feat(ft): add proxy module for emqx_ft_storage_fs
This commit is contained in:
parent
04e5378bda
commit
197ce32669
|
@ -189,7 +189,7 @@ on_fin(PacketId, Msg, FileId, Checksum) ->
|
||||||
%% We have new fin packet
|
%% We have new fin packet
|
||||||
ok ->
|
ok ->
|
||||||
Callback = callback(FinPacketKey, FileId),
|
Callback = callback(FinPacketKey, FileId),
|
||||||
case emqx_ft_storage:assemble(transfer(Msg, FileId), Callback) of
|
case assemble(transfer(Msg, FileId), Callback) of
|
||||||
%% Assembling started, packet will be acked by the callback or the responder
|
%% Assembling started, packet will be acked by the callback or the responder
|
||||||
{ok, _} ->
|
{ok, _} ->
|
||||||
undefined;
|
undefined;
|
||||||
|
@ -214,6 +214,17 @@ on_fin(PacketId, Msg, FileId, Checksum) ->
|
||||||
undefined
|
undefined
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
assemble(Transfer, Callback) ->
|
||||||
|
try
|
||||||
|
emqx_ft_storage:assemble(Transfer, Callback)
|
||||||
|
catch
|
||||||
|
C:E:S ->
|
||||||
|
?SLOG(warning, #{
|
||||||
|
msg => "file_assemble_failed", class => C, reason => E, stacktrace => S
|
||||||
|
}),
|
||||||
|
{error, {internal_error, E}}
|
||||||
|
end.
|
||||||
|
|
||||||
callback({ChanPid, PacketId} = Key, _FileId) ->
|
callback({ChanPid, PacketId} = Key, _FileId) ->
|
||||||
fun(Result) ->
|
fun(Result) ->
|
||||||
case emqx_ft_responder:unregister(Key) of
|
case emqx_ft_responder:unregister(Key) of
|
||||||
|
|
|
@ -28,10 +28,8 @@
|
||||||
|
|
||||||
-export([transfers/1]).
|
-export([transfers/1]).
|
||||||
|
|
||||||
-export([pread_local/4]).
|
-export([ready_transfers_local/1]).
|
||||||
-export([list_local/2]).
|
-export([get_ready_transfer_local/2]).
|
||||||
-export([ready_transfers_local/0, ready_transfers_local/1]).
|
|
||||||
-export([get_ready_transfer_local/1, get_ready_transfer_local/2]).
|
|
||||||
|
|
||||||
-export([ready_transfers/1]).
|
-export([ready_transfers/1]).
|
||||||
-export([get_ready_transfer/2]).
|
-export([get_ready_transfer/2]).
|
||||||
|
@ -173,16 +171,6 @@ pread(_Storage, _Transfer, Frag, Offset, Size) ->
|
||||||
assemble(Storage, Transfer, Callback) ->
|
assemble(Storage, Transfer, Callback) ->
|
||||||
emqx_ft_assembler_sup:start_child(Storage, Transfer, Callback).
|
emqx_ft_assembler_sup:start_child(Storage, Transfer, Callback).
|
||||||
|
|
||||||
-spec list_local(transfer(), fragment | result) ->
|
|
||||||
{ok, [filefrag()]} | {error, term()}.
|
|
||||||
list_local(Transfer, What) ->
|
|
||||||
emqx_ft_storage:with_storage_type(local, list, [Transfer, What]).
|
|
||||||
|
|
||||||
-spec pread_local(transfer(), filefrag(), offset(), _Size :: non_neg_integer()) ->
|
|
||||||
{ok, [filefrag()]} | {error, term()}.
|
|
||||||
pread_local(Transfer, Frag, Offset, Size) ->
|
|
||||||
emqx_ft_storage:with_storage_type(local, pread, [Transfer, Frag, Offset, Size]).
|
|
||||||
|
|
||||||
get_ready_transfer(_Storage, ReadyTransferId) ->
|
get_ready_transfer(_Storage, ReadyTransferId) ->
|
||||||
case parse_ready_transfer_id(ReadyTransferId) of
|
case parse_ready_transfer_id(ReadyTransferId) of
|
||||||
{ok, {Node, Transfer}} ->
|
{ok, {Node, Transfer}} ->
|
||||||
|
@ -198,9 +186,6 @@ get_ready_transfer(_Storage, ReadyTransferId) ->
|
||||||
Error
|
Error
|
||||||
end.
|
end.
|
||||||
|
|
||||||
get_ready_transfer_local(Transfer) ->
|
|
||||||
emqx_ft_storage:with_storage_type(local, get_ready_transfer_local, [Transfer]).
|
|
||||||
|
|
||||||
get_ready_transfer_local(Storage, Transfer) ->
|
get_ready_transfer_local(Storage, Transfer) ->
|
||||||
Dirname = mk_filedir(Storage, Transfer, get_subdirs_for(result)),
|
Dirname = mk_filedir(Storage, Transfer, get_subdirs_for(result)),
|
||||||
case file:list_dir(Dirname) of
|
case file:list_dir(Dirname) of
|
||||||
|
@ -223,9 +208,6 @@ ready_transfers(_Storage) ->
|
||||||
?SLOG(warning, #{msg => "ready_transfers", failures => BadResults}),
|
?SLOG(warning, #{msg => "ready_transfers", failures => BadResults}),
|
||||||
{ok, [File || {ok, Files} <- GoodResults, File <- Files]}.
|
{ok, [File || {ok, Files} <- GoodResults, File <- Files]}.
|
||||||
|
|
||||||
ready_transfers_local() ->
|
|
||||||
emqx_ft_storage:with_storage_type(local, ready_transfers_local, []).
|
|
||||||
|
|
||||||
ready_transfers_local(Storage) ->
|
ready_transfers_local(Storage) ->
|
||||||
{ok, Transfers} = transfers(Storage),
|
{ok, Transfers} = transfers(Storage),
|
||||||
lists:filtermap(
|
lists:filtermap(
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% Copyright (c) 2020-2023 EMQ Technologies Co., Ltd. All Rights Reserved.
|
||||||
|
%%
|
||||||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
%% you may not use this file except in compliance with the License.
|
||||||
|
%% You may obtain a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing, software
|
||||||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
%% See the License for the specific language governing permissions and
|
||||||
|
%% limitations under the License.
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
|
%% This methods are called via rpc by `emqx_ft_storage_fs`
|
||||||
|
%% They populate the call with actual storage which may be configured differently
|
||||||
|
%% on a concrete node.
|
||||||
|
|
||||||
|
-module(emqx_ft_storage_fs_proxy).
|
||||||
|
|
||||||
|
-export([
|
||||||
|
list_local/2,
|
||||||
|
pread_local/4,
|
||||||
|
get_ready_transfer_local/1,
|
||||||
|
ready_transfers_local/0
|
||||||
|
]).
|
||||||
|
|
||||||
|
list_local(Transfer, What) ->
|
||||||
|
emqx_ft_storage:with_storage_type(local, list, [Transfer, What]).
|
||||||
|
|
||||||
|
pread_local(Transfer, Frag, Offset, Size) ->
|
||||||
|
emqx_ft_storage:with_storage_type(local, pread, [Transfer, Frag, Offset, Size]).
|
||||||
|
|
||||||
|
get_ready_transfer_local(Transfer) ->
|
||||||
|
emqx_ft_storage:with_storage_type(local, get_ready_transfer_local, [Transfer]).
|
||||||
|
|
||||||
|
ready_transfers_local() ->
|
||||||
|
emqx_ft_storage:with_storage_type(local, ready_transfers_local, []).
|
|
@ -36,28 +36,29 @@ introduced_in() ->
|
||||||
"5.0.17".
|
"5.0.17".
|
||||||
|
|
||||||
-spec list(node(), transfer(), fragment | result) ->
|
-spec list(node(), transfer(), fragment | result) ->
|
||||||
{ok, [filefrag()]} | {error, term()}.
|
{ok, [filefrag()]} | {error, term()} | no_return().
|
||||||
list(Node, Transfer, What) ->
|
list(Node, Transfer, What) ->
|
||||||
erpc:call(Node, emqx_ft_storage_fs, list_local, [Transfer, What]).
|
erpc:call(Node, emqx_ft_storage_fs_proxy, list_local, [Transfer, What]).
|
||||||
|
|
||||||
-spec multilist([node()], transfer(), fragment | result) ->
|
-spec multilist([node()], transfer(), fragment | result) ->
|
||||||
emqx_rpc:erpc_multicall({ok, [filefrag()]} | {error, term()}).
|
emqx_rpc:erpc_multicall({ok, [filefrag()]} | {error, term()}).
|
||||||
multilist(Nodes, Transfer, What) ->
|
multilist(Nodes, Transfer, What) ->
|
||||||
erpc:multicall(Nodes, emqx_ft_storage_fs, list_local, [Transfer, What]).
|
erpc:multicall(Nodes, emqx_ft_storage_fs_proxy, list_local, [Transfer, What]).
|
||||||
|
|
||||||
-spec pread(node(), transfer(), filefrag(), offset(), _Size :: non_neg_integer()) ->
|
-spec pread(node(), transfer(), filefrag(), offset(), _Size :: non_neg_integer()) ->
|
||||||
{ok, [filefrag()]} | {error, term()}.
|
{ok, [filefrag()]} | {error, term()} | no_return().
|
||||||
pread(Node, Transfer, Frag, Offset, Size) ->
|
pread(Node, Transfer, Frag, Offset, Size) ->
|
||||||
erpc:call(Node, emqx_ft_storage_fs, pread_local, [Transfer, Frag, Offset, Size]).
|
erpc:call(Node, emqx_ft_storage_fs_proxy, pread_local, [Transfer, Frag, Offset, Size]).
|
||||||
|
|
||||||
-spec ready_transfers([node()]) ->
|
-spec ready_transfers([node()]) ->
|
||||||
{ok, [{emqx_ft_storage:ready_transfer_id(), emqx_ft_storage:ready_transfer_info()}]}
|
{ok, [{emqx_ft_storage:ready_transfer_id(), emqx_ft_storage:ready_transfer_info()}]}
|
||||||
| {error, term()}.
|
| {error, term()}.
|
||||||
ready_transfers(Nodes) ->
|
ready_transfers(Nodes) ->
|
||||||
erpc:multicall(Nodes, emqx_ft_storage_fs, ready_transfers_local, []).
|
erpc:multicall(Nodes, emqx_ft_storage_fs_proxy, ready_transfers_local, []).
|
||||||
|
|
||||||
-spec get_ready_transfer(node(), emqx_ft_storage:ready_transfer_id()) ->
|
-spec get_ready_transfer(node(), emqx_ft_storage:ready_transfer_id()) ->
|
||||||
{ok, emqx_ft_storage:ready_transfer_data()}
|
{ok, emqx_ft_storage:ready_transfer_data()}
|
||||||
| {error, term()}.
|
| {error, term()}
|
||||||
|
| no_return().
|
||||||
get_ready_transfer(Node, ReadyTransferId) ->
|
get_ready_transfer(Node, ReadyTransferId) ->
|
||||||
erpc:call(Node, emqx_ft_storage_fs, get_ready_transfer_local, [ReadyTransferId]).
|
erpc:call(Node, emqx_ft_storage_fs_proxy, get_ready_transfer_local, [ReadyTransferId]).
|
||||||
|
|
Loading…
Reference in New Issue