diff options
| author | Anand Avati <avati@redhat.com> | 2013-09-03 18:13:27 -0700 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-09-17 15:31:48 -0700 | 
| commit | 0402c691a9d245e00bd2e4bd100a6d5e591d3433 (patch) | |
| tree | 4ab50c4c877819c8ac46a637f6842faa73ff5c50 | |
| parent | 5ab18374d07c57de5647682d51afa05101be356f (diff) | |
fuse-bridge: enable --fopen-keep-cache based on FUSE_AUTO_INVAL_DATA.
If kernel supports FUSE_AUTO_INVAL_DATA then it is safe(r) to turn on
--fopen-keep-cache mode by default. Users report significant improvement
in perf by enabling the mode.
Change-Id: Icf9df4b7b43950d7e25302d9c2a1a7d14571a9a9
BUG: 990744
Signed-off-by: Anand Avati <avati@redhat.com>
Reviewed-on: http://review.gluster.org/5770
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
| -rw-r--r-- | glusterfsd/src/glusterfsd.c | 36 | ||||
| -rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 43 | ||||
| -rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.h | 2 | 
3 files changed, 75 insertions, 6 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index 908345d266d..c6eb58d5156 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -163,7 +163,7 @@ static struct argp_option gf_options[] = {           "Brick name to be registered with Gluster portmapper" },          {"brick-port", ARGP_BRICK_PORT_KEY, "BRICK-PORT", OPTION_HIDDEN,           "Brick Port to be registered with Gluster portmapper" }, -	{"fopen-keep-cache", ARGP_FOPEN_KEEP_CACHE_KEY, 0, 0, +	{"fopen-keep-cache", ARGP_FOPEN_KEEP_CACHE_KEY, "BOOL", OPTION_ARG_OPTIONAL,  	 "Do not purge the cache on file open"},          {0, 0, 0, 0, "Fuse options:"}, @@ -379,7 +379,8 @@ set_fuse_mount_options (glusterfs_ctx_t *ctx, dict_t *options)                  }          } -	if (cmd_args->fopen_keep_cache) { +	switch (cmd_args->fopen_keep_cache) { +	case GF_OPTION_ENABLE:  		ret = dict_set_static_ptr(options, "fopen-keep-cache",  			"on");  		if (ret < 0) { @@ -388,6 +389,23 @@ set_fuse_mount_options (glusterfs_ctx_t *ctx, dict_t *options)  				"fopen-keep-cache");  			goto err;  		} +		break; +	case GF_OPTION_DISABLE: +		ret = dict_set_static_ptr(options, "fopen-keep-cache", +			"off"); +		if (ret < 0) { +			gf_log("glusterfsd", GF_LOG_ERROR, +				"failed to set dict value for key " +				"fopen-keep-cache"); +			goto err; +		} +		break; +        case GF_OPTION_DEFERRED: /* default */ +        default: +                gf_log ("glusterfsd", GF_LOG_DEBUG, +			"fopen-keep-cache mode %d", +                        cmd_args->fopen_keep_cache); +                break;  	}  	if (cmd_args->gid_timeout) { @@ -990,7 +1008,18 @@ parse_opts (int key, char *arg, struct argp_state *state)                  break;  	case ARGP_FOPEN_KEEP_CACHE_KEY: -		cmd_args->fopen_keep_cache = 1; +                if (!arg) +                        arg = "on"; + +                if (gf_string2boolean (arg, &b) == 0) { +                        cmd_args->fopen_keep_cache = b; + +                        break; +                } + +                argp_failure (state, -1, 0, +                              "unknown cache setting \"%s\"", arg); +  		break;  	case ARGP_GID_TIMEOUT_KEY: @@ -1330,6 +1359,7 @@ glusterfs_ctx_defaults_init (glusterfs_ctx_t *ctx)  #endif          cmd_args->fuse_attribute_timeout = -1;          cmd_args->fuse_entry_timeout = -1; +	cmd_args->fopen_keep_cache = GF_OPTION_DEFERRED;          INIT_LIST_HEAD (&cmd_args->xlator_options);          INIT_LIST_HEAD (&cmd_args->volfile_servers); diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index d864c1fac40..6805056828e 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -3836,6 +3836,40 @@ fuse_init (xlator_t *this, fuse_in_header_t *finh, void *msg)                          fino.flags |= FUSE_DO_READDIRPLUS;          } +	if (priv->fopen_keep_cache == 2) { +		/* If user did not explicitly set --fopen-keep-cache[=off], +		   then check if kernel support FUSE_AUTO_INVAL_DATA and ... +		*/ +		if (fini->flags & FUSE_AUTO_INVAL_DATA) { +			/* ... enable fopen_keep_cache mode if supported. +			*/ +			gf_log ("glusterfs-fuse", GF_LOG_DEBUG, "Detected " +				"support for FUSE_AUTO_INVAL_DATA. Enabling " +				"fopen_keep_cache automatically."); +			fino.flags |= FUSE_AUTO_INVAL_DATA; +			priv->fopen_keep_cache = 1; +		} else { +			gf_log ("glusterfs-fuse", GF_LOG_DEBUG, "No support " +				"for FUSE_AUTO_INVAL_DATA. Disabling " +				"fopen_keep_cache."); +			/* ... else disable. */ +			priv->fopen_keep_cache = 0; +		} +	} else if (priv->fopen_keep_cache == 1) { +		/* If user explicitly set --fopen-keep-cache[=on], +		   then enable FUSE_AUTO_INVAL_DATA if possible. +		*/ +		if (fini->flags & FUSE_AUTO_INVAL_DATA) { +			gf_log ("glusterfs-fuse", GF_LOG_DEBUG, "fopen_keep_cache " +				"is explicitly set. Enabling FUSE_AUTO_INVAL_DATA"); +			fino.flags |= FUSE_AUTO_INVAL_DATA; +		} else { +			gf_log ("glusterfs-fuse", GF_LOG_WARNING, "fopen_keep_cache " +				"is explicitly set. Support for " +				"FUSE_AUTO_INVAL_DATA is missing"); +		} +	} +  	if (fini->flags & FUSE_ASYNC_DIO)  		fino.flags |= FUSE_ASYNC_DIO; @@ -5080,6 +5114,7 @@ init (xlator_t *this_xl)          int                fsname_allocated = 0;          glusterfs_ctx_t   *ctx = NULL;          gf_boolean_t       sync_to_mount = _gf_false; +        gf_boolean_t       fopen_keep_cache = _gf_false;          unsigned long      mntflags = 0;          char              *mnt_args = NULL;          eh_t              *event = NULL; @@ -5225,8 +5260,12 @@ init (xlator_t *this_xl)                  GF_ASSERT (ret == 0);          } -        GF_OPTION_INIT("fopen-keep-cache", priv->fopen_keep_cache, bool, -                cleanup_exit); +	priv->fopen_keep_cache = 2; +	if (dict_get (options, "fopen-keep-cache")) { +		GF_OPTION_INIT("fopen-keep-cache", fopen_keep_cache, bool, +			       cleanup_exit); +		priv->fopen_keep_cache = fopen_keep_cache; +	}          GF_OPTION_INIT("gid-timeout", priv->gid_cache_timeout, int32,                  cleanup_exit); diff --git a/xlators/mount/fuse/src/fuse-bridge.h b/xlators/mount/fuse/src/fuse-bridge.h index 2626638dc4f..93319467ba3 100644 --- a/xlators/mount/fuse/src/fuse-bridge.h +++ b/xlators/mount/fuse/src/fuse-bridge.h @@ -101,7 +101,7 @@ struct fuse_private {          gf_boolean_t         acl;          gf_boolean_t         selinux;          gf_boolean_t         read_only; -	gf_boolean_t	     fopen_keep_cache; +	int32_t	             fopen_keep_cache;  	int32_t		     gid_cache_timeout;          gf_boolean_t         enable_ino32;          fdtable_t           *fdtable;  | 
