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 <amarts@redhat.com>
This commit is contained in:
Amar Tumballi 2018-06-29 23:40:53 +05:30
parent bfba1d3602
commit a2112bd6fa
7 changed files with 227 additions and 22 deletions

View File

@ -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

View File

@ -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 --- */

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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;
}
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;
}
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;
}
void
fini (xlator_t *this)
{
return;
}
struct xlator_fops fops = {
struct xlator_fops template_fops = {
};
struct xlator_cbks cbks = {
struct xlator_cbks template_cbks = {
};
struct volume_options options[] = {
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_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",
};

View File

@ -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__ */