From mboxrd@z Thu Jan 1 00:00:00 1970 From: Fabio M. Di Nitto Date: Thu, 22 Sep 2011 10:43:41 +0200 Subject: [Cluster-devel] [PATCH] cman: allow late close of stderr file descriptor and free resources Message-ID: <1316681021-5872-1-git-send-email-fdinitto@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit In case debug is enabled, and cman is executed via init script, we leak a fd associated to a file that will grow indefinetely in size. We address this situation by adding a very specific cman_tool startup option associated to init script, to tell cman to perform a late close of stderr and freeing correctly all resources. Resolves: rhbz#740385 Signed-off-by: Fabio M. Di Nitto --- cman/cman_tool/cman_tool.h | 1 + cman/cman_tool/join.c | 4 ++++ cman/cman_tool/main.c | 7 ++++++- cman/daemon/ais.c | 11 +++++++++++ cman/init.d/cman.in | 2 +- 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/cman/cman_tool/cman_tool.h b/cman/cman_tool/cman_tool.h index e84b491..e1250ee 100644 --- a/cman/cman_tool/cman_tool.h +++ b/cman/cman_tool/cman_tool.h @@ -84,6 +84,7 @@ struct commandline int remove; int force; int verbose; + int nostderr_debug; int nodeid; int timeout; unsigned int config_version; diff --git a/cman/cman_tool/join.c b/cman/cman_tool/join.c index caa5bf6..a33c8b4 100644 --- a/cman/cman_tool/join.c +++ b/cman/cman_tool/join.c @@ -186,6 +186,10 @@ int join(commandline_t *comline, char *main_envp[]) snprintf(scratch, sizeof(scratch), "CMAN_DEBUG=%d", comline->verbose); envp[envptr++] = strdup(scratch); } + if (comline->nostderr_debug) { + snprintf(scratch, sizeof(scratch), "CMAN_NOSTDERR_DEBUG=true"); + envp[envptr++] = strdup(scratch); + } if (comline->noconfig_opt) { envp[envptr++] = strdup("CMAN_NOCONFIG=true"); snprintf(config_modules, sizeof(config_modules), "cmanpreconfig%s", diff --git a/cman/cman_tool/main.c b/cman/cman_tool/main.c index 61d29aa..88612c4 100644 --- a/cman/cman_tool/main.c +++ b/cman/cman_tool/main.c @@ -12,7 +12,7 @@ #define DEFAULT_CONFIG_MODULE "xmlconfig" -#define OPTION_STRING ("m:n:v:e:2p:c:i:N:t:o:k:F:C:VAPwfqah?XD::Sd::r::") +#define OPTION_STRING ("m:n:v:e:2p:c:i:N:t:o:k:F:C:VAPwfqazh?XD::Sd::r::") #define OP_JOIN 1 #define OP_LEAVE 2 #define OP_EXPECTED 3 @@ -62,6 +62,7 @@ static void print_usage(int subcmd) printf(" -D What to do about the config. Default (without -D) is to\n"); printf(" validate the config. with -D no validation will be done.\n"); printf(" -Dwarn will print errors but allow the operation to continue.\n"); + printf(" -z Disable stderr debugging output.\n"); printf("\n"); } @@ -1047,6 +1048,10 @@ static void decode_arguments(int argc, char *argv[], commandline_t *comline) comline->verbose = 255; break; + case 'z': + comline->nostderr_debug = 1; + break; + case 'w': comline->wait_opt = TRUE; break; diff --git a/cman/daemon/ais.c b/cman/daemon/ais.c index 05cb8d7..6b5640a 100644 --- a/cman/daemon/ais.c +++ b/cman/daemon/ais.c @@ -14,6 +14,8 @@ #include #include #include +#include +#include /* corosync headers */ #include @@ -220,6 +222,15 @@ static int cman_exec_init_fn(struct corosync_api_v1 *api) api->tpg_init(&group_handle, cman_deliver_fn, cman_confchg_fn); api->tpg_join(group_handle, cman_group, 1); + if (getenv("CMAN_NOSTDERR_DEBUG")) { + int tmpfd; + tmpfd = open("/dev/null", O_RDWR); + if (tmpfd > -1 && tmpfd != STDERR_FILENO) { + dup2(tmpfd, STDERR_FILENO); + close(tmpfd); + } + } + return 0; } diff --git a/cman/init.d/cman.in b/cman/init.d/cman.in index fecefea..d0c6f70 100644 --- a/cman/init.d/cman.in +++ b/cman/init.d/cman.in @@ -556,7 +556,7 @@ start_cman() return 1 fi - cman_tool -t $CMAN_CLUSTER_TIMEOUT -w join $cman_join_opts > $tmpfile 2>&1 & + cman_tool -z -t $CMAN_CLUSTER_TIMEOUT -w join $cman_join_opts > $tmpfile 2>&1 & while status cman_tool >/dev/null 2>&1; do sleep 0.2 -- 1.7.4.4