diff options
Diffstat (limited to 'xlators/protocol/server/src/server.c')
-rw-r--r-- | xlators/protocol/server/src/server.c | 66 |
1 files changed, 61 insertions, 5 deletions
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c index d7eab16bf13..023f2a6234f 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -27,6 +27,12 @@ #include "authenticate.h" #include "event.h" +rpcsvc_cbk_program_t server_cbk_prog = { + .progname = "Gluster Callback", + .prognum = GLUSTER_CBK_PROGRAM, + .progver = GLUSTER_CBK_VERSION, +}; + void grace_time_handler (void *data) { @@ -1093,22 +1099,72 @@ fini (xlator_t *this) int notify (xlator_t *this, int32_t event, void *data, ...) { - int ret = 0; - int32_t val = 0; - dict_t *dict = NULL; - dict_t *output = NULL; - va_list ap; + int ret = 0; + int32_t val = 0; + dict_t *dict = NULL; + dict_t *output = NULL; + va_list ap; + client_t *client = NULL; + char *client_uid = NULL; + struct gf_upcall *upcall_data = NULL; + gfs3_upcall_req up_req; + server_conf_t *conf = NULL; + rpc_transport_t *xprt = NULL; dict = data; va_start (ap, data); output = va_arg (ap, dict_t*); va_end (ap); + conf = this->private; + if (!conf) + return 0; + switch (event) { + case GF_EVENT_UPCALL: + { + if (!data) { + ret = -1; + goto out; + } + + upcall_data = (struct gf_upcall *)data; + + client_uid = upcall_data->client_uid; + + if (!client_uid) { + ret = -1; + goto out; + } + + gf_proto_upcall_from_upcall (&up_req, upcall_data); + + pthread_mutex_lock (&conf->mutex); + { + list_for_each_entry (xprt, &conf->xprt_list, list) { + client = xprt->xl_private; + + if (strcmp(client->client_uid, client_uid)) + continue; + + rpcsvc_request_submit( + conf->rpc, xprt, + &server_cbk_prog, + GF_CBK_UPCALL, + &up_req, + this->ctx, + (xdrproc_t)xdr_gfs3_upcall_req); + break; + } + } + pthread_mutex_unlock (&conf->mutex); + break; + } default: default_notify (this, event, data); break; } +out: return ret; } |