From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christine Caulfield Date: Thu, 12 Jul 2012 11:57:14 +0100 Subject: [Cluster-devel] [PATCH] cman: fix data copy and memory leak when reloading config In-Reply-To: <1341999996-12269-1-git-send-email-fdinitto@redhat.com> References: <1341999996-12269-1-git-send-email-fdinitto@redhat.com> Message-ID: <4FFEAD8A.2030903@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit ACK apart from the comments! On 11/07/12 10:46, Fabio M. Di Nitto wrote: > From: "Fabio M. Di Nitto" > > cman.cluster_id,nodename,two_node information were not copied > from the old to the new config at reload time. This triggers > a problem when drop information from objdb (suboptimal). > > Also fix a possible memory leak when we have reload issues. > > Signed-off-by: Fabio M. Di Nitto > --- > cman/daemon/cman-preconfig.c | 31 +++++++++++++++++++++++++++++-- > 1 files changed, 29 insertions(+), 2 deletions(-) > > diff --git a/cman/daemon/cman-preconfig.c b/cman/daemon/cman-preconfig.c > index 68fec22..22583fe 100644 > --- a/cman/daemon/cman-preconfig.c > +++ b/cman/daemon/cman-preconfig.c > @@ -1478,6 +1478,7 @@ static int cmanpre_reloadconfig(struct objdb_iface_ver0 *objdb, int flush, const > hdb_handle_t cluster_parent_handle_new; > unsigned int config_version = 0, config_version_new = 0; > char *config_value = NULL; > + char str[255]; > > /* don't reload if we've been told to run configless */ > if (getenv("CMAN_NOCONFIG")) { > @@ -1489,16 +1490,16 @@ static int cmanpre_reloadconfig(struct objdb_iface_ver0 *objdb, int flush, const > /* find both /cluster entries */ > objdb->object_find_create(OBJECT_PARENT_HANDLE, "cluster", strlen("cluster"), &find_handle); > objdb->object_find_next(find_handle, &cluster_parent_handle); > + objdb->object_find_next(find_handle, &cluster_parent_handle_new); > + objdb->object_find_destroy(find_handle); > if (!cluster_parent_handle) { > snprintf (error_reason, sizeof(error_reason) - 1, "Cannot find old /cluster/ key in configuration\n"); > goto err; > } > - objdb->object_find_next(find_handle, &cluster_parent_handle_new); > if (!cluster_parent_handle_new) { > snprintf (error_reason, sizeof(error_reason) - 1, "Cannot find new /cluster/ key in configuration\n"); > goto err; > } > - objdb->object_find_destroy(find_handle); > > if (!objdb->object_key_get(cluster_parent_handle, "config_version", strlen("config_version"), (void *)&config_value, NULL)) { > if (config_value) { > @@ -1531,6 +1532,32 @@ static int cmanpre_reloadconfig(struct objdb_iface_ver0 *objdb, int flush, const > /* destroy the old one */ > objdb->object_destroy(cluster_parent_handle); > > + /* > + * create cluster.cman in the new config if it doesn't exists * create cluster.cman in the new config if it doesn't exist > + */ > + objdb->object_find_create(cluster_parent_handle_new, "cman", strlen("cman"), &find_handle); > + if (objdb->object_find_next(find_handle, &object_handle)) { > + objdb->object_create(cluster_parent_handle_new, &object_handle, > + "cman", strlen("cman")); > + } > + objdb->object_find_destroy(find_handle); > + > + /* > + * readd cluster_id/two_node/nodename > + */ * write cluster_id/two_node/nodename > + snprintf(str, sizeof(str) - 1, "%d", cluster_id); > + objdb->object_key_create_typed(object_handle, "cluster_id", > + str, strlen(str) + 1, OBJDB_VALUETYPE_STRING); > + > + if (two_node) { > + snprintf(str, sizeof(str) - 1, "%d", 1); > + objdb->object_key_create_typed(object_handle, "two_node", > + str, strlen(str) + 1, OBJDB_VALUETYPE_STRING); > + } > + > + objdb->object_key_create_typed(object_handle, "nodename", > + nodename, strlen(nodename)+1, OBJDB_VALUETYPE_STRING); > + > /* update the reference to the new config */ > cluster_parent_handle = cluster_parent_handle_new; > >