@@ -4451,10 +4451,32 @@ mdb_freelist_save(MDB_txn *txn)
44514451 rc = MDB_BAD_TXN ;
44524452 break ;
44534453 }
4454- if (mdb_midl_xmerge (& test_idl , (MDB_ID * ) data .mv_data )) {
4455- fprintf (stderr , "freelist duplicates/overlaps in free list\n" , start_written );
4454+ if (rc = mdb_midl_xmerge (& test_idl , (MDB_ID * ) data .mv_data )) {
4455+ last = * (txnid_t * ) key .mv_data ;
4456+ fprintf (stderr , "freelist duplicates/overlaps in free list %u %u %u %u %u %u %i %i %i %i %i %u %u\n" , last , data .mv_size , start_written ,
4457+ pglast , env -> me_freelist_start , env -> me_freelist_end ,
4458+ freelist_written_start , env -> me_freelist_written_start , freelist_written_end , env -> me_freelist_written_end ,
4459+ i , fl_writes [0 ], fl_writes [1 ]);
4460+ fprintf (stderr , "conflicting freelist to save:\n" );
4461+ mdb_midl_print (stderr , test_idl );
4462+ fprintf (stderr , "from the original freelist to save:\n" );
4463+ mdb_midl_print (stderr , pghead );
4464+ fprintf (stderr , "All the entries that we are saving to the freelist:\n" );
4465+ // print out all the entries that we are saving to the freelist
4466+ test_idl = mdb_midl_alloc (16 );
4467+ key .mv_size = sizeof (start_written );
4468+ key .mv_data = & start_written ;
4469+ rc = mdb_cursor_get (& mc , & key , & data , MDB_SET );
4470+ size_t last = 0 ;
4471+ while (rc == 0 ) {
4472+ last = * (txnid_t * ) key .mv_data ;
4473+ fprintf (stderr , "entry %u:\n" , last );
4474+ mdb_midl_print (stderr , (MDB_ID * ) data .mv_data );
4475+ if (last >= env -> me_freelist_end ) break ;
4476+ rc = mdb_cursor_get (& mc , & key , & data , MDB_NEXT );
4477+ }
44564478 last_error = malloc (100 );
4457- sprintf (last_error , "freelist entry %u not in new free list \n" , start_written );
4479+ sprintf (last_error , "freelist entry %u had bad/duplicate entries, error code %u \n" , last , rc );
44584480 rc = MDB_BAD_TXN ;
44594481 break ;
44604482 }
0 commit comments