diff options
author | Anand V. Avati <avati@gluster.com> | 2009-03-09 16:16:02 +0530 |
---|---|---|
committer | Anand V. Avati <avati@amp.gluster.com> | 2009-03-09 17:40:35 +0530 |
commit | fdfdd7cf05b7378c879917acb9129d69a407aee9 (patch) | |
tree | 059910ef4d232cf66251dac977415bc79d899332 /xlators | |
parent | 5e4e99f4c1aa09b9e323c6fd23fcc3517447a6d7 (diff) |
dht_readdir_cbk - retry on same subvol if no entries match the hash
Signed-off-by: Anand V. Avati <avati@amp.gluster.com>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index cd29786e7bf..6d97f8f7a4d 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -2041,7 +2041,8 @@ dht_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, gf_dirent_t *entry = NULL; call_frame_t *prev = NULL; xlator_t *subvol = NULL; - xlator_t *next = NULL; + xlator_t *next_subvol = NULL; + off_t next_offset = 0; dht_layout_t *layout = NULL; int count = 0; @@ -2077,19 +2078,28 @@ dht_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, list_add_tail (&entry->list, &entries.list); count++; } + next_offset = orig_entry->d_off; } op_ret = count; done: if (count == 0) { - next = dht_subvol_next (this, prev->this); - if (!next) { + /* non-zero next_offset means that + EOF is not yet hit on the current subvol + */ + if (next_offset == 0) { + next_subvol = dht_subvol_next (this, prev->this); + } else { + next_subvol = prev->this; + } + + if (!next_subvol) { goto unwind; } STACK_WIND (frame, dht_readdir_cbk, - next, next->fops->readdir, - local->fd, local->size, 0); + next_subvol, next_subvol->fops->readdir, + local->fd, local->size, next_offset); return 0; } |