diff options
Diffstat (limited to 'xlators/cluster/afr/src/afr-self-heal-data.c')
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index 2aed60baa1a..37bcc2b3f9e 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -10,15 +10,10 @@ #include "afr.h" #include "afr-self-heal.h" -#include "byte-order.h" +#include <glusterfs/byte-order.h> #include "protocol-common.h" #include "afr-messages.h" -#include "events.h" - -enum { - AFR_SELFHEAL_DATA_FULL = 0, - AFR_SELFHEAL_DATA_DIFF, -}; +#include <glusterfs/events.h> #define HAS_HOLES(i) ((i->ia_blocks * 512) < (i->ia_size)) static int @@ -73,7 +68,7 @@ __afr_can_skip_data_block_heal(call_frame_t *frame, xlator_t *this, fd_t *fd, xdata = dict_new(); if (!xdata) goto out; - if (dict_set_int32(xdata, "check-zero-filled", 1)) { + if (dict_set_int32_sizen(xdata, "check-zero-filled", 1)) { dict_unref(xdata); goto out; } @@ -134,7 +129,7 @@ __afr_is_sink_zero_filled(xlator_t *this, fd_t *fd, size_t size, off_t offset, priv = this->private; ret = syncop_readv(priv->children[sink], fd, size, offset, 0, &iovec, - &count, &iobref, NULL, NULL); + &count, &iobref, NULL, NULL, NULL); if (ret < 0) goto out; ret = iov_0filled(iovec, count); @@ -164,7 +159,7 @@ __afr_selfheal_data_read_write(call_frame_t *frame, xlator_t *this, fd_t *fd, priv = this->private; ret = syncop_readv(priv->children[source], fd, size, offset, 0, &iovec, - &count, &iobref, NULL, NULL); + &count, &iobref, NULL, NULL, NULL); if (ret <= 0) return ret; @@ -212,7 +207,7 @@ __afr_selfheal_data_read_write(call_frame_t *frame, xlator_t *this, fd_t *fd, } ret = syncop_writev(priv->children[i], fd, iovec, count, offset, iobref, - 0, NULL, NULL); + 0, NULL, NULL, NULL, NULL); if (ret != iov_length(iovec, count)) { /* write() failed on this sink. unset the corresponding member in sinks[] (which is healed_sinks[] in the @@ -230,24 +225,40 @@ __afr_selfheal_data_read_write(call_frame_t *frame, xlator_t *this, fd_t *fd, return ret; } +static gf_boolean_t +afr_source_sinks_locked(xlator_t *this, unsigned char *locked_on, int source, + unsigned char *healed_sinks) +{ + afr_private_t *priv = this->private; + int i = 0; + + if (!locked_on[source]) + return _gf_false; + + for (i = 0; i < priv->child_count; i++) { + if (healed_sinks[i] && locked_on[i]) + return _gf_true; + } + + return _gf_false; +} + static int afr_selfheal_data_block(call_frame_t *frame, xlator_t *this, fd_t *fd, int source, unsigned char *healed_sinks, off_t offset, size_t size, int type, struct afr_reply *replies) { int ret = -1; - int sink_count = 0; afr_private_t *priv = NULL; unsigned char *data_lock = NULL; priv = this->private; - sink_count = AFR_COUNT(healed_sinks, priv->child_count); data_lock = alloca0(priv->child_count); ret = afr_selfheal_inodelk(frame, this, fd->inode, this->name, offset, size, data_lock); { - if (ret < sink_count) { + if (!afr_source_sinks_locked(this, data_lock, source, healed_sinks)) { ret = -ENOTCONN; goto unlock; } @@ -301,7 +312,7 @@ afr_data_self_heal_type_get(afr_private_t *priv, unsigned char *healed_sinks, int type = AFR_SELFHEAL_DATA_FULL; int i = 0; - if (priv->data_self_heal_algorithm == NULL) { + if (priv->data_self_heal_algorithm == AFR_SELFHEAL_DATA_DYNAMIC) { type = AFR_SELFHEAL_DATA_FULL; for (i = 0; i < priv->child_count; i++) { if (!healed_sinks[i] && i != source) @@ -311,10 +322,8 @@ afr_data_self_heal_type_get(afr_private_t *priv, unsigned char *healed_sinks, break; } } - } else if (strcmp(priv->data_self_heal_algorithm, "full") == 0) { - type = AFR_SELFHEAL_DATA_FULL; - } else if (strcmp(priv->data_self_heal_algorithm, "diff") == 0) { - type = AFR_SELFHEAL_DATA_DIFF; + } else { + type = priv->data_self_heal_algorithm; } return type; } @@ -331,6 +340,9 @@ afr_selfheal_data_do(call_frame_t *frame, xlator_t *this, fd_t *fd, int source, call_frame_t *iter_frame = NULL; unsigned char arbiter_sink_status = 0; + gf_msg(this->name, GF_LOG_INFO, 0, AFR_MSG_SELF_HEAL_INFO, + "performing data selfheal on %s", uuid_utoa(fd->inode->gfid)); + priv = this->private; if (priv->arbiter_count) { arbiter_sink_status = healed_sinks[ARBITER_BRICK_INDEX]; @@ -544,9 +556,11 @@ __afr_selfheal_data_finalize_source( replies, AFR_DATA_TRANSACTION); if (source < 0) { gf_event(EVENT_AFR_SPLIT_BRAIN, + "client-pid=%d;" "subvol=%s;type=data;" "file=%s", - this->name, uuid_utoa(inode->gfid)); + this->ctx->cmd_args.client_pid, this->name, + uuid_utoa(inode->gfid)); return -EIO; } |
