@@ -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