diff options
| -rw-r--r-- | rpc/rpc-lib/src/protocol-common.h | 15 | ||||
| -rw-r--r-- | rpc/xdr/src/Makefile.am | 6 | ||||
| -rw-r--r-- | rpc/xdr/src/portmap-xdr.c | 192 | ||||
| -rw-r--r-- | rpc/xdr/src/portmap-xdr.h | 111 | ||||
| -rw-r--r-- | rpc/xdr/src/portmap.c | 189 | ||||
| -rw-r--r-- | rpc/xdr/src/portmap.h | 95 | ||||
| -rw-r--r-- | rpc/xdr/src/portmap.x | 45 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/Makefile.am | 4 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-pmap.c | 336 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-pmap.h | 55 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 12 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 8 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 3 | 
13 files changed, 1066 insertions, 5 deletions
diff --git a/rpc/rpc-lib/src/protocol-common.h b/rpc/rpc-lib/src/protocol-common.h index 7cff79be367..95ef06aef9c 100644 --- a/rpc/rpc-lib/src/protocol-common.h +++ b/rpc/rpc-lib/src/protocol-common.h @@ -123,6 +123,18 @@ enum gf_cli_procnum {          GF1_CLI_MAXVALUE,  }; + +enum gf_pmap_procnum { +        GF_PMAP_NULL = 0, +        GF_PMAP_PORTBYBRICK, +        GF_PMAP_BRICKBYPORT, +        GF_PMAP_SIGNUP, +        GF_PMAP_SIGNIN, +        GF_PMAP_SIGNOUT, +        GF_PMAP_MAXVALUE, +}; + +  #define GLUSTER3_1_FOP_PROGRAM   1298437 /* Completely random */  #define GLUSTER3_1_FOP_VERSION   310 /* 3.1.0 */  #define GLUSTER3_1_FOP_PROCCNT   GFS3_OP_MAXVALUE @@ -138,4 +150,7 @@ enum gf_cli_procnum {  #define GLUSTER_HNDSK_PROGRAM   14398633 /* Completely random */  #define GLUSTER_HNDSK_VERSION   1   /* 0.0.1 */ +#define GLUSTER_PMAP_PROGRAM    34123456 +#define GLUSTER_PMAP_VERSION    1 +  #endif /* !_PROTOCOL_COMMON_H */ diff --git a/rpc/xdr/src/Makefile.am b/rpc/xdr/src/Makefile.am index 79063cd6452..981f319b3a7 100644 --- a/rpc/xdr/src/Makefile.am +++ b/rpc/xdr/src/Makefile.am @@ -12,9 +12,11 @@ libgfxdr_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \  libgfxdr_la_SOURCES =  xdr-generic.c \  			glusterfs3-xdr.c glusterfs3.c \  			cli1-xdr.c cli1.c \ -			glusterd1-xdr.c glusterd1.c +			glusterd1-xdr.c glusterd1.c \ +			portmap-xdr.c portmap.c  noinst_HEADERS = xdr-generic.h \  		glusterfs3-xdr.h glusterfs3.h \  		cli1-xdr.h cli1.h \ -		glusterd1-xdr.h glusterd1.h +		glusterd1-xdr.h glusterd1.h \ +		portmap-xdr.h portmap.h diff --git a/rpc/xdr/src/portmap-xdr.c b/rpc/xdr/src/portmap-xdr.c new file mode 100644 index 00000000000..a23eef9b314 --- /dev/null +++ b/rpc/xdr/src/portmap-xdr.c @@ -0,0 +1,192 @@ +/* + * Please do not edit this file. + * It was generated using rpcgen. + */ + +#include "portmap-xdr.h" + +bool_t +xdr_pmap_port_by_brick_req (XDR *xdrs, pmap_port_by_brick_req *objp) +{ +	 if (!xdr_string (xdrs, &objp->brick, ~0)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_pmap_port_by_brick_rsp (XDR *xdrs, pmap_port_by_brick_rsp *objp) +{ +	register int32_t *buf; + + +	if (xdrs->x_op == XDR_ENCODE) { +		buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); +		if (buf == NULL) { +			 if (!xdr_int (xdrs, &objp->op_ret)) +				 return FALSE; +			 if (!xdr_int (xdrs, &objp->op_errno)) +				 return FALSE; +			 if (!xdr_int (xdrs, &objp->status)) +				 return FALSE; +			 if (!xdr_int (xdrs, &objp->port)) +				 return FALSE; +		} else { +			IXDR_PUT_LONG(buf, objp->op_ret); +			IXDR_PUT_LONG(buf, objp->op_errno); +			IXDR_PUT_LONG(buf, objp->status); +			IXDR_PUT_LONG(buf, objp->port); +		} +		return TRUE; +	} else if (xdrs->x_op == XDR_DECODE) { +		buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); +		if (buf == NULL) { +			 if (!xdr_int (xdrs, &objp->op_ret)) +				 return FALSE; +			 if (!xdr_int (xdrs, &objp->op_errno)) +				 return FALSE; +			 if (!xdr_int (xdrs, &objp->status)) +				 return FALSE; +			 if (!xdr_int (xdrs, &objp->port)) +				 return FALSE; +		} else { +			objp->op_ret = IXDR_GET_LONG(buf); +			objp->op_errno = IXDR_GET_LONG(buf); +			objp->status = IXDR_GET_LONG(buf); +			objp->port = IXDR_GET_LONG(buf); +		} +	 return TRUE; +	} + +	 if (!xdr_int (xdrs, &objp->op_ret)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->op_errno)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->status)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->port)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_pmap_brick_by_port_req (XDR *xdrs, pmap_brick_by_port_req *objp) +{ +	 if (!xdr_int (xdrs, &objp->port)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_pmap_brick_by_port_rsp (XDR *xdrs, pmap_brick_by_port_rsp *objp) +{ +	register int32_t *buf; + + +	if (xdrs->x_op == XDR_ENCODE) { +		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); +		if (buf == NULL) { +			 if (!xdr_int (xdrs, &objp->op_ret)) +				 return FALSE; +			 if (!xdr_int (xdrs, &objp->op_errno)) +				 return FALSE; +			 if (!xdr_int (xdrs, &objp->status)) +				 return FALSE; + +		} else { +		IXDR_PUT_LONG(buf, objp->op_ret); +		IXDR_PUT_LONG(buf, objp->op_errno); +		IXDR_PUT_LONG(buf, objp->status); +		} +		 if (!xdr_string (xdrs, &objp->brick, ~0)) +			 return FALSE; +		return TRUE; +	} else if (xdrs->x_op == XDR_DECODE) { +		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); +		if (buf == NULL) { +			 if (!xdr_int (xdrs, &objp->op_ret)) +				 return FALSE; +			 if (!xdr_int (xdrs, &objp->op_errno)) +				 return FALSE; +			 if (!xdr_int (xdrs, &objp->status)) +				 return FALSE; + +		} else { +		objp->op_ret = IXDR_GET_LONG(buf); +		objp->op_errno = IXDR_GET_LONG(buf); +		objp->status = IXDR_GET_LONG(buf); +		} +		 if (!xdr_string (xdrs, &objp->brick, ~0)) +			 return FALSE; +	 return TRUE; +	} + +	 if (!xdr_int (xdrs, &objp->op_ret)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->op_errno)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->status)) +		 return FALSE; +	 if (!xdr_string (xdrs, &objp->brick, ~0)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_pmap_signup_req (XDR *xdrs, pmap_signup_req *objp) +{ +	 if (!xdr_string (xdrs, &objp->brick, ~0)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->port)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_pmap_signup_rsp (XDR *xdrs, pmap_signup_rsp *objp) +{ +	 if (!xdr_int (xdrs, &objp->op_ret)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->op_errno)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_pmap_signin_req (XDR *xdrs, pmap_signin_req *objp) +{ +	 if (!xdr_string (xdrs, &objp->brick, ~0)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->port)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_pmap_signin_rsp (XDR *xdrs, pmap_signin_rsp *objp) +{ +	 if (!xdr_int (xdrs, &objp->op_ret)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->op_errno)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_pmap_signout_req (XDR *xdrs, pmap_signout_req *objp) +{ +	 if (!xdr_string (xdrs, &objp->brick, ~0)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->port)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_pmap_signout_rsp (XDR *xdrs, pmap_signout_rsp *objp) +{ +	 if (!xdr_int (xdrs, &objp->op_ret)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->op_errno)) +		 return FALSE; +	return TRUE; +} diff --git a/rpc/xdr/src/portmap-xdr.h b/rpc/xdr/src/portmap-xdr.h new file mode 100644 index 00000000000..7f8141ab25b --- /dev/null +++ b/rpc/xdr/src/portmap-xdr.h @@ -0,0 +1,111 @@ +/* + * Please do not edit this file. + * It was generated using rpcgen. + */ + +#ifndef _PORTMAP_H_RPCGEN +#define _PORTMAP_H_RPCGEN + +#include <rpc/rpc.h> + + +#ifdef __cplusplus +extern "C" { +#endif + + +struct pmap_port_by_brick_req { +	char *brick; +}; +typedef struct pmap_port_by_brick_req pmap_port_by_brick_req; + +struct pmap_port_by_brick_rsp { +	int op_ret; +	int op_errno; +	int status; +	int port; +}; +typedef struct pmap_port_by_brick_rsp pmap_port_by_brick_rsp; + +struct pmap_brick_by_port_req { +	int port; +}; +typedef struct pmap_brick_by_port_req pmap_brick_by_port_req; + +struct pmap_brick_by_port_rsp { +	int op_ret; +	int op_errno; +	int status; +	char *brick; +}; +typedef struct pmap_brick_by_port_rsp pmap_brick_by_port_rsp; + +struct pmap_signup_req { +	char *brick; +	int port; +}; +typedef struct pmap_signup_req pmap_signup_req; + +struct pmap_signup_rsp { +	int op_ret; +	int op_errno; +}; +typedef struct pmap_signup_rsp pmap_signup_rsp; + +struct pmap_signin_req { +	char *brick; +	int port; +}; +typedef struct pmap_signin_req pmap_signin_req; + +struct pmap_signin_rsp { +	int op_ret; +	int op_errno; +}; +typedef struct pmap_signin_rsp pmap_signin_rsp; + +struct pmap_signout_req { +	char *brick; +	int port; +}; +typedef struct pmap_signout_req pmap_signout_req; + +struct pmap_signout_rsp { +	int op_ret; +	int op_errno; +}; +typedef struct pmap_signout_rsp pmap_signout_rsp; + +/* the xdr functions */ + +#if defined(__STDC__) || defined(__cplusplus) +extern  bool_t xdr_pmap_port_by_brick_req (XDR *, pmap_port_by_brick_req*); +extern  bool_t xdr_pmap_port_by_brick_rsp (XDR *, pmap_port_by_brick_rsp*); +extern  bool_t xdr_pmap_brick_by_port_req (XDR *, pmap_brick_by_port_req*); +extern  bool_t xdr_pmap_brick_by_port_rsp (XDR *, pmap_brick_by_port_rsp*); +extern  bool_t xdr_pmap_signup_req (XDR *, pmap_signup_req*); +extern  bool_t xdr_pmap_signup_rsp (XDR *, pmap_signup_rsp*); +extern  bool_t xdr_pmap_signin_req (XDR *, pmap_signin_req*); +extern  bool_t xdr_pmap_signin_rsp (XDR *, pmap_signin_rsp*); +extern  bool_t xdr_pmap_signout_req (XDR *, pmap_signout_req*); +extern  bool_t xdr_pmap_signout_rsp (XDR *, pmap_signout_rsp*); + +#else /* K&R C */ +extern bool_t xdr_pmap_port_by_brick_req (); +extern bool_t xdr_pmap_port_by_brick_rsp (); +extern bool_t xdr_pmap_brick_by_port_req (); +extern bool_t xdr_pmap_brick_by_port_rsp (); +extern bool_t xdr_pmap_signup_req (); +extern bool_t xdr_pmap_signup_rsp (); +extern bool_t xdr_pmap_signin_req (); +extern bool_t xdr_pmap_signin_rsp (); +extern bool_t xdr_pmap_signout_req (); +extern bool_t xdr_pmap_signout_rsp (); + +#endif /* K&R C */ + +#ifdef __cplusplus +} +#endif + +#endif /* !_PORTMAP_H_RPCGEN */ diff --git a/rpc/xdr/src/portmap.c b/rpc/xdr/src/portmap.c new file mode 100644 index 00000000000..51c44a7d6ed --- /dev/null +++ b/rpc/xdr/src/portmap.c @@ -0,0 +1,189 @@ +/* +  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/>. +*/ + + +#include "portmap.h" + + +ssize_t +xdr_to_pmap_port_by_brick_req (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_pmap_port_by_brick_req); +} + + +ssize_t +xdr_to_pmap_port_by_brick_rsp (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_pmap_port_by_brick_rsp); +} + + +ssize_t +xdr_from_pmap_port_by_brick_req (struct iovec inmsg, void *args) +{ +        return xdr_serialize_generic (inmsg, (void *)args, +                                      (xdrproc_t)xdr_pmap_port_by_brick_req); +} + + +ssize_t +xdr_from_pmap_port_by_brick_rsp (struct iovec inmsg, void *args) +{ +        return xdr_serialize_generic (inmsg, (void *)args, +                                      (xdrproc_t)xdr_pmap_port_by_brick_rsp); +} + + + +ssize_t +xdr_to_pmap_brick_by_port_req (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_pmap_brick_by_port_req); +} + + +ssize_t +xdr_to_pmap_brick_by_port_rsp (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_pmap_brick_by_port_rsp); +} + + +ssize_t +xdr_from_pmap_brick_by_port_req (struct iovec inmsg, void *args) +{ +        return xdr_serialize_generic (inmsg, (void *)args, +                                      (xdrproc_t)xdr_pmap_brick_by_port_req); +} + + +ssize_t +xdr_from_pmap_brick_by_port_rsp (struct iovec inmsg, void *args) +{ +        return xdr_serialize_generic (inmsg, (void *)args, +                                      (xdrproc_t)xdr_pmap_brick_by_port_rsp); +} + + + + +ssize_t +xdr_to_pmap_signup_req (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_pmap_signup_req); +} + + +ssize_t +xdr_to_pmap_signup_rsp (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_pmap_signup_rsp); +} + + +ssize_t +xdr_from_pmap_signup_req (struct iovec inmsg, void *args) +{ +        return xdr_serialize_generic (inmsg, (void *)args, +                                      (xdrproc_t)xdr_pmap_signup_req); +} + + +ssize_t +xdr_from_pmap_signup_rsp (struct iovec inmsg, void *args) +{ +        return xdr_serialize_generic (inmsg, (void *)args, +                                      (xdrproc_t)xdr_pmap_signup_rsp); +} + + + + +ssize_t +xdr_to_pmap_signin_req (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_pmap_signin_req); +} + + +ssize_t +xdr_to_pmap_signin_rsp (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_pmap_signin_rsp); +} + + +ssize_t +xdr_from_pmap_signin_req (struct iovec inmsg, void *args) +{ +        return xdr_serialize_generic (inmsg, (void *)args, +                                      (xdrproc_t)xdr_pmap_signin_req); +} + + +ssize_t +xdr_from_pmap_signin_rsp (struct iovec inmsg, void *args) +{ +        return xdr_serialize_generic (inmsg, (void *)args, +                                      (xdrproc_t)xdr_pmap_signin_rsp); +} + + + + +ssize_t +xdr_to_pmap_signout_req (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_pmap_signout_req); +} + + +ssize_t +xdr_to_pmap_signout_rsp (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_pmap_signout_rsp); +} + + +ssize_t +xdr_from_pmap_signout_req (struct iovec inmsg, void *args) +{ +        return xdr_serialize_generic (inmsg, (void *)args, +                                      (xdrproc_t)xdr_pmap_signout_req); +} + + +ssize_t +xdr_from_pmap_signout_rsp (struct iovec inmsg, void *args) +{ +        return xdr_serialize_generic (inmsg, (void *)args, +                                      (xdrproc_t)xdr_pmap_signout_rsp); +} + diff --git a/rpc/xdr/src/portmap.h b/rpc/xdr/src/portmap.h new file mode 100644 index 00000000000..1cfcca3ebda --- /dev/null +++ b/rpc/xdr/src/portmap.h @@ -0,0 +1,95 @@ +/* +  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 _PORTMAP_H +#define _PORTMAP_H + +#include <sys/uio.h> + +#include "xdr-generic.h" +#include "portmap-xdr.h" + + +ssize_t +xdr_to_pmap_port_by_brick_req (struct iovec inmsg, void *args); + +ssize_t +xdr_to_pmap_port_by_brick_rsp (struct iovec inmsg, void *args); + +ssize_t +xdr_from_pmap_port_by_brick_req (struct iovec outmsg, void *args); + +ssize_t +xdr_from_pmap_port_by_brick_rsp (struct iovec outmsg, void *args); + + +ssize_t +xdr_to_pmap_brick_by_port_req (struct iovec inmsg, void *args); + +ssize_t +xdr_to_pmap_brick_by_port_rsp (struct iovec inmsg, void *args); + +ssize_t +xdr_from_pmap_brick_by_port_req (struct iovec outmsg, void *args); + +ssize_t +xdr_from_pmap_brick_by_port_rsp (struct iovec outmsg, void *args); + + +ssize_t +xdr_from_pmap_signup_req (struct iovec msg, void *args); + +ssize_t +xdr_from_pmap_signup_rsp (struct iovec msg, void *args); + +ssize_t +xdr_to_pmap_signup_req (struct iovec msg, void *args); + +ssize_t +xdr_to_pmap_signup_rsp (struct iovec msg, void *args); + + +ssize_t +xdr_from_pmap_signin_req (struct iovec msg, void *args); + +ssize_t +xdr_from_pmap_signin_rsp (struct iovec msg, void *args); + +ssize_t +xdr_to_pmap_signin_req (struct iovec msg, void *args); + +ssize_t +xdr_to_pmap_signin_rsp (struct iovec msg, void *args); + + +ssize_t +xdr_from_pmap_signout_req (struct iovec msg, void *args); + +ssize_t +xdr_from_pmap_signout_rsp (struct iovec msg, void *args); + +ssize_t +xdr_to_pmap_signout_req (struct iovec msg, void *args); + +ssize_t +xdr_to_pmap_signout_rsp (struct iovec msg, void *args); + + +#endif /* !_PORTMAP_H */ diff --git a/rpc/xdr/src/portmap.x b/rpc/xdr/src/portmap.x new file mode 100644 index 00000000000..6e9f07c4534 --- /dev/null +++ b/rpc/xdr/src/portmap.x @@ -0,0 +1,45 @@ + +struct pmap_port_by_brick_req { +       string   brick<>; +}; + +struct pmap_port_by_brick_rsp { +       int      op_ret; +       int      op_errno; +       int      status; +       int      port; +}; + + +struct pmap_brick_by_port_req { +       int      port; +}; + +struct pmap_brick_by_port_rsp { +       int      op_ret; +       int      op_errno; +       int      status; +       string   brick<>; +}; + + +struct pmap_signup_req { +}; + +struct pmap_signup_rsp { +}; + + +struct pmap_signon_req { +}; + +struct pmap_signon_rsp { +}; + + +struct pmap_signoff_req { +}; + +struct pmap_signoff_rsp { +}; + diff --git a/xlators/mgmt/glusterd/src/Makefile.am b/xlators/mgmt/glusterd/src/Makefile.am index adc7ee30bf9..f3abd96ef9e 100644 --- a/xlators/mgmt/glusterd/src/Makefile.am +++ b/xlators/mgmt/glusterd/src/Makefile.am @@ -2,7 +2,9 @@ xlator_LTLIBRARIES = glusterd.la  xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/mgmt  glusterd_la_LDFLAGS = -module -avoidversion  glusterd_la_SOURCES = glusterd.c glusterd-handler.c glusterd-sm.c glusterd-op-sm.c \ -	glusterd-utils.c glusterd3_1-mops.c glusterd-store.c glusterd-handshake.c +	glusterd-utils.c glusterd3_1-mops.c glusterd-store.c glusterd-handshake.c \ +	glusterd-pmap.c +  glusterd_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la\  		     $(top_builddir)/rpc/xdr/src/libgfxdr.la\  		     $(top_builddir)/rpc/rpc-lib/src/libgfrpc.la diff --git a/xlators/mgmt/glusterd/src/glusterd-pmap.c b/xlators/mgmt/glusterd/src/glusterd-pmap.c new file mode 100644 index 00000000000..76ad7298764 --- /dev/null +++ b/xlators/mgmt/glusterd/src/glusterd-pmap.c @@ -0,0 +1,336 @@ +/* +  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 "xlator.h" +#include "glusterfs.h" +#include "compat-errno.h" + +#include "glusterd.h" +#include "glusterd-utils.h" + +#include "portmap.h" +#include "protocol-common.h" +#include "rpcsvc.h" + +#include <sys/socket.h> +#include <sys/types.h> +#include <netinet/in.h> + + +int +pmap_port_isfree (int port) +{ +        struct sockaddr_in sin; +        int                sock = -1; +        int                ret = 0; + +        memset (&sin, 0, sizeof (sin)); +        sin.sin_family = PF_INET; +        sin.sin_port = hton16 (port); + +        sock = socket (PF_INET, SOCK_STREAM, 0); +        if (sock == -1) +                return -1; + +        ret = bind (sock, (struct sockaddr *)&sin, sizeof (sin)); +        close (sock); + +        return ret == 0 ? 1 : 0; +} + + +struct pmap_registry * +pmap_registry_new (void) +{ +        struct pmap_registry *pmap = NULL; +        int                   i = 0; + +        pmap = CALLOC (sizeof (*pmap), 1); +        if (!pmap) +                return NULL; + +        for (i = 0; i < 65536; i++) { +                if (!pmap_port_isfree (i)) +                        pmap->ports[i].used = 1; +        } + +        pmap->base_port = 6969; +        pmap->last_alloc = 6969; + +        return pmap; +} + + +struct pmap_registry * +pmap_registry_get (xlator_t *this) +{ +        glusterd_conf_t      *priv = NULL; +        struct pmap_registry *pmap = NULL; + +        priv = this->private; + +        pmap = priv->pmap; +        if (!pmap) { +                pmap = pmap_registry_new (); +                if (!pmap) +                        return NULL; +                priv->pmap = pmap; +        } + +        return pmap; +} + + +int +pmap_registry_search (xlator_t *this, const char *brickname) +{ +        glusterd_conf_t      *priv = NULL; +        struct pmap_registry *pmap = NULL; +        int                   p = 0; +        int                   port = 0; + +        priv = this->private; + +        pmap = priv->pmap; + +        for (p = pmap->base_port; p < 65535; p++) { +                if (strcmp (pmap->ports[p].brickname, brickname) == 0) { +                        port = p; +                        break; +                } +        } + +        return port; +} + + +int +pmap_registry_alloc (xlator_t *this) +{ +        glusterd_conf_t      *priv = NULL; +        struct pmap_registry *pmap = NULL; +        int                   p = 0; +        int                   port = 0; + +        priv = this->private; + +        pmap = priv->pmap; + +        for (p = pmap->base_port; p < 65535; p++) { +                if (pmap->ports[p].used) +                        continue; + +                if (pmap_port_isfree (p)) { +                        pmap->ports[p].used = 1; +                        port = p; +                        break; +                } +        } + +        return port; +} + + + +int +pmap_registry_bind (xlator_t *this, int port, const char *brickname) +{ +        glusterd_conf_t      *priv = NULL; +        struct pmap_registry *pmap = NULL; +        int                   p = 0; + + +        priv = this->private; + +        pmap = priv->pmap; + +        pmap->ports[p].used = 1; +        if (pmap->ports[p].brickname) +                free (pmap->ports[p].brickname); +        pmap->ports[p].brickname = strdup (brickname); + +        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) +{ +        pmap_port_by_brick_req    args = {0,}; +        pmap_port_by_brick_rsp    rsp  = {0,}; +        char                     *brick = NULL; +        int                       port = 0; + + +        if (xdr_to_glusterfs_req (req, &args, xdr_to_pmap_port_by_brick_req)) { +                req->rpc_err = GARBAGE_ARGS; +                goto fail; +        } + +        brick = args.brick; + +        port = pmap_registry_search (THIS, brick); + +        rsp.op_ret = 0; +        rsp.port = port; + +fail: +        glusterd_submit_reply (req, &rsp, NULL, 0, NULL, +                               (gd_serialize_t)xdr_from_pmap_port_by_brick_rsp); + +        return 0; +} + + +int +gluster_pmap_brickbyport (rpcsvc_request_t *req) +{ +        pmap_brick_by_port_req    args = {0,}; +        pmap_brick_by_port_rsp    rsp  = {0,}; + + +        if (xdr_to_glusterfs_req (req, &args, xdr_to_pmap_brick_by_port_req)) { +                req->rpc_err = GARBAGE_ARGS; +                goto fail; +        } + + +fail: + +        glusterd_submit_reply (req, &rsp, NULL, 0, NULL, +                               (gd_serialize_t)xdr_from_pmap_brick_by_port_rsp); + +        return 0; +} + + + +int +gluster_pmap_signup (rpcsvc_request_t *req) +{ +        pmap_signup_req    args = {0,}; +        pmap_signup_rsp    rsp  = {0,}; + + +        if (xdr_to_glusterfs_req (req, &args, xdr_to_pmap_signup_req)) { +                req->rpc_err = GARBAGE_ARGS; +                goto fail; +        } + + +fail: +        glusterd_submit_reply (req, &rsp, NULL, 0, NULL, +                               (gd_serialize_t)xdr_from_pmap_signup_rsp); + +        return 0; +} + + +int +gluster_pmap_signin (rpcsvc_request_t *req) +{ +        pmap_signin_req    args = {0,}; +        pmap_signin_rsp    rsp  = {0,}; + + +        if (xdr_to_glusterfs_req (req, &args, xdr_to_pmap_signin_req)) { +                req->rpc_err = GARBAGE_ARGS; +                goto fail; +        } + + +fail: +        glusterd_submit_reply (req, &rsp, NULL, 0, NULL, +                               (gd_serialize_t)xdr_from_pmap_signin_rsp); + +        return 0; +} + + + +int +gluster_pmap_signout (rpcsvc_request_t *req) +{ +        pmap_signout_req    args = {0,}; +        pmap_signout_rsp    rsp  = {0,}; + + +        if (xdr_to_glusterfs_req (req, &args, xdr_to_pmap_signout_req)) { +                //failed to decode msg; +                req->rpc_err = GARBAGE_ARGS; +                goto fail; +        } + + +fail: +        glusterd_submit_reply (req, &rsp, NULL, 0, NULL, +                               (gd_serialize_t)xdr_from_pmap_signout_rsp); + +        return 0; +} + + +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 }, +}; + + +struct rpcsvc_program gluster_pmap_prog = { +        .progname  = "Gluster Portmap", +        .prognum   = GLUSTER_PMAP_PROGRAM, +        .progver   = GLUSTER_PMAP_VERSION, +        .actors    = gluster_pmap_actors, +        .numactors = GF_PMAP_MAXVALUE, +}; diff --git a/xlators/mgmt/glusterd/src/glusterd-pmap.h b/xlators/mgmt/glusterd/src/glusterd-pmap.h new file mode 100644 index 00000000000..be028157efa --- /dev/null +++ b/xlators/mgmt/glusterd/src/glusterd-pmap.h @@ -0,0 +1,55 @@ +/* +  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 _GLUSTERD_PMAP_H_ +#define _GLUSTERD_PMAP_H_ + +#ifndef _CONFIG_H +#define _CONFIG_H +#include "config.h" +#endif + +#include <pthread.h> +#include "uuid.h" + +#include "glusterfs.h" +#include "xlator.h" +#include "logging.h" +#include "call-stub.h" +#include "fd.h" +#include "byte-order.h" +#include "glusterd.h" +#include "rpcsvc.h" + + +struct pmap_port_status { +        int    used; +        char  *brickname; +}; + +struct pmap_registry { +        int     base_port; +        int     last_alloc; +        struct  pmap_port_status ports[65536]; +}; + +int pmap_registry_alloc (xlator_t *this); +int pmap_registry_bind (xlator_t *this, int port, const char *brickname); + +#endif diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index c17582341c0..c135e75264f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -716,7 +716,7 @@ glusterd_volinfo_find (char *volname, glusterd_volinfo_t **volinfo)  int32_t  glusterd_volume_start_glusterfs (glusterd_volinfo_t  *volinfo, -                                 glusterd_brickinfo_t   *brickinfo, +                                 glusterd_brickinfo_t  *brickinfo,                                   int32_t count)  {          int32_t                 ret = -1; @@ -727,6 +727,7 @@ glusterd_volume_start_glusterfs (glusterd_volinfo_t  *volinfo,          char                    path[PATH_MAX] = {0,};          char                    cmd_str[8192] = {0,};          char                    rundir[PATH_MAX] = {0,}; +        int                     port = 0;          GF_ASSERT (volinfo);          GF_ASSERT (brickinfo); @@ -746,12 +747,19 @@ glusterd_volume_start_glusterfs (glusterd_volinfo_t  *volinfo,                  goto out;          } +        port = pmap_registry_alloc (THIS); +          GLUSTERD_GET_BRICK_PIDFILE (pidfile, path, brickinfo->hostname, count);          snprintf (volfile, PATH_MAX, "%s/%s-%s-%d.vol", path,                    brickinfo->hostname, volinfo->volname, count); -        snprintf (cmd_str, 8192, "glusterfs -f %s -p %s", volfile, pidfile); + +        snprintf (cmd_str, 8192, +                  "glusterfs --xlator-option server-tcp.listen-port=%d -f %s -p %s", +                  port, volfile, pidfile);          ret = system (cmd_str); +        if (ret == 0) +                pmap_registry_bind (THIS, port, brickinfo->path);  out:          return ret;  } diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index 7d888d944fb..d2b271a1b5f 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -49,6 +49,7 @@ static uuid_t glusterd_uuid;  extern struct rpcsvc_program glusterd1_mop_prog;  extern struct rpcsvc_program gluster_handshake_prog;  extern struct rpc_clnt_program glusterd3_1_mgmt_prog; +extern struct rpcsvc_program gluster_pmap_prog;  extern glusterd_op_info_t opinfo; @@ -267,6 +268,13 @@ init (xlator_t *this)                  goto out;          } +        ret = rpcsvc_program_register (rpc, gluster_pmap_prog); +        if (ret) { +                gf_log (this->name, GF_LOG_ERROR, +                        "rpcsvc_program_register returned %d", ret); +                goto out; +        } +          gluster_handshake_prog.options = this->options;          ret = rpcsvc_program_register (rpc, gluster_handshake_prog);          if (ret) diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 2f0937a326b..600381243de 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -42,6 +42,8 @@  #include "rpcsvc.h"  #include "glusterd-sm.h"  #include "glusterd1-xdr.h" +#include "glusterd-pmap.h" +  #define GLUSTERD_MAX_VOLUME_NAME        1000 @@ -64,6 +66,7 @@ typedef struct {          char              workdir[PATH_MAX];          rpcsvc_t          *rpc;          rpc_clnt_prog_t   *mgmt; +        struct pmap_registry *pmap;          struct list_head  volumes;          struct list_head  hostnames;          glusterd_store_handle_t *handle;  | 
