summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-pmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-pmap.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-pmap.c274
1 files changed, 166 insertions, 108 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-pmap.c b/xlators/mgmt/glusterd/src/glusterd-pmap.c
index dfb39b353..a153ca1a9 100644
--- a/xlators/mgmt/glusterd/src/glusterd-pmap.c
+++ b/xlators/mgmt/glusterd/src/glusterd-pmap.c
@@ -1,22 +1,12 @@
/*
- 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 Affero 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
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see
- <http://www.gnu.org/licenses/>.
-*/
+ Copyright (c) 2010-2013 Red Hat, Inc. <http://www.redhat.com>
+ This file is part of GlusterFS.
+ This file is licensed to you under your choice of the GNU Lesser
+ General Public License, version 3 or any later version (LGPLv3 or
+ later), or the GNU General Public License, version 2 (GPLv2), in all
+ cases as published by the Free Software Foundation.
+*/
#ifndef _CONFIG_H
#define _CONFIG_H
@@ -30,7 +20,8 @@
#include "glusterd.h"
#include "glusterd-utils.h"
-#include "portmap.h"
+#include "portmap-xdr.h"
+#include "xdr-generic.h"
#include "protocol-common.h"
#include "rpcsvc.h"
@@ -61,8 +52,8 @@ pmap_port_isfree (int port)
}
-struct pmap_registry *
-pmap_registry_new (void)
+static struct pmap_registry *
+pmap_registry_new (xlator_t *this)
{
struct pmap_registry *pmap = NULL;
int i = 0;
@@ -72,15 +63,14 @@ pmap_registry_new (void)
return NULL;
for (i = 0; i < 65536; i++) {
- if (!pmap_port_isfree (i)) {
- pmap->ports[i].used = 1;
- pmap->last_alloc = i;
- }
+ if (pmap_port_isfree (i))
+ pmap->ports[i].type = GF_PMAP_PORT_FREE;
+ else
+ pmap->ports[i].type = GF_PMAP_PORT_FOREIGN;
}
- pmap->base_port = 6969;
- if (pmap->last_alloc < 6969)
- pmap->last_alloc = 6969;
+ pmap->base_port = pmap->last_alloc =
+ ((glusterd_conf_t *)(this->private))->base_port;
return pmap;
}
@@ -96,7 +86,7 @@ pmap_registry_get (xlator_t *this)
pmap = priv->pmap;
if (!pmap) {
- pmap = pmap_registry_new ();
+ pmap = pmap_registry_new (this);
if (!pmap)
return NULL;
priv->pmap = pmap;
@@ -106,29 +96,48 @@ pmap_registry_get (xlator_t *this)
}
+static char*
+nextword (char *str)
+{
+ while (*str && !isspace (*str))
+ str++;
+ while (*str && isspace (*str))
+ str++;
+
+ return str;
+}
+
int
-pmap_registry_search (xlator_t *this, const char *brickname)
+pmap_registry_search (xlator_t *this, const char *brickname,
+ gf_pmap_port_type_t type)
{
struct pmap_registry *pmap = NULL;
int p = 0;
- int port = 0;
+ char *brck = NULL;
+ char *nbrck = NULL;
pmap = pmap_registry_get (this);
- for (p = pmap->base_port; p < pmap->last_alloc; p++) {
- if (!pmap->ports[p].brickname)
+ for (p = pmap->base_port; p <= pmap->last_alloc; p++) {
+ if (!pmap->ports[p].brickname || pmap->ports[p].type != type)
continue;
- if (strcmp (pmap->ports[p].brickname, brickname) == 0) {
- port = p;
- break;
+
+ for (brck = pmap->ports[p].brickname;;) {
+ nbrck = strtail (brck, brickname);
+ if (nbrck && (!*nbrck || isspace (*nbrck)))
+ return p;
+ brck = nextword (brck);
+ if (!*brck)
+ break;
}
}
- return port;
+ return 0;
}
int
-pmap_registry_search_by_xprt (xlator_t *this, void *xprt)
+pmap_registry_search_by_xprt (xlator_t *this, void *xprt,
+ gf_pmap_port_type_t type)
{
struct pmap_registry *pmap = NULL;
int p = 0;
@@ -136,10 +145,11 @@ pmap_registry_search_by_xprt (xlator_t *this, void *xprt)
pmap = pmap_registry_get (this);
- for (p = pmap->base_port; p < pmap->last_alloc; p++) {
+ for (p = pmap->base_port; p <= pmap->last_alloc; p++) {
if (!pmap->ports[p].xprt)
continue;
- if (pmap->ports[p].xprt == xprt) {
+ if (pmap->ports[p].xprt == xprt &&
+ pmap->ports[p].type == type) {
port = p;
break;
}
@@ -160,7 +170,7 @@ pmap_registry_search_by_port (xlator_t *this, int port)
pmap = pmap_registry_get (this);
- if (pmap->ports[port].used)
+ if (pmap->ports[port].type == GF_PMAP_PORT_BRICKSERVER)
brickname = pmap->ports[port].brickname;
out:
@@ -177,23 +187,26 @@ pmap_registry_alloc (xlator_t *this)
pmap = pmap_registry_get (this);
- for (p = pmap->base_port; p < 65535; p++) {
- if (pmap->ports[p].used)
+ for (p = pmap->last_alloc; p < 65535; p++) {
+ if (pmap->ports[p].type != GF_PMAP_PORT_FREE)
continue;
if (pmap_port_isfree (p)) {
- pmap->ports[p].used = 1;
+ pmap->ports[p].type = GF_PMAP_PORT_LEASED;
port = p;
break;
}
}
+ if (port)
+ pmap->last_alloc = port;
+
return port;
}
int
-pmap_registry_bind (xlator_t *this, int port,
- const char *brickname, void *xprt)
+pmap_registry_bind (xlator_t *this, int port, const char *brickname,
+ gf_pmap_port_type_t type, void *xprt)
{
struct pmap_registry *pmap = NULL;
int p = 0;
@@ -204,10 +217,10 @@ pmap_registry_bind (xlator_t *this, int port,
goto out;
p = port;
- pmap->ports[p].used = 1;
- if (pmap->ports[p].brickname)
- free (pmap->ports[p].brickname);
+ pmap->ports[p].type = type;
+ free (pmap->ports[p].brickname);
pmap->ports[p].brickname = strdup (brickname);
+ pmap->ports[p].type = type;
pmap->ports[p].xprt = xprt;
gf_log ("pmap", GF_LOG_INFO, "adding brick %s on port %d",
@@ -220,13 +233,17 @@ out:
}
int
-pmap_registry_remove (xlator_t *this, int port,
- const char *brickname, void *xprt)
+pmap_registry_remove (xlator_t *this, int port, const char *brickname,
+ gf_pmap_port_type_t type, void *xprt)
{
struct pmap_registry *pmap = NULL;
int p = 0;
+ glusterd_conf_t *priv = NULL;
- pmap = pmap_registry_get (this);
+ priv = this->private;
+ pmap = priv->pmap;
+ if (!pmap)
+ goto out;
if (port) {
if (port > 65535)
@@ -237,13 +254,13 @@ pmap_registry_remove (xlator_t *this, int port,
}
if (brickname && strchr (brickname, '/')) {
- p = pmap_registry_search (this, brickname);
+ p = pmap_registry_search (this, brickname, type);
if (p)
goto remove;
}
if (xprt) {
- p = pmap_registry_search_by_xprt (this, xprt);
+ p = pmap_registry_search_by_xprt (this, xprt, type);
if (p)
goto remove;
}
@@ -253,9 +270,7 @@ remove:
gf_log ("pmap", GF_LOG_INFO, "removing brick %s on port %d",
pmap->ports[p].brickname, p);
- pmap->ports[p].used = 0;
- if (pmap->ports[p].brickname)
- free (pmap->ports[p].brickname);
+ free (pmap->ports[p].brickname);
pmap->ports[p].brickname = NULL;
pmap->ports[p].xprt = NULL;
@@ -264,43 +279,25 @@ out:
return 0;
}
-
-typedef ssize_t (*gfs_serialize_t) (struct iovec outmsg, void *data);
-
-
-static int
-xdr_to_glusterfs_req (rpcsvc_request_t *req, void *arg, gfs_serialize_t sfunc)
-{
- int ret = -1;
-
- if (!req)
- return -1;
-
- ret = sfunc (req->msg[0], arg);
-
- if (ret > 0)
- ret = 0;
-
- return ret;
-}
-
-
int
-gluster_pmap_portbybrick (rpcsvc_request_t *req)
+__gluster_pmap_portbybrick (rpcsvc_request_t *req)
{
pmap_port_by_brick_req args = {0,};
pmap_port_by_brick_rsp rsp = {0,};
char *brick = NULL;
int port = 0;
+ int ret = -1;
- if (xdr_to_glusterfs_req (req, &args, xdr_to_pmap_port_by_brick_req)) {
+ ret = xdr_to_generic (req->msg[0], &args,
+ (xdrproc_t)xdr_pmap_port_by_brick_req);
+ if (ret < 0) {
req->rpc_err = GARBAGE_ARGS;
goto fail;
}
brick = args.brick;
- port = pmap_registry_search (THIS, brick);
+ port = pmap_registry_search (THIS, brick, GF_PMAP_PORT_BRICKSERVER);
if (!port)
rsp.op_ret = -1;
@@ -309,19 +306,30 @@ gluster_pmap_portbybrick (rpcsvc_request_t *req)
fail:
glusterd_submit_reply (req, &rsp, NULL, 0, NULL,
- (gd_serialize_t)xdr_from_pmap_port_by_brick_rsp);
+ (xdrproc_t)xdr_pmap_port_by_brick_rsp);
+ free (args.brick);//malloced by xdr
return 0;
}
int
-gluster_pmap_brickbyport (rpcsvc_request_t *req)
+gluster_pmap_portbybrick (rpcsvc_request_t *req)
+{
+ return glusterd_big_locked_handler (req, __gluster_pmap_portbybrick);
+}
+
+
+int
+__gluster_pmap_brickbyport (rpcsvc_request_t *req)
{
pmap_brick_by_port_req args = {0,};
pmap_brick_by_port_rsp rsp = {0,};
+ int ret = -1;
- if (xdr_to_glusterfs_req (req, &args, xdr_to_pmap_brick_by_port_req)) {
+ ret = xdr_to_generic (req->msg[0], &args,
+ (xdrproc_t)xdr_pmap_brick_by_port_req);
+ if (ret < 0) {
req->rpc_err = GARBAGE_ARGS;
goto fail;
}
@@ -334,94 +342,144 @@ gluster_pmap_brickbyport (rpcsvc_request_t *req)
fail:
glusterd_submit_reply (req, &rsp, NULL, 0, NULL,
- (gd_serialize_t)xdr_from_pmap_brick_by_port_rsp);
+ (xdrproc_t)xdr_pmap_brick_by_port_rsp);
return 0;
}
+int
+gluster_pmap_brickbyport (rpcsvc_request_t *req)
+{
+ return glusterd_big_locked_handler (req, __gluster_pmap_brickbyport);
+}
+
+
+static int
+glusterd_brick_update_signin (glusterd_brickinfo_t *brickinfo,
+ gf_boolean_t value)
+{
+ brickinfo->signed_in = value;
+
+ return 0;
+}
int
-gluster_pmap_signup (rpcsvc_request_t *req)
+__gluster_pmap_signup (rpcsvc_request_t *req)
{
pmap_signup_req args = {0,};
pmap_signup_rsp rsp = {0,};
+ int ret = -1;
- if (xdr_to_glusterfs_req (req, &args, xdr_to_pmap_signup_req)) {
+ ret = xdr_to_generic (req->msg[0], &args,
+ (xdrproc_t)xdr_pmap_signup_req);
+ if (ret < 0) {
req->rpc_err = GARBAGE_ARGS;
goto fail;
}
- rsp.op_ret = pmap_registry_bind (THIS, args.port, args.brick, req->trans);
+ rsp.op_ret = pmap_registry_bind (THIS, args.port, args.brick,
+ GF_PMAP_PORT_BRICKSERVER, req->trans);
fail:
glusterd_submit_reply (req, &rsp, NULL, 0, NULL,
- (gd_serialize_t)xdr_from_pmap_signup_rsp);
+ (xdrproc_t)xdr_pmap_signup_rsp);
+ free (args.brick);//malloced by xdr
return 0;
}
+int
+gluster_pmap_signup (rpcsvc_request_t *req)
+{
+ return glusterd_big_locked_handler (req, __gluster_pmap_signup);
+}
int
-gluster_pmap_signin (rpcsvc_request_t *req)
+__gluster_pmap_signin (rpcsvc_request_t *req)
{
pmap_signin_req args = {0,};
pmap_signin_rsp rsp = {0,};
+ glusterd_brickinfo_t *brickinfo = NULL;
+ int ret = -1;
- if (xdr_to_glusterfs_req (req, &args, xdr_to_pmap_signin_req)) {
+ ret = xdr_to_generic (req->msg[0], &args,
+ (xdrproc_t)xdr_pmap_signin_req);
+ if (ret < 0) {
req->rpc_err = GARBAGE_ARGS;
goto fail;
}
rsp.op_ret = pmap_registry_bind (THIS, args.port, args.brick,
- req->trans);
+ GF_PMAP_PORT_BRICKSERVER, req->trans);
+ ret = glusterd_get_brickinfo (THIS, args.brick, args.port, _gf_true,
+ &brickinfo);
fail:
glusterd_submit_reply (req, &rsp, NULL, 0, NULL,
- (gd_serialize_t)xdr_from_pmap_signin_rsp);
+ (xdrproc_t)xdr_pmap_signin_rsp);
+ free (args.brick);//malloced by xdr
+
+ if (!ret)
+ glusterd_brick_update_signin (brickinfo, _gf_true);
return 0;
}
+int
+gluster_pmap_signin (rpcsvc_request_t *req)
+{
+ return glusterd_big_locked_handler (req, __gluster_pmap_signin);
+}
+
int
-gluster_pmap_signout (rpcsvc_request_t *req)
+__gluster_pmap_signout (rpcsvc_request_t *req)
{
pmap_signout_req args = {0,};
pmap_signout_rsp rsp = {0,};
+ int ret = -1;
+ glusterd_brickinfo_t *brickinfo = NULL;
-
- if (xdr_to_glusterfs_req (req, &args, xdr_to_pmap_signout_req)) {
+ ret = xdr_to_generic (req->msg[0], &args,
+ (xdrproc_t)xdr_pmap_signout_req);
+ if (ret < 0) {
//failed to decode msg;
req->rpc_err = GARBAGE_ARGS;
goto fail;
}
rsp.op_ret = pmap_registry_remove (THIS, args.port, args.brick,
- req->trans);
+ GF_PMAP_PORT_BRICKSERVER, req->trans);
+ ret = glusterd_get_brickinfo (THIS, args.brick, args.port, _gf_true,
+ &brickinfo);
fail:
glusterd_submit_reply (req, &rsp, NULL, 0, NULL,
- (gd_serialize_t)xdr_from_pmap_signout_rsp);
+ (xdrproc_t)xdr_pmap_signout_rsp);
+ free (args.brick);//malloced by xdr
+
+ if (!ret)
+ glusterd_brick_update_signin (brickinfo, _gf_false);
return 0;
}
+int
+gluster_pmap_signout (rpcsvc_request_t *req)
+{
+ return glusterd_big_locked_handler (req, __gluster_pmap_signout);
+}
rpcsvc_actor_t gluster_pmap_actors[] = {
- [GF_PMAP_NULL] = {"NULL", GF_HNDSK_NULL, NULL, NULL, NULL },
- [GF_PMAP_PORTBYBRICK] = {"PORTBYBRICK", GF_PMAP_PORTBYBRICK,
- gluster_pmap_portbybrick, NULL, NULL },
- [GF_PMAP_BRICKBYPORT] = {"BRICKBYPORT", GF_PMAP_BRICKBYPORT,
- gluster_pmap_brickbyport, NULL, NULL },
- [GF_PMAP_SIGNIN] = {"SIGNIN", GF_PMAP_SIGNIN,
- gluster_pmap_signin, NULL, NULL },
- [GF_PMAP_SIGNOUT] = {"SIGNOUT", GF_PMAP_SIGNOUT,
- gluster_pmap_signout, NULL, NULL },
- [GF_PMAP_SIGNUP] = {"SIGNUP", GF_PMAP_SIGNUP,
- gluster_pmap_signup, NULL, NULL },
+ [GF_PMAP_NULL] = {"NULL", GF_PMAP_NULL, NULL, NULL, 0, DRC_NA},
+ [GF_PMAP_PORTBYBRICK] = {"PORTBYBRICK", GF_PMAP_PORTBYBRICK, gluster_pmap_portbybrick, NULL, 0, DRC_NA},
+ [GF_PMAP_BRICKBYPORT] = {"BRICKBYPORT", GF_PMAP_BRICKBYPORT, gluster_pmap_brickbyport, NULL, 0, DRC_NA},
+ [GF_PMAP_SIGNIN] = {"SIGNIN", GF_PMAP_SIGNIN, gluster_pmap_signin, NULL, 0, DRC_NA},
+ [GF_PMAP_SIGNOUT] = {"SIGNOUT", GF_PMAP_SIGNOUT, gluster_pmap_signout, NULL, 0, DRC_NA},
+ [GF_PMAP_SIGNUP] = {"SIGNUP", GF_PMAP_SIGNUP, gluster_pmap_signup, NULL, 0, DRC_NA},
};