-
-
Save erthink/933c62a7718421aec4be7100d0570065 to your computer and use it in GitHub Desktop.
catch MDBX_CORRUPTED
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| diff --git a/src/core.c b/src/core.c | |
| index 122d46b2f..1b8c3aa7a 100644 | |
| --- a/src/core.c | |
| +++ b/src/core.c | |
| @@ -575,6 +575,14 @@ number_of_ovpages(const MDBX_env *env, size_t bytes) { | |
| return bytes2pgno(env, PAGEHDRSZ - 1 + bytes) + 1; | |
| } | |
| +static inline int corrupted() { | |
| + fflush(NULL); | |
| + abort(); | |
| + return MDBX_CORRUPTED; | |
| +} | |
| + | |
| +#define MDBX_CORRUPTED corrupted() | |
| + | |
| __cold static int MDBX_PRINTF_ARGS(2, 3) | |
| bad_page(const MDBX_page *mp, const char *fmt, ...) { | |
| if (mdbx_log_enabled(MDBX_LOG_ERROR)) { | |
| @@ -8555,7 +8563,7 @@ mdbx_validate_meta(MDBX_env *env, MDBX_meta *const meta, uint64_t *filesize, | |
| if (meta->mm_geo.next < MIN_PAGENO || meta->mm_geo.next - 1 > MAX_PAGENO) { | |
| mdbx_warning("meta[%u] has invalid next-pageno (%" PRIaPGNO "), skip it", | |
| meta_number, meta->mm_geo.next); | |
| - return MDBX_CORRUPTED; | |
| + return -30796; | |
| } | |
| /* LY: check filesize & used_bytes */ | |
| @@ -8569,7 +8577,7 @@ mdbx_validate_meta(MDBX_env *env, MDBX_meta *const meta, uint64_t *filesize, | |
| mdbx_warning("meta[%u] used-bytes (%" PRIu64 ") beyond filesize (%" PRIu64 | |
| "), skip it", | |
| meta_number, used_bytes, *filesize); | |
| - return MDBX_CORRUPTED; | |
| + return -30796; | |
| } | |
| } | |
| if (meta->mm_geo.next - 1 > MAX_PAGENO || used_bytes > MAX_MAPSIZE) { | |
| @@ -8629,7 +8637,7 @@ mdbx_validate_meta(MDBX_env *env, MDBX_meta *const meta, uint64_t *filesize, | |
| mdbx_warning("meta[%u] next-pageno (%" PRIaPGNO | |
| ") is beyond end-pgno (%" PRIaPGNO "), skip it", | |
| meta_number, meta->mm_geo.next, meta->mm_geo.now); | |
| - return MDBX_CORRUPTED; | |
| + return -30796; | |
| } | |
| /* LY: GC root */ | |
| @@ -8639,12 +8647,12 @@ mdbx_validate_meta(MDBX_env *env, MDBX_meta *const meta, uint64_t *filesize, | |
| meta->mm_dbs[FREE_DBI].md_leaf_pages || | |
| meta->mm_dbs[FREE_DBI].md_overflow_pages) { | |
| mdbx_warning("meta[%u] has false-empty GC, skip it", meta_number); | |
| - return MDBX_CORRUPTED; | |
| + return -30796; | |
| } | |
| } else if (meta->mm_dbs[FREE_DBI].md_root >= meta->mm_geo.next) { | |
| mdbx_warning("meta[%u] has invalid GC-root %" PRIaPGNO ", skip it", | |
| meta_number, meta->mm_dbs[FREE_DBI].md_root); | |
| - return MDBX_CORRUPTED; | |
| + return -30796; | |
| } | |
| /* LY: MainDB root */ | |
| @@ -8654,12 +8662,12 @@ mdbx_validate_meta(MDBX_env *env, MDBX_meta *const meta, uint64_t *filesize, | |
| meta->mm_dbs[MAIN_DBI].md_leaf_pages || | |
| meta->mm_dbs[MAIN_DBI].md_overflow_pages) { | |
| mdbx_warning("meta[%u] has false-empty maindb", meta_number); | |
| - return MDBX_CORRUPTED; | |
| + return -30796; | |
| } | |
| } else if (meta->mm_dbs[MAIN_DBI].md_root >= meta->mm_geo.next) { | |
| mdbx_warning("meta[%u] has invalid maindb-root %" PRIaPGNO ", skip it", | |
| meta_number, meta->mm_dbs[MAIN_DBI].md_root); | |
| - return MDBX_CORRUPTED; | |
| + return -30796; | |
| } | |
| if (safe64_read(&meta->mm_txnid_a) == 0) { | |
| @@ -8681,7 +8689,7 @@ static __cold int mdbx_read_header(MDBX_env *env, MDBX_meta *dest, | |
| memset(dest, 0, sizeof(MDBX_meta)); | |
| dest->mm_datasync_sign = MDBX_DATASIGN_WEAK; | |
| - rc = MDBX_CORRUPTED; | |
| + rc = -30796; | |
| /* Read twice all meta pages so we can find the latest one. */ | |
| unsigned loop_limit = NUM_METAS * 2; | |
| @@ -8758,7 +8766,7 @@ static __cold int mdbx_read_header(MDBX_env *env, MDBX_meta *dest, | |
| if (rc == MDBX_SUCCESS) { | |
| /* TODO: try to restore the database by fully checking b-tree structure | |
| * for the each meta page, if the corresponding option was given */ | |
| - return MDBX_CORRUPTED; | |
| + return -30796; | |
| } | |
| return rc; | |
| } | |
| @@ -9773,7 +9781,7 @@ static __cold int mdbx_setup_dxb(MDBX_env *env, const int lck_rc) { | |
| mdbx_error("last-page beyond end-of-file (last %" PRIaPGNO | |
| ", have %" PRIaPGNO ")", | |
| meta.mm_geo.next, bytes2pgno(env, (size_t)filesize_before)); | |
| - return MDBX_CORRUPTED; | |
| + return -30796; | |
| } | |
| if (env->me_flags & MDBX_RDONLY) { | |
| @@ -9839,7 +9847,7 @@ static __cold int mdbx_setup_dxb(MDBX_env *env, const int lck_rc) { | |
| if (unlikely(meta_clash_mask)) { | |
| if (/* not recovery mode */ env->me_stuck_meta < 0) { | |
| mdbx_error("meta-pages are clashed: mask 0x%d", meta_clash_mask); | |
| - return MDBX_CORRUPTED; | |
| + return -30796; | |
| } else { | |
| mdbx_warning("ignore meta-pages clashing (mask 0x%d) in recovery mode", | |
| meta_clash_mask); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment