diff options
| author | Brian Foster <bfoster@redhat.com> | 2012-07-16 13:51:09 -0400 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2012-07-17 08:11:48 -0700 | 
| commit | 59ff893d11844eb52453ce4f7f098df05fcde174 (patch) | |
| tree | 25d332376a461e09770e7dfdd88e7cfc13efea4b /glusterfsd | |
| parent | 911603eb0e1c85e79cf261f99f442c833ead8178 (diff) | |
libglusterfs,mount/fuse: implement gidcache mechanism in fuse-bridge
This change genericizes the cache mechanism implemented in commit
8efd2845 into libglusterfs/src/gidcache.[ch] and adds fuse-bridge as
a client. The cache mechanism is fundamentally equivalent, with some
minor changes:
  - Change cache key from uid_t to uint64_t.
  - Modify the cache add logic to locate and use an entry with a
    matching ID, should it already exist. This addresses a bug in
    the existing mechanism where an expired entry supercedes a newly
    added entry in lookup, causing repeated adds and flushing of a
    cache bucket.
The fuse group cache is disabled by default. It can be enabled via
the 'gid-timeout' fuse-bridge translator option and accompanying
mount option (i.e., '-o gid-timeout=1' for a 1s entry timeout).
BUG: 800892
Change-Id: I0b34a2263ca48dbb154790a4a44fc70b733e9114
Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-on: http://review.gluster.com/3676
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'glusterfsd')
| -rw-r--r-- | glusterfsd/src/glusterfsd.c | 20 | ||||
| -rw-r--r-- | glusterfsd/src/glusterfsd.h | 1 | 
2 files changed, 21 insertions, 0 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index 93e84060..acbed554 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -181,6 +181,9 @@ static struct argp_option gf_options[] = {          {"attribute-timeout", ARGP_ATTRIBUTE_TIMEOUT_KEY, "SECONDS", 0,           "Set attribute timeout to SECONDS for inodes in fuse kernel module "           "[default: 1]"}, +	{"gid-timeout", ARGP_GID_TIMEOUT_KEY, "SECONDS", 0, +	 "Set auxilary group list timeout to SECONDS for fuse translator " +	 "[default: 0]"},          {"client-pid", ARGP_CLIENT_PID_KEY, "PID", OPTION_HIDDEN,           "client will authenticate itself with process id PID to server"},          {"user-map-root", ARGP_USER_MAP_ROOT_KEY, "USER", OPTION_HIDDEN, @@ -381,6 +384,16 @@ create_fuse_mount (glusterfs_ctx_t *ctx)  		}  	} +	if (cmd_args->gid_timeout) { +		ret = dict_set_int32(master->options, "gid-timeout", +			cmd_args->gid_timeout); +		if (ret < 0) { +			gf_log("glusterfsd", GF_LOG_ERROR, "failed to set dict " +				"value for key gid-timeout"); +			goto err; +		} +	} +          switch (cmd_args->fuse_direct_io_mode) {          case GF_OPTION_DISABLE: /* disable */                  ret = dict_set_static_ptr (master->options, ZR_DIRECT_IO_OPT, @@ -827,6 +840,13 @@ parse_opts (int key, char *arg, struct argp_state *state)  	case ARGP_FOPEN_KEEP_CACHE_KEY:  		cmd_args->fopen_keep_cache = 1;  		break; + +	case ARGP_GID_TIMEOUT_KEY: +		if (!gf_string2int(arg, &cmd_args->gid_timeout)) +			break; + +		argp_failure(state, -1, 0, "unknown group list timeout %s", arg); +		break;  	}          return 0; diff --git a/glusterfsd/src/glusterfsd.h b/glusterfsd/src/glusterfsd.h index 382a8cc7..5c00acb5 100644 --- a/glusterfsd/src/glusterfsd.h +++ b/glusterfsd/src/glusterfsd.h @@ -88,6 +88,7 @@ enum argp_option_keys {          ARGP_MEM_ACCOUNTING_KEY           = 157,          ARGP_SELINUX_KEY                  = 158,  	ARGP_FOPEN_KEEP_CACHE_KEY	  = 159, +	ARGP_GID_TIMEOUT_KEY		  = 160,  };  struct _gfd_vol_top_priv_t {  | 
