Skip to content

Commit c423e2c

Browse files
committed
Make sure stop and delete servers handle both name formats.
Also normalise Name to binary inside writer and replica.
1 parent d56410e commit c423e2c

File tree

7 files changed

+84
-36
lines changed

7 files changed

+84
-36
lines changed

src/osiris_log.erl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2653,23 +2653,25 @@ read_header0(#?MODULE{cfg = #cfg{directory = Dir,
26532653
end.
26542654

26552655
trigger_retention_eval(#?MODULE{cfg =
2656-
#cfg{directory = Dir,
2656+
#cfg{name = Name,
2657+
directory = Dir,
26572658
retention = RetentionSpec,
26582659
counter = Cnt,
26592660
shared = Shared}} = State) ->
26602661

26612662
%% updates first offset and first timestamp
26622663
%% after retention has been evaluated
2663-
EvalFun = fun ({{FstOff, _}, FstTs, Seg}) when is_integer(FstOff),
2664-
is_integer(FstTs) ->
2664+
EvalFun = fun ({{FstOff, _}, FstTs, NumSegLeft})
2665+
when is_integer(FstOff),
2666+
is_integer(FstTs) ->
26652667
osiris_log_shared:set_first_chunk_id(Shared, FstOff),
26662668
counters:put(Cnt, ?C_FIRST_OFFSET, FstOff),
26672669
counters:put(Cnt, ?C_FIRST_TIMESTAMP, FstTs),
2668-
counters:put(Cnt, ?C_SEGMENTS, Seg);
2670+
counters:put(Cnt, ?C_SEGMENTS, NumSegLeft);
26692671
(_) ->
26702672
ok
26712673
end,
2672-
ok = osiris_retention:eval(Dir, RetentionSpec, EvalFun),
2674+
ok = osiris_retention:eval(Name, Dir, RetentionSpec, EvalFun),
26732675
State.
26742676

26752677
next_location(undefined) ->

src/osiris_replica.erl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,11 @@ await(Server) ->
158158
init(Config) ->
159159
{ok, undefined, {continue, Config}}.
160160

161-
handle_continue(#{name := Name,
161+
handle_continue(#{name := Name0,
162162
leader_pid := LeaderPid,
163-
reference := ExtRef} = Config, undefined) ->
163+
reference := ExtRef} = Config, undefined)
164+
when ?IS_STRING(Name0) ->
165+
Name = osiris_util:normalise_name(Name0),
164166
process_flag(trap_exit, true),
165167
process_flag(message_queue_data, off_heap),
166168
Node = node(LeaderPid),

src/osiris_retention.erl

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
%% API functions
1313
-export([start_link/0,
14-
eval/3]).
14+
eval/4]).
1515
%% gen_server callbacks
1616
-export([init/1,
1717
handle_call/3,
@@ -20,6 +20,8 @@
2020
terminate/2,
2121
code_change/3]).
2222

