summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr/src
diff options
context:
space:
mode:
authorKevin Vigor <kvigor@fb.com>2017-01-23 10:27:52 -0800
committerKevin Vigor <kvigor@fb.com>2017-01-23 10:27:52 -0800
commitf80281c05e3f1c0ead5910586c7e81f047add623 (patch)
treef58cac77acef73cfdf14d420bd10613ad3dc1850 /xlators/cluster/afr/src
parent6f6a21f1bbc5131e70b42d89a5ac8d8aa709ad3f (diff)
parentb21c51e6f0baa5145923637f54e79d221ca59cff (diff)
Merge remote-tracking branch 'origin/release-3.8' into merge-3.8
Change-Id: Ie6c73dee0b6798af4a69c43c0b03c3d02ff36aa2
Diffstat (limited to 'xlators/cluster/afr/src')
-rw-r--r--xlators/cluster/afr/src/afr-common.c24
-rw-r--r--xlators/cluster/afr/src/afr-dir-write.c6
-rw-r--r--xlators/cluster/afr/src/afr-read-txn.c26
-rw-r--r--xlators/cluster/afr/src/afr-transaction.c8
-rw-r--r--xlators/cluster/afr/src/afr.h18
5 files changed, 38 insertions, 44 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c
index 0f878a9be86..fb3318da36a 100644
--- a/xlators/cluster/afr/src/afr-common.c
+++ b/xlators/cluster/afr/src/afr-common.c
@@ -131,6 +131,7 @@ __afr_inode_ctx_get (xlator_t *this, inode_t *inode, afr_inode_ctx_t **ctx)
out:
return ret;
}
+
/*
* INODE CTX 64-bit VALUE FORMAT FOR SMALL (<= 16) SUBVOL COUNTS:
*
@@ -192,10 +193,7 @@ __afr_set_in_flight_sb_status (xlator_t *this, afr_local_t *local,
metadatamap_old = metadatamap = (val & 0x000000000000ffff);
datamap_old = datamap = (val & 0x00000000ffff0000) >> 16;
- /* Hard-code event to 0 since there is a failure and the inode
- * needs to be refreshed anyway.
- */
- event = 0;
+ event = (val & 0xffffffff00000000) >> 32;
if (txn_type == AFR_DATA_TRANSACTION)
tmp_map = datamap;
@@ -228,6 +226,8 @@ __afr_set_in_flight_sb_status (xlator_t *this, afr_local_t *local,
local->transaction.in_flight_sb = _gf_true;
metadatamap |= (1 << index);
}
+ if (metadatamap_old != metadatamap)
+ event = 0;
break;
case AFR_DATA_TRANSACTION:
@@ -237,10 +237,12 @@ __afr_set_in_flight_sb_status (xlator_t *this, afr_local_t *local,
local->transaction.in_flight_sb = _gf_true;
datamap |= (1 << index);
}
+ if (datamap_old != datamap)
+ event = 0;
break;
default:
- break;
+ break;
}
val = ((uint64_t) metadatamap) |
@@ -351,7 +353,7 @@ out:
}
int
-__afr_inode_read_subvol_reset_small (inode_t *inode, xlator_t *this)
+__afr_inode_event_gen_reset_small (inode_t *inode, xlator_t *this)
{
int ret = -1;
uint16_t datamap = 0;
@@ -452,7 +454,7 @@ out:
}
int
-__afr_inode_read_subvol_reset (inode_t *inode, xlator_t *this)
+__afr_inode_event_gen_reset (inode_t *inode, xlator_t *this)
{
afr_private_t *priv = NULL;
int ret = -1;
@@ -460,7 +462,7 @@ __afr_inode_read_subvol_reset (inode_t *inode, xlator_t *this)
priv = this->private;
if (priv->child_count <= 16)
- ret = __afr_inode_read_subvol_reset_small (inode, this);
+ ret = __afr_inode_event_gen_reset_small (inode, this);
else
ret = -1;
@@ -593,7 +595,7 @@ out:
int
-afr_inode_read_subvol_reset (inode_t *inode, xlator_t *this)
+afr_inode_event_gen_reset (inode_t *inode, xlator_t *this)
{
int ret = -1;
@@ -601,7 +603,7 @@ afr_inode_read_subvol_reset (inode_t *inode, xlator_t *this)
LOCK(&inode->lock);
{
- ret = __afr_inode_read_subvol_reset (inode, this);
+ ret = __afr_inode_event_gen_reset (inode, this);
}
UNLOCK(&inode->lock);
out:
@@ -2086,7 +2088,7 @@ afr_lookup_done (call_frame_t *frame, xlator_t *this)
if (afr_replies_interpret (frame, this, local->inode, NULL)) {
read_subvol = afr_read_subvol_decide (local->inode,
this, &args);
- afr_inode_read_subvol_reset (local->inode, this);
+ afr_inode_event_gen_reset (local->inode, this);
goto cant_interpret;
} else {
read_subvol = afr_data_subvol_get (local->inode, this,
diff --git a/xlators/cluster/afr/src/afr-dir-write.c b/xlators/cluster/afr/src/afr-dir-write.c
index 286a5392da6..8e483c382c4 100644
--- a/xlators/cluster/afr/src/afr-dir-write.c
+++ b/xlators/cluster/afr/src/afr-dir-write.c
@@ -122,12 +122,12 @@ __afr_dir_write_finalize (call_frame_t *frame, xlator_t *this)
continue;
if (local->replies[i].op_ret < 0) {
if (local->inode)
- afr_inode_read_subvol_reset (local->inode, this);
+ afr_inode_event_gen_reset (local->inode, this);
if (local->parent)
- afr_inode_read_subvol_reset (local->parent,
+ afr_inode_event_gen_reset (local->parent,
this);
if (local->parent2)
- afr_inode_read_subvol_reset (local->parent2,
+ afr_inode_event_gen_reset (local->parent2,
this);
continue;
}
diff --git a/xlators/cluster/afr/src/afr-read-txn.c b/xlators/cluster/afr/src/afr-read-txn.c
index 926f7c4dc47..2390764bccd 100644
--- a/xlators/cluster/afr/src/afr-read-txn.c
+++ b/xlators/cluster/afr/src/afr-read-txn.c
@@ -48,17 +48,6 @@ afr_read_txn_next_subvol (call_frame_t *frame, xlator_t *this)
return 0;
}
-#define AFR_READ_TXN_SET_ERROR_AND_GOTO(ret, errnum, index, label) \
- do { \
- local->op_ret = ret; \
- local->op_errno = errnum; \
- read_subvol = index; \
- gf_msg (this->name, GF_LOG_ERROR, EIO, AFR_MSG_SPLIT_BRAIN,\
- "Failing %s on gfid %s: split-brain observed.",\
- gf_fop_list[local->op], uuid_utoa (inode->gfid));\
- goto label; \
- } while (0)
-
int
afr_read_txn_refresh_done (call_frame_t *frame, xlator_t *this, int err)
{
@@ -72,19 +61,16 @@ afr_read_txn_refresh_done (call_frame_t *frame, xlator_t *this, int err)
inode = local->inode;
if (err) {
- local->op_errno = -err;
- local->op_ret = -1;
read_subvol = -1;
- gf_msg (this->name, GF_LOG_ERROR, EIO, AFR_MSG_SPLIT_BRAIN,
- "Failing %s on gfid %s: split-brain observed.",
- gf_fop_list[local->op], uuid_utoa (inode->gfid));
goto readfn;
}
read_subvol = afr_read_subvol_select_by_policy (inode, this,
local->readable, NULL);
- if (read_subvol == -1)
- AFR_READ_TXN_SET_ERROR_AND_GOTO (-1, EIO, -1, readfn);
+ if (read_subvol == -1) {
+ err = -EIO;
+ goto readfn;
+ }
if (local->read_attempted[read_subvol]) {
afr_read_txn_next_subvol (frame, this);
@@ -99,6 +85,10 @@ readfn:
if ((ret == 0) && spb_choice >= 0)
read_subvol = spb_choice;
}
+
+ if (read_subvol == -1) {
+ AFR_SET_ERROR_AND_CHECK_SPLIT_BRAIN (-1, -err);
+ }
local->readfn (frame, this, read_subvol);
return 0;
diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c
index 9cb735ea7fa..8178fc0d18b 100644
--- a/xlators/cluster/afr/src/afr-transaction.c
+++ b/xlators/cluster/afr/src/afr-transaction.c
@@ -2255,15 +2255,9 @@ int
afr_write_txn_refresh_done (call_frame_t *frame, xlator_t *this, int err)
{
afr_local_t *local = frame->local;
- afr_private_t *priv = this->private;
- int ret = 0;
if (err) {
- local->op_errno = -err;
- local->op_ret = -1;
- gf_msg (this->name, GF_LOG_ERROR, -ret, AFR_MSG_SPLIT_BRAIN,
- "Failing %s on gfid %s: split-brain observed.",
- gf_fop_list[local->op], uuid_utoa (local->inode->gfid));
+ AFR_SET_ERROR_AND_CHECK_SPLIT_BRAIN(-1, -err);
goto fail;
}
diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h
index bbfa309b868..aa19f1eeb37 100644
--- a/xlators/cluster/afr/src/afr.h
+++ b/xlators/cluster/afr/src/afr.h
@@ -54,6 +54,18 @@ typedef int (*afr_changelog_resume_t) (call_frame_t *frame, xlator_t *this);
#define AFR_CMP(a1,a2,len) ({int __cmp = 0; int __i; for (__i = 0; __i < len; __i++) if (a1[__i] != a2[__i]) { __cmp = 1; break;} __cmp;})
#define AFR_IS_ARBITER_BRICK(priv, index) ((priv->arbiter_count == 1) && (index == ARBITER_BRICK_INDEX))
+#define AFR_SET_ERROR_AND_CHECK_SPLIT_BRAIN(ret, errnum) \
+ do { \
+ local->op_ret = ret; \
+ local->op_errno = errnum; \
+ if (local->op_errno == EIO) \
+ gf_msg (this->name, GF_LOG_ERROR, local->op_errno, \
+ AFR_MSG_SPLIT_BRAIN, "Failing %s on gfid %s: " \
+ "split-brain observed.", \
+ gf_fop_list[local->op], \
+ uuid_utoa (local->inode->gfid)); \
+ } while (0)
+
typedef enum {
AFR_FAV_CHILD_NONE,
AFR_FAV_CHILD_BY_SIZE,
@@ -882,7 +894,7 @@ afr_inode_read_subvol_set (inode_t *inode, xlator_t *this,
int event_generation);
int
-afr_inode_read_subvol_reset (inode_t *inode, xlator_t *this);
+afr_inode_event_gen_reset (inode_t *inode, xlator_t *this);
int
afr_read_subvol_select_by_policy (inode_t *inode, xlator_t *this,
@@ -906,10 +918,6 @@ afr_read_subvol_get (inode_t *inode, xlator_t *this, int *subvol_p,
afr_read_subvol_get(i, t, s, r, e, AFR_METADATA_TRANSACTION, a)
int
-afr_inode_ctx_reset_unreadable_subvol (inode_t *inode, xlator_t *this,
- int subvol_idx, int txn_type);
-
-int
afr_inode_refresh (call_frame_t *frame, xlator_t *this, inode_t *inode,
uuid_t gfid, afr_inode_refresh_cbk_t cbk);