Skip to content

Commit c5ebfca

Browse files
committed
Remove dangling symlinks on log init.
1 parent 7b727f0 commit c5ebfca

File tree

4 files changed

+31
-9
lines changed

4 files changed

+31
-9
lines changed

src/ra_kv_harness.erl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,9 @@ execute_operation(State, {kill_member}) ->
531531

532532
Pid = erpc:call(NodeName, erlang, whereis, [?CLUSTER_NAME]),
533533
erpc:call(NodeName, erlang, exit, [Pid, kill]),
534+
%% give it a bit of time after a kill in case this member is chosen
535+
%% for the next operation
536+
timer:sleep(100),
534537
State#{operations_count => OpCount + 1,
535538
successful_ops => SuccessOps + 1}
536539
end.

src/ra_log.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ init(#{uid := UId,
229229
% this queries the segment writer and thus blocks until any
230230
% segments it is currently processed have been finished
231231
MtRange = ra_mt:range(Mt0),
232+
ok = ra_log_segments:purge_dangling_symlinks(Dir),
232233
SegRefs = my_segrefs(UId, SegWriter),
233234
SegmentMaxCount = maps:get(segment_max_entries, Conf, ?SEGMENT_MAX_ENTRIES),
234235
SegmentMaxSize = maps:get(segment_max_size_bytes, Conf, ?SEGMENT_MAX_SIZE_B),
@@ -838,7 +839,6 @@ handle_event({segments, TidRanges, NewSegs},
838839

839840
%% it is theoretically possible that the segment writer flush _could_
840841
%% over take WAL notifications
841-
%%
842842
FstPend = ra_seq:first(Pend0),
843843
Pend = case ra_mt:range(Mt) of
844844
{Start, _End} when Start > FstPend ->
@@ -1372,7 +1372,7 @@ release_resources(MaxOpenSegments, AccessPattern,
13721372
%% only used by resend to wal functionality and doesn't update the mem table
13731373
wal_rewrite(#?MODULE{cfg = #cfg{uid = UId,
13741374
wal = Wal} = Cfg,
1375-
last_wal_write = {_, _, _LastWalIdx}} = State,
1375+
last_wal_write = {_, _, _}} = State,
13761376
Tid, {Idx, Term, Cmd}) ->
13771377
case ra_log_wal:write(Wal, {UId, self()}, Tid, Idx, Term, Cmd) of
13781378
{ok, Pid} ->

src/ra_log_segment.erl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -495,13 +495,13 @@ info(Filename, Live0)
495495
when not is_tuple(Filename) ->
496496
%% TODO: this can be much optimised by a specialised index parsing
497497
%% function
498-
{ok, Seg} = open(Filename, #{mode => read}),
499-
Index = Seg#state.index,
500-
{ok, #file_info{type = T,
498+
{ok, #file_info{type = Type,
501499
links = Links,
502-
ctime = CTime}} = file:read_link_info(Filename,
503-
[raw, {time, posix}]),
500+
ctime = CTime}} = prim_file:read_link_info(Filename,
501+
[raw, {time, posix}]),
504502

503+
{ok, Seg} = open(Filename, #{mode => read}),
504+
Index = Seg#state.index,
505505
AllIndexesSeq = ra_seq:from_list(maps:keys(Index)),
506506
Live = case Live0 of
507507
undefined ->
@@ -515,7 +515,7 @@ info(Filename, Live0)
515515
end, 0, Live),
516516
Info = #{size => Seg#state.data_write_offset,
517517
index_size => Seg#state.data_start,
518-
file_type => T,
518+
file_type => Type,
519519
links => Links,
520520
ctime => CTime,
521521
max_count => max_count(Seg),

src/ra_log_segments.erl

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
fetch_term/2,
3030
info/1,
3131
purge_symlinks/2,
32+
purge_dangling_symlinks/1,
3233
compaction_conf/1
3334
]).
3435

@@ -394,7 +395,7 @@ purge_symlinks(Dir, OlderThanSec) ->
394395
Now = erlang:system_time(second),
395396
[begin
396397
Fn = filename:join(Dir, F),
397-
case file:read_link_info(Fn, [raw, {time, posix}]) of
398+
case prim_file:read_link_info(Fn, [raw, {time, posix}]) of
398399
{ok, #file_info{type = symlink,
399400
ctime = Time}}
400401
when Now - Time > OlderThanSec ->
@@ -406,6 +407,24 @@ purge_symlinks(Dir, OlderThanSec) ->
406407
end || F <- list_files(Dir, ".segment")],
407408
ok.
408409

410+
-spec purge_dangling_symlinks(file:filename_all()) -> ok.
411+
purge_dangling_symlinks(Dir) ->
412+
[begin
413+
Fn = filename:join(Dir, F),
414+
case file:read_link_info(Fn, [raw]) of
415+
{ok, #file_info{type = symlink}} ->
416+
case file:open(Fn, [raw, read, binary]) of
417+
{ok, Fd} ->
418+
ok = file:close(Fd);
419+
{error, enoent} ->
420+
%% dangling symlink
421+
ok = prim_file:delete(Fn)
422+
end;
423+
_ ->
424+
ok
425+
end
426+
end || F <- list_files(Dir, ".segment")],
427+
ok.
409428
%% LOCAL
410429

411430
segment_read_plan(_SegRefs, [], Acc) ->

0 commit comments

Comments
 (0)