23+
-define(DEFAULT_SHEDULED_EVAL_TIME, 1000 * 60 * 60). %% 1HR
24+
2325
-record(state, {scheduled = #{} :: #{osiris:name() => timer:tref()}}).
2426

2527
%%%===================================================================
@@ -30,13 +32,13 @@
3032
start_link() ->
3133
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
3234

33-
-spec eval(file:name_all(), [osiris:retention_spec()],
35+
-spec eval(osiris:name(), file:name_all(), [osiris:retention_spec()],
3436
fun((osiris_log:range()) -> ok)) ->
35-
ok.
36-
eval(_Dir, [], _Fun) ->
37+
ok.
38+
eval(_Name, _Dir, [], _Fun) ->
3739
ok;
38-
eval(Dir, Specs, Fun) ->
39-
gen_server:cast(?MODULE, {eval, Dir, Specs, Fun}).
40+
eval(Name, Dir, Specs, Fun) ->
41+
gen_server:cast(?MODULE, {eval, Name, Dir, Specs, Fun}).
4042

4143
%%%===================================================================
4244
%%% gen_server callbacks
@@ -63,10 +65,10 @@ handle_call(_Request, _From, State) ->
6365
%% @spec handle_cast(Msg, State) -> {noreply, State} |
6466
%% {noreply, State, Timeout} |
6567
%% {stop, Reason, State}
66-
handle_cast({eval, Dir, Specs, Fun}, State) ->
68+
handle_cast({eval, Name, Dir, Specs, Fun}, State) ->
6769
Result = osiris_log:evaluate_retention(Dir, Specs),
6870
_ = Fun(Result),
69-
{noreply, State}.
71+
{noreply, schedule(osiris_util:normalise_name(Name), Specs, Result, State)}.
7072

7173
%% @spec handle_info(Info, State) -> {noreply, State} |
7274
%% {noreply, State, Timeout} |
@@ -85,3 +87,6 @@ code_change(_OldVsn, State, _Extra) ->
8587
%%%===================================================================
8688
%%% Internal functions
8789
%%%===================================================================
90+
schedule(_Name, _Specs, _Result, State) ->
91+
State.
92+

src/osiris_server_sup.erl

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,23 @@ init([]) ->
2121
Procs = [],
2222
{ok, {{one_for_one, 1, 5}, Procs}}.
2323

24-
stop_child(Node, CName) ->
24+
stop_child(Node, Name) ->
2525
try
26-
case supervisor:terminate_child({?MODULE, Node}, CName) of
26+
%% as replicas are temporary we don't have to explicitly
27+
%% delete them
28+
case supervisor:terminate_child({?MODULE, Node}, Name) of
2729
ok ->
28-
%% as replicas are temporary we don't have to explicitly
29-
%% delete them
3030
ok;
3131
{error, not_found} ->
32-
ok;
32+
OthName = flip_name(Name),
33+
case supervisor:terminate_child({?MODULE, Node}, OthName) of
34+
ok ->
35+
ok;
36+
{error, not_found} ->
37+
ok;
38+
Err ->
39+
Err
40+
end;
3341
Err ->
3442
Err
3543
end
@@ -39,17 +47,29 @@ stop_child(Node, CName) ->
3947
ok
4048
end.
4149

42-
delete_child(Node, #{name := CName} = Config) ->
50+
delete_child(Node, #{name := Name} = Config) ->
4351
try
44-
case supervisor:get_childspec({?MODULE, Node}, CName) of
52+
case supervisor:get_childspec({?MODULE, Node}, Name) of
4553
{ok, _} ->
46-
_ = stop_child(Node, CName),
54+
_ = stop_child(Node, Name),
4755
rpc:call(Node, osiris_log, delete_directory, [Config]);
4856
{error, not_found} ->
49-
ok
57+
OthName = flip_name(Name),
58+
case supervisor:get_childspec({?MODULE, Node}, OthName) of
59+
{ok, _} ->
60+
_ = stop_child(Node, OthName),
61+
rpc:call(Node, osiris_log, delete_directory, [Config]);
62+
{error, not_found} ->
63+
ok
64+
end
5065
end
5166
catch
5267
_:{noproc, _} ->
5368
%% Whole supervisor or app is already down - i.e. stop_app
5469
ok
5570
end.
71+
72+
flip_name(N) when is_binary(N) ->
73+
binary_to_list(N);
74+
flip_name(N) when is_list(N) ->
75+
list_to_binary(N).

src/osiris_util.erl

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
get_replication_configuration_from_tls_dist/0,
1818
get_replication_configuration_from_tls_dist/1,
1919
get_replication_configuration_from_tls_dist/2,
20-
partition_parallel/3
20+
partition_parallel/3,
21+
normalise_name/1
2122
]).
2223

2324
%% For testing
@@ -43,8 +44,8 @@ validate_base64uri(Str) when ?IS_STRING(Str) ->
4344
string:is_empty(Str) == false
4445
end.
4546

46-
-spec to_base64uri(string()) -> string().
47-
to_base64uri(Str) when is_list(Str) ->
47+
-spec to_base64uri(string() | binary()) -> string().
48+
to_base64uri(Str) when ?IS_STRING(Str) ->
4849
lists:foldr(fun(G, Acc) ->
4950
case lists:member(G, ?BASE64_URI_CHARS) of
5051
true -> [G | Acc];
@@ -261,3 +262,8 @@ collect([{{Pid, MRef}, E} | Next], {Left, Right}, Timeout) ->
261262
after Timeout ->
262263
exit(partition_parallel_timeout)
263264
end.
265+
266+
normalise_name(Name) when is_binary(Name) ->
267+
Name;
268+
normalise_name(Name) when is_list(Name) ->
269+
list_to_binary(Name).

src/osiris_writer.erl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,14 @@
7272

7373
start(Config = #{name := Name, leader_node := Leader}) ->
7474
supervisor:start_child({?SUP, Leader},
75-
#{id => Name,
75+
#{id => osiris_util:normalise_name(Name),
7676
start => {?MODULE, start_link, [Config]},
7777
restart => temporary,
7878
shutdown => 5000,
7979
type => worker}).
8080

8181
stop(#{name := Name, leader_node := Node}) ->
82+
%% stop child handles name normalisation
8283
?SUP:stop_child(Node, Name).
8384

8485
delete(#{leader_node := Node} = Config) ->
@@ -150,12 +151,13 @@ query_replication_state(Pid) when is_pid(Pid) ->
150151
init(Config) ->
151152
{ok, undefined, {continue, Config}}.
152153

153-
handle_continue(#{name := Name,
154+
handle_continue(#{name := Name0,
154155
epoch := Epoch,
155156
reference := ExtRef,
156157
replica_nodes := Replicas} =
157158
Config, undefined)
158-
when ?IS_STRING(Name) ->
159+
when ?IS_STRING(Name0) ->
160+
Name = osiris_util:normalise_name(Name0),
159161
Dir = osiris_log:directory(Config),
160162
process_flag(trap_exit, true),
161163
process_flag(message_queue_data, off_heap),

test/osiris_SUITE.erl

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ init_per_testcase(TestCase, Config) ->
106106
ok = extra_init(TestCase),
107107
{ok, Apps} = application:ensure_all_started(osiris),
108108
ok = logger:set_primary_config(level, all),
109-
% file:make_dir(Dir),
110109
[{data_dir, Dir},
111110
{test_case, TestCase},
112111
{cluster_name, atom_to_binary(TestCase, utf8)},
@@ -769,16 +768,24 @@ cluster_restart_new_leader(Config) ->
769768
ok.
770769

771770
cluster_delete(Config) ->
772-
PrivDir = ?config(data_dir, Config),
773771
Name = ?config(cluster_name, Config),
772+
ok = cluster_delete(Config, Name, Name),
773+
ok = cluster_delete(Config, Name, binary_to_list(Name)),
774+
ok = cluster_delete(Config, binary_to_list(Name), binary_to_list(Name)),
775+
ok = cluster_delete(Config, binary_to_list(Name), Name),
776+
ok.
777+
778+
cluster_delete(Config, StartName, DeleteName) ->
779+
PrivDir = ?config(data_dir, Config),
774780
PeerStates = [start_child_node(N, PrivDir) || N <- [s1, s2, s3]],
775781
[LeaderNode | Replicas] = [NodeName || {_Ref, NodeName} <- PeerStates],
776782
Conf0 =
777-
#{name => Name,
783+
#{name => StartName,
778784
epoch => 1,
779785
leader_node => LeaderNode,
780786
replica_nodes => Replicas},
781-
{ok, #{leader_pid := Leader} = Conf} = osiris:start_cluster(Conf0),
787+
{ok, #{leader_pid := Leader,
788+
replica_pids := ReplicaPids} = Conf} = osiris:start_cluster(Conf0),
782789
ok = osiris:write(Leader, undefined, 42, <<"before-restart">>),
783790
receive
784791
{osiris_written, _, _WriterId, [42]} ->
@@ -788,7 +795,11 @@ cluster_delete(Config) ->
788795
exit(osiris_written_timeout)
789796
end,
790797

791-
osiris:delete_cluster(Conf),
798+
osiris:delete_cluster(Conf#{name => DeleteName}),
799+
%% validate pids are gone
800+
[begin
801+
?assertEqual(false, erpc:call(node(Pid), erlang,is_process_alive, [Pid]))
802+
end || Pid <- [Leader | ReplicaPids]],
792803
[stop_peer(Ref) || {Ref, _} <- PeerStates],
793804
ok.
794805

@@ -1732,7 +1743,7 @@ start_child_node(NodeNamePrefix, PrivDir) ->
17321743
start_child_node(NodeName, PrivDir, ExtraAppConfig0) ->
17331744
_ = file:make_dir(PrivDir),
17341745
Dir = filename:join(PrivDir, NodeName),
1735-
ok = file:make_dir(Dir),
1746+
_ = file:make_dir(Dir),
17361747

17371748
%% make sure the data dir computed above is passed on to the peers
17381749
ExtraAppConfig1 = proplists:delete(data_dir, ExtraAppConfig0),

0 commit comments

Comments
 (0)