Skip to content

Commit 46507f1

Browse files
committed
Properly update the range of free-list writes when loose pages will be returned to the free-list
1 parent 10e621a commit 46507f1

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

dependencies/lmdb/libraries/liblmdb/mdb.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4251,7 +4251,7 @@ mdb_freelist_save(MDB_txn *txn)
42514251
unsigned end = mop_len;
42524252
mop_len -= len;
42534253
unsigned start = mop_len > 0 ? mop_len - 1 : 0;
4254-
char do_write = env->me_freelist_written_start <= end && env->me_freelist_written_end >= start;
4254+
char do_write = freelist_written_start <= end && freelist_written_end >= start;
42554255
fl_writes[i++] = do_write;
42564256
// determine if it is in the range of actively written pages
42574257
if (freelist_written_start <= end && freelist_written_end >= start) {
@@ -4303,9 +4303,11 @@ mdb_freelist_save(MDB_txn *txn)
43034303
mop[0] = 0;
43044304
}
43054305
mop_len = (mop ? mop[0] : 0) + txn->mt_loose_count;
4306-
//fprintf(stderr, "mop_len %u = mop[0] %u + txn->mt_loose_count %u, reserved_sape,", mop_len, (mop ? mop[0] : 0), txn->mt_loose_count, reserved_space);
4307-
if (freelist_written_start != env->me_freelist_written_start)
4308-
freelist_written_end = env->me_freelist_written_end;
4306+
if (txn->mt_loose_count > 0) {
4307+
// loose pages are appended to the end, so we have to expand the range to the end
4308+
env->me_freelist_written_end = mop_len;
4309+
env->me_freelist_written_start = 1;
4310+
}
43094311
} while(reserved_space != mop_len ||
43104312
(start_written > env->me_freelist_start && env->me_freelist_start > 0) ||
43114313
freecnt < txn->mt_free_pgs[0] ||
@@ -4317,7 +4319,8 @@ mdb_freelist_save(MDB_txn *txn)
43174319
*/
43184320
if (txn->mt_loose_pgs) {
43194321
MDB_page *mp = txn->mt_loose_pgs;
4320-
if (!env->me_pghead) env->me_pghead = mdb_midl_alloc(1);
4322+
if (!env->me_pghead)
4323+
env->me_pghead = mdb_midl_alloc(1);
43214324
unsigned count = txn->mt_loose_count;
43224325
lost_loose += count;
43234326
for (; mp; mp = NEXT_LOOSE_PAGE(mp))

test/index.test.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -417,21 +417,37 @@ describe('lmdb-js', function () {
417417
//await new Promise((resolve) => setTimeout(resolve, 3000));
418418

419419
let promise;
420+
let deleting;
420421
let additive = 'this is more text';
421422
for (let i = 0; i < 6; i++) additive += additive;
422423
let read_txn = db.useReadTransaction();
423-
for (let i = 0; i < 500; i++) {
424+
for (let i = 0; i < 5000; i++) {
424425
if (Math.random() < 0.3) {
425426
read_txn.done();
426427
read_txn = db.useReadTransaction();
427428
}
428429
let text = 'this is a test';
429430
while (random() < 0.95) text += additive;
430-
if (random() < 0.4) promise = db.remove(i % 40);
431-
else promise = db.put(i % 40, text);
431+
if (random() < 0.4) promise = db.remove(random());
432+
else promise = db.put(random(), text);
432433
if (random() < 0.05) {
433434
await promise;
434435
}
436+
if (random() < 0.0001) {
437+
if (!deleting) {
438+
deleting = true;
439+
(async () => {
440+
let j = 0;
441+
console.log('deleting all entries');
442+
for (let { key, value } of db.getRange({})) {
443+
let promise = db.remove(key);
444+
if (++j % 1000 === 0) await promise;
445+
}
446+
console.log('finished deleting all entries', j);
447+
deleting = false;
448+
})();
449+
}
450+
}
435451
}
436452
await promise;
437453
});

0 commit comments

Comments
 (0)