mirror of
				https://github.com/isar/libmdbx.git
				synced 2025-11-01 03:48:57 +08:00 
			
		
		
		
	mdbx: refine mdbx_update_gc(), add extra audit.
Change-Id: I70b5bba977ab6fadfdffed722226ebe02abe252c
This commit is contained in:
		
							
								
								
									
										41
									
								
								src/mdbx.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								src/mdbx.c
									
									
									
									
									
								
							| @@ -3576,7 +3576,7 @@ static int mdbx_prep_backlog(MDBX_txn *txn, MDBX_cursor *mc) { | ||||
| /* Count all the pages in each DB and in the freelist and make sure | ||||
|  * it matches the actual number of pages being used. | ||||
|  * All named DBs must be open for a correct count. */ | ||||
| static int mdbx_audit(MDBX_txn *txn, unsigned befree_stored) { | ||||
| static __cold int mdbx_audit(MDBX_txn *txn, unsigned befree_stored) { | ||||
|   MDBX_val key, data; | ||||
|  | ||||
|   const pgno_t pending = | ||||
| @@ -3674,12 +3674,11 @@ static int mdbx_update_gc(MDBX_txn *txn) { | ||||
|   (void)dbg_prefix_mode; | ||||
|   mdbx_trace("\n>>> @%" PRIaTXN, txn->mt_txnid); | ||||
|  | ||||
|   unsigned befree_stored = 0, loop = 0; | ||||
|   MDBX_cursor mc; | ||||
|   int rc = mdbx_cursor_init(&mc, txn, FREE_DBI); | ||||
|   if (unlikely(rc != MDBX_SUCCESS)) | ||||
|     return rc; | ||||
|  | ||||
|   unsigned befree_stored = 0, loop = 0; | ||||
|     goto bailout; | ||||
|  | ||||
| retry: | ||||
|   mdbx_trace(" >> restart"); | ||||
| @@ -3762,6 +3761,11 @@ retry: | ||||
|  | ||||
|     // handle loose pages - put ones into the reclaimed- or befree-list | ||||
|     mdbx_tassert(txn, mdbx_pnl_check(env->me_reclaimed_pglist, true)); | ||||
|     if (mdbx_audit_enabled()) { | ||||
|       rc = mdbx_audit(txn, befree_stored); | ||||
|       if (unlikely(rc != MDBX_SUCCESS)) | ||||
|         goto bailout; | ||||
|     } | ||||
|     if (txn->mt_loose_pages) { | ||||
|       /* Return loose page numbers to me_reclaimed_pglist, | ||||
|        * though usually none are left at this point. | ||||
| @@ -3772,7 +3776,7 @@ retry: | ||||
|          * since unable to return them to me_reclaimed_pglist. */ | ||||
|         if (unlikely((rc = mdbx_pnl_need(&txn->mt_befree_pages, | ||||
|                                          txn->mt_loose_count)) != 0)) | ||||
|           return rc; | ||||
|           goto bailout; | ||||
|         for (MDBX_page *mp = txn->mt_loose_pages; mp; mp = NEXT_LOOSE_PAGE(mp)) | ||||
|           mdbx_pnl_xappend(txn->mt_befree_pages, mp->mp_pgno); | ||||
|         mdbx_trace("%s: append %u loose-pages to befree-pages", dbg_prefix_mode, | ||||
| @@ -3851,6 +3855,11 @@ retry: | ||||
|  | ||||
|       txn->mt_loose_pages = NULL; | ||||
|       txn->mt_loose_count = 0; | ||||
|       if (mdbx_audit_enabled()) { | ||||
|         rc = mdbx_audit(txn, befree_stored); | ||||
|         if (unlikely(rc != MDBX_SUCCESS)) | ||||
|           goto bailout; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     // handle reclaimed pages - return suitable into unallocated space | ||||
| @@ -3884,6 +3893,11 @@ retry: | ||||
|             dbg_prefix_mode, txn->mt_next_pgno - tail, tail, txn->mt_next_pgno); | ||||
|         txn->mt_next_pgno = tail; | ||||
|         mdbx_tassert(txn, mdbx_pnl_check(env->me_reclaimed_pglist, true)); | ||||
|         if (mdbx_audit_enabled()) { | ||||
|           rc = mdbx_audit(txn, befree_stored); | ||||
|           if (unlikely(rc != MDBX_SUCCESS)) | ||||
|             goto bailout; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
| @@ -3931,6 +3945,11 @@ retry: | ||||
|     mdbx_tassert(txn, txn->mt_loose_count == 0); | ||||
|  | ||||
|     mdbx_trace(" >> reserving"); | ||||
|     if (mdbx_audit_enabled()) { | ||||
|       rc = mdbx_audit(txn, befree_stored); | ||||
|       if (unlikely(rc != MDBX_SUCCESS)) | ||||
|         goto bailout; | ||||
|     } | ||||
|     const unsigned amount = | ||||
|         env->me_reclaimed_pglist ? MDBX_PNL_SIZE(env->me_reclaimed_pglist) : 0; | ||||
|     const unsigned left = amount - settled; | ||||
| @@ -4213,6 +4232,11 @@ retry: | ||||
|                  (unsigned)(to - env->me_reclaimed_pglist), to[-1], fill_gc_id); | ||||
|  | ||||
|       left -= chunk; | ||||
|       if (mdbx_audit_enabled()) { | ||||
|         rc = mdbx_audit(txn, befree_stored + amount - left); | ||||
|         if (unlikely(rc != MDBX_SUCCESS)) | ||||
|           goto bailout; | ||||
|       } | ||||
|       if (left == 0) { | ||||
|         rc = MDBX_SUCCESS; | ||||
|         break; | ||||
| @@ -4240,11 +4264,12 @@ retry: | ||||
|     goto retry; | ||||
|   } | ||||
|  | ||||
|   mdbx_tassert(txn, | ||||
|                txn->mt_lifo_reclaimed == NULL || | ||||
|                    cleaned_gc_slot == MDBX_PNL_SIZE(txn->mt_lifo_reclaimed)); | ||||
|  | ||||
| bailout: | ||||
|   if (txn->mt_lifo_reclaimed) { | ||||
|     mdbx_tassert(txn, | ||||
|                  rc != MDBX_SUCCESS || | ||||
|                      cleaned_gc_slot == MDBX_PNL_SIZE(txn->mt_lifo_reclaimed)); | ||||
|     MDBX_PNL_SIZE(txn->mt_lifo_reclaimed) = 0; | ||||
|     if (txn != env->me_txn0) { | ||||
|       mdbx_txl_free(txn->mt_lifo_reclaimed); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user