distribute: Respect end-of-dir on readdir only for last subvol
We need to ensure that only the last subvolume's end-of-directory notification is respected so that directory reading does not stop before all subvolumes have been read. That could happen because the posix for each subvolume sends a ENOENT on end-of-directory but in distribute we're not concerned only with a posix's view of the directory but the aggregated namespace' view of the directory, which is maintained by distribute. Signed-off-by: Shehjar Tikoo <shehjart@gluster.com> Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 597 (miscellaneous fixes for xlators to work well with NFS xlator) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=597
This commit is contained in:
parent
59947fc4c2
commit
0a86bd1aa3
@ -2168,6 +2168,15 @@ dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,
|
||||
count++;
|
||||
}
|
||||
op_ret = count;
|
||||
/* We need to ensure that only the last subvolume's end-of-directory
|
||||
* notification is respected so that directory reading does not stop
|
||||
* before all subvolumes have been read. That could happen because the
|
||||
* posix for each subvolume sends a ENOENT on end-of-directory but in
|
||||
* distribute we're not concerned only with a posix's view of the
|
||||
* directory but the aggregated namespace' view of the directory.
|
||||
*/
|
||||
if (prev->this != dht_last_up_subvol (this))
|
||||
op_errno = 0;
|
||||
|
||||
done:
|
||||
if (count == 0) {
|
||||
@ -2258,6 +2267,15 @@ dht_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
|
||||
}
|
||||
}
|
||||
op_ret = count;
|
||||
/* We need to ensure that only the last subvolume's end-of-directory
|
||||
* notification is respected so that directory reading does not stop
|
||||
* before all subvolumes have been read. That could happen because the
|
||||
* posix for each subvolume sends a ENOENT on end-of-directory but in
|
||||
* distribute we're not concerned only with a posix's view of the
|
||||
* directory but the aggregated namespace' view of the directory.
|
||||
*/
|
||||
if (prev->this != dht_last_up_subvol (this))
|
||||
op_errno = 0;
|
||||
|
||||
done:
|
||||
if (count == 0) {
|
||||
|
@ -269,6 +269,7 @@ int dht_layout_set (xlator_t *this, inode_t *inode, dht_layout_t *layout);
|
||||
void dht_layout_unref (xlator_t *this, dht_layout_t *layout);
|
||||
dht_layout_t *dht_layout_ref (xlator_t *this, dht_layout_t *layout);
|
||||
xlator_t *dht_first_up_subvol (xlator_t *this);
|
||||
xlator_t *dht_last_up_subvol (xlator_t *this);
|
||||
|
||||
int dht_build_child_loc (xlator_t *this, loc_t *child, loc_t *parent, char *name);
|
||||
|
||||
|
@ -208,6 +208,27 @@ dht_first_up_subvol (xlator_t *this)
|
||||
return child;
|
||||
}
|
||||
|
||||
xlator_t *
|
||||
dht_last_up_subvol (xlator_t *this)
|
||||
{
|
||||
dht_conf_t *conf = NULL;
|
||||
xlator_t *child = NULL;
|
||||
int i = 0;
|
||||
|
||||
conf = this->private;
|
||||
LOCK (&conf->subvolume_lock);
|
||||
{
|
||||
for (i = conf->subvolume_cnt-1; i >= 0; i--) {
|
||||
if (conf->subvolume_status[i]) {
|
||||
child = conf->subvolumes[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
UNLOCK (&conf->subvolume_lock);
|
||||
|
||||
return child;
|
||||
}
|
||||
|
||||
xlator_t *
|
||||
dht_subvol_get_hashed (xlator_t *this, loc_t *loc)
|
||||
|
Loading…
x
Reference in New Issue
Block a user