|
|
3604df |
From 904f7b6b9719c1fe2fc1ddc3ca23c64f4d440eff Mon Sep 17 00:00:00 2001
|
|
|
3604df |
From: Poornima G <pgurusid@redhat.com>
|
|
|
3604df |
Date: Fri, 2 Sep 2016 12:47:15 +0530
|
|
|
3604df |
Subject: [PATCH 132/141] ec: Implement ipc fop
|
|
|
3604df |
|
|
|
3604df |
The ipc will be wound to all the bricks, but for it to be
|
|
|
3604df |
successfull, the fop should succeed on minimum number of bricks.
|
|
|
3604df |
|
|
|
3604df |
Conflicts while backport:
|
|
|
3604df |
xlators/cluster/ec/src/ec-types.h
|
|
|
3604df |
|
|
|
3604df |
Change-Id: I3f8cb6a349e87bafd0773583def9d4e3765aa140
|
|
|
3604df |
BUG: 1284873
|
|
|
3604df |
Signed-off-by: Poornima G <pgurusid@redhat.com>
|
|
|
3604df |
Reviewed-on: http://review.gluster.org/15387
|
|
|
3604df |
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
|
|
|
3604df |
Smoke: Gluster Build System <jenkins@build.gluster.org>
|
|
|
3604df |
Reviewed-by: Ashish Pandey <aspandey@redhat.com>
|
|
|
3604df |
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
|
|
|
3604df |
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
|
|
|
3604df |
Reviewed-on: https://code.engineering.redhat.com/gerrit/87045
|
|
|
3604df |
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
|
|
|
3604df |
Tested-by: Rajesh Joseph <rjoseph@redhat.com>
|
|
|
3604df |
---
|
|
|
3604df |
xlators/cluster/ec/src/ec-data.h | 1 +
|
|
|
3604df |
xlators/cluster/ec/src/ec-fops.h | 4 +
|
|
|
3604df |
xlators/cluster/ec/src/ec-generic.c | 136 +++++++++++++++++++++++++++++++++++
|
|
|
3604df |
xlators/cluster/ec/src/ec.c | 10 +++-
|
|
|
3604df |
4 files changed, 150 insertions(+), 1 deletions(-)
|
|
|
3604df |
|
|
|
3604df |
diff --git a/xlators/cluster/ec/src/ec-data.h b/xlators/cluster/ec/src/ec-data.h
|
|
|
3604df |
index a207b11..c3ec5cb 100644
|
|
|
3604df |
--- a/xlators/cluster/ec/src/ec-data.h
|
|
|
3604df |
+++ b/xlators/cluster/ec/src/ec-data.h
|
|
|
3604df |
@@ -134,6 +134,7 @@ union _ec_cbk
|
|
|
3604df |
fop_fxattrop_cbk_t fxattrop;
|
|
|
3604df |
fop_zerofill_cbk_t zerofill;
|
|
|
3604df |
fop_seek_cbk_t seek;
|
|
|
3604df |
+ fop_ipc_cbk_t ipc;
|
|
|
3604df |
};
|
|
|
3604df |
|
|
|
3604df |
struct _ec_lock
|
|
|
3604df |
diff --git a/xlators/cluster/ec/src/ec-fops.h b/xlators/cluster/ec/src/ec-fops.h
|
|
|
3604df |
index 8d93842..ca6d6b3 100644
|
|
|
3604df |
--- a/xlators/cluster/ec/src/ec-fops.h
|
|
|
3604df |
+++ b/xlators/cluster/ec/src/ec-fops.h
|
|
|
3604df |
@@ -199,4 +199,8 @@ void ec_seek(call_frame_t *frame, xlator_t *this, uintptr_t target,
|
|
|
3604df |
int32_t minimum, fop_seek_cbk_t func, void *data, fd_t *fd,
|
|
|
3604df |
off_t offset, gf_seek_what_t what, dict_t *xdata);
|
|
|
3604df |
|
|
|
3604df |
+void ec_ipc(call_frame_t *frame, xlator_t *this, uintptr_t target,
|
|
|
3604df |
+ int32_t minimum, fop_ipc_cbk_t func, void *data, int32_t op,
|
|
|
3604df |
+ dict_t *xdata);
|
|
|
3604df |
+
|
|
|
3604df |
#endif /* __EC_FOPS_H__ */
|
|
|
3604df |
diff --git a/xlators/cluster/ec/src/ec-generic.c b/xlators/cluster/ec/src/ec-generic.c
|
|
|
3604df |
index 0ad5149..37b3b78 100644
|
|
|
3604df |
--- a/xlators/cluster/ec/src/ec-generic.c
|
|
|
3604df |
+++ b/xlators/cluster/ec/src/ec-generic.c
|
|
|
3604df |
@@ -1446,3 +1446,139 @@ out:
|
|
|
3604df |
func(frame, NULL, this, -1, error, NULL, NULL);
|
|
|
3604df |
}
|
|
|
3604df |
}
|
|
|
3604df |
+
|
|
|
3604df |
+/* FOP: IPC */
|
|
|
3604df |
+
|
|
|
3604df |
+int32_t ec_ipc_cbk(call_frame_t * frame, void * cookie, xlator_t * this,
|
|
|
3604df |
+ int32_t op_ret, int32_t op_errno, dict_t * xdata)
|
|
|
3604df |
+{
|
|
|
3604df |
+ ec_fop_data_t * fop = NULL;
|
|
|
3604df |
+ ec_cbk_data_t * cbk = NULL;
|
|
|
3604df |
+ int32_t idx = (int32_t)(uintptr_t)cookie;
|
|
|
3604df |
+
|
|
|
3604df |
+ VALIDATE_OR_GOTO(this, out);
|
|
|
3604df |
+ GF_VALIDATE_OR_GOTO(this->name, frame, out);
|
|
|
3604df |
+ GF_VALIDATE_OR_GOTO(this->name, frame->local, out);
|
|
|
3604df |
+ GF_VALIDATE_OR_GOTO(this->name, this->private, out);
|
|
|
3604df |
+
|
|
|
3604df |
+ fop = frame->local;
|
|
|
3604df |
+
|
|
|
3604df |
+ ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx,
|
|
|
3604df |
+ frame, op_ret, op_errno);
|
|
|
3604df |
+
|
|
|
3604df |
+ cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_IPC, idx, op_ret,
|
|
|
3604df |
+ op_errno);
|
|
|
3604df |
+
|
|
|
3604df |
+ if (cbk != NULL)
|
|
|
3604df |
+ {
|
|
|
3604df |
+ if (xdata != NULL)
|
|
|
3604df |
+ {
|
|
|
3604df |
+ cbk->xdata = dict_ref(xdata);
|
|
|
3604df |
+ }
|
|
|
3604df |
+
|
|
|
3604df |
+ ec_combine(cbk, NULL);
|
|
|
3604df |
+ }
|
|
|
3604df |
+
|
|
|
3604df |
+out:
|
|
|
3604df |
+ if (fop != NULL)
|
|
|
3604df |
+ {
|
|
|
3604df |
+ ec_complete(fop);
|
|
|
3604df |
+ }
|
|
|
3604df |
+
|
|
|
3604df |
+ return 0;
|
|
|
3604df |
+}
|
|
|
3604df |
+
|
|
|
3604df |
+void ec_wind_ipc(ec_t * ec, ec_fop_data_t * fop, int32_t idx)
|
|
|
3604df |
+{
|
|
|
3604df |
+ ec_trace("WIND", fop, "idx=%d", idx);
|
|
|
3604df |
+
|
|
|
3604df |
+ STACK_WIND_COOKIE(fop->frame, ec_ipc_cbk, (void *)(uintptr_t)idx,
|
|
|
3604df |
+ ec->xl_list[idx], ec->xl_list[idx]->fops->ipc,
|
|
|
3604df |
+ fop->int32, fop->xdata);
|
|
|
3604df |
+}
|
|
|
3604df |
+
|
|
|
3604df |
+int32_t ec_manager_ipc(ec_fop_data_t *fop, int32_t state)
|
|
|
3604df |
+{
|
|
|
3604df |
+ ec_cbk_data_t * cbk;
|
|
|
3604df |
+
|
|
|
3604df |
+ switch (state)
|
|
|
3604df |
+ {
|
|
|
3604df |
+ case EC_STATE_INIT:
|
|
|
3604df |
+ case EC_STATE_DISPATCH:
|
|
|
3604df |
+ ec_dispatch_all(fop);
|
|
|
3604df |
+
|
|
|
3604df |
+ return EC_STATE_PREPARE_ANSWER;
|
|
|
3604df |
+
|
|
|
3604df |
+ case EC_STATE_PREPARE_ANSWER:
|
|
|
3604df |
+ ec_fop_prepare_answer(fop, _gf_true);
|
|
|
3604df |
+
|
|
|
3604df |
+ return EC_STATE_REPORT;
|
|
|
3604df |
+
|
|
|
3604df |
+ case EC_STATE_REPORT:
|
|
|
3604df |
+ cbk = fop->answer;
|
|
|
3604df |
+
|
|
|
3604df |
+ GF_ASSERT(cbk != NULL);
|
|
|
3604df |
+ if (fop->cbks.ipc != NULL)
|
|
|
3604df |
+ {
|
|
|
3604df |
+ fop->cbks.ipc(fop->req_frame, fop, fop->xl, cbk->op_ret,
|
|
|
3604df |
+ cbk->op_errno, cbk->xdata);
|
|
|
3604df |
+ }
|
|
|
3604df |
+
|
|
|
3604df |
+ return EC_STATE_END;
|
|
|
3604df |
+
|
|
|
3604df |
+ case -EC_STATE_INIT:
|
|
|
3604df |
+ case -EC_STATE_DISPATCH:
|
|
|
3604df |
+ case -EC_STATE_PREPARE_ANSWER:
|
|
|
3604df |
+ case -EC_STATE_REPORT:
|
|
|
3604df |
+ GF_ASSERT(fop->error != 0);
|
|
|
3604df |
+
|
|
|
3604df |
+ if (fop->cbks.ipc != NULL)
|
|
|
3604df |
+ {
|
|
|
3604df |
+ fop->cbks.ipc(fop->req_frame, fop, fop->xl, -1, fop->error,
|
|
|
3604df |
+ NULL);
|
|
|
3604df |
+ }
|
|
|
3604df |
+
|
|
|
3604df |
+ return EC_STATE_END;
|
|
|
3604df |
+
|
|
|
3604df |
+ default:
|
|
|
3604df |
+ gf_msg (fop->xl->name, GF_LOG_ERROR, EINVAL,
|
|
|
3604df |
+ EC_MSG_UNHANDLED_STATE, "Unhandled state %d for %s",
|
|
|
3604df |
+ state, ec_fop_name(fop->id));
|
|
|
3604df |
+
|
|
|
3604df |
+ return EC_STATE_END;
|
|
|
3604df |
+ }
|
|
|
3604df |
+}
|
|
|
3604df |
+
|
|
|
3604df |
+void ec_ipc(call_frame_t *frame, xlator_t *this, uintptr_t target,
|
|
|
3604df |
+ int32_t minimum, fop_ipc_cbk_t func, void *data, int32_t op,
|
|
|
3604df |
+ dict_t *xdata)
|
|
|
3604df |
+{
|
|
|
3604df |
+ ec_cbk_t callback = { .ipc = func };
|
|
|
3604df |
+ ec_fop_data_t * fop = NULL;
|
|
|
3604df |
+ int32_t error = ENOMEM;
|
|
|
3604df |
+
|
|
|
3604df |
+ gf_msg_trace ("ec", 0, "EC(IPC) %p", frame);
|
|
|
3604df |
+
|
|
|
3604df |
+ VALIDATE_OR_GOTO(this, out);
|
|
|
3604df |
+ GF_VALIDATE_OR_GOTO(this->name, frame, out);
|
|
|
3604df |
+ GF_VALIDATE_OR_GOTO(this->name, this->private, out);
|
|
|
3604df |
+
|
|
|
3604df |
+ fop = ec_fop_data_allocate(frame, this, GF_FOP_IPC, 0, target, minimum,
|
|
|
3604df |
+ ec_wind_ipc, ec_manager_ipc, callback, data);
|
|
|
3604df |
+ if (fop == NULL) {
|
|
|
3604df |
+ goto out;
|
|
|
3604df |
+ }
|
|
|
3604df |
+ if (xdata != NULL) {
|
|
|
3604df |
+ fop->xdata = dict_ref(xdata);
|
|
|
3604df |
+ }
|
|
|
3604df |
+ fop->int32 = op;
|
|
|
3604df |
+
|
|
|
3604df |
+ error = 0;
|
|
|
3604df |
+
|
|
|
3604df |
+out:
|
|
|
3604df |
+ if (fop != NULL) {
|
|
|
3604df |
+ ec_manager(fop, error);
|
|
|
3604df |
+ } else {
|
|
|
3604df |
+ func(frame, NULL, this, -1, error, NULL);
|
|
|
3604df |
+ }
|
|
|
3604df |
+}
|
|
|
3604df |
diff --git a/xlators/cluster/ec/src/ec.c b/xlators/cluster/ec/src/ec.c
|
|
|
3604df |
index 587ea63..12c3de5 100644
|
|
|
3604df |
--- a/xlators/cluster/ec/src/ec.c
|
|
|
3604df |
+++ b/xlators/cluster/ec/src/ec.c
|
|
|
3604df |
@@ -1183,6 +1183,13 @@ int32_t ec_gf_seek(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,
|
|
|
3604df |
return 0;
|
|
|
3604df |
}
|
|
|
3604df |
|
|
|
3604df |
+int32_t ec_gf_ipc(call_frame_t *frame, xlator_t *this, int32_t op,
|
|
|
3604df |
+ dict_t *xdata)
|
|
|
3604df |
+{
|
|
|
3604df |
+ ec_ipc(frame, this, -1, EC_MINIMUM_MIN, default_ipc_cbk, NULL, op, xdata);
|
|
|
3604df |
+ return 0;
|
|
|
3604df |
+}
|
|
|
3604df |
+
|
|
|
3604df |
int32_t ec_gf_forget(xlator_t * this, inode_t * inode)
|
|
|
3604df |
{
|
|
|
3604df |
uint64_t value = 0;
|
|
|
3604df |
@@ -1298,7 +1305,8 @@ struct xlator_fops fops =
|
|
|
3604df |
.fallocate = ec_gf_fallocate,
|
|
|
3604df |
.discard = ec_gf_discard,
|
|
|
3604df |
.zerofill = ec_gf_zerofill,
|
|
|
3604df |
- .seek = ec_gf_seek
|
|
|
3604df |
+ .seek = ec_gf_seek,
|
|
|
3604df |
+ .ipc = ec_gf_ipc
|
|
|
3604df |
};
|
|
|
3604df |
|
|
|
3604df |
struct xlator_cbks cbks =
|
|
|
3604df |
--
|
|
|
3604df |
1.7.1
|
|
|
3604df |
|