diff options
| author | Anand Avati <avati@gluster.com> | 2010-07-21 03:54:16 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2010-07-21 02:44:09 -0700 | 
| commit | d69b8b56d7be4a15e7eac9dcd45d9b19ac2dc0bf (patch) | |
| tree | f450c1cb3b4767f4f07e5e0f9050bcab58941e40 | |
| parent | 74195df7a5bdc6ae9489d63a3b8157cbb2ddd8e2 (diff) | |
glusterd: implement GETSPEC
Signed-off-by: Anand V. Avati <avati@blackhole.gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 971 (dynamic volume management)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=971
| -rw-r--r-- | xlators/mgmt/glusterd/src/Makefile.am | 4 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handshake.c | 164 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 8 | 
3 files changed, 171 insertions, 5 deletions
diff --git a/xlators/mgmt/glusterd/src/Makefile.am b/xlators/mgmt/glusterd/src/Makefile.am index d8b4e87d4..5e835d3b5 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-ha.c +	glusterd-utils.c glusterd3_1-mops.c glusterd-ha.c \ +	glusterd-handshake.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-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c new file mode 100644 index 000000000..046923480 --- /dev/null +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -0,0 +1,164 @@ +/* +  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 "glusterfs3.h" +#include "protocol-common.h" +#include "rpcsvc.h" + + +typedef ssize_t (*gfs_serialize_t) (struct iovec outmsg, void *data); + + +static size_t +build_volfile_path (const char *volname, char *path, +                    size_t path_len) +{ +        int32_t ret = -1; +        glusterd_conf_t *priv = NULL; + +        priv = THIS->private; + +        ret = snprintf (path, path_len, "%s/vols/%s/%s-tcp.vol", +                        priv->workdir, volname, volname); + +        return ret; +} + +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 +server_getspec (rpcsvc_request_t *req) +{ +        int32_t               ret = -1; +        int32_t               op_errno = 0; +        int32_t               spec_fd = -1; +        size_t                file_len = 0; +        char                  filename[ZR_PATH_MAX] = {0,}; +        struct stat           stbuf = {0,}; +        char                 *volume = NULL; +        int                   cookie = 0; + +        gf_getspec_req    args = {0,}; +        gf_getspec_rsp    rsp  = {0,}; + + +        rsp.spec = ""; + +        if (xdr_to_glusterfs_req (req, &args, xdr_to_getspec_req)) { +                //failed to decode msg; +                req->rpc_err = GARBAGE_ARGS; +                goto fail; +        } + +        volume = args.key; + +        ret = build_volfile_path (volume, filename, sizeof (filename)); + +        if (ret > 0) { +                /* to allocate the proper buffer to hold the file data */ +                ret = stat (filename, &stbuf); +                if (ret < 0){ +                        gf_log ("glusterd", GF_LOG_ERROR, +                                "Unable to stat %s (%s)", +                                filename, strerror (errno)); +                        goto fail; +                } + +                spec_fd = open (filename, O_RDONLY); +                if (spec_fd < 0) { +                        gf_log ("glusterd", GF_LOG_ERROR, +                                "Unable to open %s (%s)", +                                filename, strerror (errno)); +                        goto fail; +                } +                ret = file_len = stbuf.st_size; +        } else { +                op_errno = ENOENT; +        } + +        if (file_len) { +                rsp.spec = CALLOC (file_len, sizeof (char)); +                if (!rsp.spec) { +                        ret = -1; +                        op_errno = ENOMEM; +                        goto fail; +                } +                ret = read (spec_fd, rsp.spec, file_len); + +                close (spec_fd); +        } + +        /* convert to XDR */ +fail: +        rsp.op_ret   = ret; + +        if (op_errno) +                rsp.op_errno = gf_errno_to_error (op_errno); +        if (cookie) +                rsp.op_errno = cookie; + + +        glusterd_submit_reply (req, &rsp, NULL, 0, NULL, +                               (gd_serialize_t)xdr_serialize_getspec_rsp); + +        return 0; +} + + +rpcsvc_actor_t gluster_handshake_actors[] = { +        [GF_HNDSK_NULL]      = {"NULL",      GF_HNDSK_NULL,      NULL, NULL, NULL }, +        [GF_HNDSK_GETSPEC]   = {"GETSPEC",   GF_HNDSK_GETSPEC,   server_getspec, NULL, NULL }, +}; + + +struct rpcsvc_program gluster_handshake_prog = { +        .progname  = "GlusterFS Handshake", +        .prognum   = GLUSTER_HNDSK_PROGRAM, +        .progver   = GLUSTER_HNDSK_VERSION, +        .actors    = gluster_handshake_actors, +        .numactors = GF_HNDSK_MAXVALUE, +}; diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index 3be035e63..7e886f17a 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -46,6 +46,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;  static int @@ -249,12 +250,11 @@ init (xlator_t *this)                  goto out;          } -//TODO: Waiting on handshake code -/*        gluster_handshake_prog.options = this->options; -        ret = rpcsvc_program_register (conf->rpc, gluster_handshake_prog); +        gluster_handshake_prog.options = this->options; +        ret = rpcsvc_program_register (rpc, gluster_handshake_prog);          if (ret)                  goto out; -*/ +          conf = GF_CALLOC (1, sizeof (glusterd_conf_t),                            gf_gld_mt_glusterd_conf_t);          GF_VALIDATE_OR_GOTO(this->name, conf, out);  | 
