Skip to content

Instantly share code, notes, and snippets.

@erthink
Last active October 22, 2020 15:37
Show Gist options
  • Select an option

  • Save erthink/933c62a7718421aec4be7100d0570065 to your computer and use it in GitHub Desktop.

Select an option

Save erthink/933c62a7718421aec4be7100d0570065 to your computer and use it in GitHub Desktop.
catch MDBX_CORRUPTED
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