diff options
author | Raghavendra G <raghavendra@zresearch.com> | 2009-07-09 00:25:28 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-07-16 00:37:44 -0700 |
commit | 1b4e68977c43b8d432d28d7301add35b01464ae5 (patch) | |
tree | 59de9beab3ead1a94a3090fe838d986c017b12a8 /xlators | |
parent | 3e3be6de2d954bcd134e8f377ea1af4cab682e04 (diff) |
Implementing quick-read translator.
lookup can fetch the entire file in xattr dictionary using the key
"glusterfs.content". We set the maximum size of the file that can
be fetched so in the xattr_req dictionary using the same key. If file-size
is less than or equal to the value set in dictionary, the content is stored
in the dictionary using same key in lookup_cbk.
For small files, we can do an optimization wherein we do not really send the
calls open, read and close to the storage translators. Instead there can be
an xlator which fakes open, read and close calls. For reads, it sends the data
it has cached during lookup and hence saving the time for open, read and close
calls to reach storage translators (this time can be significant if calls have
to go through network to reach storage translator).
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/performance/Makefile.am | 2 | ||||
-rw-r--r-- | xlators/performance/quick-read/Makefile.am | 3 | ||||
-rw-r--r-- | xlators/performance/quick-read/src/Makefile.am | 14 | ||||
-rw-r--r-- | xlators/performance/quick-read/src/quick-read.c | 116 | ||||
-rw-r--r-- | xlators/performance/quick-read/src/quick-read.h | 50 |
5 files changed, 184 insertions, 1 deletions
diff --git a/xlators/performance/Makefile.am b/xlators/performance/Makefile.am index f7504bbe8f3..6b5facca51e 100644 --- a/xlators/performance/Makefile.am +++ b/xlators/performance/Makefile.am @@ -1,3 +1,3 @@ -SUBDIRS = write-behind read-ahead io-threads io-cache symlink-cache +SUBDIRS = write-behind read-ahead io-threads io-cache symlink-cache quick-read CLEANFILES = diff --git a/xlators/performance/quick-read/Makefile.am b/xlators/performance/quick-read/Makefile.am new file mode 100644 index 00000000000..d471a3f9243 --- /dev/null +++ b/xlators/performance/quick-read/Makefile.am @@ -0,0 +1,3 @@ +SUBDIRS = src + +CLEANFILES = diff --git a/xlators/performance/quick-read/src/Makefile.am b/xlators/performance/quick-read/src/Makefile.am new file mode 100644 index 00000000000..644f27e3f74 --- /dev/null +++ b/xlators/performance/quick-read/src/Makefile.am @@ -0,0 +1,14 @@ +xlator_LTLIBRARIES = quick-read.la +xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/performance + +quick_read_la_LDFLAGS = -module -avoidversion + +quick_read_la_SOURCES = quick-read.c +quick_read_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la + +noinst_HEADERS = quick-read.h + +AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\ + -I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS) + +CLEANFILES = diff --git a/xlators/performance/quick-read/src/quick-read.c b/xlators/performance/quick-read/src/quick-read.c new file mode 100644 index 00000000000..4e85e6f377f --- /dev/null +++ b/xlators/performance/quick-read/src/quick-read.c @@ -0,0 +1,116 @@ +/* + Copyright (c) 2009-2010 Z RESEARCH, Inc. <http://www.zresearch.com> + This file is part of GlusterFS. + + GlusterFS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3 of the License, + or (at your option) any later version. + + GlusterFS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see + <http://www.gnu.org/licenses/>. +*/ + +#include "quick-read.h" + + +int32_t +init (xlator_t *this) +{ + char *str = NULL; + int32_t ret = -1; + qr_conf_t *conf = NULL; + + if (!this->children || this->children->next) { + gf_log (this->name, GF_LOG_ERROR, + "FATAL: volume (%s) not configured with exactly one " + "child", this->name); + return -1; + } + + if (!this->parents) { + gf_log (this->name, GF_LOG_WARNING, + "dangling volume. check volfile "); + } + + conf = CALLOC (1, sizeof (*conf)); + if (conf == NULL) { + gf_log (this->name, GF_LOG_ERROR, + "out of memory"); + ret = -1; + goto out; + } + + ret = dict_get_str (this->options, "max-file-size", + &str); + if (ret == 0) { + ret = gf_string2bytesize (str, &conf->max_file_size); + if (ret != 0) { + gf_log (this->name, GF_LOG_ERROR, + "invalid number format \"%s\" of \"option " + "max-file-size\"", + str); + ret = -1; + goto out; + } + } + + conf->cache_timeout = -1; + ret = dict_get_str (this->options, "cache-timeout", &str); + if (ret == 0) { + ret = gf_string2uint_base10 (str, + (unsigned int *)&conf->cache_timeout); + if (ret != 0) { + gf_log (this->name, GF_LOG_ERROR, + "invalid cache-timeout value %s", str); + ret = -1; + goto out; + } + } + + this->private = conf; +out: + if ((ret == -1) && conf) { + FREE (conf); + } + + return ret; +} + + +void +fini (xlator_t *this) +{ + return; +} + + +struct xlator_fops fops = { +}; + + +struct xlator_mops mops = { +}; + + +struct xlator_cbks cbks = { +}; + +struct volume_options options[] = { + { .key = {"cache-timeout"}, + .type = GF_OPTION_TYPE_INT, + .min = 1, + .max = 60 + }, + { .key = {"max-file-size"}, + .type = GF_OPTION_TYPE_SIZET, + .min = 0, + .max = 1 * GF_UNIT_MB + }, +}; diff --git a/xlators/performance/quick-read/src/quick-read.h b/xlators/performance/quick-read/src/quick-read.h new file mode 100644 index 00000000000..d3f4ecf0ca2 --- /dev/null +++ b/xlators/performance/quick-read/src/quick-read.h @@ -0,0 +1,50 @@ +/* + Copyright (c) 2009-2010 Z RESEARCH, Inc. <http://www.zresearch.com> + This file is part of GlusterFS. + + GlusterFS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3 of the License, + or (at your option) any later version. + + GlusterFS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see + <http://www.gnu.org/licenses/>. +*/ + +#ifndef __QUICK_READ_H +#define __QUICK_READ_H + +#ifndef _CONFIG_H +#define _CONFIG_H +#include "config.h" +#endif + +#include "glusterfs.h" +#include "logging.h" +#include "dict.h" +#include "xlator.h" +#include "list.h" +#include "compat.h" +#include "compat-errno.h" +#include "common-utils.h" +#include "call-stub.h" +#include "defaults.h" +#include <libgen.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +struct qr_conf { + uint64_t max_file_size; + int32_t cache_timeout; +}; +typedef struct qr_conf qr_conf_t; + +#endif /* #ifndef __QUICK_READ_H */ |