diff options
author | Kaushik BV <kaushikbv@gluster.com> | 2011-02-03 23:16:03 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2011-02-04 00:39:15 -0800 |
commit | ba40a3ece0a0b5b381e7d05c74d09cdd1818b817 (patch) | |
tree | ed5a160110083707413105c90055ae79494be716 | |
parent | 7f59d855bb160a14a517e82b71e4f387b50cbf63 (diff) |
libxlator: New policy for aggregation of xtime:
-Try to salvage errors like ENOENT/ENOTCONN/ENODATA,
-Propogate back any other error from any brick
-EINVAL if some assertion of the aggregation logic is broken
Signed-off-by: Kaushik BV <kaushikbv@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 2341 ([glusterfs-3.1.2gsyncqa4]: crash in gsyncd)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2341
-rw-r--r-- | xlators/lib/src/libxlator.c | 69 | ||||
-rw-r--r-- | xlators/lib/src/libxlator.h | 4 |
2 files changed, 57 insertions, 16 deletions
diff --git a/xlators/lib/src/libxlator.c b/xlators/lib/src/libxlator.c index f43fd381b85..e7bbe04baa1 100644 --- a/xlators/lib/src/libxlator.c +++ b/xlators/lib/src/libxlator.c @@ -64,8 +64,25 @@ cluster_markerxtime_cbk (call_frame_t *frame, void *cookie, xlator_t *this, goto out; } + if (local->esomerr) { + LOCK (&frame->lock); + { + callcnt = --local->call_count; + } + goto done; + } + vol_uuid = local->vol_uuid; + if (op_ret && op_errno == ENODATA) { + LOCK (&frame->lock); + { + callcnt = --local->call_count; + local->enodata_count++; + } + goto done; + } + if (op_ret && op_errno == ENOENT) { LOCK (&frame->lock); { @@ -84,6 +101,17 @@ cluster_markerxtime_cbk (call_frame_t *frame, void *cookie, xlator_t *this, goto done; } + if (op_ret) { + LOCK (&frame->lock); + { + callcnt = --local->call_count; + local->esomerr = op_errno; + } + goto done; + } + + + LOCK (&frame->lock); { @@ -91,14 +119,14 @@ cluster_markerxtime_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (!gf_asprintf (& marker_xattr, "%s.%s.%s", MARKER_XATTR_PREFIX, vol_uuid, XTIME)) { op_errno = ENOMEM; - goto out; + goto done; } if (dict_get_ptr (dict, marker_xattr, (void **)&net_timebuf)) { gf_log (this->name, GF_LOG_WARNING, "Unable to get <uuid>.xtime attr"); - + local->noxtime_count++; goto done; } @@ -147,21 +175,30 @@ done: op_errno = ENOMEM; goto out; } + goto out; } - else { + + if (local->noxtime_count) + goto out; + + if (local->enodata_count) { op_ret = -1; - if (local->enotconn_count) { - op_errno = ENOTCONN; - goto out; - } - if (local->enoent_count) { - op_errno = ENOENT; - goto out; - } - else { - op_errno = EINVAL; - goto out; - } + op_errno = ENODATA; + goto out; + } + if (local->enotconn_count) { + op_ret = -1; + op_errno = ENOTCONN; + goto out; + } + if (local->enoent_count) { + op_ret = -1; + op_errno = ENOENT; + goto out; + } + else { + op_errno = local->esomerr; + goto out; } out: if (local->xl_specf_unwind) { @@ -241,7 +278,7 @@ cluster_markeruuid_cbk (call_frame_t *frame, void *cookie, xlator_t *this, (marker->volmark->minor != volmark->minor)) { op_ret = -1; op_errno = EINVAL; - goto out; + goto done; } else if (volmark->retval) { data_unref ((data_t *) marker->volmark); diff --git a/xlators/lib/src/libxlator.h b/xlators/lib/src/libxlator.h index be8a0093695..0187e876bda 100644 --- a/xlators/lib/src/libxlator.h +++ b/xlators/lib/src/libxlator.h @@ -47,6 +47,10 @@ struct marker_str { unsigned has_xtime:1; int32_t enoent_count; int32_t enotconn_count; + int32_t enodata_count; + int32_t noxtime_count; + + int esomerr; xlator_specf_unwind_t xl_specf_unwind; void *xl_local; |