fix(dsrepl): turn memoize into a safer function
This commit is contained in:
parent
d39ca41070
commit
a1f5de3f5b
|
@ -38,17 +38,6 @@
|
||||||
terminate/2
|
terminate/2
|
||||||
]).
|
]).
|
||||||
|
|
||||||
-define(PTERM(DB, SHARD, L), {?MODULE, DB, SHARD, L}).
|
|
||||||
-define(MEMOIZE(DB, SHARD, EXPR),
|
|
||||||
case persistent_term:get(__X_Key = ?PTERM(DB, SHARD, ?LINE), undefined) of
|
|
||||||
undefined ->
|
|
||||||
ok = persistent_term:put(__X_Key, __X_Value = (EXPR)),
|
|
||||||
__X_Value;
|
|
||||||
__X_Value ->
|
|
||||||
__X_Value
|
|
||||||
end
|
|
||||||
).
|
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
start_link(DB, Shard, Opts) ->
|
start_link(DB, Shard, Opts) ->
|
||||||
|
@ -121,10 +110,10 @@ pick_random(Servers) ->
|
||||||
lists:nth(rand:uniform(length(Servers)), Servers).
|
lists:nth(rand:uniform(length(Servers)), Servers).
|
||||||
|
|
||||||
get_cluster_name(DB, Shard) ->
|
get_cluster_name(DB, Shard) ->
|
||||||
?MEMOIZE(DB, Shard, cluster_name(DB, Shard)).
|
memoize(fun cluster_name/2, [DB, Shard]).
|
||||||
|
|
||||||
get_local_server(DB, Shard) ->
|
get_local_server(DB, Shard) ->
|
||||||
?MEMOIZE(DB, Shard, local_server(DB, Shard)).
|
memoize(fun local_server/2, [DB, Shard]).
|
||||||
|
|
||||||
get_shard_servers(DB, Shard) ->
|
get_shard_servers(DB, Shard) ->
|
||||||
maps:get(servers, emqx_ds_replication_shard_allocator:shard_meta(DB, Shard)).
|
maps:get(servers, emqx_ds_replication_shard_allocator:shard_meta(DB, Shard)).
|
||||||
|
@ -203,3 +192,16 @@ start_shard(DB, Shard, #{replication_options := ReplicationOpts}) ->
|
||||||
servers => Servers,
|
servers => Servers,
|
||||||
local_server => LocalServer
|
local_server => LocalServer
|
||||||
}.
|
}.
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
memoize(Fun, Args) ->
|
||||||
|
%% NOTE: Assuming that the function is pure and never returns `undefined`.
|
||||||
|
case persistent_term:get([Fun | Args], undefined) of
|
||||||
|
undefined ->
|
||||||
|
Result = erlang:apply(Fun, Args),
|
||||||
|
_ = persistent_term:put([Fun | Args], Result),
|
||||||
|
Result;
|
||||||
|
Result ->
|
||||||
|
Result
|
||||||
|
end.
|
||||||
|
|
Loading…
Reference in New Issue