diff options
| author | Venky Shankar <vshankar@redhat.com> | 2013-08-12 22:18:53 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-09-04 20:43:03 -0700 | 
| commit | a6a74c926be767decbcf55dc7d95228c6a62df12 (patch) | |
| tree | 4b27266f0656f9ca40b3c9080aa1fa8c6e659d08 | |
| parent | 9ccdba413ff12956df2221fce91b220300479d23 (diff) | |
features/marker: force xtime updates (configurable) for client-pid = -1
This is required by Geo-Replication that does auxillary mount
with client-pid as -1 (which has special treatment at specific
places in GlusterFS), to trigger xtime updates on the intermediate
master in a cascading setup.
Marker too had a check to "not" mark updates for geo-replication's
auxillary mounts. With the new geo-replication design, xtimes are
not set by the master on the slave for all entities. Due to this
cascading setups were broken.
This patch introduces "geo-replication.ignore-pid-check" option
as a "override" for the client-pid check for gsyncd's client-pid.
When this options is enabled, marker start "marking" even if the
updates are from the special client.
Geo-Replication on the detection of itself being an intermediate
master, enables this option.
Change-Id: I9f7140edd12fef5480595ee0f93f35b94cdb8345
BUG: 996371
Signed-off-by: Venky Shankar <vshankar@redhat.com>
Reviewed-on: http://review.gluster.org/5591
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Avra Sengupta <asengupt@redhat.com>
Tested-by: Avra Sengupta <asengupt@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
| -rw-r--r-- | xlators/features/marker/src/marker.c | 27 | ||||
| -rw-r--r-- | xlators/features/marker/src/marker.h | 5 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.h | 1 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-set.c | 16 | 
4 files changed, 43 insertions, 6 deletions
diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index 3325d8af3..59152db43 100644 --- a/xlators/features/marker/src/marker.c +++ b/xlators/features/marker/src/marker.c @@ -468,11 +468,16 @@ marker_create_frame (xlator_t *this, marker_local_t *local)  int32_t  marker_xtime_update_marks (xlator_t *this, marker_local_t *local)  { +        marker_conf_t *priv = NULL; +          GF_VALIDATE_OR_GOTO ("marker", this, out);          GF_VALIDATE_OR_GOTO (this->name, local, out); -        if ((local->pid == GF_CLIENT_PID_GSYNCD) || -            (local->pid == GF_CLIENT_PID_DEFRAG)) +        priv = this->private; + +        if ((local->pid == GF_CLIENT_PID_GSYNCD +             && !(priv->feature_enabled & GF_XTIME_GSYNC_FORCE)) +            || (local->pid == GF_CLIENT_PID_DEFRAG))                  goto out;          marker_gettimeofday (local); @@ -2593,7 +2598,7 @@ out:  int32_t  reconfigure (xlator_t *this, dict_t *options)  { -        int32_t         ret     = -1; +        int32_t         ret     = 0;          data_t         *data    = NULL;          gf_boolean_t    flag    = _gf_false;          marker_conf_t  *priv    = NULL; @@ -2634,11 +2639,17 @@ reconfigure (xlator_t *this, dict_t *options)                                          "xtime updation will fail");                          } else {                                  priv->feature_enabled |= GF_XTIME; +                                data = dict_get (options, "gsync-force-xtime"); +                                if (!data) +                                        goto out; +                                ret = gf_string2boolean (data->data, &flag); +                                if (ret == 0 && flag) +                                        priv->feature_enabled |= GF_XTIME_GSYNC_FORCE;                          }                  }          }  out: -        return 0; +        return ret;  } @@ -2694,9 +2705,16 @@ init (xlator_t *this)                                  goto err;                          priv->feature_enabled |= GF_XTIME; +                        data = dict_get (options, "gsync-force-xtime"); +                        if (!data) +                                goto cont; +                        ret = gf_string2boolean (data->data, &flag); +                        if (ret == 0 && flag) +                                priv->feature_enabled |= GF_XTIME_GSYNC_FORCE;                  }          } + cont:          this->local_pool = mem_pool_new (marker_local_t, 128);          if (!this->local_pool) {                  gf_log (this->name, GF_LOG_ERROR, @@ -2771,5 +2789,6 @@ struct volume_options options[] = {          {.key = {"timestamp-file"}},          {.key = {"quota"}},          {.key = {"xtime"}}, +        {.key = {"gsync-force-xtime"}},          {.key = {NULL}}  }; diff --git a/xlators/features/marker/src/marker.h b/xlators/features/marker/src/marker.h index 2f1feeee6..1a58f8cfc 100644 --- a/xlators/features/marker/src/marker.h +++ b/xlators/features/marker/src/marker.h @@ -28,8 +28,9 @@  #define TIMESTAMP_FILE      "timestamp-file"  enum { -        GF_QUOTA=1, -        GF_XTIME=2 +        GF_QUOTA             = 1, +        GF_XTIME             = 2, +        GF_XTIME_GSYNC_FORCE = 4,  };  /*initialize the local variable*/ diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.h b/xlators/mgmt/glusterd/src/glusterd-volgen.h index ad3e9bd88..0c1a76c12 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.h +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.h @@ -23,6 +23,7 @@  #define VKEY_DIAG_LAT_MEASUREMENT "diagnostics.latency-measurement"  #define VKEY_FEATURES_LIMIT_USAGE "features.limit-usage"  #define VKEY_MARKER_XTIME         GEOREP".indexing" +#define VKEY_MARKER_XTIME_FORCE   GEOREP".ignore-pid-check"  #define VKEY_CHANGELOG            "changelog.changelog"  #define VKEY_FEATURES_QUOTA       "features.quota" diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index 7ec8cf755..8c6c5b954 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -1007,6 +1007,22 @@ struct volopt_map_entry glusterd_volopt_map[] = {            .flags       = OPT_FLAG_FORCE,            .op_version  = 1          }, +        { .key         = VKEY_MARKER_XTIME_FORCE, +          .voltype     = "features/marker", +          .option      = "gsync-force-xtime", +          .value       = "off", +          .type        = NO_DOC, +          .flags       = OPT_FLAG_FORCE, +          .op_version  = 2 +        }, +        { .key         = VKEY_MARKER_XTIME_FORCE, +          .voltype     = "features/marker", +          .option      = "!gsync-force-xtime", +          .value       = "off", +          .type        = NO_DOC, +          .flags       = OPT_FLAG_FORCE, +          .op_version  = 2 +        },          { .key         = VKEY_FEATURES_QUOTA,            .voltype     = "features/marker",            .option      = "quota",  | 
