diff options
Diffstat (limited to 'xlators/playground/template/src')
| -rw-r--r-- | xlators/playground/template/src/Makefile.am | 17 | ||||
| -rw-r--r-- | xlators/playground/template/src/template.c | 186 | ||||
| -rw-r--r-- | xlators/playground/template/src/template.h | 43 |
3 files changed, 246 insertions, 0 deletions
diff --git a/xlators/playground/template/src/Makefile.am b/xlators/playground/template/src/Makefile.am new file mode 100644 index 00000000000..e76a717a550 --- /dev/null +++ b/xlators/playground/template/src/Makefile.am @@ -0,0 +1,17 @@ +xlator_LTLIBRARIES = template.la +xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/playground + +template_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) + +template_la_SOURCES = template.c +template_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la + +noinst_HEADERS = template.h + +AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \ + -I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src + +AM_CFLAGS = -Wall $(GF_CFLAGS) + +CLEANFILES = + diff --git a/xlators/playground/template/src/template.c b/xlators/playground/template/src/template.c new file mode 100644 index 00000000000..2f25d2363a6 --- /dev/null +++ b/xlators/playground/template/src/template.c @@ -0,0 +1,186 @@ +/* + Copyright (c) 2006-2018 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. +*/ +#include "template.h" +#include <glusterfs/statedump.h> + +static int32_t +template_mem_acct_init(xlator_t *this) +{ + int ret = -1; + + GF_VALIDATE_OR_GOTO("template", this, out); + + ret = xlator_mem_acct_init(this, gf_template_mt_end + 1); + + if (ret != 0) { + gf_msg(this->name, GF_LOG_ERROR, ENOMEM, TEMPLATE_MSG_NO_MEMORY, + "Memory accounting init failed"); + goto out; + } + + ret = 0; +out: + return ret; +} + +static int32_t +template_priv_to_dict(xlator_t *this, dict_t *dict, char *brickname) +{ + int ret = 0; + template_private_t *priv = NULL; + + priv = this->private; + ret = dict_set_uint64(dict, "template.dummy", priv->dummy); + if (ret) + gf_msg_debug(this->name, ENOMEM, "dict_set of dummy key failed"); + + return 0; +} + +static int32_t +template_priv(xlator_t *this) +{ + template_private_t *priv = NULL; + + priv = this->private; + gf_proc_dump_write("template.dummy", "%" PRId32, priv->dummy); + + return 0; +} + +static int32_t +template_dump_metrics(xlator_t *this, int fd) +{ + template_private_t *priv = NULL; + + priv = this->private; + /* NOTE: currently this is adding private variable, which can + be constant here. But in reality, things which are changing + can be added here, so we get to plot them on graph. */ + dprintf(fd, "%s.private.dummy %d\n", this->name, priv->dummy); + + return 0; +} + +static int32_t +template_init(xlator_t *this) +{ + int ret = -1; + template_private_t *priv = NULL; + + if (!this->children || this->children->next) { + gf_msg(this->name, GF_LOG_ERROR, EINVAL, TEMPLATE_MSG_NO_GRAPH, + "not configured with exactly one child. exiting"); + goto out; + } + + if (!this->parents) { + gf_msg(this->name, GF_LOG_ERROR, EINVAL, TEMPLATE_MSG_NO_GRAPH, + "dangling volume. check volfile "); + goto out; + } + + priv = GF_CALLOC(1, sizeof(template_private_t), gf_template_mt_private_t); + if (!priv) { + gf_msg(this->name, GF_LOG_ERROR, ENOMEM, TEMPLATE_MSG_NO_MEMORY, + "priv allocation failed"); + goto out; + } + + GF_OPTION_INIT("dummy", priv->dummy, int32, out); + + this->private = priv; + priv = NULL; + ret = 0; + +out: + if (priv) + GF_FREE(priv); + + return ret; +} + +static int +template_reconfigure(xlator_t *this, dict_t *options) +{ + int ret = -1; + template_private_t *priv = NULL; + + priv = this->private; + + GF_OPTION_RECONF("dummy", priv->dummy, options, int32, out); + + ret = 0; +out: + return ret; +} + +static void +template_fini(xlator_t *this) +{ + template_private_t *priv = NULL; + + priv = this->private; + this->private = NULL; + + GF_FREE(priv); +} + +static int +template_notify(xlator_t *this, int32_t event, void *data, ...) +{ + switch (event) { + default: + default_notify(this, event, data); + gf_msg_debug(this->name, 0, "event %d received", event); + } + + return 0; +} + +struct xlator_fops template_fops = {}; + +struct xlator_cbks template_cbks = {}; + +struct xlator_dumpops template_dumpops = { + .priv = template_priv, + .priv_to_dict = template_priv_to_dict, +}; + +struct volume_options template_options[] = { + { + .key = {"dummy"}, + .type = GF_OPTION_TYPE_INT, + .min = 1, + .max = 1024, + .default_value = "1", + .description = "a dummy option to show how to set the option", + .op_version = {GD_OP_VERSION_5_0}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .level = OPT_STATUS_EXPERIMENTAL, + .tags = {"development", "experimental", "template"}, + }, + {.key = {NULL}}, +}; + +xlator_api_t xlator_api = { + .init = template_init, + .fini = template_fini, + .notify = template_notify, + .reconfigure = template_reconfigure, + .mem_acct_init = template_mem_acct_init, + .dump_metrics = template_dump_metrics, + .op_version = {GD_OP_VERSION_5_0}, + .dumpops = &template_dumpops, + .fops = &template_fops, + .cbks = &template_cbks, + .options = template_options, + .identifier = "template", +}; diff --git a/xlators/playground/template/src/template.h b/xlators/playground/template/src/template.h new file mode 100644 index 00000000000..c53dc1c7010 --- /dev/null +++ b/xlators/playground/template/src/template.h @@ -0,0 +1,43 @@ +/* + Copyright (c) 2013-2018 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 __TEMPLATE_H__ +#define __TEMPLATE_H__ + +#include <glusterfs/glusterfs.h> +#include <glusterfs/logging.h> +#include <glusterfs/dict.h> +#include <glusterfs/xlator.h> +#include <glusterfs/defaults.h> + +struct template_private { + /* Add all the relevant fields you need here */ + int32_t dummy; +}; + +typedef struct template_private template_private_t; + +/* Below section goes to template-mem-types.h */ +#include <glusterfs/mem-types.h> + +enum gf_template_mem_types_ { + gf_template_mt_private_t = gf_common_mt_end + 1, + gf_template_mt_end, +}; + +/* This normally goes to another file 'template-messages.h", + required for 'gf_msg()'. + NOTE: make sure you have added your component (in this case, + TEMPLATE) in `libglusterfs/src/glfs-message-id.h`. + */ +#include <glusterfs/glfs-message-id.h> + +GLFS_MSGID(TEMPLATE, TEMPLATE_MSG_NO_MEMORY, TEMPLATE_MSG_NO_GRAPH); + +#endif /* __TEMPLATE_H__ */ |
