Skip to content

Commit 3237d61

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 3237d61

File tree

1 file changed

+13
-3
lines changed
  • dependencies/lmdb/libraries/liblmdb

1 file changed

+13
-3
lines changed

dependencies/lmdb/libraries/liblmdb/mdb.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4251,12 +4251,15 @@ 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) {
42584258
// we will reserve one entry for size and potentially one extra entry in case we are splitting an entry
42594259
data.mv_size = (len + (head_id < pglast ? 2 : 1)) * sizeof(pgno_t);
4260+
if (txn->mt_loose_count > 0) {
4261+
fprintf(stderr, "Reserving freelist %u from %u-%u, size: %u, txn->mt_loose_count: %u, mop[0] %u\n", head_id, mop_len, end, data.mv_size, txn->mt_loose_count, mop[0]);
4262+
}
42604263
if (data.mv_size <= 0) {
42614264
sprintf(last_error, "attempt to reserve freelist had a data entry with zero-size, last len %i\n", len);
42624265
return MDB_BAD_TXN;
@@ -4303,9 +4306,14 @@ mdb_freelist_save(MDB_txn *txn)
43034306
mop[0] = 0;
43044307
}
43054308
mop_len = (mop ? mop[0] : 0) + txn->mt_loose_count;
4309+
if (txn->mt_loose_count > 0) {
4310+
// loose pages are appended to the end, so we have to expand the range to the end
4311+
env->me_freelist_written_end = mop_len;
4312+
env->me_freelist_written_start = 1;
4313+
}
43064314
//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);
43074315
if (freelist_written_start != env->me_freelist_written_start)
4308-
freelist_written_end = env->me_freelist_written_end;
4316+
freelist_written_end = env->me_freelist_written_end;
43094317
} while(reserved_space != mop_len ||
43104318
(start_written > env->me_freelist_start && env->me_freelist_start > 0) ||
43114319
freecnt < txn->mt_free_pgs[0] ||
@@ -4317,8 +4325,10 @@ mdb_freelist_save(MDB_txn *txn)
43174325
*/
43184326
if (txn->mt_loose_pgs) {
43194327
MDB_page *mp = txn->mt_loose_pgs;
4320-
if (!env->me_pghead) env->me_pghead = mdb_midl_alloc(1);
4328+
if (!env->me_pghead)
4329+
env->me_pghead = mdb_midl_alloc(1);
43214330
unsigned count = txn->mt_loose_count;
4331+
fprintf(stderr, "Returning %u loose pages to me_pghead\n", count);
43224332
lost_loose += count;
43234333
for (; mp; mp = NEXT_LOOSE_PAGE(mp))
43244334
mdb_midl_append(&env->me_pghead, mp->mp_pgno);

0 commit comments

Comments
 (0)