|
103 | 103 | {cfg = #cfg{}, |
104 | 104 | %% mutable data below |
105 | 105 | range :: ra:range(), |
106 | | - % first_index = -1 :: ra_index(), |
107 | | - % last_index = -1 :: -1 | ra_index(), |
108 | 106 | last_term = 0 :: ra_term(), |
109 | 107 | last_written_index_term = {0, 0} :: ra_idxterm(), |
110 | 108 | snapshot_state :: ra_snapshot:state(), |
@@ -817,30 +815,10 @@ handle_event({segments, TidRanges, NewSegs}, |
817 | 815 | ok |
818 | 816 | end, |
819 | 817 | {State, [{bg_work, Fun, fun (_Err) -> ok end}]}; |
820 | | -handle_event({segments_to_be_deleted, SegRefs}, |
821 | | - #?MODULE{cfg = #cfg{uid = UId, |
822 | | - log_id = LogId, |
823 | | - directory = Dir, |
824 | | - counter = Counter, |
825 | | - names = Names}, |
826 | | - reader = Reader} = State) -> |
827 | | - ActiveSegs = ra_log_segments:segment_refs(Reader) -- SegRefs, |
828 | | - #{max_size := MaxOpenSegments} = ra_log_segments:info(Reader), |
829 | | - % close all open segments |
830 | | - ok = ra_log_segments:close(Reader), |
831 | | - ?DEBUG("~ts: ~b obsolete segments - remaining: ~b", |
832 | | - [LogId, length(SegRefs), length(ActiveSegs)]), |
833 | | - %% open a new segment with the new max open segment value |
834 | | - Fun = fun () -> |
835 | | - [prim_file:delete(filename:join(Dir, F)) |
836 | | - || {F, _} <- SegRefs], |
837 | | - ok |
838 | | - end, |
839 | | - {State#?MODULE{reader = ra_log_segments:init(UId, Dir, MaxOpenSegments, |
840 | | - random, |
841 | | - ActiveSegs, Names, Counter)}, |
842 | | - |
843 | | - [{bg_work, Fun, fun (_Err) -> ok end}]}; |
| 818 | +handle_event({compaction_result, Result}, |
| 819 | + #?MODULE{reader = Reader0} = State) -> |
| 820 | + {Reader, Effs} = ra_log_segments:handle_compaction_result(Result, Reader0), |
| 821 | + {State#?MODULE{reader = Reader}, Effs}; |
844 | 822 | handle_event({snapshot_written, {SnapIdx, _} = Snap, LiveIndexes, SnapKind}, |
845 | 823 | #?MODULE{cfg = #cfg{uid = UId, |
846 | 824 | names = Names} = Cfg, |
@@ -904,7 +882,9 @@ handle_event({snapshot_written, {SnapIdx, _} = Snap, LiveIndexes, SnapKind}, |
904 | 882 | live_indexes = LiveIndexes, |
905 | 883 | current_snapshot = Snap, |
906 | 884 | snapshot_state = SnapState}, |
907 | | - CompEffs = schedule_compaction(SnapIdx, State), |
| 885 | + CompEffs = ra_log_segments:schedule_compaction(minor, SnapIdx, |
| 886 | + LiveIndexes, |
| 887 | + State#?MODULE.reader), |
908 | 888 | Effects = CompEffs ++ Effects0, |
909 | 889 | {State, Effects}; |
910 | 890 | checkpoint -> |
@@ -1021,7 +1001,9 @@ install_snapshot({SnapIdx, SnapTerm} = IdxTerm, MacMod, LiveIndexes, |
1021 | 1001 | live_indexes = LiveIndexes, |
1022 | 1002 | mem_table = Mt, |
1023 | 1003 | last_written_index_term = IdxTerm}, |
1024 | | - CompEffs = schedule_compaction(SnapIdx, State), |
| 1004 | + CompEffs = ra_log_segments:schedule_compaction(minor, SnapIdx, |
| 1005 | + LiveIndexes, |
| 1006 | + State#?MODULE.reader), |
1025 | 1007 | {ok, State, CompEffs ++ CPEffects}. |
1026 | 1008 |
|
1027 | 1009 |
|
@@ -1326,52 +1308,7 @@ release_resources(MaxOpenSegments, |
1326 | 1308 | %%% Local functions |
1327 | 1309 |
|
1328 | 1310 |
|
1329 | | -schedule_compaction(SnapIdx, #?MODULE{cfg = #cfg{uid = _UId, |
1330 | | - segment_writer = _SegWriter}, |
1331 | | - live_indexes = LiveIndexes, |
1332 | | - reader = Reader0}) -> |
1333 | | - case ra_log_segments:segment_refs(Reader0) of |
1334 | | - [] -> |
1335 | | - []; |
1336 | | - [_ | Compactable] -> |
1337 | | - %% never compact the current segment |
1338 | | - %% only take those who have a range lower than the snapshot index as |
1339 | | - %% we never want to compact more than that |
1340 | | - SegRefs = lists:takewhile(fun ({_Fn, {_Start, End}}) -> |
1341 | | - End =< SnapIdx |
1342 | | - end, lists:reverse(Compactable)), |
1343 | | - % SnapDir = ra_snapshot:current_snapshot_dir(SnapState), |
1344 | | - |
1345 | | - %% TODO: minor compactions should also delete / truncate |
1346 | | - %% segments with completely overwritten indexes |
1347 | | - |
1348 | | - Self = self(), |
1349 | | - Fun = |
1350 | | - fun () -> |
1351 | | - Delete = lists:foldl( |
1352 | | - fun({_Fn, Range} = S, Del) -> |
1353 | | - case ra_seq:in_range(Range, |
1354 | | - LiveIndexes) of |
1355 | | - [] -> |
1356 | | - [S | Del]; |
1357 | | - _ -> |
1358 | | - Del |
1359 | | - end |
1360 | | - end, [], SegRefs), |
1361 | | - %% need to update the ra_servers list of seg refs _before_ |
1362 | | - %% the segments can actually be deleted |
1363 | | - Self ! {ra_log_event, |
1364 | | - {segments_to_be_deleted, Delete}}, |
1365 | | - ok |
1366 | | - end, |
1367 | | - |
1368 | | - [{bg_work, Fun, fun (_Err) -> |
1369 | | - ?WARN("bgwork err ~p", [_Err]), ok |
1370 | | - end}] |
1371 | | - end. |
1372 | | - |
1373 | | - |
1374 | | -%% unly used by resend to wal functionality and doesn't update the mem table |
| 1311 | +%% only used by resend to wal functionality and doesn't update the mem table |
1375 | 1312 | wal_rewrite(#?MODULE{cfg = #cfg{uid = UId, |
1376 | 1313 | wal = Wal} = Cfg, |
1377 | 1314 | range = _Range} = State, |
|
0 commit comments