diff options
Diffstat (limited to 'xlators/cluster')
-rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 161 |
1 files changed, 34 insertions, 127 deletions
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index bc6e983cd0a..84081fdaa13 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -2113,6 +2113,8 @@ gf_defrag_migrate_single_file (void *opaque) double elapsed = {0,}; struct dht_container *rebal_entry = NULL; inode_t *inode = NULL; + xlator_t *hashed_subvol = NULL; + xlator_t *cached_subvol = NULL; rebal_entry = (struct dht_container *)opaque; if (!rebal_entry) { @@ -2180,6 +2182,32 @@ gf_defrag_migrate_single_file (void *opaque) goto out; } + hashed_subvol = dht_subvol_get_hashed (this, &entry_loc); + if (!hashed_subvol) { + gf_msg (this->name, GF_LOG_ERROR, 0, + DHT_MSG_HASHED_SUBVOL_GET_FAILED, + "Failed to get hashed subvol for %s", + loc->path); + ret = 0; + goto out; + } + + cached_subvol = dht_subvol_get_cached (this, entry_loc.inode); + if (!cached_subvol) { + gf_msg (this->name, GF_LOG_ERROR, 0, + DHT_MSG_CACHED_SUBVOL_GET_FAILED, + "Failed to get cached subvol for %s", + loc->path); + + ret = 0; + goto out; + } + + if (hashed_subvol == cached_subvol) { + ret = 0; + goto out; + } + inode = inode_link (entry_loc.inode, entry_loc.parent, entry->d_name, &iatt); inode_unref (entry_loc.inode); /* use the inode returned by inode_link */ @@ -2426,12 +2454,8 @@ gf_defrag_get_entry (xlator_t *this, int i, struct dht_container **container, int ret = -1; char is_linkfile = 0; gf_dirent_t *df_entry = NULL; - loc_t entry_loc = {0,}; dict_t *xattr_rsp = NULL; - struct iatt iatt = {0,}; struct dht_container *tmp_container = NULL; - xlator_t *hashed_subvol = NULL; - xlator_t *cached_subvol = NULL; if (defrag->defrag_status != GF_DEFRAG_STATUS_STARTED) { ret = -1; @@ -2447,7 +2471,7 @@ gf_defrag_get_entry (xlator_t *this, int i, struct dht_container **container, ret = syncop_readdirp (conf->local_subvols[i], fd, 131072, dir_dfmeta->offset_var[i].offset, &(dir_dfmeta->equeue[i]), - NULL, NULL); + xattr_req, NULL); if (ret == 0) { dir_dfmeta->offset_var[i].readdir_done = 1; ret = 0; @@ -2511,137 +2535,22 @@ gf_defrag_get_entry (xlator_t *this, int i, struct dht_container **container, continue; } - loc_wipe (&entry_loc); - ret = dht_build_child_loc (this, &entry_loc, loc, - df_entry->d_name); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, "Child loc" - " build failed"); - ret = -1; - goto out; - } - - if (gf_uuid_is_null (df_entry->d_stat.ia_gfid)) { - gf_msg (this->name, GF_LOG_ERROR, 0, - DHT_MSG_GFID_NULL, - "%s/%s gfid not present", loc->path, - df_entry->d_name); - continue; - } - - gf_uuid_copy (entry_loc.gfid, df_entry->d_stat.ia_gfid); - - if (gf_uuid_is_null (loc->gfid)) { - gf_msg (this->name, GF_LOG_ERROR, 0, - DHT_MSG_GFID_NULL, - "%s/%s gfid not present", loc->path, - df_entry->d_name); - continue; - } - - gf_uuid_copy (entry_loc.pargfid, loc->gfid); - - entry_loc.inode->ia_type = df_entry->d_stat.ia_type; - - if (xattr_rsp) { - dict_unref (xattr_rsp); - xattr_rsp = NULL; - } - - ret = syncop_lookup (conf->local_subvols[i], &entry_loc, - &iatt, NULL, xattr_req, &xattr_rsp); - if (ret) { - gf_msg (this->name, GF_LOG_ERROR, 0, - DHT_MSG_MIGRATE_FILE_FAILED, - "Migrate file failed:%s lookup failed", - entry_loc.path); - - if (-ret != ENOENT && -ret != ESTALE) { - - defrag->total_failures++; - - if (conf->decommission_in_progress) { - ret = -1; - goto out; - } else { - *should_commit_hash = 0; - continue; - } - } - - continue; - } - - - is_linkfile = check_is_linkfile (NULL, &iatt, xattr_rsp, - conf->link_xattr_name); + is_linkfile = check_is_linkfile (NULL, &df_entry->d_stat, + df_entry->dict, + conf->link_xattr_name); if (is_linkfile) { /* No need to add linkto file to the queue for migration. Only the actual data file need to be checked for migration criteria. */ + gf_msg_debug (this->name, 0, "Skipping linkfile" - " %s on subvol: %s", entry_loc.path, + " %s on subvol: %s", df_entry->d_name, conf->local_subvols[i]->name); continue; } - - ret = syncop_lookup (this, &entry_loc, NULL, NULL, - NULL, NULL); - if (ret) { - gf_msg (this->name, GF_LOG_WARNING, -ret, - DHT_MSG_MIGRATE_FILE_FAILED, - "lookup failed for file:%s", - entry_loc.path); - - if (-ret != ENOENT && -ret != ESTALE) { - - defrag->total_failures++; - - if (conf->decommission_in_progress) { - ret = -1; - goto out; - } else { - *should_commit_hash = 0; - continue; - } - } - - continue; - } - - /* if distribute is present, it will honor this key. - * -1, ENODATA is returned if distribute is not present - * or file doesn't have a link-file. If file has - * link-file, the path of link-file will be the value, - * and also that guarantees that file has to be mostly - * migrated */ - - hashed_subvol = dht_subvol_get_hashed (this, &entry_loc); - if (!hashed_subvol) { - gf_msg (this->name, GF_LOG_ERROR, 0, - DHT_MSG_HASHED_SUBVOL_GET_FAILED, - "Failed to get hashed subvol for %s", - loc->path); - continue; - } - - cached_subvol = dht_subvol_get_cached (this, entry_loc.inode); - if (!cached_subvol) { - gf_msg (this->name, GF_LOG_ERROR, 0, - DHT_MSG_CACHED_SUBVOL_GET_FAILED, - "Failed to get cached subvol for %s", - loc->path); - - continue; - } - - if (hashed_subvol == cached_subvol) { - continue; - } - /*Build Container Structure */ tmp_container = GF_CALLOC (1, sizeof(struct dht_container), @@ -2702,8 +2611,6 @@ gf_defrag_get_entry (xlator_t *this, int i, struct dht_container **container, } out: - loc_wipe (&entry_loc); - if (ret == 0) { *container = tmp_container; } else { |