diff options
-rwxr-xr-x | tests/bugs/glusterfs/bug-853690.t | 2 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 25 |
2 files changed, 12 insertions, 15 deletions
diff --git a/tests/bugs/glusterfs/bug-853690.t b/tests/bugs/glusterfs/bug-853690.t index d81be011438..59facfcddb0 100755 --- a/tests/bugs/glusterfs/bug-853690.t +++ b/tests/bugs/glusterfs/bug-853690.t @@ -65,7 +65,7 @@ TEST glusterfs --volfile=$B0/test.vol --attribute-timeout=0 --entry-timeout=0 $M # Send a single write, guaranteed to be short on one replica, and attempt to # read the data back. Failure to detect the short write results in different # file sizes and immediate split-brain (EIO). -TEST dd if=/dev/zero of=$M0/file bs=128k count=1 +TEST dd if=/dev/urandom of=$M0/file bs=128k count=1 TEST dd if=$M0/file of=/dev/null bs=128k count=1 ######## # diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index f5664f08a25..6e112d82092 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -97,10 +97,12 @@ __afr_selfheal_data_checksums_match (call_frame_t *frame, xlator_t *this, for (i = 0; i < priv->child_count; i++) { if (i == source) continue; - if (memcmp (local->replies[source].checksum, - local->replies[i].checksum, - MD5_DIGEST_LENGTH)) - return _gf_false; + if (local->replies[i].valid) { + if (memcmp (local->replies[source].checksum, + local->replies[i].checksum, + MD5_DIGEST_LENGTH)) + return _gf_false; + } } return _gf_true; @@ -378,23 +380,16 @@ out: static int __afr_selfheal_truncate_sinks (call_frame_t *frame, xlator_t *this, fd_t *fd, unsigned char *healed_sinks, - struct afr_reply *replies, uint64_t size) + uint64_t size) { afr_local_t *local = NULL; afr_private_t *priv = NULL; - unsigned char *larger_sinks = 0; int i = 0; local = frame->local; priv = this->private; - larger_sinks = alloca0 (priv->child_count); - for (i = 0; i < priv->child_count; i++) { - if (healed_sinks[i] && replies[i].poststat.ia_size > size) - larger_sinks[i] = 1; - } - - AFR_ONLIST (larger_sinks, frame, attr_cbk, ftruncate, fd, size, NULL); + AFR_ONLIST (healed_sinks, frame, attr_cbk, ftruncate, fd, size, NULL); for (i = 0; i < priv->child_count; i++) if (healed_sinks[i] && local->replies[i].op_ret == -1) @@ -439,6 +434,9 @@ afr_does_size_mismatch (xlator_t *this, unsigned char *sources, if (replies[i].op_ret < 0) continue; + if (!sources[i]) + continue; + if (!min) min = &replies[i].poststat; @@ -686,7 +684,6 @@ __afr_selfheal_data (call_frame_t *frame, xlator_t *this, fd_t *fd, } ret = __afr_selfheal_truncate_sinks (frame, this, fd, healed_sinks, - locked_replies, locked_replies[source].poststat.ia_size); if (ret < 0) goto unlock; |