From 68af21113084f8269c877ccf04b9a9ee61fa8fe4 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Thu, 21 Mar 2024 15:33:18 -0300 Subject: [PATCH] fix(ds): reply sync callers after raft store failure --- .../src/emqx_ds_replication_layer_egress.erl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/emqx_durable_storage/src/emqx_ds_replication_layer_egress.erl b/apps/emqx_durable_storage/src/emqx_ds_replication_layer_egress.erl index b1a1c0cb4..0b0618a80 100644 --- a/apps/emqx_durable_storage/src/emqx_ds_replication_layer_egress.erl +++ b/apps/emqx_durable_storage/src/emqx_ds_replication_layer_egress.erl @@ -175,7 +175,11 @@ do_flush( #{db => DB, shard => Shard, reason => Error} ), Cooldown = ?COOLDOWN_MIN + rand:uniform(?COOLDOWN_MAX - ?COOLDOWN_MIN), - ok = timer:sleep(Cooldown) + ok = timer:sleep(Cooldown), + %% Since we drop the entire batch here, we at least reply callers with an + %% error so they don't hang indefinitely in the `gen_server' call with + %% `infinity' timeout. + lists:foreach(fun(From) -> gen_server:reply(From, {error, Error}) end, Replies) end, S#s{ n = 0,