|
@@ -1,7 +1,7 @@
|
|
|
%%--------------------------------------------------------------------
|
|
%%--------------------------------------------------------------------
|
|
|
%% Copyright (c) 2024 EMQ Technologies Co., Ltd. All Rights Reserved.
|
|
%% Copyright (c) 2024 EMQ Technologies Co., Ltd. All Rights Reserved.
|
|
|
%%--------------------------------------------------------------------
|
|
%%--------------------------------------------------------------------
|
|
|
--module(emqx_ds_proto_v3).
|
|
|
|
|
|
|
+-module(emqx_ds_proto_v5).
|
|
|
|
|
|
|
|
-behavior(emqx_bpapi).
|
|
-behavior(emqx_bpapi).
|
|
|
|
|
|
|
@@ -13,16 +13,20 @@
|
|
|
get_streams/5,
|
|
get_streams/5,
|
|
|
make_iterator/6,
|
|
make_iterator/6,
|
|
|
next/5,
|
|
next/5,
|
|
|
|
|
+ poll/6,
|
|
|
update_iterator/5,
|
|
update_iterator/5,
|
|
|
add_generation/2,
|
|
add_generation/2,
|
|
|
-
|
|
|
|
|
- %% introduced in v3
|
|
|
|
|
list_generations_with_lifetimes/3,
|
|
list_generations_with_lifetimes/3,
|
|
|
- drop_generation/4
|
|
|
|
|
|
|
+ drop_generation/4,
|
|
|
|
|
+
|
|
|
|
|
+ %% introduced in v4
|
|
|
|
|
+ get_delete_streams/5,
|
|
|
|
|
+ make_delete_iterator/6,
|
|
|
|
|
+ delete_next/6
|
|
|
]).
|
|
]).
|
|
|
|
|
|
|
|
%% behavior callbacks:
|
|
%% behavior callbacks:
|
|
|
--export([introduced_in/0, deprecated_since/0]).
|
|
|
|
|
|
|
+-export([introduced_in/0]).
|
|
|
|
|
|
|
|
%%================================================================================
|
|
%%================================================================================
|
|
|
%% API functions
|
|
%% API functions
|
|
@@ -40,21 +44,21 @@ drop_db(Node, DB) ->
|
|
|
emqx_ds:topic_filter(),
|
|
emqx_ds:topic_filter(),
|
|
|
emqx_ds:time()
|
|
emqx_ds:time()
|
|
|
) ->
|
|
) ->
|
|
|
- [{integer(), emqx_ds_storage_layer:stream_v1()}].
|
|
|
|
|
|
|
+ [{integer(), emqx_ds_storage_layer:stream()}].
|
|
|
get_streams(Node, DB, Shard, TopicFilter, Time) ->
|
|
get_streams(Node, DB, Shard, TopicFilter, Time) ->
|
|
|
- erpc:call(Node, emqx_ds_replication_layer, do_get_streams_v1, [DB, Shard, TopicFilter, Time]).
|
|
|
|
|
|
|
+ erpc:call(Node, emqx_ds_replication_layer, do_get_streams_v2, [DB, Shard, TopicFilter, Time]).
|
|
|
|
|
|
|
|
-spec make_iterator(
|
|
-spec make_iterator(
|
|
|
node(),
|
|
node(),
|
|
|
emqx_ds:db(),
|
|
emqx_ds:db(),
|
|
|
emqx_ds_replication_layer:shard_id(),
|
|
emqx_ds_replication_layer:shard_id(),
|
|
|
- emqx_ds_storage_layer:stream_v1(),
|
|
|
|
|
|
|
+ emqx_ds_storage_layer:stream(),
|
|
|
emqx_ds:topic_filter(),
|
|
emqx_ds:topic_filter(),
|
|
|
emqx_ds:time()
|
|
emqx_ds:time()
|
|
|
) ->
|
|
) ->
|
|
|
- {ok, emqx_ds_storage_layer:iterator()} | {error, _}.
|
|
|
|
|
|
|
+ emqx_ds:make_iterator_result().
|
|
|
make_iterator(Node, DB, Shard, Stream, TopicFilter, StartTime) ->
|
|
make_iterator(Node, DB, Shard, Stream, TopicFilter, StartTime) ->
|
|
|
- erpc:call(Node, emqx_ds_replication_layer, do_make_iterator_v1, [
|
|
|
|
|
|
|
+ erpc:call(Node, emqx_ds_replication_layer, do_make_iterator_v2, [
|
|
|
DB, Shard, Stream, TopicFilter, StartTime
|
|
DB, Shard, Stream, TopicFilter, StartTime
|
|
|
]).
|
|
]).
|
|
|
|
|
|
|
@@ -65,9 +69,7 @@ make_iterator(Node, DB, Shard, Stream, TopicFilter, StartTime) ->
|
|
|
emqx_ds_storage_layer:iterator(),
|
|
emqx_ds_storage_layer:iterator(),
|
|
|
pos_integer()
|
|
pos_integer()
|
|
|
) ->
|
|
) ->
|
|
|
- {ok, emqx_ds_storage_layer:iterator(), [{emqx_ds:message_key(), [emqx_types:message()]}]}
|
|
|
|
|
- | {ok, end_of_stream}
|
|
|
|
|
- | {error, _}.
|
|
|
|
|
|
|
+ emqx_rpc:call_result(emqx_ds:next_result()).
|
|
|
next(Node, DB, Shard, Iter, BatchSize) ->
|
|
next(Node, DB, Shard, Iter, BatchSize) ->
|
|
|
emqx_rpc:call(Shard, Node, emqx_ds_replication_layer, do_next_v1, [DB, Shard, Iter, BatchSize]).
|
|
emqx_rpc:call(Shard, Node, emqx_ds_replication_layer, do_next_v1, [DB, Shard, Iter, BatchSize]).
|
|
|
|
|
|
|
@@ -84,6 +86,7 @@ store_batch(Node, DB, Shard, Batch, Options) ->
|
|
|
DB, Shard, Batch, Options
|
|
DB, Shard, Batch, Options
|
|
|
]).
|
|
]).
|
|
|
|
|
|
|
|
|
|
+%% Candidate for removal:
|
|
|
-spec update_iterator(
|
|
-spec update_iterator(
|
|
|
node(),
|
|
node(),
|
|
|
emqx_ds:db(),
|
|
emqx_ds:db(),
|
|
@@ -91,21 +94,31 @@ store_batch(Node, DB, Shard, Batch, Options) ->
|
|
|
emqx_ds_storage_layer:iterator(),
|
|
emqx_ds_storage_layer:iterator(),
|
|
|
emqx_ds:message_key()
|
|
emqx_ds:message_key()
|
|
|
) ->
|
|
) ->
|
|
|
- {ok, emqx_ds_storage_layer:iterator()} | {error, _}.
|
|
|
|
|
|
|
+ emqx_ds:make_iterator_result().
|
|
|
update_iterator(Node, DB, Shard, OldIter, DSKey) ->
|
|
update_iterator(Node, DB, Shard, OldIter, DSKey) ->
|
|
|
erpc:call(Node, emqx_ds_replication_layer, do_update_iterator_v2, [
|
|
erpc:call(Node, emqx_ds_replication_layer, do_update_iterator_v2, [
|
|
|
DB, Shard, OldIter, DSKey
|
|
DB, Shard, OldIter, DSKey
|
|
|
]).
|
|
]).
|
|
|
|
|
|
|
|
|
|
+-spec poll(
|
|
|
|
|
+ node(),
|
|
|
|
|
+ node(),
|
|
|
|
|
+ emqx_ds:db(),
|
|
|
|
|
+ emqx_ds_replication_layer:shard_id(),
|
|
|
|
|
+ [{emqx_ds_beamformer:return_addr(_), emqx_ds_storage_layer:iterator()}],
|
|
|
|
|
+ emqx_ds:poll_opts()
|
|
|
|
|
+) ->
|
|
|
|
|
+ ok.
|
|
|
|
|
+poll(DestNode, SourceNode, DB, Shard, Iterators, PollOpts) ->
|
|
|
|
|
+ erpc:call(DestNode, emqx_ds_replication_layer, do_poll_v1, [
|
|
|
|
|
+ SourceNode, DB, Shard, Iterators, PollOpts
|
|
|
|
|
+ ]).
|
|
|
|
|
+
|
|
|
-spec add_generation([node()], emqx_ds:db()) ->
|
|
-spec add_generation([node()], emqx_ds:db()) ->
|
|
|
[{ok, ok} | {error, _}].
|
|
[{ok, ok} | {error, _}].
|
|
|
add_generation(Node, DB) ->
|
|
add_generation(Node, DB) ->
|
|
|
erpc:multicall(Node, emqx_ds_replication_layer, do_add_generation_v2, [DB]).
|
|
erpc:multicall(Node, emqx_ds_replication_layer, do_add_generation_v2, [DB]).
|
|
|
|
|
|
|
|
-%%--------------------------------------------------------------------------------
|
|
|
|
|
-%% Introduced in V3
|
|
|
|
|
-%%--------------------------------------------------------------------------------
|
|
|
|
|
-
|
|
|
|
|
-spec list_generations_with_lifetimes(
|
|
-spec list_generations_with_lifetimes(
|
|
|
node(),
|
|
node(),
|
|
|
emqx_ds:db(),
|
|
emqx_ds:db(),
|
|
@@ -127,12 +140,59 @@ list_generations_with_lifetimes(Node, DB, Shard) ->
|
|
|
drop_generation(Node, DB, Shard, GenId) ->
|
|
drop_generation(Node, DB, Shard, GenId) ->
|
|
|
erpc:call(Node, emqx_ds_replication_layer, do_drop_generation_v3, [DB, Shard, GenId]).
|
|
erpc:call(Node, emqx_ds_replication_layer, do_drop_generation_v3, [DB, Shard, GenId]).
|
|
|
|
|
|
|
|
|
|
+%%--------------------------------------------------------------------------------
|
|
|
|
|
+%% Introduced in V4
|
|
|
|
|
+%%--------------------------------------------------------------------------------
|
|
|
|
|
+
|
|
|
|
|
+-spec get_delete_streams(
|
|
|
|
|
+ node(),
|
|
|
|
|
+ emqx_ds:db(),
|
|
|
|
|
+ emqx_ds_replication_layer:shard_id(),
|
|
|
|
|
+ emqx_ds:topic_filter(),
|
|
|
|
|
+ emqx_ds:time()
|
|
|
|
|
+) ->
|
|
|
|
|
+ [emqx_ds_storage_layer:delete_stream()].
|
|
|
|
|
+get_delete_streams(Node, DB, Shard, TopicFilter, Time) ->
|
|
|
|
|
+ erpc:call(Node, emqx_ds_replication_layer, do_get_delete_streams_v4, [
|
|
|
|
|
+ DB, Shard, TopicFilter, Time
|
|
|
|
|
+ ]).
|
|
|
|
|
+
|
|
|
|
|
+-spec make_delete_iterator(
|
|
|
|
|
+ node(),
|
|
|
|
|
+ emqx_ds:db(),
|
|
|
|
|
+ emqx_ds_replication_layer:shard_id(),
|
|
|
|
|
+ emqx_ds_storage_layer:delete_stream(),
|
|
|
|
|
+ emqx_ds:topic_filter(),
|
|
|
|
|
+ emqx_ds:time()
|
|
|
|
|
+) ->
|
|
|
|
|
+ {ok, emqx_ds_storage_layer:delete_iterator()} | {error, _}.
|
|
|
|
|
+make_delete_iterator(Node, DB, Shard, Stream, TopicFilter, StartTime) ->
|
|
|
|
|
+ erpc:call(Node, emqx_ds_replication_layer, do_make_delete_iterator_v4, [
|
|
|
|
|
+ DB, Shard, Stream, TopicFilter, StartTime
|
|
|
|
|
+ ]).
|
|
|
|
|
+
|
|
|
|
|
+-spec delete_next(
|
|
|
|
|
+ node(),
|
|
|
|
|
+ emqx_ds:db(),
|
|
|
|
|
+ emqx_ds_replication_layer:shard_id(),
|
|
|
|
|
+ emqx_ds_storage_layer:delete_iterator(),
|
|
|
|
|
+ emqx_ds:delete_selector(),
|
|
|
|
|
+ pos_integer()
|
|
|
|
|
+) ->
|
|
|
|
|
+ {ok, emqx_ds_storage_layer:delete_iterator(), non_neg_integer()}
|
|
|
|
|
+ | {ok, end_of_stream}
|
|
|
|
|
+ | {error, _}.
|
|
|
|
|
+delete_next(Node, DB, Shard, Iter, Selector, BatchSize) ->
|
|
|
|
|
+ erpc:call(
|
|
|
|
|
+ Node,
|
|
|
|
|
+ emqx_ds_replication_layer,
|
|
|
|
|
+ do_delete_next_v4,
|
|
|
|
|
+ [DB, Shard, Iter, Selector, BatchSize]
|
|
|
|
|
+ ).
|
|
|
|
|
+
|
|
|
%%================================================================================
|
|
%%================================================================================
|
|
|
%% behavior callbacks
|
|
%% behavior callbacks
|
|
|
%%================================================================================
|
|
%%================================================================================
|
|
|
|
|
|
|
|
introduced_in() ->
|
|
introduced_in() ->
|
|
|
- "5.5.0".
|
|
|
|
|
-
|
|
|
|
|
-deprecated_since() ->
|
|
|
|
|
- "5.5.1".
|
|
|
|
|
|
|
+ "5.8.0".
|