Blob Blame Raw
From 1d2dca488c7b646dcf5d482414dec2ee032edea6 Mon Sep 17 00:00:00 2001
From: Ludwig Krispenz <lkrispen@redhat.com>
Date: Fri, 6 Dec 2019 13:54:04 +0100
Subject: [PATCH] Ticket 50741-cont bdb_start - Detected Disorderly Shutdown

Bug: Offline import does no longer write guardian file, next
	normal start will raise a Disorderly Shutdown

Fix: The bug was introduced with the fix for #50659 when dblayer_close() was
	removed from import_moain_offline becasue it was called twice in some
	scenarios. But it did miss in ldif2db. Add it there.
	Also correct function reference in error messages

Reviewed by: Thierry, thanks
---
 .../slapd/back-ldbm/db-bdb/bdb_import.c       | 60 +++++++++----------
 .../slapd/back-ldbm/db-bdb/bdb_ldif2db.c      |  3 +
 2 files changed, 33 insertions(+), 30 deletions(-)

diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_import.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_import.c
index 60b6e13eb..15574e60f 100644
--- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_import.c
+++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_import.c
@@ -2274,7 +2274,7 @@ bdb_import_main(void *arg)
                                producer, PR_PRIORITY_NORMAL, PR_GLOBAL_BOUND_THREAD,
                                PR_UNJOINABLE_THREAD, SLAPD_DEFAULT_THREAD_STACKSIZE)) {
                 PRErrorCode prerr = PR_GetError();
-                slapi_log_err(SLAPI_LOG_ERR, "import_main_offline",
+                slapi_log_err(SLAPI_LOG_ERR, "bdb_import_main",
                               "Unable to spawn upgrade dn producer thread, " SLAPI_COMPONENT_NAME_NSPR " error %d (%s)\n",
                               prerr, slapd_pr_strerror(prerr));
                 goto error;
@@ -2285,19 +2285,19 @@ bdb_import_main(void *arg)
                                PR_UNJOINABLE_THREAD,
                                SLAPD_DEFAULT_THREAD_STACKSIZE)) {
                 PRErrorCode prerr = PR_GetError();
-                slapi_log_err(SLAPI_LOG_ERR, "import_main_offline",
+                slapi_log_err(SLAPI_LOG_ERR, "bdb_import_main",
                               "Unable to spawn index producer thread, " SLAPI_COMPONENT_NAME_NSPR " error %d (%s)\n",
                               prerr, slapd_pr_strerror(prerr));
                 goto error;
             }
         } else {
-            import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline", "Beginning import job...");
+            import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main", "Beginning import job...");
             if (!CREATE_THREAD(PR_USER_THREAD, (VFP)import_producer, producer,
                                PR_PRIORITY_NORMAL, PR_GLOBAL_BOUND_THREAD,
                                PR_UNJOINABLE_THREAD,
                                SLAPD_DEFAULT_THREAD_STACKSIZE)) {
                 PRErrorCode prerr = PR_GetError();
-                slapi_log_err(SLAPI_LOG_ERR, "import_main_offline",
+                slapi_log_err(SLAPI_LOG_ERR, "bdb_import_main",
                               "Unable to spawn import producer thread, " SLAPI_COMPONENT_NAME_NSPR " error %d (%s)\n",
                               prerr, slapd_pr_strerror(prerr));
                 goto error;
@@ -2305,9 +2305,9 @@ bdb_import_main(void *arg)
         }
 
         if (0 == job->job_index_buffer_suggestion)
-            import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline", "Index buffering is disabled.");
+            import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main", "Index buffering is disabled.");
         else
-            import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline",
+            import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main",
                               "Index buffering enabled with bucket size %lu",
                               (long unsigned int)job->job_index_buffer_suggestion);
 
@@ -2343,13 +2343,13 @@ bdb_import_main(void *arg)
         if (ret == ERR_IMPORT_ABORTED) {
             /* at least one of the threads has aborted -- shut down ALL
              * of the threads */
-            import_log_notice(job, SLAPI_LOG_ERR, "import_main_offline",
+            import_log_notice(job, SLAPI_LOG_ERR, "bdb_import_main",
                               "Aborting all %s threads...", opstr);
             /* this abort sets the  abort flag on the threads and will block for
              * the exit of all threads
              */
             import_set_abort_flag_all(job, 1);
-            import_log_notice(job, SLAPI_LOG_ERR, "import_main_offline",
+            import_log_notice(job, SLAPI_LOG_ERR, "bdb_import_main",
                               "%s threads aborted.", opstr);
             aborted = 1;
             goto error;
@@ -2359,7 +2359,7 @@ bdb_import_main(void *arg)
             goto error;
         } else if (0 != ret) {
             /* Some horrible fate has befallen the import */
-            import_log_notice(job, SLAPI_LOG_ERR, "import_main_offline",
+            import_log_notice(job, SLAPI_LOG_ERR, "bdb_import_main",
                               "Fatal pass error %d", ret);
             goto error;
         }
@@ -2405,7 +2405,7 @@ bdb_import_main(void *arg)
                 job->first_ID = job->ready_ID + 1;
                 import_free_thread_data(job);
                 job->worker_list = producer;
-                import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline",
+                import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main",
                                   "Beginning pass number %d", job->total_pass + 1);
             } else {
                 /* Bizarro-slapd */
@@ -2416,7 +2416,7 @@ bdb_import_main(void *arg)
 
     /* kill the producer now; we're done */
     if (producer) {
-        import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline", "Cleaning up producer thread...");
+        import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main", "Cleaning up producer thread...");
         producer->command = STOP;
         /* wait for the lead thread to stop */
         while (producer->state != FINISHED) {
@@ -2424,18 +2424,18 @@ bdb_import_main(void *arg)
         }
     }
 
-    import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline", "Indexing complete.  Post-processing...");
+    import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main", "Indexing complete.  Post-processing...");
     /* Now do the numsubordinates attribute */
     /* [610066] reindexed db cannot be used in the following backup/restore */
-    import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline",
+    import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main",
                       "Generating numsubordinates (this may take several minutes to complete)...");
     if ((!(job->flags & FLAG_REINDEXING) || (job->flags & FLAG_DN2RDN)) &&
         (ret = bdb_update_subordinatecounts(be, job, NULL)) != 0) {
-        import_log_notice(job, SLAPI_LOG_ERR, "import_main_offline",
+        import_log_notice(job, SLAPI_LOG_ERR, "bdb_import_main",
                           "Failed to update numsubordinates attributes");
         goto error;
     }
-    import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline",
+    import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main",
                       "Generating numSubordinates complete.");
 
     if (!entryrdn_get_noancestorid()) {
@@ -2446,12 +2446,12 @@ bdb_import_main(void *arg)
         ainfo_get(be, "ancestorid", &ai);
         dblayer_erase_index_file(be, ai, PR_TRUE, 0);
         if ((ret = bdb_ancestorid_create_index(be, job)) != 0) {
-            import_log_notice(job, SLAPI_LOG_ERR, "import_main_offline", "Failed to create ancestorid index");
+            import_log_notice(job, SLAPI_LOG_ERR, "bdb_import_main", "Failed to create ancestorid index");
             goto error;
         }
     }
 
-    import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline", "Flushing caches...");
+    import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main", "Flushing caches...");
 
 /* New way to exit the routine: check the return code.
      * If it's non-zero, delete the database files.
@@ -2462,7 +2462,7 @@ bdb_import_main(void *arg)
 error:
     /* If we fail, the database is now in a mess, so we delete it
        except dry run mode */
-    import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline", "Closing files...");
+    import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main", "Closing files...");
     cache_clear(&job->inst->inst_cache, CACHE_TYPE_ENTRY);
     if (entryrdn_get_switch()) {
         cache_clear(&job->inst->inst_dncache, CACHE_TYPE_DN);
@@ -2476,14 +2476,14 @@ error:
         /* initialize the entry cache */
         if (!cache_init(&(inst->inst_cache), DEFAULT_CACHE_SIZE,
                         DEFAULT_CACHE_ENTRIES, CACHE_TYPE_ENTRY)) {
-            slapi_log_err(SLAPI_LOG_ERR, "import_main_offline",
+            slapi_log_err(SLAPI_LOG_ERR, "bdb_import_main",
                           "cache_init failed.  Server should be restarted.\n");
         }
 
         /* initialize the dn cache */
         if (!cache_init(&(inst->inst_dncache), DEFAULT_DNCACHE_SIZE,
                         DEFAULT_DNCACHE_MAXCOUNT, CACHE_TYPE_DN)) {
-            slapi_log_err(SLAPI_LOG_ERR, "import_main_offline",
+            slapi_log_err(SLAPI_LOG_ERR, "bdb_import_main",
                           "dn cache_init failed.  Server should be restarted.\n");
         }
     }
@@ -2496,7 +2496,7 @@ error:
         }
     } else {
         if (0 != (ret = dblayer_instance_close(job->inst->inst_be))) {
-            import_log_notice(job, SLAPI_LOG_WARNING, "import_main_offline", "Failed to close database");
+            import_log_notice(job, SLAPI_LOG_WARNING, "bdb_import_main", "Failed to close database");
         }
     }
     end = slapi_current_utc_time();
@@ -2508,7 +2508,7 @@ error:
 
         if (job->not_here_skipped) {
             if (job->skipped) {
-                import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline",
+                import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main",
                                   "%s complete.  Processed %lu entries "
                                   "(%d bad entries were skipped, "
                                   "%d entries were skipped because they don't "
@@ -2518,7 +2518,7 @@ error:
                                   job->skipped, job->not_here_skipped,
                                   seconds_to_import, entries_per_second);
             } else {
-                import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline",
+                import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main",
                                   "%s complete.  Processed %lu entries "
                                   "(%d entries were skipped because they don't "
                                   "belong to this database) "
@@ -2529,7 +2529,7 @@ error:
             }
         } else {
             if (job->skipped) {
-                import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline",
+                import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main",
                                   "%s complete.  Processed %lu entries "
                                   "(%d were skipped) in %d seconds. "
                                   "(%.2f entries/sec)",
@@ -2537,7 +2537,7 @@ error:
                                   job->skipped, seconds_to_import,
                                   entries_per_second);
             } else {
-                import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline",
+                import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main",
                                   "%s complete.  Processed %lu entries "
                                   "in %d seconds. (%.2f entries/sec)",
                                   opstr, (long unsigned int)entries_processed,
@@ -2548,7 +2548,7 @@ error:
 
     if (job->flags & (FLAG_DRYRUN | FLAG_UPGRADEDNFORMAT_V1)) {
         if (0 == ret) {
-            import_log_notice(job, SLAPI_LOG_INFO, "import_main_offline", "%s complete.  %s is up-to-date.",
+            import_log_notice(job, SLAPI_LOG_INFO, "bdb_import_main", "%s complete.  %s is up-to-date.",
                               opstr, job->inst->inst_name);
             ret = 0;
             if (job->task) {
@@ -2556,7 +2556,7 @@ error:
             }
             import_all_done(job, ret);
         } else if (NEED_DN_NORM_BT == ret) {
-            import_log_notice(job, SLAPI_LOG_NOTICE, "import_main_offline",
+            import_log_notice(job, SLAPI_LOG_NOTICE, "bdb_import_main",
                               "%s complete. %s needs upgradednformat all.",
                               opstr, job->inst->inst_name);
             if (job->task) {
@@ -2565,7 +2565,7 @@ error:
             import_all_done(job, ret);
             ret = 1;
         } else if (NEED_DN_NORM == ret) {
-            import_log_notice(job, SLAPI_LOG_NOTICE, "import_main_offline",
+            import_log_notice(job, SLAPI_LOG_NOTICE, "bdb_import_main",
                               "%s complete. %s needs upgradednformat.",
                               opstr, job->inst->inst_name);
             if (job->task) {
@@ -2574,7 +2574,7 @@ error:
             import_all_done(job, ret);
             ret = 2;
         } else if (NEED_DN_NORM_SP == ret) {
-            import_log_notice(job, SLAPI_LOG_NOTICE, "import_main_offline",
+            import_log_notice(job, SLAPI_LOG_NOTICE, "bdb_import_main",
                               "%s complete. %s needs upgradednformat spaces.",
                               opstr, job->inst->inst_name);
             if (job->task) {
@@ -2589,7 +2589,7 @@ error:
             }
         }
     } else if (0 != ret) {
-        import_log_notice(job, SLAPI_LOG_ERR, "import_main_offline", "%s failed.", opstr);
+        import_log_notice(job, SLAPI_LOG_ERR, "bdb_import_main", "%s failed.", opstr);
         if (job->task != NULL) {
             slapi_task_finish(job->task, ret);
         }
diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_ldif2db.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_ldif2db.c
index bb411a539..542147c3d 100644
--- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_ldif2db.c
+++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_ldif2db.c
@@ -383,6 +383,9 @@ bdb_ldif2db(Slapi_PBlock *pb)
     /* always use "new" import code now */
     slapi_pblock_set(pb, SLAPI_BACKEND, inst->inst_be);
     ret = bdb_back_ldif2db(pb);
+    if (task_flags & SLAPI_TASK_RUNNING_FROM_COMMANDLINE) {
+        dblayer_close(li, DBLAYER_IMPORT_MODE);
+    }
     if (ret == 0) {
         if (task_flags & SLAPI_TASK_RUNNING_FROM_COMMANDLINE) {
             dblayer_import_file_update(inst);
-- 
2.21.1