[Tarantool-patches] [PATCH v2 13/16] raft: invoke update triggers within state machine

Serge Petrenko sergepetrenko at tarantool.org
Fri Nov 20 12:10:27 MSK 2020


20.11.2020 02:46, Vladislav Shpilevoy пишет:
> Raft used to call on_update trigger from the worker fiber. It was
> done because it could yield. But it is not the case anymore. The
> only yielding operation was box_clear_synchro_queue(), which is
> not called from the trigger now.
>
> That makes possible to call the trigger from within of the state
> machine. And this removes the yield between the Raft state change
> and the trigger invocation.
>
> What, in turn, allows to move all box-related urgent updates to
> the trigger. Such as box_update_ro_summary().
>
> Part of #5303


LGTM.

> ---
>   src/box/raftlib.c | 12 +++++++++++-
>   1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/src/box/raftlib.c b/src/box/raftlib.c
> index 4457a784f..f64a66942 100644
> --- a/src/box/raftlib.c
> +++ b/src/box/raftlib.c
> @@ -574,7 +574,6 @@ raft_worker_handle_broadcast(struct raft *raft)
>   		req.vclock = raft->vclock;
>   	}
>   	raft_broadcast(raft, &req);
> -	trigger_run(&raft->on_update, raft);
>   	raft->is_broadcast_scheduled = false;
>   }
>   
> @@ -967,6 +966,17 @@ raft_new_term(struct raft *raft)
>   static void
>   raft_schedule_broadcast(struct raft *raft)
>   {
> +	/*
> +	 * Broadcast works not only for network, but also for other subsystems
> +	 * on the same node. The info is delivered to them via update triggers.
> +	 * But the broadcast happens from inside of the state machine, so it
> +	 * can't yield.
> +	 */
> +	int csw = fiber()->csw;
> +	trigger_run(&raft->on_update, raft);
> +	assert(csw == fiber()->csw);
> +	(void)csw;
> +
>   	raft->is_broadcast_scheduled = true;
>   	raft_schedule_async(raft);
>   }

-- 
Serge Petrenko



More information about the Tarantool-patches mailing list