diff options
| author | Susant Palai <spalai@redhat.com> | 2014-05-13 12:56:17 -0400 |
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2014-06-16 05:14:20 -0700 |
| commit | b8f3aab95f01ac7d590a5ba490e890d9cf8c2e50 (patch) | |
| tree | 87e346c84680c8acdee38464014d04c0e9974d86 /xlators/cluster/dht/src/dht-common.c | |
| parent | 62265f40d7201854dbf33d59a74286dda671a129 (diff) | |
DHT/readdirp: Directory not shown/healed on mount point if exists
on single brick(non first up subvolume).
Problem: If snapshot is taken, when mkdir has succeeded only on
hashed_subvolume, then after restoring snapshot the directory
is not shown on mount point.
Why: dht_readdirp takes only those directory entries in to
account, which are present on first_up_subvolume. Hence, if the
"hashed subvolume" is not same as first_up_subvolume, it wont be listed
on mount point and also not healed.
Solution:
Case 1: (Rebalance not running)If hashed subvolume is NULL or down then
filter in first_up_subvolume. Other wise the corresponding hashed subvolume
will take care of the directory entry.
Case 2: If readdirp_optimize option is turned on then read from first_up_subvol
Change-Id: Idaad28f1c9f688dbfb1a8a3ab8b244510c02365e
BUG: 1092433
Signed-off-by: Susant Palai <spalai@redhat.com>
Reviewed-on: http://review.gluster.org/7599
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/cluster/dht/src/dht-common.c')
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index d2e1598251b..419815cce4d 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -3046,7 +3046,6 @@ err: return 0; } - int dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, int op_errno, gf_dirent_t *orig_entries, dict_t *xdata) @@ -3062,7 +3061,9 @@ dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, dht_layout_t *layout = 0; dht_conf_t *conf = NULL; xlator_t *subvol = 0; + xlator_t *hashed_subvol = 0; int ret = 0; + int readdir_optimize = 0; INIT_LIST_HEAD (&entries.list); prev = cookie; @@ -3077,18 +3078,48 @@ dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, layout = local->layout; + if (conf->readdir_optimize == _gf_true) + readdir_optimize = 1; + list_for_each_entry (orig_entry, (&orig_entries->list), list) { next_offset = orig_entry->d_off; - if (check_is_dir (NULL, (&orig_entry->d_stat), NULL) && - (prev->this != local->first_up_subvol)) { - continue; + if (check_is_dir (NULL, (&orig_entry->d_stat), NULL)) { + + /*Directory entries filtering : + * a) If rebalance is running, pick from first_up_subvol + * b) (rebalance not running)hashed subvolume is NULL or + * down then filter in first_up_subvolume. Other wise the + * corresponding hashed subvolume will take care of the + * directory entry. + */ + + if (readdir_optimize) { + if (prev->this == local->first_up_subvol) + goto list; + else + continue; + + } + + hashed_subvol = dht_layout_search (this, layout, \ + orig_entry->d_name); + + if (prev->this == hashed_subvol) + goto list; + if ((hashed_subvol + && dht_subvol_status (conf, hashed_subvol)) + ||(prev->this != local->first_up_subvol)) + continue; + + goto list; } + if (check_is_linkfile (NULL, (&orig_entry->d_stat), orig_entry->dict, conf->link_xattr_name)) { continue; } - +list: entry = gf_dirent_for_name (orig_entry->d_name); if (!entry) { |
