diff options
| -rw-r--r-- | glusterfsd/src/glusterfsd.c | 28 | ||||
| -rw-r--r-- | glusterfsd/src/glusterfsd.h | 1 | ||||
| -rw-r--r-- | libglusterfs/src/glusterfs.h | 1 | ||||
| -rwxr-xr-x | tests/bugs/fuse/bug-858215.t | 2 | ||||
| -rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 34 | ||||
| -rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.h | 15 | ||||
| -rwxr-xr-x | xlators/mount/fuse/utils/mount.glusterfs.in | 7 | 
7 files changed, 73 insertions, 15 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index 31a9bf71688..76e57d9c165 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -246,6 +246,8 @@ static struct argp_option gf_options[] = {           "Enable localtime logging"},          {"process-name", ARGP_PROCESS_NAME_KEY, "PROCESS-NAME", OPTION_HIDDEN,           "option to specify the process type" }, +        {"event-history", ARGP_FUSE_EVENT_HISTORY_KEY, "BOOL", +         OPTION_ARG_OPTIONAL, "disable/enable fuse event-history"},          {0, 0, 0, 0, "Miscellaneous Options:"},          {0, }  }; @@ -556,6 +558,15 @@ set_fuse_mount_options (glusterfs_ctx_t *ctx, dict_t *options)                          goto err;                  }          } +        if (cmd_args->event_history) { +                ret = dict_set_str (options, "event-history", +                                    cmd_args->event_history); +                if (ret < 0) { +                        gf_msg ("glusterfsd", GF_LOG_ERROR, 0, glusterfsd_msg_4, +                                "event-history"); +                        goto err; +                } +        }          ret = 0;  err:          return ret; @@ -1292,6 +1303,23 @@ no_oom_api:                  }                  cmd_args->subdir_mount = gf_strdup (arg);                  break; +        case ARGP_FUSE_EVENT_HISTORY_KEY: +                if (!arg) +                        arg = "no"; + +                if (gf_string2boolean (arg, &b) == 0) { +                        if (b) { +                                cmd_args->event_history = "yes"; +                        } else { +                                cmd_args->event_history = "no"; +                        } + +                        break; +                } + +                argp_failure (state, -1, 0, +                              "unknown event-history setting \"%s\"", arg); +                break;  	}          return 0; diff --git a/glusterfsd/src/glusterfsd.h b/glusterfsd/src/glusterfsd.h index 99d9ec4e258..058a43fd385 100644 --- a/glusterfsd/src/glusterfsd.h +++ b/glusterfsd/src/glusterfsd.h @@ -99,6 +99,7 @@ enum argp_option_keys {          ARGP_LOCALTIME_LOGGING_KEY        = 177,          ARGP_SUBDIR_MOUNT_KEY             = 178,          ARGP_PROCESS_NAME_KEY             = 179, +        ARGP_FUSE_EVENT_HISTORY_KEY       = 180,  };  struct _gfd_vol_top_priv { diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index 37ce5d91a1c..045f631f40e 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -423,6 +423,7 @@ struct _cmd_args {          char           *subdir_mount;          char              *process_name; +        char              *event_history;  };  typedef struct _cmd_args cmd_args_t; diff --git a/tests/bugs/fuse/bug-858215.t b/tests/bugs/fuse/bug-858215.t index 389783be841..acfaca9bb4b 100755 --- a/tests/bugs/fuse/bug-858215.t +++ b/tests/bugs/fuse/bug-858215.t @@ -32,7 +32,7 @@ TEST $CLI volume start $V0;  EXPECT 'Started' volinfo_field $V0 'Status';  ## Mount FUSE with caching disabled -TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0; +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --event-history=on -s $H0 --volfile-id $V0 $M0;  ## Test for checking whether the fops have been saved in the event-history  TEST ! stat $M0/newfile; diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 3b9824e137c..34a0dbbe539 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -5161,10 +5161,15 @@ fuse_priv_dump (xlator_t  *this)  int  fuse_history_dump (xlator_t *this)  { -        int      ret    = -1; -        char key_prefix[GF_DUMP_MAX_BUF_LEN] = {0,}; +        int             ret                             = -1; +        char            key_prefix[GF_DUMP_MAX_BUF_LEN] = {0,}; +        fuse_private_t *priv                            = this->private;          GF_VALIDATE_OR_GOTO ("fuse", this, out); + +        if (!priv->event_history) +                goto out; +          GF_VALIDATE_OR_GOTO (this->name, this->history, out);          gf_proc_dump_build_key (key_prefix, "xlator.mount.fuse", @@ -5659,6 +5664,9 @@ init (xlator_t *this_xl)                  }          } +        GF_OPTION_INIT("event-history", priv->event_history, bool, +                       cleanup_exit); +          /* user has set only background-qlen, not congestion-threshold,             use the fuse kernel driver formula to set congestion. ie, 75% */          if (dict_get (this_xl->options, "background-qlen") && @@ -5757,14 +5765,16 @@ init (xlator_t *this_xl)                          goto cleanup_exit;          } -        event = eh_new (FUSE_EVENT_HISTORY_SIZE, _gf_false, NULL); -        if (!event) { -                gf_log (this_xl->name, GF_LOG_ERROR, -                        "could not create a new event history"); -                goto cleanup_exit; -        } +        if (priv->event_history) { +                event = eh_new (FUSE_EVENT_HISTORY_SIZE, _gf_false, NULL); +                if (!event) { +                        gf_log (this_xl->name, GF_LOG_ERROR, +                                "could not create a new event history"); +                        goto cleanup_exit; +                } -        this_xl->history = event; +                this_xl->history = event; +        }          pthread_mutex_init (&priv->fuse_dump_mutex, NULL);          pthread_cond_init (&priv->sync_cond, NULL); @@ -5961,5 +5971,11 @@ struct volume_options options[] = {            .type = GF_OPTION_TYPE_BOOL,            .default_value = "false"          }, +        { .key = {"event-history"}, +          .type = GF_OPTION_TYPE_BOOL, +          .default_value = "false", +          .description = "This option can be used to enable or disable fuse " +          "event history.", +        },          { .key = {NULL} },  }; diff --git a/xlators/mount/fuse/src/fuse-bridge.h b/xlators/mount/fuse/src/fuse-bridge.h index 201b7f6930f..2dfef64c975 100644 --- a/xlators/mount/fuse/src/fuse-bridge.h +++ b/xlators/mount/fuse/src/fuse-bridge.h @@ -135,6 +135,9 @@ struct fuse_private {          /* Enable or disable capability support */          gf_boolean_t         capability; +        /* Enable or disable event history */ +        gf_boolean_t         event_history; +          /* whether to run the unmount daemon */          gf_boolean_t auto_unmount;  }; @@ -280,7 +283,8 @@ typedef struct fuse_graph_switch_args fuse_graph_switch_args_t;  #define fuse_log_eh_fop(this, state, frame, op_ret, op_errno)               \          do {                                                            \ -                if (this->history) {                                    \ +                fuse_private_t *priv = this->private;                   \ +                if (this->history && priv->event_history) {             \                          if (state->fd)                                  \                                  gf_log_eh ("op_ret: %d, op_errno: %d, " \                                             "%"PRIu64", %s () => %p, gfid: %s", \ @@ -300,10 +304,11 @@ typedef struct fuse_graph_switch_args fuse_graph_switch_args_t;                  }                                                       \          } while(0) -#define fuse_log_eh(this, args...)              \ -        do {                                    \ -                if (this->history)              \ -                        gf_log_eh(args);        \ +#define fuse_log_eh(this, args...)                            \ +        do {                                                  \ +                fuse_private_t *priv = this->private;         \ +                if (this->history && priv->event_history)     \ +                        gf_log_eh(args);                      \          } while (0)  static inline xlator_t * diff --git a/xlators/mount/fuse/utils/mount.glusterfs.in b/xlators/mount/fuse/utils/mount.glusterfs.in index ea7205b95e2..c6f2dda8e9a 100755 --- a/xlators/mount/fuse/utils/mount.glusterfs.in +++ b/xlators/mount/fuse/utils/mount.glusterfs.in @@ -217,6 +217,10 @@ start_glusterfs ()          cmd_line=$(echo "$cmd_line --use-readdirp=$use_readdirp");      fi +    if [ -n "$event_history" ]; then +        cmd_line=$(echo "$cmd_line --event-history=$event_history"); +    fi +      if [ -n "$volume_name" ]; then          cmd_line=$(echo "$cmd_line --volume-name=$volume_name");      fi @@ -488,6 +492,9 @@ with_options()          "use-readdirp")              use_readdirp=$value              ;; +        "event-history") +            event_history=$value +            ;;          "no-root-squash")              if [ $value = "yes" ] ||                  [ $value = "on" ] ||  | 
