diff options
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 47 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 18 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 1 | ||||
-rw-r--r-- | xlators/cluster/dht/src/tier-common.c | 213 | ||||
-rw-r--r-- | xlators/cluster/dht/src/tier-common.h | 6 | ||||
-rw-r--r-- | xlators/cluster/dht/src/tier.c | 2 |
6 files changed, 265 insertions, 22 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index c667266fed8..f3499ed6d0b 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -4387,7 +4387,7 @@ unlock: /* * dht_normalize_stats - */ -static void +void dht_normalize_stats (struct statvfs *buf, unsigned long bsize, unsigned long frsize) { @@ -4535,6 +4535,10 @@ dht_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) dht_conf_t *conf = NULL; int op_errno = -1; int i = -1; + inode_t *inode = NULL; + inode_table_t *itable = NULL; + uuid_t root_gfid = {0, }; + loc_t newloc = {0, }; VALIDATE_OR_GOTO (frame, err); VALIDATE_OR_GOTO (this, err); @@ -4549,31 +4553,34 @@ dht_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) goto err; } - if (!loc->inode || IA_ISDIR (loc->inode->ia_type)) { - local->call_cnt = conf->subvolume_cnt; + if (loc->inode && !IA_ISDIR (loc->inode->ia_type)) { + itable = loc->inode->table; + if (!itable) { + op_errno = EINVAL; + goto err; + } - for (i = 0; i < conf->subvolume_cnt; i++) { - STACK_WIND (frame, dht_statfs_cbk, - conf->subvolumes[i], - conf->subvolumes[i]->fops->statfs, loc, - xdata); + loc = &local->loc2; + root_gfid[15] = 1; + + inode = inode_find (itable, root_gfid); + if (!inode) { + op_errno = EINVAL; + goto err; } - return 0; - } - subvol = dht_subvol_get_cached (this, loc->inode); - if (!subvol) { - gf_msg_debug (this->name, 0, - "no cached subvolume for path=%s", loc->path); - op_errno = EINVAL; - goto err; + dht_build_root_loc (inode, &newloc); + loc = &newloc; } - local->call_cnt = 1; - - STACK_WIND (frame, dht_statfs_cbk, - subvol, subvol->fops->statfs, loc, xdata); + local->call_cnt = conf->subvolume_cnt; + for (i = 0; i < conf->subvolume_cnt; i++) { + STACK_WIND (frame, dht_statfs_cbk, + conf->subvolumes[i], + conf->subvolumes[i]->fops->statfs, loc, + xdata); + } return 0; err: diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 9a71c46c8e4..080e98594ec 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -177,6 +177,19 @@ typedef gf_boolean_t (*dht_need_heal_t)(call_frame_t *frame, dht_layout_t **inmem, dht_layout_t **ondisk); +typedef struct { + uint64_t blocks_used; + uint64_t pblocks_used; + uint64_t files_used; + uint64_t pfiles_used; + uint64_t unhashed_blocks_used; + uint64_t unhashed_pblocks_used; + uint64_t unhashed_files_used; + uint64_t unhashed_pfiles_used; + uint64_t unhashed_fsid; + uint64_t hashed_fsid; +} tier_statvfs_t; + struct dht_local { int call_cnt; loc_t loc; @@ -193,6 +206,7 @@ struct dht_local { struct iatt preparent; struct iatt postparent; struct statvfs statvfs; + tier_statvfs_t tier_statvfs; fd_t *fd; inode_t *inode; dict_t *params; @@ -1229,4 +1243,8 @@ dht_get_lock_subvolume (xlator_t *this, struct gf_flock *lock, int dht_lk_inode_unref (call_frame_t *frame, int32_t op_ret); +void +dht_normalize_stats (struct statvfs *buf, unsigned long bsize, + unsigned long frsize); + #endif/* _DHT_H */ diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 4c83ed478c0..83805fe86a6 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -1917,7 +1917,6 @@ dht_build_root_loc (inode_t *inode, loc_t *loc) loc->gfid[15] = 1; } - /* return values: 1 -> error, bug ignore and continue 0 -> proceed -1 -> error, handle it */ diff --git a/xlators/cluster/dht/src/tier-common.c b/xlators/cluster/dht/src/tier-common.c index 20d3f24d3bf..5b8634718ca 100644 --- a/xlators/cluster/dht/src/tier-common.c +++ b/xlators/cluster/dht/src/tier-common.c @@ -1082,3 +1082,216 @@ tier_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, tier_do_readdir (frame, this, fd, size, yoff, GF_FOP_READDIRP, dict); return 0; } + +int +tier_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int op_ret, int op_errno, struct statvfs *statvfs, + dict_t *xdata) +{ + gf_boolean_t event = _gf_false; + qdstatfs_action_t action = qdstatfs_action_OFF; + dht_local_t *local = NULL; + int this_call_cnt = 0; + int bsize = 0; + int frsize = 0; + GF_UNUSED int ret = 0; + unsigned long new_usage = 0; + unsigned long cur_usage = 0; + call_frame_t *prev = NULL; + dht_conf_t *conf = NULL; + tier_statvfs_t *tier_stat = NULL; + + prev = cookie; + local = frame->local; + GF_ASSERT (local); + + conf = this->private; + + if (xdata) + ret = dict_get_int8 (xdata, "quota-deem-statfs", + (int8_t *)&event); + + tier_stat = &local->tier_statvfs; + + LOCK (&frame->lock); + { + if (op_ret == -1) { + local->op_errno = op_errno; + goto unlock; + } + if (!statvfs) { + op_errno = EINVAL; + local->op_ret = -1; + goto unlock; + } + local->op_ret = 0; + + switch (local->quota_deem_statfs) { + case _gf_true: + if (event == _gf_true) + action = qdstatfs_action_COMPARE; + else + action = qdstatfs_action_NEGLECT; + break; + + case _gf_false: + if (event == _gf_true) { + action = qdstatfs_action_REPLACE; + local->quota_deem_statfs = _gf_true; + } + break; + + default: + gf_msg (this->name, GF_LOG_ERROR, 0, + DHT_MSG_INVALID_VALUE, + "Encountered third " + "value for boolean variable %d", + local->quota_deem_statfs); + break; + } + + if (local->quota_deem_statfs) { + switch (action) { + case qdstatfs_action_NEGLECT: + goto unlock; + + case qdstatfs_action_REPLACE: + local->statvfs = *statvfs; + goto unlock; + + case qdstatfs_action_COMPARE: + new_usage = statvfs->f_blocks - + statvfs->f_bfree; + cur_usage = local->statvfs.f_blocks - + local->statvfs.f_bfree; + + /* Take the max of the usage from subvols */ + if (new_usage >= cur_usage) + local->statvfs = *statvfs; + goto unlock; + + default: + break; + } + } + + if (local->statvfs.f_bsize != 0) { + bsize = max(local->statvfs.f_bsize, statvfs->f_bsize); + frsize = max(local->statvfs.f_frsize, statvfs->f_frsize); + dht_normalize_stats(&local->statvfs, bsize, frsize); + dht_normalize_stats(statvfs, bsize, frsize); + } else { + local->statvfs.f_bsize = statvfs->f_bsize; + local->statvfs.f_frsize = statvfs->f_frsize; + } + + if (prev->this == TIER_HASHED_SUBVOL) { + local->statvfs.f_blocks = statvfs->f_blocks; + local->statvfs.f_files = statvfs->f_files; + local->statvfs.f_fsid = statvfs->f_fsid; + local->statvfs.f_flag = statvfs->f_flag; + local->statvfs.f_namemax = statvfs->f_namemax; + tier_stat->blocks_used = (statvfs->f_blocks - statvfs->f_bfree); + tier_stat->pblocks_used = (statvfs->f_blocks - statvfs->f_bavail); + tier_stat->files_used = (statvfs->f_files - statvfs->f_ffree); + tier_stat->pfiles_used = (statvfs->f_files - statvfs->f_favail); + tier_stat->hashed_fsid = statvfs->f_fsid; + } else { + tier_stat->unhashed_fsid = statvfs->f_fsid; + tier_stat->unhashed_blocks_used = (statvfs->f_blocks - statvfs->f_bfree); + tier_stat->unhashed_pblocks_used = (statvfs->f_blocks - statvfs->f_bavail); + tier_stat->unhashed_files_used = (statvfs->f_files - statvfs->f_ffree); + tier_stat->unhashed_pfiles_used = (statvfs->f_files - statvfs->f_favail); + } + + } +unlock: + UNLOCK (&frame->lock); + + this_call_cnt = dht_frame_return (frame); + if (is_last_call (this_call_cnt)) { + if (tier_stat->unhashed_fsid != tier_stat->hashed_fsid) { + tier_stat->blocks_used += tier_stat->unhashed_blocks_used; + tier_stat->pblocks_used += tier_stat->unhashed_pblocks_used; + tier_stat->files_used += tier_stat->unhashed_files_used; + tier_stat->pfiles_used += tier_stat->unhashed_pfiles_used; + } + local->statvfs.f_bfree = local->statvfs.f_blocks - + tier_stat->blocks_used; + local->statvfs.f_bavail = local->statvfs.f_blocks - + tier_stat->pblocks_used; + local->statvfs.f_ffree = local->statvfs.f_files - + tier_stat->files_used; + local->statvfs.f_favail = local->statvfs.f_files - + tier_stat->pfiles_used; + DHT_STACK_UNWIND (statfs, frame, local->op_ret, local->op_errno, + &local->statvfs, xdata); + } + + return 0; +} + + +int +tier_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) +{ + xlator_t *subvol = NULL; + dht_local_t *local = NULL; + dht_conf_t *conf = NULL; + int op_errno = -1; + int i = -1; + inode_t *inode = NULL; + inode_table_t *itable = NULL; + uuid_t root_gfid = {0, }; + loc_t newloc = {0, }; + + VALIDATE_OR_GOTO (frame, err); + VALIDATE_OR_GOTO (this, err); + VALIDATE_OR_GOTO (loc, err); + VALIDATE_OR_GOTO (this->private, err); + + conf = this->private; + + local = dht_local_init (frame, NULL, NULL, GF_FOP_STATFS); + if (!local) { + op_errno = ENOMEM; + goto err; + } + + if (loc->inode && !IA_ISDIR (loc->inode->ia_type)) { + itable = loc->inode->table; + if (!itable) { + op_errno = EINVAL; + goto err; + } + + loc = &local->loc2; + root_gfid[15] = 1; + + inode = inode_find (itable, root_gfid); + if (!inode) { + op_errno = EINVAL; + goto err; + } + + dht_build_root_loc (inode, &newloc); + loc = &newloc; + } + + local->call_cnt = conf->subvolume_cnt; + + for (i = 0; i < conf->subvolume_cnt; i++) { + STACK_WIND (frame, tier_statfs_cbk, + conf->subvolumes[i], + conf->subvolumes[i]->fops->statfs, loc, + xdata); + } + + return 0; + +err: + op_errno = (op_errno == -1) ? errno : op_errno; + DHT_STACK_UNWIND (statfs, frame, -1, op_errno, NULL, NULL); + + return 0; +} diff --git a/xlators/cluster/dht/src/tier-common.h b/xlators/cluster/dht/src/tier-common.h index 0ef96aca032..26e01d7f141 100644 --- a/xlators/cluster/dht/src/tier-common.h +++ b/xlators/cluster/dht/src/tier-common.h @@ -58,5 +58,11 @@ tier_readdir (call_frame_t *frame, int tier_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, dict_t *xdata); + + +int +tier_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata); + + #endif diff --git a/xlators/cluster/dht/src/tier.c b/xlators/cluster/dht/src/tier.c index 356af021563..9c8f15bbce2 100644 --- a/xlators/cluster/dht/src/tier.c +++ b/xlators/cluster/dht/src/tier.c @@ -2465,7 +2465,7 @@ struct xlator_fops fops = { .mknod = dht_mknod, .open = dht_open, - .statfs = dht_statfs, + .statfs = tier_statfs, .opendir = dht_opendir, .readdir = tier_readdir, .readdirp = tier_readdirp, |