Wednesday, July 9, 2014

[389-commits] ldap/servers

ldap/servers/slapd/back-ldbm/dblayer.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)

New commits:
commit 16e5ce768bc70a3d30dca139ec8fc9330d071168
Author: Mark Reynolds <mreynolds@redhat.com>
Date: Wed Jul 9 17:39:38 2014 -0400

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!)

diff --git a/ldap/servers/slapd/back-ldbm/dblayer.c b/ldap/servers/slapd/back-ldbm/dblayer.c
index 0fda6d3..4f38845 100644
--- a/ldap/servers/slapd/back-ldbm/dblayer.c
+++ b/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);


--
389 commits mailing list
389-commits@lists.fedoraproject.org
https://admin.fedoraproject.org/mailman/listinfo/389-commits

No comments:

Post a Comment