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