Просмотр исходного кода

fix: ensure iterator is opened

Thales Macedo Garitezi 2 лет назад
Родитель
Сommit
c28c6d1b7e
1 измененных файлов с 13 добавлено и 11 удалено
  1. 13 11
      apps/emqx/src/emqx_persistent_session_ds.erl

+ 13 - 11
apps/emqx/src/emqx_persistent_session_ds.erl

@@ -93,12 +93,7 @@ add_subscription(TopicFilterBin, DSSessionID) ->
             {ok, IteratorID, StartMS, IsNew} = emqx_ds:session_add_iterator(
                 DSSessionID, TopicFilter
             ),
-            case IsNew of
-                true ->
-                    ok = open_iterator_on_all_nodes(TopicFilter, StartMS, IteratorID);
-                false ->
-                    ok
-            end,
+            ok = open_iterator_on_all_nodes(TopicFilter, StartMS, IteratorID),
             {ok, IteratorID, IsNew}
         end
     ).
@@ -106,7 +101,9 @@ add_subscription(TopicFilterBin, DSSessionID) ->
 -spec open_iterator_on_all_nodes(emqx_topic:words(), emqx_ds:time(), emqx_ds:iterator_id()) -> ok.
 open_iterator_on_all_nodes(TopicFilter, StartMS, IteratorID) ->
     Nodes = emqx:running_nodes(),
-    Results = emqx_persistent_session_ds_proto_v1:open_iterator(Nodes, TopicFilter, StartMS, IteratorID),
+    Results = emqx_persistent_session_ds_proto_v1:open_iterator(
+        Nodes, TopicFilter, StartMS, IteratorID
+    ),
     %% TODO: handle errors
     true = lists:all(fun(Res) -> Res =:= {ok, ok} end, Results),
     ok.
@@ -114,10 +111,15 @@ open_iterator_on_all_nodes(TopicFilter, StartMS, IteratorID) ->
 -spec do_open_iterator(emqx_topic:words(), emqx_ds:time(), emqx_ds:iterator_id()) -> ok.
 do_open_iterator(TopicFilter, StartMS, IteratorID) ->
     Replay = {TopicFilter, StartMS},
-    %% FIXME: choose DS shard based on ...?
-    {ok, It} = emqx_ds_storage_layer:make_iterator(?DS_SHARD, Replay),
-    ok = emqx_ds_storage_layer:preserve_iterator(It, IteratorID),
-    ok.
+    case emqx_ds_storage_layer:is_iterator_present(?DS_SHARD, IteratorID) of
+        true ->
+            {ok, _It} = emqx_ds_storage_layer:restore_iterator(?DS_SHARD, IteratorID),
+            ok;
+        false ->
+            {ok, It} = emqx_ds_storage_layer:make_iterator(?DS_SHARD, Replay),
+            ok = emqx_ds_storage_layer:preserve_iterator(It, IteratorID),
+            ok
+    end.
 
 %%