diff options
-rw-r--r-- | glusterfs.spec.in | 4 | ||||
-rw-r--r-- | libglusterfs/src/glfs-message-id.h | 1 | ||||
-rwxr-xr-x | tests/basic/playground/template-xlator-sanity.t | 27 | ||||
-rwxr-xr-x | tests/basic/rpc-coverage.sh | 13 | ||||
-rw-r--r-- | xlators/playground/template/src/Makefile.am | 2 | ||||
-rw-r--r-- | xlators/playground/template/src/template.c | 169 | ||||
-rw-r--r-- | xlators/playground/template/src/template.h | 29 |
7 files changed, 225 insertions, 20 deletions
diff --git a/glusterfs.spec.in b/glusterfs.spec.in index 9d4d62fdf38..8acc387b6b4 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 f991ce142d4..9702a18ffe4 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 00000000000..c3090dae5a8 --- /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 <<EOF +volume posix + type storage/posix + option directory $B0/single-brick +end-volume + +volume template + type playground/template + subvolumes posix +end-volume +EOF + +TEST glusterfs -f $B0/template.vol $M0 + +TEST $(dirname $0)/../rpc-coverage.sh --no-locks $M0 + +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 + +cleanup; diff --git a/tests/basic/rpc-coverage.sh b/tests/basic/rpc-coverage.sh index 11d3be66dcb..b7aaef0bcb5 100755 --- a/tests/basic/rpc-coverage.sh +++ b/tests/basic/rpc-coverage.sh @@ -437,7 +437,9 @@ function run_tests() test_chmod; test_chown; test_utimes; - test_locks; + if $run_lock_tests; then + test_locks; + fi test_readdir; test_setxattr; test_listxattr; @@ -453,14 +455,19 @@ function _init() DIR=$(pwd); } - +run_lock_tests=1 function parse_cmdline() { if [ "x$1" == "x" ] ; then - echo "Usage: $0 /path/mount" + echo "Usage: $0 [--no-locks] /path/mount" exit 1 fi + if [ "$1" == "--no-locks" ] ; then + run_lock_tests=0 + shift + fi + DIR=$1; if [ ! -d "$DIR" ] ; then diff --git a/xlators/playground/template/src/Makefile.am b/xlators/playground/template/src/Makefile.am index 92cbe974093..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) diff --git a/xlators/playground/template/src/template.c b/xlators/playground/template/src/template.c index c4db42debd0..45d310a8c6e 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,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 2e9752cac09..e384c0181f7 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 @@ -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__ */ |