diff options
| author | Raghavendra Bhat <raghavendra@redhat.com> | 2012-09-05 13:07:49 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2012-09-06 04:01:30 -0700 | 
| commit | be1d21a8795b215035f546c8da83df205afeb449 (patch) | |
| tree | 61b40e638ca2bd66348ba68171fd25010c2337db /libglusterfs | |
| parent | d6c99b6134f1eb90b3a8020c3538101df266e9b5 (diff) | |
core/statedump: parse the file and set the path of the statedump files
* As of now "gluster volume set statedump-path" option sets the path of
  the statedump files for brick processes only. If SIGUSR1 is sent directly
  to all the gluster processes instead of using gluster cli command, then
  some of the statedumps will still be in /tmp (such as nfs server, glustershd).
* This patch makes glusterfs processes search for the file
  /tmp/glusterdump.options and consider the options given in it. There if path
  key is set, then all the processes use that path when SIGUSR1 is sent or cli
  statedump command is executed. (Note that after taking statedump, if
  /tmp/glusterdump.options file is removed, then the default way is resumed).
Change-Id: I2e8fbfb4823318512e03b234e90d3a3888724ddc
BUG: 851175
Signed-off-by: Raghavendra Bhat <raghavendra@redhat.com>
Reviewed-on: http://review.gluster.org/3907
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'libglusterfs')
| -rw-r--r-- | libglusterfs/src/statedump.c | 125 | ||||
| -rw-r--r-- | libglusterfs/src/statedump.h | 9 | 
2 files changed, 119 insertions, 15 deletions
diff --git a/libglusterfs/src/statedump.c b/libglusterfs/src/statedump.c index 1158a2d82e5..8eac728721c 100644 --- a/libglusterfs/src/statedump.c +++ b/libglusterfs/src/statedump.c @@ -80,6 +80,45 @@ gf_proc_dump_close (void)          gf_dump_fd = -1;  } +static int +gf_proc_dump_set_path (char *dump_options_file) +{ +        int     ret = -1; +        FILE    *fp = NULL; +        char    buf[256]; +        char    *key = NULL, *value = NULL; +        char    *saveptr = NULL; + +        fp = fopen (dump_options_file, "r"); +        if (!fp) +                goto out; + +        ret = fscanf (fp, "%s", buf); + +        while (ret != EOF) { +                key = strtok_r (buf, "=", &saveptr); +                if (!key) { +                        ret = fscanf (fp, "%s", buf); +                        continue; +                } + +                value = strtok_r (NULL, "=", &saveptr); + +                if (!value) { +                        ret = fscanf (fp, "%s", buf); +                        continue; +                } +                if (!strcmp (key, "path")) { +                        dump_options.dump_path = gf_strdup (value); +                        break; +                } +        } + +out: +        if (fp) +                fclose (fp); +        return ret; +}  int  gf_proc_dump_add_section (char *key, ...) @@ -489,6 +528,44 @@ gf_proc_dump_enable_all_options ()          return 0;  } +gf_boolean_t +is_gf_proc_dump_all_disabled () +{ +        gf_boolean_t all_disabled = _gf_true; + +        GF_CHECK_DUMP_OPTION_ENABLED (dump_options.dump_mem, all_disabled, out); +        GF_CHECK_DUMP_OPTION_ENABLED (dump_options.dump_iobuf, all_disabled, out); +        GF_CHECK_DUMP_OPTION_ENABLED (dump_options.dump_callpool, all_disabled, +                                   out); +        GF_CHECK_DUMP_OPTION_ENABLED (dump_options.xl_options.dump_priv, +                                   all_disabled, out); +        GF_CHECK_DUMP_OPTION_ENABLED (dump_options.xl_options.dump_inode, +                                   all_disabled, out); +        GF_CHECK_DUMP_OPTION_ENABLED (dump_options.xl_options.dump_fd, +                                   all_disabled, out); +        GF_CHECK_DUMP_OPTION_ENABLED (dump_options.xl_options.dump_inodectx, +                                   all_disabled, out); +        GF_CHECK_DUMP_OPTION_ENABLED (dump_options.xl_options.dump_fdctx, +                                   all_disabled, out); +        GF_CHECK_DUMP_OPTION_ENABLED (dump_options.xl_options.dump_history, +                                   all_disabled, out); + +out: +        return all_disabled; +} + +/* These options are dumped by default if /tmp/glusterdump.options +   file exists and it is emtpty +*/ +static int +gf_proc_dump_enable_default_options () +{ +        GF_PROC_DUMP_SET_OPTION (dump_options.dump_mem, _gf_true); +        GF_PROC_DUMP_SET_OPTION (dump_options.dump_callpool, _gf_true); + +        return 0; +} +  static int  gf_proc_dump_disable_all_options ()  { @@ -567,28 +644,43 @@ gf_proc_dump_options_init ()          int     ret = -1;          FILE    *fp = NULL;          char    buf[256]; -        char    dumpbuf[GF_DUMP_MAX_BUF_LEN];          char    *key = NULL, *value = NULL;          char    *saveptr = NULL;          char    dump_option_file[PATH_MAX]; +        /* glusterd will create a file /tmp/glusterdump.<pid>.options and +           sets the statedump options for the process and the file is removed +           after the statedump is taken. Direct issue of SIGUSR1 does not have +           mechanism for considering the statedump options. So to have a way +           of configuring the statedump of all the glusterfs processes through +           both cli command and SIGUSR1, /tmp/glusterdump.options file +           is searched and the options mentioned in it are given the higher +           priority. +        */          snprintf (dump_option_file, sizeof (dump_option_file), -                  "/tmp/glusterdump.%d.options", getpid ()); - +                  "/tmp/glusterdump.options");          fp = fopen (dump_option_file, "r"); -          if (!fp) { -                //ENOENT, return success -                (void) gf_proc_dump_enable_all_options (); -                return 0; +                snprintf (dump_option_file, sizeof (dump_option_file), +                          "/tmp/glusterdump.%d.options", getpid ()); + +                fp = fopen (dump_option_file, "r"); + +                if (!fp) { +                        //ENOENT, return success +                        (void) gf_proc_dump_enable_all_options (); +                        return 0; +                }          }          (void) gf_proc_dump_disable_all_options (); +        // swallow the errors if setting statedump file path is failed. +        ret = gf_proc_dump_set_path (dump_option_file); +          ret = fscanf (fp, "%s", buf);          while (ret != EOF) { -                  key = strtok_r (buf, "=", &saveptr);                  if (!key) {                          ret = fscanf (fp, "%s", buf); @@ -602,20 +694,18 @@ gf_proc_dump_options_init ()                          continue;                  } -                snprintf (dumpbuf, sizeof (dumpbuf), "[Debug]:key=%s, value=%s\n",key,value); -                ret = write (gf_dump_fd, dumpbuf, strlen (dumpbuf)); -                  gf_proc_dump_parse_set_option (key, value); -          } +        if (is_gf_proc_dump_all_disabled ()) +                (void) gf_proc_dump_enable_default_options (); +          if (fp)                  fclose (fp);          return 0;  } -  void  gf_proc_dump_info (int signum, glusterfs_ctx_t *ctx)  { @@ -637,11 +727,14 @@ gf_proc_dump_info (int signum, glusterfs_ctx_t *ctx)          } else                  strncpy (brick_name, "glusterdump", sizeof (brick_name)); -        ret = gf_proc_dump_open (ctx->statedump_path, brick_name); +        ret = gf_proc_dump_options_init ();          if (ret < 0)                  goto out; -        ret = gf_proc_dump_options_init (); +        if (dump_options.dump_path) +                ret = gf_proc_dump_open (dump_options.dump_path, brick_name); +        else +                ret = gf_proc_dump_open (ctx->statedump_path, brick_name);          if (ret < 0)                  goto out; @@ -710,6 +803,8 @@ gf_proc_dump_info (int signum, glusterfs_ctx_t *ctx)  out:          if (gf_dump_fd != -1)                  gf_proc_dump_close (); +        GF_FREE (dump_options.dump_path); +        dump_options.dump_path = NULL;          gf_proc_dump_unlock ();          return; diff --git a/libglusterfs/src/statedump.h b/libglusterfs/src/statedump.h index 03648ddd9bd..8342b120ada 100644 --- a/libglusterfs/src/statedump.h +++ b/libglusterfs/src/statedump.h @@ -31,6 +31,7 @@ typedef struct gf_dump_options_ {          gf_boolean_t            dump_iobuf;          gf_boolean_t            dump_callpool;          gf_dump_xl_options_t    xl_options; //options for all xlators +        char                    *dump_path;  } gf_dump_options_t;  extern gf_dump_options_t dump_options; @@ -55,6 +56,14 @@ void _gf_proc_dump_build_key (char *key, const char *prefix, char *fmt,...)  #define GF_PROC_DUMP_SET_OPTION(opt,val) opt = val +#define GF_CHECK_DUMP_OPTION_ENABLED(option_dump, var, label)      \ +        do {                                                    \ +                if (option_dump == _gf_true) {                  \ +                        var = _gf_false;                        \ +                        goto label;                             \ +                }                                               \ +        } while (0); +  void gf_proc_dump_init();  void gf_proc_dump_fini(void);  | 
