From a2112bd6fa2e4851cd982a691165f76f0c90d977 Mon Sep 17 00:00:00 2001 From: Amar Tumballi Date: Fri, 29 Jun 2018 23:40:53 +0530 Subject: xlators/playground: fix the template files with latest requirements * Make use of xlator_api * Make use of gf_msg() * Make use of mem-pool * Add a sample metrics dump function * Provide an dummy option, which can be initialized, and reconfigured * Add a test case to make sure template xlator is built and used with default fops * Make a change in rpc-coverage to run without lock tests. Updates: bz#1193929 Change-Id: I377dd67b656f440f9bc7c0098e21c0c1934e9096 Signed-off-by: Amar Tumballi --- glusterfs.spec.in | 4 +- libglusterfs/src/glfs-message-id.h | 1 + tests/basic/playground/template-xlator-sanity.t | 27 ++++ tests/basic/rpc-coverage.sh | 13 +- xlators/playground/template/src/Makefile.am | 2 +- xlators/playground/template/src/template.c | 169 ++++++++++++++++++++++-- xlators/playground/template/src/template.h | 29 +++- 7 files changed, 225 insertions(+), 20 deletions(-) create mode 100755 tests/basic/playground/template-xlator-sanity.t diff --git a/glusterfs.spec.in b/glusterfs.spec.in index 9d4d62fdf3..8acc387b6b 100644 --- a/glusterfs.spec.in +++ b/glusterfs.spec.in @@ -1187,8 +1187,8 @@ exit 0 %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/glupy.so %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/quiesce.so %dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/testing -%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/testing/features - %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/testing/features/template.so +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/playground + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/playground/template.so %dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/testing/performance %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/testing/performance/symlink-cache.so # Glupy Python files diff --git a/libglusterfs/src/glfs-message-id.h b/libglusterfs/src/glfs-message-id.h index f991ce142d..9702a18ffe 100644 --- a/libglusterfs/src/glfs-message-id.h +++ b/libglusterfs/src/glfs-message-id.h @@ -88,6 +88,7 @@ enum _msgid_comp { GLFS_MSGID_COMP(SDFS, 1), GLFS_MSGID_COMP(QUIESCE, 1), GLFS_MSGID_COMP(TA, 1), + GLFS_MSGID_COMP(TEMPLATE, 1), /* --- new segments for messages goes above this line --- */ diff --git a/tests/basic/playground/template-xlator-sanity.t b/tests/basic/playground/template-xlator-sanity.t new file mode 100755 index 0000000000..c3090dae5a --- /dev/null +++ b/tests/basic/playground/template-xlator-sanity.t @@ -0,0 +1,27 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +TEST mkdir -p $B0/single-brick +cat > $B0/template.vol < + Copyright (c) 2006-2018 Red Hat, Inc. This file is part of GlusterFS. This file is licensed to you under your choice of the GNU Lesser @@ -8,37 +8,180 @@ cases as published by the Free Software Foundation. */ #include "template.h" +#include "statedump.h" -int32_t -init (xlator_t *this) +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", "%lu", 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_log (this->name, GF_LOG_ERROR, + gf_msg (this->name, GF_LOG_ERROR, EINVAL, TEMPLATE_MSG_NO_GRAPH, "not configured with exactly one child. exiting"); - return -1; + goto out; } if (!this->parents) { - gf_log (this->name, GF_LOG_WARNING, + gf_msg (this->name, GF_LOG_ERROR, EINVAL, TEMPLATE_MSG_NO_GRAPH, "dangling volume. check volfile "); + goto out; } - return 0; + 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; + ret = 0; + +out: + return ret; } -void -fini (xlator_t *this) +static int +template_reconfigure (xlator_t *this, dict_t *options) { - return; + 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; } -struct xlator_fops fops = { +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_cbks cbks = { +struct xlator_dumpops template_dumpops = { + .priv = template_priv, + .priv_to_dict = template_priv_to_dict, }; -struct volume_options options[] = { +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_4_2_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_4_2_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 2e9752cac0..e384c0181f 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. + Copyright (c) 2013-2018 Red Hat, Inc. This file is part of GlusterFS. This file is licensed to you under your choice of the GNU Lesser @@ -16,4 +16,31 @@ #include "xlator.h" #include "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 "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 "glfs-message-id.h" + +GLFS_MSGID(TEMPLATE, + TEMPLATE_MSG_NO_MEMORY, + TEMPLATE_MSG_NO_GRAPH + ); + #endif /* __TEMPLATE_H__ */ -- cgit