diff options
| author | shishir gowda <gowda.shishir@gmail.com> | 2013-12-10 14:42:05 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2013-12-14 05:28:32 -0800 | 
| commit | 6677b97f2d17699c74779922cf310adf8bff5558 (patch) | |
| tree | f976e0041e774cd0636bb0c1cbd87e59517a5398 | |
| parent | b562ace8f7525f6d06555d4f02ac48fec82f23ad (diff) | |
cluster/dht: Del GF_READDIR_SKIP_DIRS key from dict for first_up
Currently, we sent GF_READDIR_SKIP_DIRS for all subvolumes if
first_subvol != first_up_subvolume.
Also first_up_subvolume can change with-in the life of a call and
cbk. Saving the first_up_subvol in dht_local for checks.
Back porting fix http://review.gluster.org/5577
BUG: 996474
Change-Id: I67b5bbe781e12812557b569b7d0a0beba4224159
Signed-off-by: shishir gowda <gowda.shishir@gmail.com>
Reviewed-on: http://review.gluster.org/6468
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 15 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 1 | 
2 files changed, 12 insertions, 4 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index d18a0f856f8..f4a6a9136a7 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -3071,7 +3071,7 @@ dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,          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 != dht_first_up_subvol (this))) || +		    (prev->this != local->first_up_subvol)) ||                      check_is_linkfile (NULL, (&orig_entry->d_stat),                                         orig_entry->dict)) {                          continue; @@ -3150,13 +3150,16 @@ done:                  }  		if (conf->readdir_optimize == _gf_true) { -                        if (next_subvol != dht_first_up_subvol (this)) { +                        if (next_subvol != local->first_up_subvol) {                                  ret = dict_set_int32 (local->xattr,                                                        GF_READDIR_SKIP_DIRS, 1);                                  if (ret)                                          gf_log (this->name, GF_LOG_ERROR,  					         "dict set failed"); -		        } +		        } else { +                                 dict_del (local->xattr, +                                           GF_READDIR_SKIP_DIRS); +                        }                  }                  STACK_WIND (frame, dht_readdirp_cbk, @@ -3301,6 +3304,7 @@ dht_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,          local->fd = fd_ref (fd);          local->size = size;          local->xattr_req = (dict)? dict_ref (dict) : NULL; +        local->first_up_subvol = dht_first_up_subvol (this);          dht_deitransform (this, yoff, &xvol, (uint64_t *)&xoff); @@ -3320,13 +3324,16 @@ dht_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,                                          "failed to set 'glusterfs.dht.linkto'"                                          " key");  			if (conf->readdir_optimize == _gf_true) { -                                if (xvol != dht_first_up_subvol (this)) { +                                if (xvol != local->first_up_subvol) {  				        ret = dict_set_int32 (local->xattr,  			                               GF_READDIR_SKIP_DIRS, 1);  				        if (ret)  					        gf_log (this->name,                                                          GF_LOG_ERROR,  						        "Dict set failed"); +                                } else { +                                        dict_del (local->xattr, +                                                  GF_READDIR_SKIP_DIRS);                                  }  			}                  } diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index d1d6032540d..e801b95d149 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -181,6 +181,7 @@ struct dht_local {          xlator_t        *link_subvol;          struct dht_rebalance_ rebalance; +        xlator_t        *first_up_subvol;  };  typedef struct dht_local dht_local_t;  | 
