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 f07e745a4b3..5a5c65114c4 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -1020,6 +1020,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; @@ -1042,20 +1043,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,}; @@ -1063,6 +1077,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; @@ -1084,11 +1099,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) { @@ -1102,6 +1128,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 02e467e68a7..08402373be6 100644 --- a/rpc/rpc-lib/src/rpcsvc.h +++ b/rpc/rpc-lib/src/rpcsvc.h @@ -584,7 +584,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 26cd0fc4f25..c2272558939 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -244,7 +244,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); @@ -280,7 +281,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 10009e2b4a7..7ab0862b0a2 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -1235,12 +1235,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;                  }          } @@ -1272,7 +1278,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);  | 
