فهرست منبع

fix(ds): Preserve errors in the egress

ieQu1 1 سال پیش
والد
کامیت
4382971443
1فایلهای تغییر یافته به همراه15 افزوده شده و 4 حذف شده
  1. 15 4
      apps/emqx_durable_storage/src/emqx_ds_replication_layer_egress.erl

+ 15 - 4
apps/emqx_durable_storage/src/emqx_ds_replication_layer_egress.erl

@@ -302,9 +302,9 @@ repackage_messages(DB, Messages, Sync, Atomic) ->
         #{},
         #{},
         Messages
         Messages
     ),
     ),
-    maps:foreach(
-        fun(Shard, {NMsgs, ByteSize, RevMessages}) ->
-            gen_server:call(
+    maps:fold(
+        fun(Shard, {NMsgs, ByteSize, RevMessages}, ErrAcc) ->
+            Err = gen_server:call(
                 ?via(DB, Shard),
                 ?via(DB, Shard),
                 #enqueue_req{
                 #enqueue_req{
                     messages = lists:reverse(RevMessages),
                     messages = lists:reverse(RevMessages),
@@ -314,11 +314,22 @@ repackage_messages(DB, Messages, Sync, Atomic) ->
                     payload_bytes = ByteSize
                     payload_bytes = ByteSize
                 },
                 },
                 infinity
                 infinity
-            )
+            ),
+            compose_errors(ErrAcc, Err)
         end,
         end,
+        ok,
         Batches
         Batches
     ).
     ).
 
 
+compose_errors(ErrAcc, ok) ->
+    ErrAcc;
+compose_errors(ok, Err) ->
+    Err;
+compose_errors({error, recoverable, _}, {error, unrecoverable, Err}) ->
+    {error, unrecoverable, Err};
+compose_errors(ErrAcc, _Err) ->
+    ErrAcc.
+
 start_timer(S) ->
 start_timer(S) ->
     Interval = application:get_env(emqx_durable_storage, egress_flush_interval, 100),
     Interval = application:get_env(emqx_durable_storage, egress_flush_interval, 100),
     Tref = erlang:send_after(Interval, self(), ?flush),
     Tref = erlang:send_after(Interval, self(), ?flush),