diff options
author | Jeff Darcy <jdarcy@redhat.com> | 2013-02-18 13:16:39 -0500 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2013-02-18 20:50:48 -0800 |
commit | 59ac567c8b5ebf20b573ecf250e13f841e817dbd (patch) | |
tree | b16dd6c33140c1ec571145b64bae574e9be0c76d /xlators/cluster/dht/src/dht.c | |
parent | 6ff25bc98193fd39e25acfce8e3b2f3b3d80a9c8 (diff) |
distribute: add hash-name-regex option
This is to support the common "write to temp file then rename" idiom. In our
case this causes us to create a linkfile during the rename in (N-1)/N cases,
with a significant impact on performance e.g. for UFO which uses this idiom.
This patch allows the user to specify up to two regular expressions that
separate the permanent and transient parts of a temp-file name:
rsync-hash-regex reimplements the existing RSYNC_FRIENDLY_NAME
pattern where the temporary name for EXAMPLE is .EXAMPLE.suffix
extra-hash-regex can be used for a second pattern, active concurrently,
and can include alternatives via the POSIX extended-regex syntax
Change-Id: Ic1a6ed19324bc31fefe91ee34b8478877a9c5d2c
BUG: 912564
Signed-off-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-on: http://review.gluster.org/4116
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/cluster/dht/src/dht.c')
-rw-r--r-- | xlators/cluster/dht/src/dht.c | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/xlators/cluster/dht/src/dht.c b/xlators/cluster/dht/src/dht.c index bb4d70ec8a3..784ed920ecc 100644 --- a/xlators/cluster/dht/src/dht.c +++ b/xlators/cluster/dht/src/dht.c @@ -284,6 +284,39 @@ out: return ret; } +void +dht_init_regex (xlator_t *this, dict_t *odict, char *name, + regex_t *re, gf_boolean_t *re_valid) +{ + char *temp_str; + + if (dict_get_str (odict, name, &temp_str) != 0) { + if (strcmp(name,"rsync-hash-regex")) { + return; + } + temp_str = "^\\.(.+)\\.[^.]+$"; + } + + if (*re_valid) { + regfree(re); + *re_valid = _gf_false; + } + + if (!strcmp(temp_str,"none")) { + return; + } + + if (regcomp(re,temp_str,REG_EXTENDED) == 0) { + gf_log (this->name, GF_LOG_INFO, + "using regex %s = %s", name, temp_str); + *re_valid = _gf_true; + } + else { + gf_log (this->name, GF_LOG_WARNING, + "compiling regex %s failed", temp_str); + } +} + int reconfigure (xlator_t *this, dict_t *options) { @@ -349,12 +382,16 @@ reconfigure (xlator_t *this, dict_t *options) goto out; } + dht_init_regex (this, options, "rsync-hash-regex", + &conf->rsync_regex, &conf->rsync_regex_valid); + dht_init_regex (this, options, "extra-hash-regex", + &conf->extra_regex, &conf->extra_regex_valid); + ret = 0; out: return ret; } - int init (xlator_t *this) { @@ -466,6 +503,11 @@ init (xlator_t *this) goto err; } + dht_init_regex (this, this->options, "rsync-hash-regex", + &conf->rsync_regex, &conf->rsync_regex_valid); + dht_init_regex (this, this->options, "extra-hash-regex", + &conf->extra_regex, &conf->extra_regex_valid); + ret = dht_layouts_init (this, conf); if (ret == -1) { goto err; @@ -643,6 +685,20 @@ struct volume_options options[] = { "that allows DHT to requests non-first subvolumes to filter out " "directory entries." }, + { .key = {"rsync-hash-regex"}, + .type = GF_OPTION_TYPE_STR, + /* Setting a default here doesn't work. See dht_init_regex. */ + .description = "Regular expression for stripping temporary-file " + "suffix and prefix used by rsync, to prevent relocation when the " + "file is renamed." + }, + { .key = {"extra-hash-regex"}, + .type = GF_OPTION_TYPE_STR, + /* Setting a default here doesn't work. See dht_init_regex. */ + .description = "Regular expression for stripping temporary-file " + "suffix and prefix used by an application, to prevent relocation when " + "the file is renamed." + }, { .key = {NULL} }, }; |