@@ -558,10 +558,13 @@ handle_call({fold,
558
558
Manifest = lists :reverse (leveled_imanifest :to_list (State # state .manifest )),
559
559
Folder =
560
560
fun () ->
561
- fold_from_sequence (StartSQN ,
562
- {FilterFun , InitAccFun , FoldFun },
563
- Acc ,
564
- Manifest )
561
+ fold_from_sequence (
562
+ StartSQN ,
563
+ State # state .journal_sqn ,
564
+ {FilterFun , InitAccFun , FoldFun },
565
+ Acc ,
566
+ Manifest
567
+ )
565
568
end ,
566
569
case By of
567
570
as_ink ->
@@ -1211,8 +1214,12 @@ start_new_activejournal(SQN, RootPath, CDBOpts) ->
1211
1214
1212
1215
1213
1216
1214
- - spec fold_from_sequence (integer (), {fun (), fun (), fun ()}, any (), list ())
1215
- -> any ().
1217
+ - spec fold_from_sequence (
1218
+ non_neg_integer (),
1219
+ pos_integer (),
1220
+ {fun (), fun (), fun ()},
1221
+ any (),
1222
+ list ()) -> any ().
1216
1223
% % @doc
1217
1224
% %
1218
1225
% % Scan from the starting sequence number to the end of the Journal. Apply
@@ -1226,62 +1233,79 @@ start_new_activejournal(SQN, RootPath, CDBOpts) ->
1226
1233
% % over in batches using foldfile_between_sequence/7. The batch is a range of
1227
1234
% % sequence numbers (so the batch size may be << ?LOADING_BATCH) in compacted
1228
1235
% % files
1229
- fold_from_sequence (_MinSQN , _FoldFuns , Acc , []) ->
1236
+ fold_from_sequence (_MinSQN , _JournalSQN , _FoldFuns , Acc , []) ->
1230
1237
Acc ;
1231
- fold_from_sequence (MinSQN , FoldFuns , Acc , [{LowSQN , FN , Pid , _LK }|Rest ])
1238
+ fold_from_sequence (MinSQN , JournalSQN , FoldFuns , Acc , [{LowSQN , FN , Pid , _LK }|Rest ])
1232
1239
when LowSQN >= MinSQN ->
1233
- {NextMinSQN , Acc0 } = foldfile_between_sequence (MinSQN ,
1234
- MinSQN + ? LOADING_BATCH ,
1235
- FoldFuns ,
1236
- Acc ,
1237
- Pid ,
1238
- undefined ,
1239
- FN ),
1240
- fold_from_sequence (NextMinSQN , FoldFuns , Acc0 , Rest );
1241
- fold_from_sequence (MinSQN , FoldFuns , Acc , [{_LowSQN , FN , Pid , _LK }|Rest ]) ->
1240
+ {NextMinSQN , Acc0 } =
1241
+ foldfile_between_sequence (
1242
+ MinSQN ,
1243
+ MinSQN + ? LOADING_BATCH ,
1244
+ JournalSQN ,
1245
+ FoldFuns ,
1246
+ Acc ,
1247
+ Pid ,
1248
+ undefined ,
1249
+ FN
1250
+ ),
1251
+ fold_from_sequence (NextMinSQN , JournalSQN , FoldFuns , Acc0 , Rest );
1252
+ fold_from_sequence (
1253
+ MinSQN , JournalSQN , FoldFuns , Acc , [{_LowSQN , FN , Pid , _LK }|Rest ]) ->
1242
1254
% If this file has a LowSQN less than the minimum, we can skip it if the
1243
1255
% next file also has a LowSQN below the minimum
1244
1256
{NextMinSQN , Acc0 } =
1245
1257
case Rest of
1246
1258
[] ->
1247
- foldfile_between_sequence (MinSQN ,
1248
- MinSQN + ? LOADING_BATCH ,
1249
- FoldFuns ,
1250
- Acc ,
1251
- Pid ,
1252
- undefined ,
1253
- FN );
1259
+ foldfile_between_sequence (
1260
+ MinSQN ,
1261
+ MinSQN + ? LOADING_BATCH ,
1262
+ JournalSQN ,
1263
+ FoldFuns ,
1264
+ Acc ,
1265
+ Pid ,
1266
+ undefined ,
1267
+ FN
1268
+ );
1254
1269
[{NextSQN , _NxtFN , _NxtPid , _NxtLK }|_Rest ] when NextSQN > MinSQN ->
1255
- foldfile_between_sequence (MinSQN ,
1256
- MinSQN + ? LOADING_BATCH ,
1257
- FoldFuns ,
1258
- Acc ,
1259
- Pid ,
1260
- undefined ,
1261
- FN );
1270
+ foldfile_between_sequence (
1271
+ MinSQN ,
1272
+ MinSQN + ? LOADING_BATCH ,
1273
+ JournalSQN ,
1274
+ FoldFuns ,
1275
+ Acc ,
1276
+ Pid ,
1277
+ undefined ,
1278
+ FN
1279
+ );
1262
1280
_ ->
1263
1281
{MinSQN , Acc }
1264
1282
end ,
1265
- fold_from_sequence (NextMinSQN , FoldFuns , Acc0 , Rest ).
1283
+ fold_from_sequence (NextMinSQN , JournalSQN , FoldFuns , Acc0 , Rest ).
1266
1284
1267
- foldfile_between_sequence (MinSQN , MaxSQN , FoldFuns ,
1268
- Acc , CDBpid , StartPos , FN ) ->
1285
+ foldfile_between_sequence (
1286
+ MinSQN , MaxSQN , JournalSQN , FoldFuns , Acc , CDBpid , StartPos , FN ) ->
1269
1287
{FilterFun , InitAccFun , FoldFun } = FoldFuns ,
1270
1288
InitBatchAcc = {MinSQN , MaxSQN , InitAccFun (FN , MinSQN )},
1271
1289
1272
1290
case leveled_cdb :cdb_scan (CDBpid , FilterFun , InitBatchAcc , StartPos ) of
1273
1291
{eof , {AccMinSQN , _AccMaxSQN , BatchAcc }} ->
1274
1292
{AccMinSQN , FoldFun (BatchAcc , Acc )};
1293
+ {_LastPosition , {AccMinSQN , _AccMaxSQN , BatchAcc }}
1294
+ when AccMinSQN >= JournalSQN ->
1295
+ {AccMinSQN , FoldFun (BatchAcc , Acc )};
1275
1296
{LastPosition , {_AccMinSQN , _AccMaxSQN , BatchAcc }} ->
1276
1297
UpdAcc = FoldFun (BatchAcc , Acc ),
1277
1298
NextSQN = MaxSQN + 1 ,
1278
- foldfile_between_sequence (NextSQN ,
1279
- NextSQN + ? LOADING_BATCH ,
1280
- FoldFuns ,
1281
- UpdAcc ,
1282
- CDBpid ,
1283
- LastPosition ,
1284
- FN )
1299
+ foldfile_between_sequence (
1300
+ NextSQN ,
1301
+ NextSQN + ? LOADING_BATCH ,
1302
+ JournalSQN ,
1303
+ FoldFuns ,
1304
+ UpdAcc ,
1305
+ CDBpid ,
1306
+ LastPosition ,
1307
+ FN
1308
+ )
1285
1309
end .
1286
1310
1287
1311
0 commit comments