diff options
| author | Krishnan Parthasarathi <kp@gluster.com> | 2011-10-31 15:54:52 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2011-11-18 04:22:25 -0800 | 
| commit | 1e652740f74298637577e9861cb5092091404d29 (patch) | |
| tree | dc2a50ba794396b493c57e0c8b244ba2543a4b55 | |
| parent | c5be0df9149155f9e23a8e9f24d0becb0543efe1 (diff) | |
glusterd: Extended glusterd_is_service_running to get svcs's pid.
Also, volume status cmd would print "N/A" if pid couldn't be
retrieved from pidfile.
Change-Id: Ie83d228b1cf86397d181885b325e337a403e6ed2
BUG: 3043
Reviewed-on: http://review.gluster.com/650
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Amar Tumballi <amar@gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
| -rw-r--r-- | cli/src/cli-cmd-volume.c | 4 | ||||
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 16 | ||||
| -rw-r--r-- | cli/src/cli.h | 2 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 61 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 3 | 
5 files changed, 35 insertions, 51 deletions
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index 18d17b4546d..b5a177a869d 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -1376,7 +1376,7 @@ cli_cmd_volume_status_cbk (struct cli_state *state,  int -cli_print_brick_status (char *brick, int port, int online, int pid) +cli_print_brick_status (char *brick, int port, int online, char *pid)  {          int  fieldlen = CLI_VOL_STATUS_BRICK_LEN;          char buf[80] = {0,}; @@ -1400,7 +1400,7 @@ cli_print_brick_status (char *brick, int port, int online, int pid)                          printf ("%s", p);                          while (num_tabs-- != 0)                                  printf ("\t"); -                        cli_out ("%d\t%c\t%d", port, online?'Y':'N', pid); +                        cli_out ("%d\t%c\t%s", port, online?'Y':'N', pid);                          bricklen = 0;                  }          } diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 2841a32d589..8a88e57d595 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -3807,7 +3807,8 @@ gf_cli3_1_status_cbk (struct rpc_req *req, struct iovec *iov,          int                             port = 0;          int                             online = 0;          char                            key[1024] = {0,}; -        int                             pid = 0; +        int                             pid = -1; +        char                            *pid_str = NULL;          char                            brick[8192] = {0,};          char                            *volname = NULL; @@ -3875,11 +3876,22 @@ gf_cli3_1_status_cbk (struct rpc_req *req, struct iovec *iov,                  memset (key, 0, sizeof (key));                  snprintf (key, sizeof (key), "brick%d.pid", i);                  ret = dict_get_int32 (dict, key, &pid); +                if (ret) +                        goto out; +                if (pid == -1) +                        ret = gf_asprintf (&pid_str, "%s", "N/A"); +                else +                        ret = gf_asprintf (&pid_str, "%d", pid); + +                if (ret == -1) +                        goto out;                  snprintf (brick, sizeof (brick) -1, "%s:%s", hostname, path);                  cli_print_line (CLI_BRICK_STATUS_LINE_LEN); -                cli_print_brick_status (brick, port, online, pid); +                cli_print_brick_status (brick, port, online, pid_str); +                if (pid_str) +                        GF_FREE (pid_str);          }          ret = rsp.op_ret; diff --git a/cli/src/cli.h b/cli/src/cli.h index 70310f103ed..1d2e069735a 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -236,7 +236,7 @@ cli_cmd_volume_status_parse (const char **words, int wordcount,                               dict_t **options);  int -cli_print_brick_status (char *brick, int port, int online, int pid); +cli_print_brick_status (char *brick, int port, int online, char *pid);  void  cli_print_line (int len); diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 1e797a88200..2eaf4f4a2f4 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -2308,12 +2308,13 @@ out:          return ret;  } +/* Valid only in if service is 'local' to glusterd. + * pid can be -1, if reading pidfile failed */  gf_boolean_t -glusterd_is_service_running (char *pidfile) +glusterd_is_service_running (char *pidfile, int *pid)  {          FILE            *file = NULL;          gf_boolean_t    running = _gf_false; -        gf_boolean_t    locked = _gf_false;          int             ret = 0;          int             fno = 0; @@ -2322,20 +2323,20 @@ glusterd_is_service_running (char *pidfile)                  goto out;          fno = fileno (file); -        ret = lockf (fno, F_TLOCK, 0); -        if (!ret) { -                locked = _gf_true; +        ret = lockf (fno, F_TEST, 0); +        if (ret == -1) +                running = _gf_true; +        if (!pid)                  goto out; + +        ret = fscanf (file, "%d", pid); +        if (ret <= 0) { +                gf_log ("", GF_LOG_ERROR, "Unable to read pidfile: %s, %s", +                        pidfile, strerror (errno)); +                *pid = -1;          } -        running = _gf_true;  out: -        if (locked) { -                GF_ASSERT (file); -                if (lockf (fno, F_ULOCK, 0) < 0) -                        gf_log ("", GF_LOG_WARNING, "Cannot unlock pidfile: %s" -                                " reason: %s", pidfile, strerror(errno)); -        }          if (file)                  fclose (file);          return running; @@ -2586,7 +2587,7 @@ glusterd_is_nodesvc_running (char *server)          glusterd_get_nodesvc_pidfile (server, priv->workdir,                                              pidfile, sizeof (pidfile)); -        return glusterd_is_service_running (pidfile); +        return glusterd_is_service_running (pidfile, NULL);  }  int32_t @@ -3094,8 +3095,6 @@ glusterd_add_brick_to_dict (glusterd_volinfo_t *volinfo,          char            base_key[8192] = {0};          char            pidfile[PATH_MAX] = {0};          char            path[PATH_MAX] = {0}; -        FILE            *file = NULL; -        int             fd = -1;          int32_t         pid = -1;          int32_t         brick_online = -1;          xlator_t        *this = NULL; @@ -3128,39 +3127,12 @@ glusterd_add_brick_to_dict (glusterd_volinfo_t *volinfo,          if (ret)                  goto out; -          GLUSTERD_GET_VOLUME_DIR (path, volinfo, priv);          GLUSTERD_GET_BRICK_PIDFILE (pidfile, path, brickinfo->hostname,                                      brickinfo->path); -        file = fopen (pidfile, "r"); -        if (!file) { -                gf_log ("", GF_LOG_ERROR, "Unable to open pidfile: %s", -                        pidfile); -                /* pidfile doesn't exist means brick is down*/ -                pid = 0; -                brick_online = 0; -                goto cont; -        } else { -                ret = fscanf (file, "%d", &pid); -                if (ret <= 0) { -                        gf_log ("", GF_LOG_ERROR, "Unable to read pidfile: %s", -                                pidfile); -                        ret = -1; -                        goto out; -                } - -                /* check if process is crashed*/ -                fd = fileno (file); -                if ((fd != -1) && (lockf (fd, F_TEST, 0))) -                        brick_online = 1; -                else { -                        pid = 0; -                        brick_online = 0; -                } -        } +        brick_online = glusterd_is_service_running (pidfile, &pid); -cont:          memset (key, 0, sizeof (key));          snprintf (key, sizeof (key), "%s.pid", base_key);          ret = dict_set_int32 (dict, key, pid); @@ -3174,9 +3146,6 @@ cont:                  goto out;  out: -        if (file) -                fclose (file); -          if (ret)                  gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index 8401b61bc16..a34956b0c4a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -154,6 +154,9 @@ glusterd_get_nodesvc_volfile (char *server, char *workdir,                                      char *volfile, size_t len);  gf_boolean_t +glusterd_is_service_running (char *pidfile, int *pid); + +gf_boolean_t  glusterd_is_nodesvc_running ();  gf_boolean_t  | 
