diff options
author | Jeff Darcy <jdarcy@redhat.com> | 2012-03-23 13:16:06 -0400 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-05-31 17:13:29 -0700 |
commit | e066a5fea7bdaa5da78e49c9a5bf344af2f33d3c (patch) | |
tree | 12e77cb78c60de41672c005aca9e7d3c2f5c282a /xlators/cluster/dht/src | |
parent | a5b8c32afba6509c4de4ec08830f5833fcbdaf1a (diff) |
distribute: support user-specified layouts.
The new type is DHT_HASH_TYPE_DM_USER=1 (on disk in network byte order) and
we treat it the same as DHT_HASH_TYPE_DM except that we don't stomp on it
during rebalance.
Change-Id: I893571a9b89577acdea2fe868915b18d3663fd77
BUG: 807312
Signed-off-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-on: http://review.gluster.com/3004
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/cluster/dht/src')
-rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 1 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-hashfn.c | 1 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-layout.c | 8 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-selfheal.c | 8 |
4 files changed, 15 insertions, 3 deletions
diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 28deaefc6e5..d3ccacdb8c6 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -60,6 +60,7 @@ typedef struct dht_layout dht_layout_t; typedef enum { DHT_HASH_TYPE_DM, + DHT_HASH_TYPE_DM_USER, } dht_hashfn_type_t; /* rebalance related */ diff --git a/xlators/cluster/dht/src/dht-hashfn.c b/xlators/cluster/dht/src/dht-hashfn.c index 98756157db2..97eb1f05fa8 100644 --- a/xlators/cluster/dht/src/dht-hashfn.c +++ b/xlators/cluster/dht/src/dht-hashfn.c @@ -28,6 +28,7 @@ dht_hash_compute_internal (int type, const char *name, uint32_t *hash_p) switch (type) { case DHT_HASH_TYPE_DM: + case DHT_HASH_TYPE_DM_USER: hash = gf_dm_hashfn (name, strlen (name)); break; default: diff --git a/xlators/cluster/dht/src/dht-layout.c b/xlators/cluster/dht/src/dht-layout.c index 08697d0421e..97bbe987fdc 100644 --- a/xlators/cluster/dht/src/dht-layout.c +++ b/xlators/cluster/dht/src/dht-layout.c @@ -308,9 +308,13 @@ dht_disk_layout_merge (xlator_t *this, dht_layout_t *layout, return -1; } - switch (disk_layout[1]) { + type = ntoh32 (disk_layout[1]); + switch (type) { + case DHT_HASH_TYPE_DM_USER: + gf_log (this->name, GF_LOG_DEBUG, "found user-set layout"); + layout->type = type; + /* Fall through. */ case DHT_HASH_TYPE_DM: - type = ntoh32 (disk_layout[1]); break; default: gf_log (this->name, GF_LOG_CRITICAL, diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c index 68d9416fabf..7ceb80157d5 100644 --- a/xlators/cluster/dht/src/dht-selfheal.c +++ b/xlators/cluster/dht/src/dht-selfheal.c @@ -576,6 +576,12 @@ dht_fix_layout_of_directory (call_frame_t *frame, loc_t *loc, priv = this->private; local = frame->local; + if (layout->type == DHT_HASH_TYPE_DM_USER) { + gf_log (THIS->name, GF_LOG_DEBUG, "leaving %s alone", + loc->path); + goto done; + } + count = cnt = dht_get_layout_count (this, layout, 0); chunk = ((unsigned long) 0xffffffff) / ((cnt) ? cnt : 1); @@ -700,7 +706,7 @@ done: if (fix_array) GF_FREE (fix_array); - return new_layout; + return local->layout; } |