diff options
| author | Amar Tumballi <amar@gluster.com> | 2010-08-27 06:45:38 +0000 | 
|---|---|---|
| committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-08-27 05:53:56 -0700 | 
| commit | 8071909e84b6a479a6b5be1eddd15e8b16fc1a80 (patch) | |
| tree | db3a56cef557a3c86fd983e778927c70a8665363 /xlators/protocol | |
| parent | fd282c4299a5354aa272345e312ac600d9dcc680 (diff) | |
rpc: server to client callback mechanism
Signed-off-by: Amar Tumballi <amar@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
Diffstat (limited to 'xlators/protocol')
| -rw-r--r-- | xlators/protocol/client/src/Makefile.am | 3 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client-callback.c | 60 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client.c | 5 | ||||
| -rw-r--r-- | xlators/protocol/server/src/server.c | 13 | ||||
| -rw-r--r-- | xlators/protocol/server/src/server.h | 1 | 
5 files changed, 81 insertions, 1 deletions
diff --git a/xlators/protocol/client/src/Makefile.am b/xlators/protocol/client/src/Makefile.am index 159faf268a7..007810e9901 100644 --- a/xlators/protocol/client/src/Makefile.am +++ b/xlators/protocol/client/src/Makefile.am @@ -8,7 +8,8 @@ client_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \  	$(top_builddir)/rpc/rpc-lib/src/libgfrpc.la \  	$(top_builddir)/rpc/xdr/src/libgfxdr.la -client_la_SOURCES = client.c client-helpers.c client3_1-fops.c client-handshake.c +client_la_SOURCES = client.c client-helpers.c client3_1-fops.c  \ +	client-handshake.c client-callback.c  noinst_HEADERS = client.h client-mem-types.h  AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS) \ diff --git a/xlators/protocol/client/src/client-callback.c b/xlators/protocol/client/src/client-callback.c new file mode 100644 index 00000000000..51bd3375845 --- /dev/null +++ b/xlators/protocol/client/src/client-callback.c @@ -0,0 +1,60 @@ +/* +  Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> +  This file is part of GlusterFS. + +  GlusterFS is free software; you can redistribute it and/or modify +  it under the terms of the GNU General Public License as published +  by the Free Software Foundation; either version 3 of the License, +  or (at your option) any later version. + +  GlusterFS is distributed in the hope that it will be useful, but +  WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  General Public License for more details. + +  You should have received a copy of the GNU General Public License +  along with this program.  If not, see +  <http://www.gnu.org/licenses/>. +*/ + +#ifndef _CONFIG_H +#define _CONFIG_H +#include "config.h" +#endif + +#include "client.h" +#include "rpc-clnt.h" + +int +client_cbk_null (void *data) +{ +        return 0; +} + +int +client_cbk_fetchspec (void *data) +{ +        gf_log ("", 1, "here i am"); +        return 0; +} + +int +client_cbk_ino_flush (void *data) +{ +        return 0; +} + +rpcclnt_cb_actor_t gluster_cbk_actors[] = { +        [GF_CBK_NULL]      = {"NULL",      GF_CBK_NULL,      client_cbk_null }, +        [GF_CBK_FETCHSPEC] = {"FETCHSPEC", GF_CBK_FETCHSPEC, client_cbk_fetchspec }, +        [GF_CBK_INO_FLUSH] = {"INO_FLUSH", GF_CBK_INO_FLUSH, client_cbk_ino_flush }, +}; + + +struct rpcclnt_cb_program gluster_cbk_prog = { +        .progname  = "GlusterFS Callback", +        .prognum   = GLUSTER_CBK_PROGRAM, +        .progver   = GLUSTER_CBK_VERSION, +        .actors    = gluster_cbk_actors, +        .numactors = GF_CBK_MAXVALUE, +}; diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index c840d96f54c..458ecfa8f88 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -34,6 +34,7 @@  extern rpc_clnt_prog_t clnt_handshake_prog;  extern rpc_clnt_prog_t clnt_dump_prog; +extern struct rpcclnt_cb_program gluster_cbk_prog;  int client_handshake (xlator_t *this, struct rpc_clnt *rpc);  void client_start_ping (void *data); @@ -1730,6 +1731,10 @@ client_init_rpc (xlator_t *this)          conf->handshake = &clnt_handshake_prog;          conf->dump      = &clnt_dump_prog; +        ret = rpcclnt_cbk_program_register (conf->rpc, &gluster_cbk_prog); +        if (ret) +                goto out; +          ret = 0;          gf_log (this->name, GF_LOG_DEBUG, "client init successful"); diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c index 262da3e3158..8a7d9da0bbf 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -123,6 +123,10 @@ server_submit_reply (call_frame_t *frame, rpcsvc_request_t *req, void *arg,          ret = rpcsvc_submit_generic (req, &rsp, 1, payload, payloadcount,                                       iobref); +        /* TODO: this is demo purpose only */ +        /* ret = rpcsvc_callback_submit (req->svc, req->trans, req->prog, +                                         GF_CBK_NULL, &rsp, 1); +        */          /* Now that we've done our job of handing the message to the RPC layer           * we can safely unref the iob in the hope that RPC layer must have           * ref'ed the iob on receiving into the txlist. @@ -366,6 +370,7 @@ server_rpc_notify (rpcsvc_t *rpc, void *xl, rpcsvc_event_t event,          xlator_t            *this = NULL;          rpc_transport_t     *xprt = NULL;          server_connection_t *conn = NULL; +        server_conf_t       *conf = NULL;          if (!xl || !data) { @@ -376,6 +381,7 @@ server_rpc_notify (rpcsvc_t *rpc, void *xl, rpcsvc_event_t event,          this = xl;          xprt = data; +        conf = this->private;          switch (event) {          case RPCSVC_EVENT_ACCEPT: @@ -388,6 +394,10 @@ server_rpc_notify (rpcsvc_t *rpc, void *xl, rpcsvc_event_t event,                  xprt->protocol_private = conn;                  */ +                INIT_LIST_HEAD (&xprt->list); + +                list_add_tail (&xprt->list, &conf->xprt_list); +                  break;          }          case RPCSVC_EVENT_DISCONNECT: @@ -395,6 +405,8 @@ server_rpc_notify (rpcsvc_t *rpc, void *xl, rpcsvc_event_t event,                  if (conn)                          server_connection_put (this, conn); +                list_del (&xprt->list); +                  break;          default:                  break; @@ -449,6 +461,7 @@ init (xlator_t *this)          GF_VALIDATE_OR_GOTO(this->name, conf, out);          INIT_LIST_HEAD (&conf->conns); +        INIT_LIST_HEAD (&conf->xprt_list);          pthread_mutex_init (&conf->mutex, NULL);          this->private = conf; diff --git a/xlators/protocol/server/src/server.h b/xlators/protocol/server/src/server.h index 62e5ef886cf..b58e8a5fada 100644 --- a/xlators/protocol/server/src/server.h +++ b/xlators/protocol/server/src/server.h @@ -99,6 +99,7 @@ struct server_conf {  	dict_t                 *auth_modules;  	pthread_mutex_t         mutex;  	struct list_head        conns; +        struct list_head        xprt_list;  };  typedef struct server_conf server_conf_t;  | 
