diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-utils.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 122 |
1 files changed, 97 insertions, 25 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 04dba9d0b41..0a4aea24d85 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1614,7 +1614,7 @@ glusterd_service_stop (const char *service, char *pidfile, int sig, goto out; sleep (1); - if (gf_is_service_running (pidfile, NULL)) { + if (gf_is_service_running (pidfile, &pid)) { ret = kill (pid, SIGKILL); if (ret) { gf_msg (this->name, GF_LOG_ERROR, errno, @@ -1715,6 +1715,8 @@ glusterd_set_brick_socket_filepath (glusterd_volinfo_t *volinfo, xlator_t *this = NULL; glusterd_conf_t *priv = NULL; int expected_file_len = 0; + char export_path[PATH_MAX] = {0,}; + char sock_filepath[PATH_MAX] = {0,}; expected_file_len = strlen (GLUSTERD_SOCK_DIR) + strlen ("/") + MD5_DIGEST_LENGTH*2 + strlen (".socket") + 1; @@ -1725,18 +1727,10 @@ glusterd_set_brick_socket_filepath (glusterd_volinfo_t *volinfo, priv = this->private; GLUSTERD_GET_VOLUME_DIR (volume_dir, volinfo, priv); - if (is_brick_mx_enabled ()) { - snprintf (sockpath, len, "%s/run/daemon-%s.socket", - volume_dir, brickinfo->hostname); - } else { - char export_path[PATH_MAX] = {0,}; - char sock_filepath[PATH_MAX] = {0,}; - GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, export_path); - snprintf (sock_filepath, PATH_MAX, "%s/run/%s-%s", - volume_dir, brickinfo->hostname, export_path); - - glusterd_set_socket_filepath (sock_filepath, sockpath, len); - } + GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, export_path); + snprintf (sock_filepath, PATH_MAX, "%s/run/%s-%s", + volume_dir, brickinfo->hostname, export_path); + glusterd_set_socket_filepath (sock_filepath, sockpath, len); } /* connection happens only if it is not aleady connected, @@ -1830,6 +1824,7 @@ glusterd_volume_start_glusterfs (glusterd_volinfo_t *volinfo, char rdma_brick_path[PATH_MAX] = {0,}; struct rpc_clnt *rpc = NULL; rpc_clnt_connection_t *conn = NULL; + int pid = -1; GF_ASSERT (volinfo); GF_ASSERT (brickinfo); @@ -1852,7 +1847,7 @@ glusterd_volume_start_glusterfs (glusterd_volinfo_t *volinfo, } GLUSTERD_GET_BRICK_PIDFILE (pidfile, volinfo, brickinfo, priv); - if (gf_is_service_running (pidfile, NULL)) { + if (gf_is_service_running (pidfile, &pid)) { goto connect; } @@ -5044,8 +5039,6 @@ attach_brick (xlator_t *this, GLUSTERD_GET_BRICK_PIDFILE (pidfile1, other_vol, other_brick, conf); GLUSTERD_GET_BRICK_PIDFILE (pidfile2, volinfo, brickinfo, conf); - (void) sys_unlink (pidfile2); - (void) sys_link (pidfile1, pidfile2); if (volinfo->is_snap_volume) { snprintf (full_id, sizeof(full_id), "/%s/%s/%s.%s.%s", @@ -5065,6 +5058,10 @@ attach_brick (xlator_t *this, GLUSTERD_BRICK_ATTACH); rpc_clnt_unref (rpc); if (!ret) { + /* PID file is copied once brick has attached + successfully + */ + glusterd_copy_file (pidfile1, pidfile2); return 0; } } @@ -5284,6 +5281,80 @@ find_compatible_brick (glusterd_conf_t *conf, return NULL; } +/* Below function is use to populate sockpath based on passed pid + value as a argument after check the value from proc +*/ + +void +glusterd_get_sock_from_brick_pid (int pid, char *sockpath, size_t len) +{ + char fname[128] = {0,}; + char buf[1024] = {0,}; + char cmdline[2048] = {0,}; + xlator_t *this = NULL; + int fd = -1; + int i = 0, j = 0; + char *ptr = NULL; + char *brptr = NULL; + char tmpsockpath[PATH_MAX] = {0,}; + size_t blen = 0; + + this = THIS; + GF_ASSERT (this); + + snprintf(fname, sizeof(fname), "/proc/%d/cmdline", pid); + + if (sys_access (fname , R_OK) != 0) { + gf_log (this->name, GF_LOG_ERROR, + "brick process %d is not running", pid); + return; + } + + fd = open(fname, O_RDONLY); + if (fd != -1) { + blen = (int)sys_read(fd, buf, 1024); + } else { + gf_log (this->name, GF_LOG_ERROR, + "open failed %s to open a file %s", strerror (errno), + fname); + return; + } + + /* convert cmdline to single string */ + for (i = 0 , j = 0; i < blen; i++) { + if (buf[i] == '\0') + cmdline[j++] = ' '; + else if (buf[i] < 32 || buf[i] > 126) /* remove control char */ + continue; + else if (buf[i] == '"' || buf[i] == '\\') { + cmdline[j++] = '\\'; + cmdline[j++] = buf[i]; + } else { + cmdline[j++] = buf[i]; + } + } + cmdline[j] = '\0'; + if (fd) + sys_close(fd); + + ptr = strstr(cmdline, "-S "); + ptr = strchr(ptr, '/'); + brptr = strstr(ptr, "--brick-name"); + i = 0; + + while (ptr < brptr) { + if (*ptr != 32) + tmpsockpath[i++] = *ptr; + ptr++; + } + + if (tmpsockpath[0]) { + strncpy (sockpath, tmpsockpath , i); + } + +} + + int glusterd_brick_start (glusterd_volinfo_t *volinfo, glusterd_brickinfo_t *brickinfo, @@ -5295,7 +5366,6 @@ glusterd_brick_start (glusterd_volinfo_t *volinfo, glusterd_conf_t *conf = NULL; int32_t pid = -1; char pidfile[PATH_MAX] = {0}; - FILE *fp; char socketpath[PATH_MAX] = {0}; glusterd_volinfo_t *other_vol; @@ -5349,8 +5419,16 @@ glusterd_brick_start (glusterd_volinfo_t *volinfo, * same port (on another brick) and re-use that. * TBD: re-use RPC connection across bricks */ - glusterd_set_brick_socket_filepath (volinfo, brickinfo, - socketpath, sizeof (socketpath)); + if (is_brick_mx_enabled ()) + glusterd_get_sock_from_brick_pid (pid, socketpath, + sizeof(socketpath)); + else + glusterd_set_brick_socket_filepath (volinfo, brickinfo, + socketpath, + sizeof (socketpath)); + gf_log (this->name, GF_LOG_DEBUG, + "Using %s as sockfile for brick %s of volume %s ", + socketpath, brickinfo->path, volinfo->volname); (void) glusterd_brick_connect (volinfo, brickinfo, socketpath); } @@ -5389,12 +5467,6 @@ glusterd_brick_start (glusterd_volinfo_t *volinfo, * * TBD: pray for GlusterD 2 to be ready soon. */ - (void) sys_unlink (pidfile); - fp = fopen (pidfile, "w+"); - if (fp) { - (void) fprintf (fp, "0\n"); - (void) fclose (fp); - } ret = glusterd_volume_start_glusterfs (volinfo, brickinfo, wait); if (ret) { |