diff options
Diffstat (limited to 'libglusterfs/src')
| -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);  | 
