diff options
Diffstat (limited to 'xlators/cluster/dht/src')
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 17 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 7 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-helper.c | 133 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-layout.c | 1 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 2 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-shared.c | 27 |
6 files changed, 64 insertions, 123 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index ef816f53532..729ab30e672 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -2840,6 +2840,7 @@ dht_getxattr (call_frame_t *frame, xlator_t *this, } if (key && (strcmp (key, GF_XATTR_LINKINFO_KEY) == 0)) { + hashed_subvol = dht_subvol_get_hashed (this, loc); if (!hashed_subvol) { gf_msg (this->name, GF_LOG_ERROR, 0, @@ -2864,6 +2865,7 @@ dht_getxattr (call_frame_t *frame, xlator_t *this, op_errno = ENODATA; goto err; } + STACK_WIND (frame, dht_linkinfo_getxattr_cbk, hashed_subvol, hashed_subvol->fops->getxattr, loc, GF_XATTR_PATHINFO_KEY, xdata); @@ -3854,9 +3856,7 @@ list: } } - dht_itransform (this, prev->this, orig_entry->d_off, - &entry->d_off); - + entry->d_off = orig_entry->d_off; entry->d_stat = orig_entry->d_stat; entry->d_ino = orig_entry->d_ino; entry->d_type = orig_entry->d_type; @@ -3988,9 +3988,7 @@ dht_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, goto unwind; } - dht_itransform (this, prev->this, orig_entry->d_off, - &entry->d_off); - + entry->d_off = orig_entry->d_off; entry->d_ino = orig_entry->d_ino; entry->d_type = orig_entry->d_type; entry->d_len = orig_entry->d_len; @@ -4050,7 +4048,6 @@ dht_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, dht_local_t *local = NULL; int op_errno = -1; xlator_t *xvol = NULL; - off_t xoff = 0; int ret = 0; dht_conf_t *conf = NULL; @@ -4072,7 +4069,7 @@ dht_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, local->xattr_req = (dict)? dict_ref (dict) : NULL; local->first_up_subvol = dht_first_up_subvol (this); - dht_deitransform (this, yoff, &xvol, (uint64_t *)&xoff); + dht_deitransform (this, yoff, &xvol); /* TODO: do proper readdir */ if (whichop == GF_FOP_READDIRP) { @@ -4111,10 +4108,10 @@ dht_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, } STACK_WIND (frame, dht_readdirp_cbk, xvol, xvol->fops->readdirp, - fd, size, xoff, local->xattr); + fd, size, yoff, local->xattr); } else { STACK_WIND (frame, dht_readdir_cbk, xvol, xvol->fops->readdir, - fd, size, xoff, local->xattr); + fd, size, yoff, local->xattr); } return 0; diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 779b470585c..67e693146af 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -332,6 +332,7 @@ struct dht_conf { gf_boolean_t unhashed_sticky_bit; struct timeval last_stat_fetch; gf_lock_t layout_lock; + dict_t *leaf_to_subvol; void *private; /* Can be used by wrapper xlators over dht */ gf_boolean_t use_readdirp; @@ -501,9 +502,7 @@ int dht_disk_layout_merge (xlator_t *this, dht_layout_t *layout, int dht_frame_return (call_frame_t *frame); -int dht_itransform (xlator_t *this, xlator_t *subvol, uint64_t x, uint64_t *y); -int dht_deitransform (xlator_t *this, uint64_t y, xlator_t **subvol, - uint64_t *x); +int dht_deitransform (xlator_t *this, uint64_t y, xlator_t **subvol); void dht_local_wipe (xlator_t *this, dht_local_t *local); dht_local_t *dht_local_init (call_frame_t *frame, loc_t *loc, fd_t *fd, @@ -775,6 +774,8 @@ int32_t dht_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t dht_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, off_t len, dict_t *xdata); +int +dht_set_subvol_range(xlator_t *this); int32_t dht_init (xlator_t *this); void dht_fini (xlator_t *this); int dht_reconfigure (xlator_t *this, dict_t *options); diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c index bf21f39a3a7..f4e5305d791 100644 --- a/xlators/cluster/dht/src/dht-helper.c +++ b/xlators/cluster/dht/src/dht-helper.c @@ -62,20 +62,6 @@ dht_frame_return (call_frame_t *frame) return this_call_cnt; } - -static uint64_t -dht_bits_for (uint64_t num) -{ - uint64_t bits = 0, ctrl = 1; - - while (ctrl < num) { - ctrl *= 2; - bits ++; - } - - return bits; -} - /* * A slightly "updated" version of the algorithm described in the commit log * is used here. @@ -88,66 +74,6 @@ dht_bits_for (uint64_t num) * upwards which is described as 64, are both made "configurable." */ - -#define BACKEND_D_OFF_BITS 63 -#define PRESENT_D_OFF_BITS 63 - -#define ONE 1ULL -#define MASK (~0ULL) -#define PRESENT_MASK (MASK >> (64 - PRESENT_D_OFF_BITS)) -#define BACKEND_MASK (MASK >> (64 - BACKEND_D_OFF_BITS)) - -#define TOP_BIT (ONE << (PRESENT_D_OFF_BITS - 1)) -#define SHIFT_BITS (max (0, (BACKEND_D_OFF_BITS - PRESENT_D_OFF_BITS + 1))) - -int -dht_itransform (xlator_t *this, xlator_t *subvol, uint64_t x, uint64_t *y_p) -{ - dht_conf_t *conf = NULL; - int cnt = 0; - int max = 0; - uint64_t y = 0; - uint64_t hi_mask = 0; - uint64_t off_mask = 0; - int max_bits = 0; - - if (x == ((uint64_t) -1)) { - y = (uint64_t) -1; - goto out; - } - - conf = this->private; - if (!conf) - goto out; - - max = conf->subvolume_cnt; - cnt = dht_subvol_cnt (this, subvol); - - if (max == 1) { - y = x; - goto out; - } - - max_bits = dht_bits_for (max); - - hi_mask = ~(PRESENT_MASK >> (max_bits + 1)); - - if (x & hi_mask) { - /* HUGE d_off */ - off_mask = MASK << max_bits; - y = TOP_BIT | ((x >> SHIFT_BITS) & off_mask) | cnt; - } else { - /* small d_off */ - y = ((x * max) + cnt); - } - -out: - if (y_p) - *y_p = y; - - return 0; -} - int dht_filter_loc_subvol_key (xlator_t *this, loc_t *loc, loc_t *new_loc, xlator_t **subvol) @@ -205,55 +131,44 @@ out: return ret; } -int -dht_deitransform (xlator_t *this, uint64_t y, xlator_t **subvol_p, - uint64_t *x_p) +static xlator_t * +dht_get_subvol_from_id(xlator_t *this, int client_id) { + xlator_t *xl = NULL; dht_conf_t *conf = NULL; - int cnt = 0; - int max = 0; - uint64_t x = 0; + char sid[6] = { 0 }; + + conf = this->private; + + sprintf(sid, "%d", client_id); + if (dict_get_ptr(conf->leaf_to_subvol, sid, (void **) &xl)) + xl = NULL; + + return xl; +} + +int +dht_deitransform (xlator_t *this, uint64_t y, xlator_t **subvol_p) +{ + int client_id = 0; xlator_t *subvol = 0; - int max_bits = 0; - uint64_t off_mask = 0; - uint64_t host_mask = 0; + dht_conf_t *conf = NULL; if (!this->private) return -1; conf = this->private; - max = conf->subvolume_cnt; - if (max == 1) { - x = y; - cnt = 0; - goto out; - } + client_id = gf_deitransform(this, y); - if (y & TOP_BIT) { - /* HUGE d_off */ - max_bits = dht_bits_for (max); - off_mask = (MASK << max_bits); - host_mask = ~(off_mask); + subvol = dht_get_subvol_from_id(this, client_id); - x = ((y & ~TOP_BIT) & off_mask) << SHIFT_BITS; - - cnt = y & host_mask; - } else { - /* small d_off */ - cnt = y % max; - x = y / max; - } - -out: - subvol = conf->subvolumes[cnt]; + if (!subvol) + subvol = conf->subvolumes[0]; if (subvol_p) *subvol_p = subvol; - if (x_p) - *x_p = x; - return 0; } @@ -829,6 +744,8 @@ dht_init_subvolumes (xlator_t *this, dht_conf_t *conf) } conf->subvolume_cnt = cnt; + dht_set_subvol_range(this); + cnt = 0; for (subvols = this->children; subvols; subvols = subvols->next) conf->subvolumes[cnt++] = subvols->xlator; diff --git a/xlators/cluster/dht/src/dht-layout.c b/xlators/cluster/dht/src/dht-layout.c index 757ec731d26..3ea75b34ad0 100644 --- a/xlators/cluster/dht/src/dht-layout.c +++ b/xlators/cluster/dht/src/dht-layout.c @@ -166,7 +166,6 @@ dht_layout_search (xlator_t *this, dht_layout_t *layout, const char *name) int i = 0; int ret = 0; - ret = dht_hash_compute (this, layout->type, name, &hash); if (ret != 0) { gf_log (this->name, GF_LOG_WARNING, diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 466042c74a0..3531872dd31 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -1492,12 +1492,14 @@ gf_defrag_migrate_data (xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc, if (defrag->stats == _gf_true) { gettimeofday (&start, NULL); } + if (defrag->defrag_pattern && (gf_defrag_pattern_match (defrag, entry->d_name, entry->d_stat.ia_size) == _gf_false)) { continue; } + loc_wipe (&entry_loc); ret =dht_build_child_loc (this, &entry_loc, loc, entry->d_name); diff --git a/xlators/cluster/dht/src/dht-shared.c b/xlators/cluster/dht/src/dht-shared.c index 22a7260f829..860f3e716f0 100644 --- a/xlators/cluster/dht/src/dht-shared.c +++ b/xlators/cluster/dht/src/dht-shared.c @@ -214,6 +214,8 @@ dht_fini (xlator_t *this) GF_FREE (conf->file_layouts); } + dict_destroy(conf->leaf_to_subvol); + GF_FREE (conf->subvolumes); GF_FREE (conf->subvolume_status); @@ -288,7 +290,6 @@ out: return ret; } - int dht_decommissioned_remove (xlator_t *this, dht_conf_t *conf) { @@ -344,6 +345,27 @@ dht_init_regex (xlator_t *this, dict_t *odict, char *name, } int +dht_set_subvol_range(xlator_t *this) +{ + int ret = -1; + dht_conf_t *conf = NULL; + + conf = this->private; + + if (!conf) + goto out; + + conf->leaf_to_subvol = dict_new(); + if (!conf->leaf_to_subvol) + goto out; + + ret = glusterfs_reachable_leaves(this, conf->leaf_to_subvol); + +out: + return ret; +} + +int dht_reconfigure (xlator_t *this, dict_t *options) { dht_conf_t *conf = NULL; @@ -676,6 +698,9 @@ dht_init (xlator_t *this) this->private = conf; + if (dht_set_subvol_range(this)) + goto err; + return 0; err: |