diff options
author | Xavier Hernandez <xhernandez@datalab.es> | 2015-08-05 23:42:41 +0200 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2015-08-14 02:02:21 -0700 |
commit | cfac0a9c78ead389ec261010a1c094bc60ca2810 (patch) | |
tree | 5cb67d5cabd387afc8e937b8be6df9ea7efd9322 /xlators/cluster/ec/src/ec-locks.c | |
parent | ae37a97252e33e1c5cb636b679e2458a489d2550 (diff) |
cluster/ec: Fix tracking of good bricks
The bitmask of good and bad bricks was kept in the context of the
corresponding inode or fd. This was problematic when an external
process (another client or the self-heal process) did heal the
bricks but no one changed the bitmaks of other clients.
This patch removes the bitmask stored in the context and calculates
which bricks are healthy after locking them and doing the initial
xattrop. After that, it's updated using the result of each fop.
> Change-Id: I225e31cd219a12af4ca58871d8a4bb6f742b223c
> BUG: 1236065
> Signed-off-by: Xavier Hernandez <xhernandez@datalab.es>
> Reviewed-on: http://review.gluster.org/11844
> Tested-by: NetBSD Build System <jenkins@build.gluster.org>
> Tested-by: Gluster Build System <jenkins@build.gluster.com>
> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Change-Id: Idbe68b28b865c4b28366703ad1e96ae16ba44b66
BUG: 1235964
Signed-off-by: Xavier Hernandez <xhernandez@datalab.es>
Reviewed-on: http://review.gluster.org/11867
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/cluster/ec/src/ec-locks.c')
-rw-r--r-- | xlators/cluster/ec/src/ec-locks.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/xlators/cluster/ec/src/ec-locks.c b/xlators/cluster/ec/src/ec-locks.c index 00bfc0d2d99..7902a99ba84 100644 --- a/xlators/cluster/ec/src/ec-locks.c +++ b/xlators/cluster/ec/src/ec-locks.c @@ -58,7 +58,7 @@ int32_t ec_lock_check(ec_fop_data_t *fop, uintptr_t *mask) fop->answer = cbk; } - ec_update_bad(fop, locked); + ec_update_good(fop, locked); error = 0; } else { @@ -306,8 +306,7 @@ void ec_entrylk(call_frame_t * frame, xlator_t * this, uintptr_t target, GF_VALIDATE_OR_GOTO(this->name, frame, out); GF_VALIDATE_OR_GOTO(this->name, this->private, out); - fop = ec_fop_data_allocate(frame, this, GF_FOP_ENTRYLK, - EC_FLAG_UPDATE_LOC_INODE, target, minimum, + fop = ec_fop_data_allocate(frame, this, GF_FOP_ENTRYLK, 0, target, minimum, ec_wind_entrylk, ec_manager_entrylk, callback, data); if (fop == NULL) { @@ -442,10 +441,9 @@ void ec_fentrylk(call_frame_t * frame, xlator_t * this, uintptr_t target, GF_VALIDATE_OR_GOTO(this->name, frame, out); GF_VALIDATE_OR_GOTO(this->name, this->private, out); - fop = ec_fop_data_allocate(frame, this, GF_FOP_FENTRYLK, - EC_FLAG_UPDATE_FD_INODE, target, minimum, - ec_wind_fentrylk, ec_manager_entrylk, callback, - data); + fop = ec_fop_data_allocate(frame, this, GF_FOP_FENTRYLK, 0, target, + minimum, ec_wind_fentrylk, ec_manager_entrylk, + callback, data); if (fop == NULL) { goto out; } @@ -709,8 +707,7 @@ void ec_inodelk(call_frame_t * frame, xlator_t * this, uintptr_t target, GF_VALIDATE_OR_GOTO(this->name, frame, out); GF_VALIDATE_OR_GOTO(this->name, this->private, out); - fop = ec_fop_data_allocate(frame, this, GF_FOP_INODELK, - EC_FLAG_UPDATE_LOC_INODE, target, minimum, + fop = ec_fop_data_allocate(frame, this, GF_FOP_INODELK, 0, target, minimum, ec_wind_inodelk, ec_manager_inodelk, callback, data); if (fop == NULL) { @@ -846,10 +843,9 @@ void ec_finodelk(call_frame_t * frame, xlator_t * this, uintptr_t target, GF_VALIDATE_OR_GOTO(this->name, frame, out); GF_VALIDATE_OR_GOTO(this->name, this->private, out); - fop = ec_fop_data_allocate(frame, this, GF_FOP_FINODELK, - EC_FLAG_UPDATE_FD_INODE, target, minimum, - ec_wind_finodelk, ec_manager_inodelk, callback, - data); + fop = ec_fop_data_allocate(frame, this, GF_FOP_FINODELK, 0, target, + minimum, ec_wind_finodelk, ec_manager_inodelk, + callback, data); if (fop == NULL) { goto out; } @@ -1117,9 +1113,8 @@ void ec_lk(call_frame_t * frame, xlator_t * this, uintptr_t target, GF_VALIDATE_OR_GOTO(this->name, frame, out); GF_VALIDATE_OR_GOTO(this->name, this->private, out); - fop = ec_fop_data_allocate(frame, this, GF_FOP_LK, EC_FLAG_UPDATE_FD_INODE, - target, minimum, ec_wind_lk, ec_manager_lk, - callback, data); + fop = ec_fop_data_allocate(frame, this, GF_FOP_LK, 0, target, minimum, + ec_wind_lk, ec_manager_lk, callback, data); if (fop == NULL) { goto out; } |