diff options
| -rw-r--r-- | rpc/rpc-lib/src/rpcsvc.c | 33 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/rpcsvc.h | 3 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 6 | ||||
| -rw-r--r-- | xlators/protocol/server/src/server.c | 20 | 
4 files changed, 50 insertions, 12 deletions
diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index 52b57205f6d..2be54a382f9 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -1014,6 +1014,7 @@ int rpcsvc_request_submit (rpcsvc_t *rpc, rpc_transport_t *trans,          struct iovec            iov         = {0, };          struct iobuf            *iobuf      = NULL;          ssize_t                 xdr_size    = 0; +        struct iobref           *iobref     = NULL;          if (!req)                  goto out; @@ -1036,20 +1037,33 @@ int rpcsvc_request_submit (rpcsvc_t *rpc, rpc_transport_t *trans,          iov.iov_len = ret;          count = 1; +        iobref = iobref_new (); +        if (!iobref) { +                ret = -1; +                gf_log ("rpcsvc", GF_LOG_WARNING, "Failed to create iobref"); +                goto out; +        } + +        iobref_add (iobref, iobuf); +          ret = rpcsvc_callback_submit (rpc, trans, prog, procnum, -                                      &iov, count); +                                      &iov, count, iobref);  out:          if (iobuf)                  iobuf_unref (iobuf); +        if (iobref) +                iobref_unref (iobref); +          return ret;  }  int  rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,                          rpcsvc_cbk_program_t *prog, int procnum, -                        struct iovec *proghdr, int proghdrcount) +                        struct iovec *proghdr, int proghdrcount, +                        struct iobref *iobref)  {          struct iobuf          *request_iob = NULL;          struct iovec           rpchdr      = {0,}; @@ -1057,6 +1071,7 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,          int                    ret         = -1;          int                    proglen     = 0;          uint32_t               xid         = 0; +        gf_boolean_t           new_iobref  = _gf_false;          if (!rpc) {                  goto out; @@ -1078,11 +1093,22 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,                          "cannot build rpc-record");                  goto out;          } +        if (!iobref) { +                iobref = iobref_new (); +                if (!iobref) { +                        gf_log ("rpcsvc", GF_LOG_WARNING, "Failed to create iobref"); +                        goto out; +                } +                new_iobref = 1; +        } + +        iobref_add (iobref, request_iob);          req.msg.rpchdr = &rpchdr;          req.msg.rpchdrcount = 1;          req.msg.proghdr = proghdr;          req.msg.proghdrcount = proghdrcount; +        req.msg.iobref = iobref;          ret = rpc_transport_submit_request (trans, &req);          if (ret == -1) { @@ -1096,6 +1122,9 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,  out:          iobuf_unref (request_iob); +        if (new_iobref) +               iobref_unref (iobref); +          return ret;  } diff --git a/rpc/rpc-lib/src/rpcsvc.h b/rpc/rpc-lib/src/rpcsvc.h index 63a6dad8c2f..cf3e5906de1 100644 --- a/rpc/rpc-lib/src/rpcsvc.h +++ b/rpc/rpc-lib/src/rpcsvc.h @@ -581,7 +581,8 @@ int rpcsvc_request_submit (rpcsvc_t *rpc, rpc_transport_t *trans,  int rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,                              rpcsvc_cbk_program_t *prog, int procnum, -                            struct iovec *proghdr, int proghdrcount); +                            struct iovec *proghdr, int proghdrcount, +                            struct iobref *iobref);  rpcsvc_actor_t *  rpcsvc_program_actor (rpcsvc_request_t *req); diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index d6f8baff4f2..88361877efe 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -313,7 +313,8 @@ glusterd_fetchspec_notify (xlator_t *this)                  list_for_each_entry (trans, &priv->xprt_list, list) {                          rpcsvc_callback_submit (priv->rpc, trans,                                                  &glusterd_cbk_prog, -                                                GF_CBK_FETCHSPEC, NULL, 0); +                                                GF_CBK_FETCHSPEC, NULL, 0, +                                                NULL);                  }          }          pthread_mutex_unlock (&priv->xprt_lock); @@ -349,7 +350,8 @@ glusterd_fetchsnap_notify (xlator_t *this)                  list_for_each_entry (trans, &priv->xprt_list, list) {                          rpcsvc_callback_submit (priv->rpc, trans,                                                  &glusterd_cbk_prog, -                                                GF_CBK_GET_SNAPS, NULL, 0); +                                                GF_CBK_GET_SNAPS, NULL, 0, +                                                NULL);                  }          }          pthread_mutex_unlock (&priv->xprt_lock); diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c index 35bb80ef1a6..4739c4560a6 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -1351,12 +1351,18 @@ server_process_event_upcall (xlator_t *this, void *data)                          if (!client || strcmp(client->client_uid, client_uid))                                  continue; -                        rpcsvc_request_submit(conf->rpc, xprt, -                                              &server_cbk_prog, -                                              cbk_procnum, -                                              up_req, -                                              this->ctx, -                                              xdrproc); +                        ret = rpcsvc_request_submit (conf->rpc, xprt, +                                                     &server_cbk_prog, +                                                     cbk_procnum, +                                                     up_req, +                                                     this->ctx, +                                                     xdrproc); +                        if (ret < 0) { +                                gf_msg_debug (this->name, 0, "Failed to send " +                                              "upcall to client:%s upcall " +                                              "event:%d", client_uid, +                                              upcall_data->event_type); +                        }                          break;                  }          } @@ -1391,7 +1397,7 @@ server_process_child_event (xlator_t *this, int32_t event, void *data,                          rpcsvc_callback_submit (conf->rpc, xprt,                                                  &server_cbk_prog,                                                  cbk_procnum, -                                                NULL, 0); +                                                NULL, 0, NULL);                  }          }          pthread_mutex_unlock (&conf->mutex);  | 
