Skip to content

Commit d3a23c9

Browse files
committed
major compactions
1 parent e1b6bd0 commit d3a23c9

File tree

6 files changed

+854
-90
lines changed

6 files changed

+854
-90
lines changed

src/ra_log.erl

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ init(#{uid := UId,
227227
MtRange = ra_mt:range(Mt0),
228228
SegRefs = my_segrefs(UId, SegWriter),
229229
Reader = ra_log_segments:init(UId, Dir, MaxOpen, AccessPattern, SegRefs,
230-
Names, Counter),
230+
Counter, LogId),
231231
SegmentRange = ra_log_segments:range(Reader),
232232
%% TODO: check ra_range:add/2 actually performas the correct logic we expect
233233
Range = ra_range:add(MtRange, SegmentRange),
@@ -1288,21 +1288,20 @@ delete_everything(#?MODULE{cfg = #cfg{uid = UId,
12881288

12891289
-spec release_resources(non_neg_integer(),
12901290
sequential | random, state()) -> state().
1291-
release_resources(MaxOpenSegments,
1292-
AccessPattern,
1291+
release_resources(MaxOpenSegments, AccessPattern,
12931292
#?MODULE{cfg = #cfg{uid = UId,
1293+
log_id = LogId,
12941294
directory = Dir,
1295-
counter = Counter,
1296-
names = Names},
1295+
counter = Counter},
12971296
reader = Reader} = State) ->
12981297
ActiveSegs = ra_log_segments:segment_refs(Reader),
12991298
% close all open segments
13001299
% deliberately ignoring return value
13011300
_ = ra_log_segments:close(Reader),
13021301
%% open a new segment with the new max open segment value
13031302
State#?MODULE{reader = ra_log_segments:init(UId, Dir, MaxOpenSegments,
1304-
AccessPattern,
1305-
ActiveSegs, Names, Counter)}.
1303+
AccessPattern, ActiveSegs,
1304+
Counter, LogId)}.
13061305

13071306

13081307
%%% Local functions

src/ra_log_segment.erl

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
max_count/1,
2323
filename/1,
2424
segref/1,
25+
info/1,
2526
is_same_as/2,
2627
copy/3]).
2728

@@ -56,7 +57,7 @@
5657
fd :: option(file:io_device()),
5758
index_size :: pos_integer(),
5859
access_pattern :: sequential | random,
59-
file_advise = normal :: posix_file_advise(),
60+
file_advise = normal :: posix_file_advise(),
6061
mode = append :: read | append,
6162
compute_checksums = true :: boolean()}).
6263

@@ -453,6 +454,41 @@ segref(Filename) ->
453454
close(Seg),
454455
SegRef.
455456

457+
-spec info(file:filename_all()) ->
458+
#{size => non_neg_integer(),
459+
max_count => non_neg_integer(),
460+
file_type => regular | symlink,
461+
ctime => integer(),
462+
links => non_neg_integer(),
463+
% max_size => non_neg_integer(),
464+
num_entries => non_neg_integer(),
465+
range => ra:range(),
466+
indexes => ra_seq:state(),
467+
name => file:filename_all()}.
468+
info(Filename)
469+
when not is_tuple(Filename) ->
470+
%% TODO: this can be much optimised by a specialised index parsing
471+
%% function
472+
{ok, Seg} = open(Filename, #{mode => read}),
473+
Index = Seg#state.index,
474+
{ok, #file_info{type = T,
475+
links = Links,
476+
ctime = CTime}} = file:read_link_info(Filename,
477+
[raw, {time, posix}]),
478+
479+
Info = #{size => Seg#state.data_write_offset,
480+
file_type => T,
481+
links => Links,
482+
ctime => CTime,
483+
max_count => max_count(Seg),
484+
num_entries => maps:size(Index),
485+
range => range(Seg),
486+
indexes => ra_seq:from_list(maps:keys(Index)),
487+
name => filename:basename(Filename)
488+
},
489+
close(Seg),
490+
Info.
491+
456492
-spec is_same_as(state(), file:filename_all()) -> boolean().
457493
is_same_as(#state{cfg = #cfg{filename = Fn0}}, Fn) ->
458494
is_same_filename_all(Fn0, Fn).

0 commit comments

Comments
 (0)