From 9f3f5d5ea98ac8ee6f7a694512f310769ecfaa60 Mon Sep 17 00:00:00 2001 From: Mark Reynolds Date: Jan 14 2020 19:25:49 +0000 Subject: Issue 50599 - Remove db region files prior to db recovery Bug Description: If the server crashes then the region files can become corrupted and this prevents the server from starting. Fix Description: If we encounter a disorderly shutdown, then remove the region files so there is a clean slate to start with. relates: https://pagure.io/389-ds-base/issue/50599 Reviewed by: firstyear & lkrispen (Thanks!!) --- diff --git a/ldap/servers/slapd/back-ldbm/dblayer.c b/ldap/servers/slapd/back-ldbm/dblayer.c index 8c93119..3d4abda 100644 --- a/ldap/servers/slapd/back-ldbm/dblayer.c +++ b/ldap/servers/slapd/back-ldbm/dblayer.c @@ -66,6 +66,7 @@ #include #include #include +#include #define DB_OPEN(oflags, db, txnid, file, database, type, flags, mode, rval) \ { \ @@ -1362,9 +1363,20 @@ dblayer_start(struct ldbminfo *li, int dbmode) slapi_log_err(SLAPI_LOG_NOTICE, "dblayer_start", "Clean up db environment and start " "from archive.\n"); } else { + glob_t globbuf; + char file_pattern[MAXPATHLEN]; slapi_log_err(SLAPI_LOG_NOTICE, "dblayer_start", "Detected Disorderly Shutdown last " "time Directory Server was running, recovering database.\n"); slapi_disordely_shutdown(PR_TRUE); + + /* Better wipe out the region files to help ensure a clean start */ + PR_snprintf(file_pattern, MAXPATHLEN, "%s/%s", region_dir, "__db.*"); + if (glob(file_pattern, GLOB_DOOFFS, NULL, &globbuf) == 0) { + for (size_t i = 0; i < globbuf.gl_pathc; i++) { + remove(globbuf.gl_pathv[i]); + } + globfree(&globbuf); + } } } switch (dbmode & DBLAYER_RESTORE_MASK) {