summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt
diff options
context:
space:
mode:
authorRaghavendra G <raghavendra@gluster.com>2010-08-19 10:42:33 +0000
committerAnand V. Avati <avati@dev.gluster.com>2010-08-19 09:50:32 -0700
commita5dac1f49eb247d854348fe8ec54c33e664adf30 (patch)
treeb2973e967fa44feba7b1eabb813f0e51e1e4b988 /xlators/mgmt
parent01c00dd2e1d3113acb3f20c5dc7c20fa8d286339 (diff)
rpcsvc: decouple creation of listener from rpcsvc_program_register and rpcsvc_init.
- with this patch every program that wants to register itself with rpcsvc should also create one or more listener(s) and register with portmap (if necessary). Signed-off-by: Raghavendra G <raghavendra@gluster.com> Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 875 (Implement a new protocol to provide proper backward/forward compatibility) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=875
Diffstat (limited to 'xlators/mgmt')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.c77
1 files changed, 60 insertions, 17 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c
index a9f790bd3a1..33c9ac796cd 100644
--- a/xlators/mgmt/glusterd/src/glusterd.c
+++ b/xlators/mgmt/glusterd/src/glusterd.c
@@ -161,6 +161,26 @@ out:
return 0;
}
+
+inline int32_t
+glusterd_program_register (xlator_t *this, rpcsvc_t *svc,
+ rpcsvc_program_t *prog)
+{
+ int32_t ret = -1;
+
+ ret = rpcsvc_program_register (svc, prog);
+ if (ret) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "cannot register program (name: %s, prognum:%d, "
+ "progver:%d)", prog->progname, prog->prognum,
+ prog->progver);
+ goto out;
+ }
+
+out:
+ return ret;
+}
+
/*
* init - called during glusterd initialization
*
@@ -170,15 +190,16 @@ out:
int
init (xlator_t *this)
{
- int32_t ret = -1;
- rpcsvc_t *rpc = NULL;
- glusterd_conf_t *conf = NULL;
- data_t *dir_data = NULL;
- char dirname [PATH_MAX];
- struct stat buf = {0,};
- char *port_str = NULL;
- int port_num = 0;
- char voldir [PATH_MAX] = {0,};
+ int32_t ret = -1;
+ rpcsvc_t *rpc = NULL;
+ glusterd_conf_t *conf = NULL;
+ data_t *dir_data = NULL;
+ struct stat buf = {0,};
+ char *port_str = NULL;
+ int port_num = 0;
+ char voldir [PATH_MAX] = {0,};
+ rpcsvc_listener_t *listener = NULL;
+ char dirname [PATH_MAX];
dir_data = dict_get (this->options, "working-directory");
@@ -260,24 +281,35 @@ init (xlator_t *this)
glusterd1_mop_prog.progport = port_num;
}
- ret = rpcsvc_program_register (rpc, glusterd1_mop_prog);
- if (ret) {
+ /*
+ * only one listener for glusterd1_mop_prog, gluster_pmap_prog and
+ * gluster_handshake_prog.
+ */
+ listener = rpcsvc_create_listener (rpc, this->options, this->name);
+ if (listener == NULL) {
gf_log (this->name, GF_LOG_ERROR,
- "rpcsvc_program_register returned %d", ret);
+ "creation of listener failed");
goto out;
}
- ret = rpcsvc_program_register (rpc, gluster_pmap_prog);
+ ret = glusterd_program_register (this, rpc, &glusterd1_mop_prog);
if (ret) {
- gf_log (this->name, GF_LOG_ERROR,
- "rpcsvc_program_register returned %d", ret);
+ goto out;
+ }
+
+ ret = glusterd_program_register (this, rpc, &gluster_pmap_prog);
+ if (ret) {
+ rpcsvc_program_unregister (rpc, &glusterd1_mop_prog);
goto out;
}
gluster_handshake_prog.options = this->options;
- ret = rpcsvc_program_register (rpc, gluster_handshake_prog);
- if (ret)
+ ret = glusterd_program_register (this, rpc, &gluster_handshake_prog);
+ if (ret) {
+ rpcsvc_program_unregister (rpc, &glusterd1_mop_prog);
+ rpcsvc_program_unregister (rpc, &gluster_handshake_prog);
goto out;
+ }
conf = GF_CALLOC (1, sizeof (glusterd_conf_t),
gf_gld_mt_glusterd_conf_t);
@@ -309,6 +341,17 @@ init (xlator_t *this)
ret = 0;
out:
+ if (ret == -1) {
+ if (listener != NULL) {
+ rpcsvc_listener_destroy (listener);
+ }
+
+ if (this->private != NULL) {
+ GF_FREE (this->private);
+ this->private = NULL;
+ }
+ }
+
return ret;
}