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:
Shehjar Tikoo 2010-02-25 15:38:03 +00:00 committed by Anand V. Avati
parent 59947fc4c2
commit 0a86bd1aa3
3 changed files with 40 additions and 0 deletions

View File

@ -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) {

View File

@ -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);

View File

@ -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)