summaryrefslogtreecommitdiffstats
path: root/xlators/playground/template/src
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/playground/template/src')
-rw-r--r--xlators/playground/template/src/Makefile.am5
-rw-r--r--xlators/playground/template/src/template.c182
-rw-r--r--xlators/playground/template/src/template.h36
3 files changed, 195 insertions, 28 deletions
diff --git a/xlators/playground/template/src/Makefile.am b/xlators/playground/template/src/Makefile.am
index ef88d4d48bb..e76a717a550 100644
--- a/xlators/playground/template/src/Makefile.am
+++ b/xlators/playground/template/src/Makefile.am
@@ -1,5 +1,5 @@
xlator_LTLIBRARIES = template.la
-xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/testing/features
+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/playground
template_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)
@@ -8,7 +8,8 @@ template_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la
noinst_HEADERS = template.h
-AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src
+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)
diff --git a/xlators/playground/template/src/template.c b/xlators/playground/template/src/template.c
index c4db42debd0..2f25d2363a6 100644
--- a/xlators/playground/template/src/template.c
+++ b/xlators/playground/template/src/template.c
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2006-2012 Red Hat, Inc. <http://www.redhat.com>
+ 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
@@ -8,37 +8,179 @@
cases as published by the Free Software Foundation.
*/
#include "template.h"
+#include <glusterfs/statedump.h>
-int32_t
-init (xlator_t *this)
+static int32_t
+template_mem_acct_init(xlator_t *this)
{
+ int ret = -1;
- if (!this->children || this->children->next) {
- gf_log (this->name, GF_LOG_ERROR,
- "not configured with exactly one child. exiting");
- return -1;
- }
+ GF_VALIDATE_OR_GOTO("template", this, out);
- if (!this->parents) {
- gf_log (this->name, GF_LOG_WARNING,
- "dangling volume. check volfile ");
- }
+ ret = xlator_mem_acct_init(this, gf_template_mt_end + 1);
- return 0;
+ 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);
}
-void
-fini (xlator_t *this)
+static int
+template_notify(xlator_t *this, int32_t event, void *data, ...)
{
- return;
+ switch (event) {
+ default:
+ default_notify(this, event, data);
+ gf_msg_debug(this->name, 0, "event %d received", event);
+ }
+
+ return 0;
}
-struct xlator_fops fops = {
+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 xlator_cbks cbks = {
+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}},
};
-struct volume_options options[] = {
- { .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
index 2e9752cac09..c53dc1c7010 100644
--- a/xlators/playground/template/src/template.h
+++ b/xlators/playground/template/src/template.h
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2013 Red Hat, Inc. <http://www.redhat.com>
+ 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
@@ -10,10 +10,34 @@
#ifndef __TEMPLATE_H__
#define __TEMPLATE_H__
-#include "glusterfs.h"
-#include "logging.h"
-#include "dict.h"
-#include "xlator.h"
-#include "defaults.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__ */