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 d8b4e87d4bd..5e835d3b5a7 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 00000000000..04692348069 --- /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 3be035e63ac..7e886f17a6c 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); |