1
0
Эх сурвалжийг харах

Ticket 47654 - Fix regression (deadlock/crash)

Bug Description:  dblayer_close() is called for shutdowns, and when the backend
                  is being disabled for certain tasks like db2bak/bak2db.  The
                  original fix assuemd this fucntion was only called during shutdowns.

Fix Description:  Only free certain ersouces when the server is actually shutting
                  down.

https://fedorahosted.org/389/ticket/47654

Reviewed by: rmeggins(Thanks!)
Mark Reynolds 11 жил өмнө
parent
commit
16e5ce768b

+ 11 - 4
ldap/servers/slapd/back-ldbm/dblayer.c

@@ -2896,6 +2896,7 @@ int dblayer_post_close(struct ldbminfo *li, int dbmode)
     dblayer_private *priv = 0;
     int return_value = 0;
     dblayer_private_env *pEnv;
+    int shutdown = g_get_shutdown();
 
     PR_ASSERT(NULL != li);
     priv = (dblayer_private*)li->li_dblayer_private;
@@ -2928,14 +2929,17 @@ int dblayer_post_close(struct ldbminfo *li, int dbmode)
         charray_free(priv->dblayer_data_directories);
         priv->dblayer_data_directories = NULL;
     }
-    slapi_ch_free_string(&priv->dblayer_dbhome_directory);
-    slapi_ch_free_string(&priv->dblayer_home_directory);
+    if(shutdown){
+        slapi_ch_free_string(&priv->dblayer_dbhome_directory);
+        slapi_ch_free_string(&priv->dblayer_home_directory);
+    }
 
     return return_value;
 }
 
 /* 
- * This function is called when the server is shutting down.
+ * This function is called when the server is shutting down, or when the
+ * backend is being disabled (e.g. backup/restore).
  * This is not safe to call while other threads are calling into the open
  * databases !!!   So: DON'T !
  */
@@ -2945,6 +2949,7 @@ int dblayer_close(struct ldbminfo *li, int dbmode)
     ldbm_instance *inst;
     Object *inst_obj;
     int return_value = 0;
+    int shutdown = g_get_shutdown();
 
     dblayer_pre_close(li);
 
@@ -2957,7 +2962,9 @@ int dblayer_close(struct ldbminfo *li, int dbmode)
     for (inst_obj = objset_first_obj(li->li_instance_set); inst_obj;
          inst_obj = objset_next_obj(li->li_instance_set, inst_obj)) {
         inst = (ldbm_instance *)object_get_data(inst_obj);
-        vlv_close(inst);
+        if(shutdown){
+            vlv_close(inst);
+        }
         be = inst->inst_be;
         if (NULL != be->be_instance_info) {
             return_value |= dblayer_instance_close(be);