From f338193a707ae5b6b5ab6f820bea32612c4311bb Mon Sep 17 00:00:00 2001 From: Csaba Henk Date: Sun, 3 Apr 2011 15:44:17 +0000 Subject: syncdaemon: refine intermal configuration of gsyncd Signed-off-by: Csaba Henk Signed-off-by: Vijay Bellur BUG: 2561 (gsyncd command's must be preconfigured) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2561 --- cli/src/cli-rpc-ops.c | 63 ++++++++++++++++++++++-- xlators/mgmt/glusterd/src/glusterd.c | 95 +++++++++++++++++++++++------------- 2 files changed, 121 insertions(+), 37 deletions(-) diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 110962c6c29..c358192d2fa 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -26,6 +26,7 @@ #ifndef GSYNC_CONF #define GSYNC_CONF "gsync/gsyncd.conf" #endif +#define DEFAULT_LOG_FILE_DIRECTORY DATADIR "/log/glusterfs" #include "cli.h" #include "compat-errno.h" @@ -2609,7 +2610,7 @@ gf_cli3_1_gsync_get_param_file (char *prmfile, const char *ext, char *master, ch char buff[PATH_MAX] = {0, }; char cmd[PATH_MAX] = {0, }; char *ptr = NULL; - char pidfolder[PATH_MAX] = {0, }; + char prmfolder[PATH_MAX] = {0, }; char *dotp = NULL; int ret = 0; @@ -2637,7 +2638,7 @@ gf_cli3_1_gsync_get_param_file (char *prmfile, const char *ext, char *master, ch ptr = fgets(buff, sizeof(buff), in); if (ptr) { buff[strlen(buff)-1]='\0'; //strip off \n - snprintf (pidfolder, PATH_MAX, "%s/gsync/%s", gl_workdir, buff); + snprintf (prmfolder, PATH_MAX, "%s/gsync/%s", gl_workdir, buff); } else { ret = -1; goto out; @@ -2648,7 +2649,7 @@ gf_cli3_1_gsync_get_param_file (char *prmfile, const char *ext, char *master, ch ptr = fgets(buff, sizeof(buff), in); if (ptr) { buff[strlen(buff)-1]='\0'; //strip off \n - snprintf (prmfile, PATH_MAX, "%s/%s.pid", pidfolder, buff); + snprintf (prmfile, PATH_MAX, "%s/%s.%s", prmfolder, buff, ext); } out: @@ -2704,7 +2705,7 @@ gf_cli3_1_start_gsync (char *master, char *slave, char *gl_workdir) if (ret == -1) { ret = -1; gf_log ("", GF_LOG_WARNING, "failed to construct the " - "prmfile string"); + "pidfile string"); goto out; } @@ -2766,6 +2767,60 @@ gf_cli3_1_start_gsync (char *master, char *slave, char *gl_workdir) goto out; } + ret = gf_cli3_1_gsync_get_param_file (prmfile, "log", master, + slave, DEFAULT_LOG_FILE_DIRECTORY); + if (ret == -1) { + gf_log ("", GF_LOG_WARNING, "failed to construct the " + "logfile string"); + goto out; + } + /* XXX "mkdir -p": eventually this should be made into a library routine */ + tslash = strrchr(prmfile, '/'); + if (tslash) { + char *slash = prmfile; + struct stat st = {0,}; + + *tslash = '\0'; + if (*slash == '/') + slash++; + while (slash) { + slash = strchr (slash, '/'); + if (slash) + *slash = '\0'; + ret = mkdir (prmfile, 0777); + if (ret == -1 && errno != EEXIST) { + gf_log ("", GF_LOG_DEBUG, "mkdir failed (%s)", + strerror (errno)); + goto out; + } + if (slash) { + *slash = '/'; + slash++; + } + } + ret = stat (prmfile, &st); + if (ret == -1 || !S_ISDIR (st.st_mode)) { + ret = -1; + gf_log ("", GF_LOG_DEBUG, "mkdir failed (%s)", + strerror (errno)); + goto out; + } + *tslash = '/'; + } + + ret = snprintf (cmd, PATH_MAX, GSYNCD_PREFIX "/gsyncd -c %s/%s %s %s" + " --config-set log-file %s", gl_workdir, + GSYNC_CONF, master, slave, prmfile); + if (ret >= PATH_MAX) + ret = -1; + if (ret != -1) + ret = system (cmd) ? -1 : 0; + if (ret == -1) { + gf_log ("", GF_LOG_WARNING, "failed to set status file " + "for %s %s", master, slave); + goto out; + } + memset (cmd, 0, sizeof (cmd)); ret = snprintf (cmd, PATH_MAX, GSYNCD_PREFIX "/gsyncd --monitor -c %s/%s %s %s" , gl_workdir, GSYNC_CONF, master, slave); diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index 004973afb62..b4df630d0bd 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -229,6 +229,66 @@ out: return ret; } +static int +configure_syncaemon (xlator_t *this, const char *workdir) +{ + int ret = 0; +#if SYNCDAEMON_COMPILE + char voldir[PATH_MAX] = {0,}; + char cmd[4096] = {0,}; + int blen = 0; + + snprintf (voldir, PATH_MAX, "%s/gsync", workdir); + ret = mkdir (voldir, 0777); + if ((-1 == ret) && (errno != EEXIST)) { + gf_log (this->name, GF_LOG_CRITICAL, + "Unable to create gsync directory %s (%s)", + voldir, strerror (errno)); + return -1; + } + + blen = snprintf (cmd, PATH_MAX, GSYNCD_PREFIX"/gsyncd -c %s/"GSYNC_CONF + " --config-set-rx ", workdir); + + /* remote-gsyncd */ + strcpy (cmd + blen, + "remote-gsyncd " + "'"GSYNCD_PREFIX"/gsyncd --gluster-command "GFS_PREFIX"/sbin/glusterfs' " + ". ."); + ret = system (cmd); + if (ret) + goto out; + + strcpy (cmd + blen, + "remote-gsyncd /usr/local/libexec/glusterfs/gsyncd . ^ssh:"); + ret = system (cmd); + if (ret) + goto out; + + /* gluster-command */ + /* XXX $sbindir should be used (throughout the codebase) */ + strcpy (cmd + blen, + "gluster-command "GFS_PREFIX"/sbin/glusterfs . ."); + ret = system (cmd); + if (ret) + goto out; + + /* ssh-command */ + strcpy (cmd + blen, + "ssh-command 'ssh -oPasswordAuthentication=no' . ."); + ret = system (cmd); + if (ret) + goto out; + + out: +#else + (void)this; + (void)workdir; +#endif + return ret ? -1 : 0; +} + + /* * init - called during glusterd initialization * @@ -247,7 +307,6 @@ init (xlator_t *this) char dirname [PATH_MAX]; char cmd_log_filename [PATH_MAX] = {0,}; int first_time = 0; - char cmd [PATH_MAX] = {0,}; dir_data = dict_get (this->options, "working-directory"); @@ -338,41 +397,11 @@ init (xlator_t *this) " ,errno = %d", voldir, errno); exit (1); } -#if (SYNCDAEMON_COMPILE) - snprintf (voldir, PATH_MAX, "%s/gsync", dirname); - ret = mkdir (voldir, 0777); - if ((-1 == ret) && (errno != EEXIST)) { - gf_log (this->name, GF_LOG_CRITICAL, - "Unable to create gsync directory %s" - " ,errno = %d", voldir, errno); - exit (1); - } - - ret = snprintf (cmd, PATH_MAX, GSYNCD_PREFIX "/gsyncd -c %s/%s " - " --config-set-rx remote-gsyncd %s/gsyncd . ." - , dirname, GSYNC_CONF, GSYNCD_PREFIX); - if (ret <= 0) { - ret = -1; - goto out; - } - - ret = system (cmd); - if (ret == -1) - goto out; - ret = snprintf (cmd, 1024, GSYNCD_PREFIX "/gsyncd -c %s/%s " - " --config-set-rx remote-gsyncd" - " /usr/local/libexec/glusterfs/gsyncd . ^ssh:" - , dirname, GSYNC_CONF); - if (ret <= 0) { - ret = -1; + ret = configure_syncaemon (this, dirname); + if (ret) goto out; - } - ret = system (cmd); - if (ret == -1) - goto out; -#endif ret = glusterd_rpcsvc_options_build (this->options); if (ret) goto out; -- cgit