diff --git a/0001-Do-not-use-pickle-for-serialization-in-memcache-but-.patch b/0001-Do-not-use-pickle-for-serialization-in-memcache-but-.patch deleted file mode 100644 index 6179ced..0000000 --- a/0001-Do-not-use-pickle-for-serialization-in-memcache-but-.patch +++ /dev/null @@ -1,351 +0,0 @@ -From c0619bd0c5eeb3d2f8af8b37575e11847664272c Mon Sep 17 00:00:00 2001 -From: Vincent Untz -Date: Thu, 21 Jun 2012 14:37:41 +0200 -Subject: [PATCH] Do not use pickle for serialization in memcache, but JSON - -We don't want to use pickle as it can execute arbitrary code. JSON is -safer. However, note that it supports serialization for only some -specific subset of object types; this should be enough for what we need, -though. - -To avoid issues on upgrades (unability to read pickled values, and cache -poisoning for old servers not understanding JSON), we add a -memcache_serialization_support configuration option, with the following -values: - - 0 = older, insecure pickle serialization (compatible, default in this release) - 1 = json serialization but pickles can still be read (still insecure) - 2 = json serialization only (secure, suggested, and the future default) - -To avoid an instant full cache flush, existing installations should -upgrade with 0, then set to 1 and reload, then after some time (24 -hours) set to 2 and reload. Support for 0 and 1 will be removed in -future versions. - -Part of bug 1006414. - -Patch Set 2: Added Vincent Untz to AUTHORS - -Change-Id: Id7d6d547b103b4f23ebf5be98b88f09ec6027ce4 ---- - doc/manpages/proxy-server.conf.5 | 15 ++++++++ - etc/memcache.conf-sample | 10 +++++ - etc/proxy-server.conf-sample | 12 ++++++ - swift/common/memcached.py | 48 +++++++++++++++++++++----- - swift/common/middleware/memcache.py | 30 ++++++++++++---- - test/unit/common/middleware/test_memcache.py | 5 ++- - test/unit/common/test_memcached.py | 22 ++++++++++++ - 7 files changed, 125 insertions(+), 17 deletions(-) - -diff --git a/doc/manpages/proxy-server.conf.5 b/doc/manpages/proxy-server.conf.5 -index 4979e4d..5cf5a7e 100644 ---- a/doc/manpages/proxy-server.conf.5 -+++ b/doc/manpages/proxy-server.conf.5 -@@ -205,6 +205,21 @@ Enables the ability to log request headers. The default is False. - .IP \fBmemcache_servers\fR - The memcache servers that are available. This can be a list separated by commas. The default - is 127.0.0.1:11211. -+.IP \fBmemcache_serialization_support\fR -+This sets how memcache values are serialized and deserialized: -+.RE -+ -+.PD 0 -+.RS 10 -+.IP "0 = older, insecure pickle serialization (default)" -+.IP "1 = json serialization but pickles can still be read (still insecure)" -+.IP "2 = json serialization only (secure)" -+.RE -+ -+.RS 10 -+To avoid an instant full cache flush, existing installations should upgrade with 0, then set to 1 and reload, then after some time (24 hours) set to 2 and reload. In the future, the ability to use pickle serialization will be removed. -+ -+If not set in the configuration file, the value for memcache_serialization_support will be read from /etc/swift/memcache.conf if it exists (see memcache.conf-sample). Otherwise, the default value as indicated above will be used. - .RE - - -diff --git a/etc/memcache.conf-sample b/etc/memcache.conf-sample -index 580d94a..cedfc19 100644 ---- a/etc/memcache.conf-sample -+++ b/etc/memcache.conf-sample -@@ -3,3 +3,13 @@ - # several other conf files under [filter:cache] for example. You can specify - # multiple servers separated with commas, as in: 10.1.2.3:11211,10.1.2.4:11211 - # memcache_servers = 127.0.0.1:11211 -+# -+# Sets how memcache values are serialized and deserialized: -+# 0 = older, insecure pickle serialization (compatible, default in this release) -+# 1 = json serialization but pickles can still be read (still insecure) -+# 2 = json serialization only (secure, suggested, and the future default) -+# To avoid an instant full cache flush, existing installations should -+# upgrade with 0, then set to 1 and reload, then after some time (24 hours) -+# set to 2 and reload. -+# In the future, the ability to use pickle serialization will be removed. -+# memcache_serialization_support = 0 -diff --git a/etc/proxy-server.conf-sample b/etc/proxy-server.conf-sample -index 148616b..18f711a 100644 ---- a/etc/proxy-server.conf-sample -+++ b/etc/proxy-server.conf-sample -@@ -122,6 +122,18 @@ use = egg:swift#memcache - # default to the value below. You can specify multiple servers separated with - # commas, as in: 10.1.2.3:11211,10.1.2.4:11211 - # memcache_servers = 127.0.0.1:11211 -+# -+# Sets how memcache values are serialized and deserialized: -+# 0 = older, insecure pickle serialization (compatible, default in this release) -+# 1 = json serialization but pickles can still be read (still insecure) -+# 2 = json serialization only (secure, suggested, and the future default) -+# If not set here, the value for memcache_serialization_support will be read -+# from /etc/swift/memcache.conf (see memcache.conf-sample). -+# To avoid an instant full cache flush, existing installations should -+# upgrade with 0, then set to 1 and reload, then after some time (24 hours) -+# set to 2 and reload. -+# In the future, the ability to use pickle serialization will be removed. -+# memcache_serialization_support = 0 - - [filter:ratelimit] - use = egg:swift#ratelimit -diff --git a/swift/common/memcached.py b/swift/common/memcached.py -index ecd9332..82ebb7a 100644 ---- a/swift/common/memcached.py -+++ b/swift/common/memcached.py -@@ -27,11 +27,17 @@ import time - from bisect import bisect - from hashlib import md5 - -+try: -+ import simplejson as json -+except ImportError: -+ import json -+ - DEFAULT_MEMCACHED_PORT = 11211 - - CONN_TIMEOUT = 0.3 - IO_TIMEOUT = 2.0 - PICKLE_FLAG = 1 -+JSON_FLAG = 2 - NODE_WEIGHT = 50 - PICKLE_PROTOCOL = 2 - TRY_COUNT = 3 -@@ -57,7 +63,8 @@ class MemcacheRing(object): - """ - - def __init__(self, servers, connect_timeout=CONN_TIMEOUT, -- io_timeout=IO_TIMEOUT, tries=TRY_COUNT): -+ io_timeout=IO_TIMEOUT, tries=TRY_COUNT, -+ allow_pickle=False, allow_unpickle=False): - self._ring = {} - self._errors = dict(((serv, []) for serv in servers)) - self._error_limited = dict(((serv, 0) for serv in servers)) -@@ -69,6 +76,8 @@ class MemcacheRing(object): - self._client_cache = dict(((server, []) for server in servers)) - self._connect_timeout = connect_timeout - self._io_timeout = io_timeout -+ self._allow_pickle = allow_pickle -+ self._allow_unpickle = allow_unpickle or allow_pickle - - def _exception_occurred(self, server, e, action='talking'): - if isinstance(e, socket.timeout): -@@ -130,16 +139,21 @@ class MemcacheRing(object): - - :param key: key - :param value: value -- :param serialize: if True, value is pickled before sending to memcache -+ :param serialize: if True, value is serialized with JSON before sending -+ to memcache, or with pickle if configured to use -+ pickle instead of JSON (to avoid cache poisoning) - :param timeout: ttl in memcache - """ - key = md5hash(key) - if timeout > 0: - timeout += time.time() - flags = 0 -- if serialize: -+ if serialize and self._allow_pickle: - value = pickle.dumps(value, PICKLE_PROTOCOL) - flags |= PICKLE_FLAG -+ elif serialize: -+ value = json.dumps(value) -+ flags |= JSON_FLAG - for (server, fp, sock) in self._get_conns(key): - try: - sock.sendall('set %s %d %d %s noreply\r\n%s\r\n' % \ -@@ -151,8 +165,9 @@ class MemcacheRing(object): - - def get(self, key): - """ -- Gets the object specified by key. It will also unpickle the object -- before returning if it is pickled in memcache. -+ Gets the object specified by key. It will also unserialize the object -+ before returning if it is serialized in memcache with JSON, or if it -+ is pickled and unpickling is allowed. - - :param key: key - :returns: value of the key in memcache -@@ -168,7 +183,12 @@ class MemcacheRing(object): - size = int(line[3]) - value = fp.read(size) - if int(line[2]) & PICKLE_FLAG: -- value = pickle.loads(value) -+ if self._allow_unpickle: -+ value = pickle.loads(value) -+ else: -+ value = None -+ elif int(line[2]) & JSON_FLAG: -+ value = json.loads(value) - fp.readline() - line = fp.readline().strip().split() - self._return_conn(server, fp, sock) -@@ -258,7 +278,9 @@ class MemcacheRing(object): - :param mapping: dictonary of keys and values to be set in memcache - :param servery_key: key to use in determining which server in the ring - is used -- :param serialize: if True, value is pickled before sending to memcache -+ :param serialize: if True, value is serialized with JSON before sending -+ to memcache, or with pickle if configured to use -+ pickle instead of JSON (to avoid cache poisoning) - :param timeout: ttl for memcache - """ - server_key = md5hash(server_key) -@@ -268,9 +290,12 @@ class MemcacheRing(object): - for key, value in mapping.iteritems(): - key = md5hash(key) - flags = 0 -- if serialize: -+ if serialize and self._allow_pickle: - value = pickle.dumps(value, PICKLE_PROTOCOL) - flags |= PICKLE_FLAG -+ elif serialize: -+ value = json.dumps(value) -+ flags |= JSON_FLAG - msg += ('set %s %d %d %s noreply\r\n%s\r\n' % - (key, flags, timeout, len(value), value)) - for (server, fp, sock) in self._get_conns(server_key): -@@ -302,7 +327,12 @@ class MemcacheRing(object): - size = int(line[3]) - value = fp.read(size) - if int(line[2]) & PICKLE_FLAG: -- value = pickle.loads(value) -+ if self._allow_unpickle: -+ value = pickle.loads(value) -+ else: -+ value = None -+ elif int(line[2]) & JSON_FLAG: -+ value = json.loads(value) - responses[line[1]] = value - fp.readline() - line = fp.readline().strip().split() -diff --git a/swift/common/middleware/memcache.py b/swift/common/middleware/memcache.py -index eb988bd..20121c9 100644 ---- a/swift/common/middleware/memcache.py -+++ b/swift/common/middleware/memcache.py -@@ -27,20 +27,36 @@ class MemcacheMiddleware(object): - def __init__(self, app, conf): - self.app = app - self.memcache_servers = conf.get('memcache_servers') -- if not self.memcache_servers: -+ serialization_format = conf.get('memcache_serialization_support') -+ -+ if not self.memcache_servers or serialization_format is None: - path = os.path.join(conf.get('swift_dir', '/etc/swift'), - 'memcache.conf') - memcache_conf = ConfigParser() - if memcache_conf.read(path): -- try: -- self.memcache_servers = \ -- memcache_conf.get('memcache', 'memcache_servers') -- except (NoSectionError, NoOptionError): -- pass -+ if not self.memcache_servers: -+ try: -+ self.memcache_servers = \ -+ memcache_conf.get('memcache', 'memcache_servers') -+ except (NoSectionError, NoOptionError): -+ pass -+ if serialization_format is None: -+ try: -+ serialization_format = \ -+ memcache_conf.get('memcache', -+ 'memcache_serialization_support') -+ except (NoSectionError, NoOptionError): -+ pass -+ - if not self.memcache_servers: - self.memcache_servers = '127.0.0.1:11211' -+ if serialization_format is None: -+ serialization_format = 0 -+ - self.memcache = MemcacheRing( -- [s.strip() for s in self.memcache_servers.split(',') if s.strip()]) -+ [s.strip() for s in self.memcache_servers.split(',') if s.strip()], -+ allow_pickle=(serialization_format == 0), -+ allow_unpickle=(serialization_format <= 1)) - - def __call__(self, env, start_response): - env['swift.cache'] = self.memcache -diff --git a/test/unit/common/middleware/test_memcache.py b/test/unit/common/middleware/test_memcache.py -index 6b94bd1..e217a96 100644 ---- a/test/unit/common/middleware/test_memcache.py -+++ b/test/unit/common/middleware/test_memcache.py -@@ -47,6 +47,8 @@ class SetConfigParser(object): - if section == 'memcache': - if option == 'memcache_servers': - return '1.2.3.4:5' -+ elif option == 'memcache_serialization_support': -+ return '2' - else: - raise NoOptionError(option) - else: -@@ -86,7 +88,8 @@ class TestCacheMiddleware(unittest.TestCase): - exc = None - try: - app = memcache.MemcacheMiddleware( -- FakeApp(), {'memcache_servers': '1.2.3.4:5'}) -+ FakeApp(), {'memcache_servers': '1.2.3.4:5', -+ 'memcache_serialization_support': '2'}) - except Exception, err: - exc = err - finally: -diff --git a/test/unit/common/test_memcached.py b/test/unit/common/test_memcached.py -index dff6e80..3016d10 100644 ---- a/test/unit/common/test_memcached.py -+++ b/test/unit/common/test_memcached.py -@@ -1,3 +1,4 @@ -+ # -*- coding: utf8 -*- - # Copyright (c) 2010-2012 OpenStack, LLC. - # - # Licensed under the Apache License, Version 2.0 (the "License"); -@@ -166,6 +167,9 @@ class TestMemcached(unittest.TestCase): - self.assertEquals(memcache_client.get('some_key'), [1, 2, 3]) - memcache_client.set('some_key', [4, 5, 6]) - self.assertEquals(memcache_client.get('some_key'), [4, 5, 6]) -+ memcache_client.set('some_key', ['simple str', 'utf8 str éà']) -+ # As per http://wiki.openstack.org/encoding, we should expect to have unicode -+ self.assertEquals(memcache_client.get('some_key'), ['simple str', u'utf8 str éà']) - self.assert_(float(mock.cache.values()[0][1]) == 0) - esttimeout = time.time() + 10 - memcache_client.set('some_key', [1, 2, 3], timeout=10) -@@ -244,6 +248,24 @@ class TestMemcached(unittest.TestCase): - self.assertEquals(memcache_client.get_multi(('some_key2', 'some_key1', - 'not_exists'), 'multi_key'), [[4, 5, 6], [1, 2, 3], None]) - -+ def test_serialization(self): -+ memcache_client = memcached.MemcacheRing(['1.2.3.4:11211'], -+ allow_pickle=True) -+ mock = MockMemcached() -+ memcache_client._client_cache['1.2.3.4:11211'] = [(mock, mock)] * 2 -+ memcache_client.set('some_key', [1, 2, 3]) -+ self.assertEquals(memcache_client.get('some_key'), [1, 2, 3]) -+ memcache_client._allow_pickle = False -+ memcache_client._allow_unpickle = True -+ self.assertEquals(memcache_client.get('some_key'), [1, 2, 3]) -+ memcache_client._allow_unpickle = False -+ self.assertEquals(memcache_client.get('some_key'), None) -+ memcache_client.set('some_key', [1, 2, 3]) -+ self.assertEquals(memcache_client.get('some_key'), [1, 2, 3]) -+ memcache_client._allow_unpickle = True -+ self.assertEquals(memcache_client.get('some_key'), [1, 2, 3]) -+ memcache_client._allow_pickle = True -+ self.assertEquals(memcache_client.get('some_key'), [1, 2, 3]) - - if __name__ == '__main__': - unittest.main() diff --git a/0001-Use-updated-parallel-install-versions-of-epel-packag.patch b/0001-Use-updated-parallel-install-versions-of-epel-packag.patch deleted file mode 100644 index 309b08b..0000000 --- a/0001-Use-updated-parallel-install-versions-of-epel-packag.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 43e8681d5cbd6c919e379fe25cccc189827e2d60 Mon Sep 17 00:00:00 2001 -From: Alan Pevec -Date: Wed, 4 Jan 2012 00:15:05 +0100 -Subject: [PATCH] Use updated parallel install versions of epel package -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Use WebOb >= 1.0 -and depend on the EPEL parallel installable versions of the package -to satisfy those requirements. -Based on Nova/Glance EPEL patch by Pádraig Brady ---- - swift/__init__.py | 29 +++++++++++++++++++++++++++++ - 1 file changed, 29 insertions(+) - -diff --git a/swift/__init__.py b/swift/__init__.py -index 9065801..9600d1e 100644 ---- a/swift/__init__.py -+++ b/swift/__init__.py -@@ -1,3 +1,32 @@ -+import sys -+import pkg_resources -+ -+# If there is a conflicting non egg module, -+# i.e. an older standard system module installed, -+# then replace it with this requirement -+def replace_dist(requirement): -+ try: -+ return pkg_resources.require(requirement) -+ except pkg_resources.VersionConflict: -+ e = sys.exc_info()[1] -+ dist=e.args[0] -+ req=e.args[1] -+ if dist.key == req.key and not dist.location.endswith('.egg'): -+ del pkg_resources.working_set.by_key[dist.key] -+ # We assume there is no need to adjust sys.path -+ # and the associated pkg_resources.working_set.entries -+ return pkg_resources.require(requirement) -+ -+replace_dist("WebOb >= 1.0") -+ -+replace_dist("PasteDeploy >= 1.5.0") -+# This hack is needed because replace_dist() results in -+# the standard paste module path being at the start of __path__. -+# TODO: See can we get pkg_resources to do the right thing directly -+import paste -+paste.__path__.insert(0, paste.__path__.pop(-1)) -+ -+ - import gettext - - diff --git a/0001-configure.ac.patch b/0001-configure.ac.patch new file mode 100644 index 0000000..67b2e73 --- /dev/null +++ b/0001-configure.ac.patch @@ -0,0 +1,11 @@ +--- glusterfs-11.0/configure.ac.orig 2023-02-07 08:27:06.663310072 -0500 ++++ glusterfs-11.0/configure.ac 2023-02-07 08:27:56.012452316 -0500 +@@ -1319,7 +1319,7 @@ + fi + + GF_HOST_OS="" +-GF_LDFLAGS="${GF_LDFLAGS} -rdynamic" ++GF_LDFLAGS="${GF_LDFLAGS} -rdynamic -fuse-ld=mold" + + dnl see --with-libtirpc option check above, libtirpc(-devel) is required for + dnl ipv6-default diff --git a/0002-Add-fixes-for-building-the-doc-package.patch b/0002-Add-fixes-for-building-the-doc-package.patch deleted file mode 100644 index f8a173d..0000000 --- a/0002-Add-fixes-for-building-the-doc-package.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 7df10fb14d27e35faa590770594ea1b05552576f Mon Sep 17 00:00:00 2001 -From: Alan Pevec -Date: Thu, 5 Jan 2012 00:03:00 +0100 -Subject: [PATCH] Add fixes for building the doc package -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Don't access the net and always reference -the swift module from the package we're building -Based on Nova/Glance EPEL patch by Pádraig Brady ---- - doc/source/conf.py | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/doc/source/conf.py b/doc/source/conf.py -index e6a43b0..3734cd4 100644 ---- a/doc/source/conf.py -+++ b/doc/source/conf.py -@@ -33,14 +33,14 @@ import os - # If extensions (or modules to document with autodoc) are in another directory, - # add these directories to sys.path here. If the directory is relative to the - # documentation root, use os.path.abspath to make it absolute, like shown here. --sys.path.append([os.path.abspath('../swift'), os.path.abspath('..'), -- os.path.abspath('../bin')]) -+sys.path.extend([os.path.abspath('../../swift'), os.path.abspath('../..'), -+ os.path.abspath('../../bin')]) - - # -- General configuration ---------------------------------------------------- - - # Add any Sphinx extension module names here, as strings. They can be - # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. --extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', -+extensions = ['sphinx.ext.autodoc', - 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.pngmath', - 'sphinx.ext.ifconfig'] - todo_include_todos = True diff --git a/0002-Add-fixes-for-building-the-doc-package.patch.180 b/0002-Add-fixes-for-building-the-doc-package.patch.180 deleted file mode 100644 index a3c1856..0000000 --- a/0002-Add-fixes-for-building-the-doc-package.patch.180 +++ /dev/null @@ -1,37 +0,0 @@ -From 7df10fb14d27e35faa590770594ea1b05552576f Mon Sep 17 00:00:00 2001 -From: Alan Pevec -Date: Thu, 5 Jan 2012 00:03:00 +0100 -Subject: [PATCH] Add fixes for building the doc package -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Don't access the net and always reference -the swift module from the package we're building -Based on Nova/Glance EPEL patch by Pádraig Brady ---- - doc/source/conf.py | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/doc/source/conf.py b/doc/source/conf.py -index e6a43b0..3734cd4 100644 ---- a/doc/source/conf.py -+++ b/doc/source/conf.py -@@ -20,14 +20,14 @@ import os - # If extensions (or modules to document with autodoc) are in another directory, - # add these directories to sys.path here. If the directory is relative to the - # documentation root, use os.path.abspath to make it absolute, like shown here. --sys.path.extend([os.path.abspath('../swift'), os.path.abspath('..'), -- os.path.abspath('../bin')]) -+sys.path.extend([os.path.abspath('../../swift'), os.path.abspath('../..'), -+ os.path.abspath('../../bin')]) - - # -- General configuration ---------------------------------------------------- - - # Add any Sphinx extension module names here, as strings. They can be - # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. --extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', -+extensions = ['sphinx.ext.autodoc', - 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.pngmath', - 'sphinx.ext.ifconfig'] - todo_include_todos = True diff --git a/0002-Fix-bug-where-serialization_format-is-ignored.patch b/0002-Fix-bug-where-serialization_format-is-ignored.patch deleted file mode 100644 index 4f7e4b4..0000000 --- a/0002-Fix-bug-where-serialization_format-is-ignored.patch +++ /dev/null @@ -1,70 +0,0 @@ -From c38568f026853f64f2669f03bd56441b007f13be Mon Sep 17 00:00:00 2001 -From: gholt -Date: Tue, 18 Sep 2012 18:24:47 +0000 -Subject: [PATCH] Fix bug where serialization_format is ignored - -Change-Id: I5a5ac8b5f18e077105ab12e9b1f0ccafac3983f7 ---- - swift/common/middleware/memcache.py | 2 ++ - test/unit/common/middleware/test_memcache.py | 12 ++++++++++-- - 2 files changed, 12 insertions(+), 2 deletions(-) - -diff --git a/swift/common/middleware/memcache.py b/swift/common/middleware/memcache.py -index 20121c9..06678c4 100644 ---- a/swift/common/middleware/memcache.py -+++ b/swift/common/middleware/memcache.py -@@ -52,6 +52,8 @@ class MemcacheMiddleware(object): - self.memcache_servers = '127.0.0.1:11211' - if serialization_format is None: - serialization_format = 0 -+ else: -+ serialization_format = int(serialization_format) - - self.memcache = MemcacheRing( - [s.strip() for s in self.memcache_servers.split(',') if s.strip()], -diff --git a/test/unit/common/middleware/test_memcache.py b/test/unit/common/middleware/test_memcache.py -index e217a96..28c7b13 100644 ---- a/test/unit/common/middleware/test_memcache.py -+++ b/test/unit/common/middleware/test_memcache.py -@@ -48,7 +48,7 @@ class SetConfigParser(object): - if option == 'memcache_servers': - return '1.2.3.4:5' - elif option == 'memcache_serialization_support': -- return '2' -+ return '1' - else: - raise NoOptionError(option) - else: -@@ -104,6 +104,8 @@ class TestCacheMiddleware(unittest.TestCase): - finally: - memcache.ConfigParser = orig_parser - self.assertEquals(app.memcache_servers, '127.0.0.1:11211') -+ self.assertEquals(app.memcache._allow_pickle, True) -+ self.assertEquals(app.memcache._allow_unpickle, True) - - def test_conf_from_extra_conf(self): - orig_parser = memcache.ConfigParser -@@ -113,16 +115,22 @@ class TestCacheMiddleware(unittest.TestCase): - finally: - memcache.ConfigParser = orig_parser - self.assertEquals(app.memcache_servers, '1.2.3.4:5') -+ self.assertEquals(app.memcache._allow_pickle, False) -+ self.assertEquals(app.memcache._allow_unpickle, True) - - def test_conf_from_inline_conf(self): - orig_parser = memcache.ConfigParser - memcache.ConfigParser = SetConfigParser - try: - app = memcache.MemcacheMiddleware( -- FakeApp(), {'memcache_servers': '6.7.8.9:10'}) -+ FakeApp(), -+ {'memcache_servers': '6.7.8.9:10', -+ 'serialization_format': '0'}) - finally: - memcache.ConfigParser = orig_parser - self.assertEquals(app.memcache_servers, '6.7.8.9:10') -+ self.assertEquals(app.memcache._allow_pickle, False) -+ self.assertEquals(app.memcache._allow_unpickle, True) - - - if __name__ == '__main__': diff --git a/0002-contrib-aclocal-python.m4.patch b/0002-contrib-aclocal-python.m4.patch new file mode 100644 index 0000000..0772c87 --- /dev/null +++ b/0002-contrib-aclocal-python.m4.patch @@ -0,0 +1,212 @@ +--- glusterfs-11.0/contrib/aclocal/python.m4.orig 2023-06-16 11:18:03.550994174 -0400 ++++ glusterfs-11.0/contrib/aclocal/python.m4 2023-06-16 11:18:47.875238947 -0400 +@@ -1,209 +1 @@ +-## ------------------------ -*- Autoconf -*- +-## Python file handling +-## From Andrew Dalke +-## Updated by James Henstridge + ## ------------------------ +-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009 +-# Free Software Foundation, Inc. +-# +-# This file is free software; the Free Software Foundation +-# gives unlimited permission to copy and/or distribute it, +-# with or without modifications, as long as this notice is preserved. +- +-# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +-# --------------------------------------------------------------------------- +-# Adds support for distributing Python modules and packages. To +-# install modules, copy them to $(pythondir), using the python_PYTHON +-# automake variable. To install a package with the same name as the +-# automake package, install to $(pkgpythondir), or use the +-# pkgpython_PYTHON automake variable. +-# +-# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as +-# locations to install python extension modules (shared libraries). +-# Another macro is required to find the appropriate flags to compile +-# extension modules. +-# +-# If your package is configured with a different prefix to python, +-# users will have to add the install directory to the PYTHONPATH +-# environment variable, or create a .pth file (see the python +-# documentation for details). +-# +-# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will +-# cause an error if the version of python installed on the system +-# doesn't meet the requirement. MINIMUM-VERSION should consist of +-# numbers and dots only. +-AC_DEFUN([AM_PATH_PYTHON], +- [ +- dnl Find a Python interpreter. Python versions prior to 2.0 are not +- dnl supported. (2.0 was released on October 16, 2000). +- m4_define_default([_AM_PYTHON_INTERPRETER_LIST], +- [python python2 python3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 dnl +-python2.1 python2.0]) +- +- m4_if([$1],[],[ +- dnl No version check is needed. +- # Find any Python interpreter. +- if test -z "$PYTHON"; then +- AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) +- fi +- am_display_PYTHON=python +- ], [ +- dnl A version check is needed. +- if test -n "$PYTHON"; then +- # If the user set $PYTHON, use it and don't search something else. +- AC_MSG_CHECKING([whether $PYTHON version >= $1]) +- AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], +- [AC_MSG_RESULT(yes)], +- [AC_MSG_ERROR(too old)]) +- am_display_PYTHON=$PYTHON +- else +- # Otherwise, try each interpreter until we find one that satisfies +- # VERSION. +- AC_CACHE_CHECK([for a Python interpreter with version >= $1], +- [am_cv_pathless_PYTHON],[ +- for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do +- test "$am_cv_pathless_PYTHON" = none && break +- AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) +- done]) +- # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. +- if test "$am_cv_pathless_PYTHON" = none; then +- PYTHON=: +- else +- AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) +- fi +- am_display_PYTHON=$am_cv_pathless_PYTHON +- fi +- ]) +- +- if test "$PYTHON" = :; then +- dnl Run any user-specified action, or abort. +- m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) +- else +- +- dnl Query Python for its version number. Getting [:3] seems to be +- dnl the best way to do this; it's what "site.py" does in the standard +- dnl library. +- +- AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], +- [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) +- AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) +- +- dnl Use the values of $prefix and $exec_prefix for the corresponding +- dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made +- dnl distinct variables so they can be overridden if need be. However, +- dnl general consensus is that you shouldn't need this ability. +- +- AC_SUBST([PYTHON_PREFIX], ['${prefix}']) +- AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) +- +- dnl At times (like when building shared libraries) you may want +- dnl to know which OS platform Python thinks this is. +- +- AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], +- [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) +- AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) +- +- +- dnl Set up 4 directories: +- +- dnl pythondir -- where to install python scripts. This is the +- dnl site-packages directory, not the python standard library +- dnl directory like in previous automake betas. This behavior +- dnl is more consistent with lispdir.m4 for example. +- dnl Query distutils for this directory. distutils does not exist in +- dnl Python 1.5, so we fall back to the hardcoded directory if it +- dnl doesn't work. +- AC_CACHE_CHECK([for $am_display_PYTHON script directory], +- [am_cv_python_pythondir], +- [if test "x$prefix" = xNONE +- then +- am_py_prefix=$ac_default_prefix +- else +- am_py_prefix=$prefix +- fi +- am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null || +- echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"` +- case $am_cv_python_pythondir in +- $am_py_prefix*) +- am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` +- am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` +- ;; +- *) +- case $am_py_prefix in +- /usr|/System*) ;; +- *) +- am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages +- ;; +- esac +- ;; +- esac +- ]) +- AC_SUBST([pythondir], [$am_cv_python_pythondir]) +- +- dnl pkgpythondir -- $PACKAGE directory under pythondir. Was +- dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is +- dnl more consistent with the rest of automake. +- +- AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) +- +- dnl pyexecdir -- directory for installing python extension modules +- dnl (shared libraries) +- dnl Query distutils for this directory. distutils does not exist in +- dnl Python 1.5, so we fall back to the hardcoded directory if it +- dnl doesn't work. +- AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], +- [am_cv_python_pyexecdir], +- [if test "x$exec_prefix" = xNONE +- then +- am_py_exec_prefix=$am_py_prefix +- else +- am_py_exec_prefix=$exec_prefix +- fi +- am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null || +- echo "$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages"` +- case $am_cv_python_pyexecdir in +- $am_py_exec_prefix*) +- am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` +- am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` +- ;; +- *) +- case $am_py_exec_prefix in +- /usr|/System*) ;; +- *) +- am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages +- ;; +- esac +- ;; +- esac +- ]) +- AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) +- +- dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) +- +- AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) +- +- dnl Run any user-specified action. +- $2 +- fi +- +-]) +- +- +-# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +-# --------------------------------------------------------------------------- +-# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. +-# Run ACTION-IF-FALSE otherwise. +-# This test uses sys.hexversion instead of the string equivalent (first +-# word of sys.version), in order to cope with versions such as 2.2c1. +-# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). +-AC_DEFUN([AM_PYTHON_CHECK_VERSION], +- [prog="import sys +-# split strings by '.' and convert to numeric. Append some zeros +-# because we need at least 4 digits for the hex conversion. +-# map returns an iterator in Python 3.0 and a list in 2.x +-minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] +-minverhex = 0 +-# xrange is not present in Python 3.0 and range returns an iterator +-for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] +-sys.exit(sys.hexversion < minverhex)" +- AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) diff --git a/0003-makefile-am-subdirs.patch b/0003-makefile-am-subdirs.patch new file mode 100644 index 0000000..ae2e543 --- /dev/null +++ b/0003-makefile-am-subdirs.patch @@ -0,0 +1,126 @@ +diff -ruN glusterfs-11.2/api/examples/Makefile.am glusterfs-11.2-mod/api/examples/Makefile.am +--- glusterfs-11.2/api/examples/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/api/examples/Makefile.am 2025-07-02 12:31:15.002167956 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + # The bits needed for glfsxmp + EXTRA_PROGRAMS = glfsxmp + glfsxmp_SOURCES = glfsxmp.c +diff -ruN glusterfs-11.2/contrib/fuse-util/Makefile.am glusterfs-11.2-mod/contrib/fuse-util/Makefile.am +--- glusterfs-11.2/contrib/fuse-util/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/contrib/fuse-util/Makefile.am 2025-07-02 12:31:32.290546271 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + bin_PROGRAMS = fusermount-glusterfs + + fusermount_glusterfs_SOURCES = fusermount.c mount_util.c $(CONTRIBDIR)/fuse-lib/mount-common.c +diff -ruN glusterfs-11.2/libglusterfs/src/Makefile.am glusterfs-11.2-mod/libglusterfs/src/Makefile.am +--- glusterfs-11.2/libglusterfs/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/libglusterfs/src/Makefile.am 2025-07-02 12:26:47.776161392 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + noinst_PYTHON = generator.py gen-defaults.py $(top_srcdir)/events/eventskeygen.py + + libglusterfs_la_CFLAGS = $(GF_CFLAGS) $(GF_DARWIN_LIBGLUSTERFS_CFLAGS) \ +diff -ruN glusterfs-11.2/xlators/cluster/afr/src/Makefile.am glusterfs-11.2-mod/xlators/cluster/afr/src/Makefile.am +--- glusterfs-11.2/xlators/cluster/afr/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/xlators/cluster/afr/src/Makefile.am 2025-07-02 12:26:21.567940962 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + xlator_LTLIBRARIES = afr.la + xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/cluster + +diff -ruN glusterfs-11.2/xlators/cluster/dht/src/Makefile.am glusterfs-11.2-mod/xlators/cluster/dht/src/Makefile.am +--- glusterfs-11.2/xlators/cluster/dht/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/xlators/cluster/dht/src/Makefile.am 2025-07-02 12:26:07.943843179 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + xlator_LTLIBRARIES = dht.la nufa.la switch.la + + AM_CFLAGS = -Wall $(GF_CFLAGS) +diff -ruN glusterfs-11.2/xlators/cluster/ec/src/Makefile.am glusterfs-11.2-mod/xlators/cluster/ec/src/Makefile.am +--- glusterfs-11.2/xlators/cluster/ec/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/xlators/cluster/ec/src/Makefile.am 2025-07-02 12:25:45.287655225 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + xlator_LTLIBRARIES = ec.la + xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/cluster + +diff -ruN glusterfs-11.2/xlators/features/changelog/lib/src/Makefile.am glusterfs-11.2-mod/xlators/features/changelog/lib/src/Makefile.am +--- glusterfs-11.2/xlators/features/changelog/lib/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/xlators/features/changelog/lib/src/Makefile.am 2025-07-02 12:25:15.015401482 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + libgfchangelog_la_CFLAGS = -Wall $(GF_CFLAGS) $(GF_DARWIN_LIBGLUSTERFS_CFLAGS) \ + -DDATADIR=\"$(localstatedir)\" + +diff -ruN glusterfs-11.2/xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/Makefile.am glusterfs-11.2-mod/xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/Makefile.am +--- glusterfs-11.2/xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/Makefile.am 2025-07-02 12:24:16.783001896 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + csp_LTLIBRARIES = cloudsyncs3.la + cspdir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/cloudsync-plugins + +diff -ruN glusterfs-11.2/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/Makefile.am glusterfs-11.2-mod/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/Makefile.am +--- glusterfs-11.2/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/Makefile.am 2025-07-02 12:24:00.726984102 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + csp_LTLIBRARIES = cloudsynccvlt.la + cspdir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/cloudsync-plugins + +diff -ruN glusterfs-11.2/xlators/features/cloudsync/src/Makefile.am glusterfs-11.2-mod/xlators/features/cloudsync/src/Makefile.am +--- glusterfs-11.2/xlators/features/cloudsync/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/xlators/features/cloudsync/src/Makefile.am 2025-07-02 12:24:45.054966491 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + SUBDIRS = cloudsync-plugins + + xlator_LTLIBRARIES = cloudsync.la +diff -ruN glusterfs-11.2/xlators/features/thin-arbiter/src/Makefile.am glusterfs-11.2-mod/xlators/features/thin-arbiter/src/Makefile.am +--- glusterfs-11.2/xlators/features/thin-arbiter/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/xlators/features/thin-arbiter/src/Makefile.am 2025-07-02 12:22:10.366019070 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + xlator_LTLIBRARIES = thin-arbiter.la + + xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features +diff -ruN glusterfs-11.2/xlators/features/utime/src/Makefile.am glusterfs-11.2-mod/xlators/features/utime/src/Makefile.am +--- glusterfs-11.2/xlators/features/utime/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/xlators/features/utime/src/Makefile.am 2025-07-02 12:21:54.421923762 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + xlator_LTLIBRARIES = utime.la + xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features + +diff -ruN glusterfs-11.2/xlators/mgmt/glusterd/src/Makefile.am glusterfs-11.2-mod/xlators/mgmt/glusterd/src/Makefile.am +--- glusterfs-11.2/xlators/mgmt/glusterd/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/xlators/mgmt/glusterd/src/Makefile.am 2025-07-02 12:20:49.141466838 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + if WITH_SERVER + xlator_LTLIBRARIES = glusterd.la + endif +diff -ruN glusterfs-11.2/xlators/mount/fuse/src/Makefile.am glusterfs-11.2-mod/xlators/mount/fuse/src/Makefile.am +--- glusterfs-11.2/xlators/mount/fuse/src/Makefile.am 2025-06-10 16:27:14.000000000 +0300 ++++ glusterfs-11.2-mod/xlators/mount/fuse/src/Makefile.am 2025-07-02 12:19:50.029047303 +0300 +@@ -1,3 +1,5 @@ ++AUTOMAKE_OPTIONS = subdir-objects ++ + noinst_HEADERS_linux = $(CONTRIBDIR)/fuse-include/fuse_kernel.h\ + $(CONTRIBDIR)/fuse-include/mount_util.h\ + $(CONTRIBDIR)/fuse-lib/mount-gluster-compat.h diff --git a/README.md b/README.md new file mode 100644 index 0000000..1cab5c1 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# Gluster + Gluster is a software defined distributed storage that can scale to several + petabytes. It provides interfaces for object, block and file storage. + +## Development + Contributions to gluster in the form of patches and new feature additions can + be made by following steps outlined at [Developers Guide](https://gluster.readthedocs.io/en/latest/Developer-guide/Developers-Index/#contributing-to-the-gluster-community). + +## Documentation + The Gluster documentation can be found at [Gluster Docs](http://gluster.readthedocs.io/en/latest). + +## Deployment + Quick instructions to build and install can be found in [INSTALL](INSTALL) file. + +## Maintainers + The list of Gluster maintainers is available in [MAINTAINERS](MAINTAINERS) file. + +## License + Gluster is dual licensed under [GPLV2](COPYING-GPLV2) and [LGPLV3+](COPYING-LGPLV3). + + Please visit the [Gluster Home Page](http://www.gluster.org/) to find out more about Gluster. diff --git a/account-server.conf b/account-server.conf deleted file mode 100644 index 1ffca8b..0000000 --- a/account-server.conf +++ /dev/null @@ -1,16 +0,0 @@ -[DEFAULT] -bind_ip = 127.0.0.1 -bind_port = 6012 -workers = 2 - -[pipeline:main] -pipeline = account-server - -[app:account-server] -use = egg:swift#account - -[account-replicator] - -[account-auditor] - -[account-reaper] diff --git a/container-server.conf b/container-server.conf deleted file mode 100644 index fa0de88..0000000 --- a/container-server.conf +++ /dev/null @@ -1,18 +0,0 @@ -[DEFAULT] -bind_ip = 127.0.0.1 -bind_port = 6011 -workers = 2 - -[pipeline:main] -pipeline = container-server - -[app:container-server] -use = egg:swift#container - -[container-replicator] - -[container-updater] - -[container-auditor] - -[container-sync] diff --git a/gluster-swift-account-auditor.service b/gluster-swift-account-auditor.service deleted file mode 100644 index 35413ce..0000000 --- a/gluster-swift-account-auditor.service +++ /dev/null @@ -1,12 +0,0 @@ -# After network.target just because. -[Unit] -Description=OpenStack Object Storage (swift) - Account Auditor -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-account-auditor /etc/swift/account-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-account-auditor@.service b/gluster-swift-account-auditor@.service deleted file mode 100644 index 8b44df9..0000000 --- a/gluster-swift-account-auditor@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Account Auditor instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-account-auditor /etc/swift/account-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-account-reaper.service b/gluster-swift-account-reaper.service deleted file mode 100644 index dd6fb00..0000000 --- a/gluster-swift-account-reaper.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Account Reaper -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-account-reaper /etc/swift/account-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-account-reaper@.service b/gluster-swift-account-reaper@.service deleted file mode 100644 index dbd5aa4..0000000 --- a/gluster-swift-account-reaper@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Account Reaper instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-account-reaper /etc/swift/account-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-account-replicator.service b/gluster-swift-account-replicator.service deleted file mode 100644 index 0cad889..0000000 --- a/gluster-swift-account-replicator.service +++ /dev/null @@ -1,12 +0,0 @@ -# After network.target just so replicator can talk to other nodes. -[Unit] -Description=OpenStack Object Storage (swift) - Account Replicator -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-account-replicator /etc/swift/account-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-account-replicator@.service b/gluster-swift-account-replicator@.service deleted file mode 100644 index 65fbaa3..0000000 --- a/gluster-swift-account-replicator@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Account Replicator instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-account-replicator /etc/swift/account-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-account.init b/gluster-swift-account.init deleted file mode 100755 index 4f1dbfd..0000000 --- a/gluster-swift-account.init +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh - -### BEGIN INIT INFO -# Provides: gluster-swift-account -# Required-Start: $remote_fs -# Required-Stop: $remote_fs -# Default-Stop: 0 1 6 -# Short-Description: Swift account server -# Description: Account server for swift. -### END INIT INFO - -# gluster-swift-account: swift account server -# -# chkconfig: - 20 80 -# description: Account server for swift. - -. /etc/rc.d/init.d/functions -. /usr/share/gluster-swift/functions - -name="account" - -[ -e "/etc/sysconfig/gluster-swift-$name" ] && . "/etc/sysconfig/gluster-swift-$name" - -lockfile="/var/lock/subsys/gluster-swift-account" - -start() { - swift_action "$name" start - retval=$? - [ $retval -eq 0 ] && touch $lockfile - return $retval -} - -stop() { - swift_action "$name" stop - retval=$? - [ $retval -eq 0 ] && rm -f $lockfile - return $retval -} - -restart() { - stop - start -} - -rh_status() { - swift_action "$name" status -} - -rh_status_q() { - rh_status &> /dev/null -} - -case "$1" in - start) - rh_status_q && exit 0 - $1 - ;; - stop) - rh_status_q || exit 0 - $1 - ;; - restart) - $1 - ;; - reload) - ;; - status) - rh_status - ;; - condrestart|try-restart) - rh_status_q || exit 0 - restart - ;; - *) - echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart}" - exit 2 -esac -exit $? diff --git a/gluster-swift-account.service b/gluster-swift-account.service deleted file mode 100644 index 782b06a..0000000 --- a/gluster-swift-account.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Account Server -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-account-server /etc/swift/account-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-account@.service b/gluster-swift-account@.service deleted file mode 100644 index cae48c7..0000000 --- a/gluster-swift-account@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Account Server instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-account-server /etc/swift/account-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-container-auditor.service b/gluster-swift-container-auditor.service deleted file mode 100644 index 6359b91..0000000 --- a/gluster-swift-container-auditor.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Container Auditor -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-container-auditor /etc/swift/container-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-container-auditor@.service b/gluster-swift-container-auditor@.service deleted file mode 100644 index 7c046da..0000000 --- a/gluster-swift-container-auditor@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Container Auditor instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-container-auditor /etc/swift/container-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-container-replicator.service b/gluster-swift-container-replicator.service deleted file mode 100644 index 399f7b4..0000000 --- a/gluster-swift-container-replicator.service +++ /dev/null @@ -1,12 +0,0 @@ -# After network.target just so replicator can talk to other nodes. -[Unit] -Description=OpenStack Object Storage (swift) - Container Replicator -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-container-replicator /etc/swift/container-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-container-replicator@.service b/gluster-swift-container-replicator@.service deleted file mode 100644 index 4803503..0000000 --- a/gluster-swift-container-replicator@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Container Replicator instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-container-replicator /etc/swift/container-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-container-updater.service b/gluster-swift-container-updater.service deleted file mode 100644 index 6efc57e..0000000 --- a/gluster-swift-container-updater.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Container Updater -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-container-updater /etc/swift/container-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-container-updater@.service b/gluster-swift-container-updater@.service deleted file mode 100644 index 19f99ff..0000000 --- a/gluster-swift-container-updater@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Container Updater instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-container-updater /etc/swift/container-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-container.init b/gluster-swift-container.init deleted file mode 100755 index 1d27989..0000000 --- a/gluster-swift-container.init +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh - -### BEGIN INIT INFO -# Provides: gluster-swift-container -# Required-Start: $remote_fs -# Required-Stop: $remote_fs -# Default-Stop: 0 1 6 -# Short-Description: Swift container server -# Description: Container server for swift. -### END INIT INFO - -# gluster-swift-container: swift container server -# -# chkconfig: - 20 80 -# description: Container server for swift. - -. /etc/rc.d/init.d/functions -. /usr/share/gluster-swift/functions - -name="container" - -[ -e "/etc/sysconfig/gluster-swift-$name" ] && . "/etc/sysconfig/gluster-swift-$name" - -lockfile="/var/lock/subsys/gluster-swift-container" - -start() { - swift_action "$name" start - retval=$? - [ $retval -eq 0 ] && touch $lockfile - return $retval -} - -stop() { - swift_action "$name" stop - retval=$? - [ $retval -eq 0 ] && rm -f $lockfile - return $retval -} - -restart() { - stop - start -} - -rh_status() { - swift_action "$name" status -} - -rh_status_q() { - rh_status &> /dev/null -} - -case "$1" in - start) - rh_status_q && exit 0 - $1 - ;; - stop) - rh_status_q || exit 0 - $1 - ;; - restart) - $1 - ;; - reload) - ;; - status) - rh_status - ;; - condrestart|try-restart) - rh_status_q || exit 0 - restart - ;; - *) - echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart}" - exit 2 -esac -exit $? diff --git a/gluster-swift-container.service b/gluster-swift-container.service deleted file mode 100644 index 6db2b51..0000000 --- a/gluster-swift-container.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Container Server -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-container-server /etc/swift/container-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-container@.service b/gluster-swift-container@.service deleted file mode 100644 index 4f51e3f..0000000 --- a/gluster-swift-container@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Container Server instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-container-server /etc/swift/container-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-functions b/gluster-swift-functions deleted file mode 100644 index 4b69ed8..0000000 --- a/gluster-swift-functions +++ /dev/null @@ -1,64 +0,0 @@ -# vim: filetype=sh - -. /etc/rc.d/init.d/functions - -swift_action() { - retval=0 - server="$1" - call="swift_$2" - - if [[ -f "/etc/swift/$server-server.conf" ]]; then - $call "$server" \ - "/etc/swift/$server-server.conf" \ - "/var/run/swift/$server-server.pid" - [ $? -ne 0 ] && retval=1 - elif [[ -d "/etc/swift/$server-server/" ]]; then - declare -i count=0 - mkdir -p /var/run/swift/$server-server - for name in $( ls "/etc/swift/$server-server/" ); do - $call "$server" \ - "/etc/swift/$server-server/$name" \ - "/var/run/swift/$server-server/$count.pid" - [ $? -ne 0 ] && retval=1 - count=$count+1 - done - fi - return $retval -} - -swift_start() { - name="$1" - long_name="$name-server" - conf_file="$2" - pid_file="$3" - - ulimit -n ${SWIFT_MAX_FILES-32768} - echo -n "Starting swift-$long_name: " - daemon --pidfile $pid_file \ - "/usr/bin/swift-$long_name $conf_file &>/var/log/swift-startup.log & echo \$! > $pid_file" - retval=$? - echo - return $retval -} - -swift_stop() { - name="$1" - long_name="$name-server" - conf_name="$2" - pid_file="$3" - - echo -n "Stopping swift-$long_name: " - killproc -p $pid_file -d ${SWIFT_STOP_DELAY-15} $long_name - retval=$? - echo - return $retval -} - -swift_status() { - name="$1" - long_name="$name-server" - conf_name="$2" - pid_file="$3" - - status -p $pid_file $long_name -} diff --git a/gluster-swift-object-auditor.service b/gluster-swift-object-auditor.service deleted file mode 100644 index 498d53e..0000000 --- a/gluster-swift-object-auditor.service +++ /dev/null @@ -1,12 +0,0 @@ -# After network.target just because. -[Unit] -Description=OpenStack Object Storage (swift) - Object Auditor -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-object-auditor /etc/swift/object-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-object-auditor@.service b/gluster-swift-object-auditor@.service deleted file mode 100644 index f5c2537..0000000 --- a/gluster-swift-object-auditor@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Object Auditor instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-object-auditor /etc/swift/object-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-object-expirer.service b/gluster-swift-object-expirer.service deleted file mode 100644 index 1438427..0000000 --- a/gluster-swift-object-expirer.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Object Expirer -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-object-expirer /etc/swift/object-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-object-expirer@.service b/gluster-swift-object-expirer@.service deleted file mode 100644 index e7d03c3..0000000 --- a/gluster-swift-object-expirer@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Object Expirer instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-object-expirer /etc/swift/object-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-object-replicator.service b/gluster-swift-object-replicator.service deleted file mode 100644 index be1d3fa..0000000 --- a/gluster-swift-object-replicator.service +++ /dev/null @@ -1,12 +0,0 @@ -# After network.target just so replicator can talk to other nodes. -[Unit] -Description=OpenStack Object Storage (swift) - Object Replicator -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-object-replicator /etc/swift/object-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-object-replicator@.service b/gluster-swift-object-replicator@.service deleted file mode 100644 index 7493398..0000000 --- a/gluster-swift-object-replicator@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Object Replicator instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-object-replicator /etc/swift/object-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-object-updater.service b/gluster-swift-object-updater.service deleted file mode 100644 index d9697a5..0000000 --- a/gluster-swift-object-updater.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Object Updater -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-object-updater /etc/swift/object-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-object-updater@.service b/gluster-swift-object-updater@.service deleted file mode 100644 index 9f223c7..0000000 --- a/gluster-swift-object-updater@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Object Updater instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-object-updater /etc/swift/object-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-object.init b/gluster-swift-object.init deleted file mode 100755 index f0fe540..0000000 --- a/gluster-swift-object.init +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/sh - -### BEGIN INIT INFO -# Provides: gluster-swift-object -# Required-Start: $remote_fs -# Required-Stop: $remote_fs -# Default-Stop: 0 1 6 -# Short-Description: Swift object server -# Description: Object server for swift. -### END INIT INFO - -# gluster-swift-object: swift object server -# -# chkconfig: - 20 80 -# description: Object server for swift. - -. /etc/rc.d/init.d/functions -. /usr/share/gluster-swift/functions - -name="object" - -[ -e "/etc/sysconfig/gluster-swift-$name" ] && . "/etc/sysconfig/gluster-swift-$name" - -lockfile="/var/lock/subsys/gluster-swift-object" - -start() { - swift_action "$name" start - retval=$? - [ $retval -eq 0 ] && touch $lockfile - return $retval -} - -stop() { - swift_action "$name" stop - retval=$? - [ $retval -eq 0 ] && rm -f $lockfile - return $retval -} - -restart() { - stop - start -} - -rh_status() { - swift_action "$name" status -} - -rh_status_q() { - rh_status &> /dev/null -} - - -case "$1" in - start) - rh_status_q && exit 0 - $1 - ;; - stop) - rh_status_q || exit 0 - $1 - ;; - restart) - $1 - ;; - reload) - ;; - status) - rh_status - ;; - condrestart|try-restart) - rh_status_q || exit 0 - restart - ;; - *) - echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart}" - exit 2 -esac -exit $? diff --git a/gluster-swift-object.service b/gluster-swift-object.service deleted file mode 100644 index 1cd5020..0000000 --- a/gluster-swift-object.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Object Server -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-object-server /etc/swift/object-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-object@.service b/gluster-swift-object@.service deleted file mode 100644 index 172e322..0000000 --- a/gluster-swift-object@.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Object Server instance %I -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-object-server /etc/swift/object-server/%i.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift-proxy.init b/gluster-swift-proxy.init deleted file mode 100755 index 052e05f..0000000 --- a/gluster-swift-proxy.init +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/sh - -### BEGIN INIT INFO -# Provides: gluster-swift-proxy -# Required-Start: $remote_fs -# Required-Stop: $remote_fs -# Default-Stop: 0 1 6 -# Short-Description: Swift proxy server -# Description: Account server for swift. -### END INIT INFO - -# gluster-swift-proxy: swift proxy server -# -# chkconfig: - 20 80 -# description: Proxy server for swift. - -. /etc/rc.d/init.d/functions -. /usr/share/gluster-swift/functions - -name="proxy" - -[ -e "/etc/sysconfig/gluster-swift-$name" ] && . "/etc/sysconfig/gluster-swift-$name" - -lockfile="/var/lock/subsys/gluster-swift-proxy" - -start() { - swift_action "$name" start - retval=$? - [ $retval -eq 0 ] && touch $lockfile - return $retval -} - -stop() { - swift_action "$name" stop - retval=$? - [ $retval -eq 0 ] && rm -f $lockfile - return $retval -} - -restart() { - stop - start -} - -rh_status() { - swift_action "$name" status -} - -rh_status_q() { - rh_status &> /dev/null -} - - -case "$1" in - start) - rh_status_q && exit 0 - $1 - ;; - stop) - rh_status_q || exit 0 - $1 - ;; - restart) - $1 - ;; - reload) - ;; - status) - rh_status - ;; - condrestart|try-restart) - rh_status_q || exit 0 - restart - ;; - *) - echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart}" - exit 2 -esac -exit $? diff --git a/gluster-swift-proxy.service b/gluster-swift-proxy.service deleted file mode 100644 index 4078f50..0000000 --- a/gluster-swift-proxy.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OpenStack Object Storage (swift) - Proxy Server -After=syslog.target network.target - -[Service] -Type=simple -User=swift -ExecStart=/usr/bin/swift-proxy-server /etc/swift/proxy-server.conf - -[Install] -WantedBy=multi-user.target diff --git a/gluster-swift.tmpfs b/gluster-swift.tmpfs deleted file mode 100644 index 8f4f5a5..0000000 --- a/gluster-swift.tmpfs +++ /dev/null @@ -1,6 +0,0 @@ -# swift needs a couple of directories in /var/run -d /var/run/swift 0755 swift root -d /var/run/swift/account-server 0755 swift root -d /var/run/swift/container-server 0755 swift root -d /var/run/swift/object-server 0755 swift root -d /var/run/swift/proxy-server 0755 swift root diff --git a/glusterd.init b/glusterd.init deleted file mode 100644 index 0007d2e..0000000 --- a/glusterd.init +++ /dev/null @@ -1,109 +0,0 @@ -#!/bin/sh -# -# glusterd Startup script for the glusterfs server -# -# chkconfig: - 20 80 -# description: Clustered file-system server - -### BEGIN INIT INFO -# Provides: glusterd -# Required-Start: $local_fs $network -# Required-Stop: $local_fs $network -# Should-Start: -# Should-Stop: -# Default-Start: -# Default-Stop: 0 1 2 3 4 5 6 -# Short-Description: glusterfs server -# Description: Clustered file-system server -### END INIT INFO - -# Source function library. -. /etc/rc.d/init.d/functions - -exe="/usr/sbin/glusterd" -prog="glusterd" - -# Fedora File System Layout dictates /run -[ -e /run ] && RUNDIR="/run" -pidf="${RUNDIR:-/var/run}/$prog.pid" - -# Set defaults, then source config for eventual overrides -GLUSTERD_NOFILE="65536" - -[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog - -lockfile=/var/lock/subsys/$prog - -start() { - [ -x $exe ] || exit 5 - ulimit -n $GLUSTERD_NOFILE - echo -n $"Starting $prog: " - daemon $exe${GLUSTERD_LOGFILE+" -l $GLUSTERD_LOGFILE"}${GLUSTERD_LOGLEVEL+" -L $GLUSTERD_LOGLEVEL"} -p $pidf - retval=$? - echo - [ $retval -eq 0 ] && touch $lockfile - return $retval -} - -stop() { - echo -n $"Stopping $prog: " - killproc $prog - retval=$? - echo - [ $retval -eq 0 ] && rm -f $lockfile - return $retval -} - -restart() { - stop - start -} - -reload() { - restart -} - -force_reload() { - restart -} - -rh_status() { - status $prog -} - -rh_status_q() { - rh_status &>/dev/null -} - - -case "$1" in - start) - rh_status_q && exit 0 - $1 - ;; - stop) - rh_status_q || exit 0 - $1 - ;; - restart) - $1 - ;; - reload) - rh_status_q || exit 7 - $1 - ;; - force-reload) - force_reload - ;; - status) - rh_status - ;; - condrestart|try-restart) - rh_status_q || exit 0 - restart - ;; - *) - echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" - exit 2 -esac -exit $? diff --git a/glusterd.logrotate b/glusterd.logrotate deleted file mode 100644 index 3fce646..0000000 --- a/glusterd.logrotate +++ /dev/null @@ -1,6 +0,0 @@ -/var/log/glusterfs/*glusterd.vol.log { - missingok - postrotate - /bin/kill -HUP `cat /var/run/glusterd.pid 2>/dev/null` 2>/dev/null || true - endscript -} diff --git a/glusterd.service b/glusterd.service deleted file mode 100644 index d19d962..0000000 --- a/glusterd.service +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=GlusterFS an clustered file-system server -Wants=glusterfsd.service -After=network.target rpcbind.service - -[Service] -Type=forking -PIDFile=/run/glusterd.pid -LimitNOFILE=65536 -ExecStart=/usr/sbin/glusterd -p /run/glusterd.pid - -[Install] -WantedBy=multi-user.target diff --git a/glusterfs-3.2.5.configure.ac.patch b/glusterfs-3.2.5.configure.ac.patch deleted file mode 100644 index 122af1a..0000000 --- a/glusterfs-3.2.5.configure.ac.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- configure.ac.orig 2012-01-16 13:38:53.020000114 -0500 -+++ configure.ac 2012-01-16 13:39:29.177000589 -0500 -@@ -431,7 +431,7 @@ - linux*) - dnl GF_LINUX_HOST_OS=1 - GF_HOST_OS="GF_LINUX_HOST_OS" -- GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS} -O0" -+ GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS} -O2" - GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}" - GF_LDADD="${ARGP_STANDALONE_LDADD}" - GF_FUSE_CFLAGS="-DFUSERMOUNT_DIR=\\\"\$(bindir)\\\"" diff --git a/glusterfs-3.2.5.libglusterfs.Makefile.patch b/glusterfs-3.2.5.libglusterfs.Makefile.patch deleted file mode 100644 index 56a84b0..0000000 --- a/glusterfs-3.2.5.libglusterfs.Makefile.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- libglusterfs/src/Makefile.am.orig 2011-11-23 14:04:41.810001717 -0500 -+++ libglusterfs/src/Makefile.am 2011-11-23 14:30:49.940000394 -0500 -@@ -16,6 +16,7 @@ - $(LEX) -t $(srcdir)/graph.l > $@ - - y.tab.c y.tab.h: graph.y -- $(YACC) -d $(srcdir)/graph.y -+ $(YACC) -d -b foo $(srcdir)/graph.y -+ mv foo.tab.h y.tab.h && mv foo.tab.c y.tab.c - - CLEANFILES = graph.lex.c y.tab.c y.tab.h ---- libglusterfs/src/Makefile.in.orig 2011-11-23 14:04:35.995001451 -0500 -+++ libglusterfs/src/Makefile.in 2011-11-23 14:31:01.730999353 -0500 -@@ -866,7 +866,8 @@ - $(LEX) -t $(srcdir)/graph.l > $@ - - y.tab.c y.tab.h: graph.y -- $(YACC) -d $(srcdir)/graph.y -+ $(YACC) -d -b foo $(srcdir)/graph.y -+ mv foo.tab.h y.tab.h && mv foo.tab.c y.tab.c - # Tell versions [3.59,3.63) of GNU make to not export all variables. - # Otherwise a system limit (for SysV at least) may be exceeded. - .NOEXPORT: diff --git a/glusterfs-3.2.7.xlators.mgmt.glusterd.glusterd-rpc-ops.c.patch b/glusterfs-3.2.7.xlators.mgmt.glusterd.glusterd-rpc-ops.c.patch deleted file mode 100644 index d19799b..0000000 --- a/glusterfs-3.2.7.xlators.mgmt.glusterd.glusterd-rpc-ops.c.patch +++ /dev/null @@ -1,474 +0,0 @@ ---- xlators/mgmt/glusterd/src/glusterd-rpc-ops.c -+++ xlators/mgmt/glusterd/src/glusterd-rpc-ops.c -@@ -51,9 +51,26 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret, - int32_t op_errno, rpcsvc_request_t *req, - void *op_ctx, char *op_errstr) - { -- int32_t ret = -1; -- gd_serialize_t sfunc = NULL; -- void *cli_rsp = NULL; -+ union { -+ gf1_cli_create_vol_rsp createv_rsp; -+ gf1_cli_start_vol_rsp startv_rsp; -+ gf1_cli_stop_vol_rsp stopv_rsp; -+ gf1_cli_delete_vol_rsp delv_rsp; -+ gf1_cli_defrag_vol_rsp defragv_rsp; -+ gf1_cli_set_vol_rsp setv_rsp; -+ gf1_cli_reset_vol_rsp resetv_rsp; -+ gf1_cli_sync_volume_rsp syncv_rsp; -+ gf1_cli_stats_volume_rsp statsv_rsp; -+ gf1_cli_add_brick_rsp addb_rsp; -+ gf1_cli_remove_brick_rsp rmb_rsp; -+ gf1_cli_replace_brick_rsp replb_rsp; -+ gf1_cli_log_filename_rsp logfn_rsp; -+ gf1_cli_log_rotate_rsp logrot_rsp; -+ gf1_cli_gsync_set_rsp gsyncs_rsp; -+ gf1_cli_quota_rsp quota_rsp; -+ } cli_rsp; -+ int32_t ret = -1; -+ gd_serialize_t sfunc = NULL; - dict_t *ctx = NULL; - char *free_ptr = NULL; - glusterd_conf_t *conf = NULL; -@@ -67,145 +84,103 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret, - switch (op) { - case GD_OP_CREATE_VOLUME: - { -- gf1_cli_create_vol_rsp rsp = {0,}; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- rsp.volname = ""; -- if (op_errstr) -- rsp.op_errstr = op_errstr; -- else -- rsp.op_errstr = ""; -- cli_rsp = &rsp; -+ cli_rsp.createv_rsp.op_ret = op_ret; -+ cli_rsp.createv_rsp.op_errno = op_errno; -+ cli_rsp.createv_rsp.volname = ""; -+ cli_rsp.createv_rsp.op_errstr = op_errstr ? op_errstr : ""; - sfunc = gf_xdr_serialize_cli_create_vol_rsp; - break; - } - - case GD_OP_START_VOLUME: - { -- gf1_cli_start_vol_rsp rsp = {0,}; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- rsp.volname = ""; -- if (op_errstr) -- rsp.op_errstr = op_errstr; -- else -- rsp.op_errstr = ""; -- cli_rsp = &rsp; -+ cli_rsp.startv_rsp.op_ret = op_ret; -+ cli_rsp.startv_rsp.op_errno = op_errno; -+ cli_rsp.startv_rsp.volname = ""; -+ cli_rsp.startv_rsp.op_errstr = op_errstr ? op_errstr : ""; - sfunc = gf_xdr_serialize_cli_start_vol_rsp; - break; - } - - case GD_OP_STOP_VOLUME: - { -- gf1_cli_stop_vol_rsp rsp = {0,}; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- rsp.volname = ""; -- if (op_errstr) -- rsp.op_errstr = op_errstr; -- else -- rsp.op_errstr = ""; -- cli_rsp = &rsp; -+ cli_rsp.stopv_rsp.op_ret = op_ret; -+ cli_rsp.stopv_rsp.op_errno = op_errno; -+ cli_rsp.stopv_rsp.volname = ""; -+ cli_rsp.stopv_rsp.op_errstr = op_errstr ? op_errstr : ""; - sfunc = gf_xdr_serialize_cli_stop_vol_rsp; - break; - } - - case GD_OP_DELETE_VOLUME: - { -- gf1_cli_delete_vol_rsp rsp = {0,}; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- rsp.volname = ""; -- if (op_errstr) -- rsp.op_errstr = op_errstr; -- else -- rsp.op_errstr = ""; -- cli_rsp = &rsp; -+ cli_rsp.delv_rsp.op_ret = op_ret; -+ cli_rsp.delv_rsp.op_errno = op_errno; -+ cli_rsp.delv_rsp.volname = ""; -+ cli_rsp.delv_rsp.op_errstr = op_errstr ? op_errstr : ""; - sfunc = gf_xdr_serialize_cli_delete_vol_rsp; - break; - } - - case GD_OP_DEFRAG_VOLUME: - { -- gf1_cli_defrag_vol_rsp rsp = {0,}; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- //rsp.volname = ""; -- cli_rsp = &rsp; -+ cli_rsp.defragv_rsp.op_ret = op_ret; -+ cli_rsp.defragv_rsp.op_errno = op_errno; -+ //cli_rsp.defragv_rsp.volname = ""; - sfunc = gf_xdr_serialize_cli_defrag_vol_rsp; - break; - } - - case GD_OP_ADD_BRICK: - { -- gf1_cli_add_brick_rsp rsp = {0,}; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- rsp.volname = ""; -- if (op_errstr) -- rsp.op_errstr = op_errstr; -- else -- rsp.op_errstr = ""; -- cli_rsp = &rsp; -+ cli_rsp.addb_rsp.op_ret = op_ret; -+ cli_rsp.addb_rsp.op_errno = op_errno; -+ cli_rsp.addb_rsp.volname = ""; -+ cli_rsp.addb_rsp.op_errstr = op_errstr ? op_errstr : ""; - sfunc = gf_xdr_serialize_cli_add_brick_rsp; - break; - } - - case GD_OP_REMOVE_BRICK: - { -- gf1_cli_remove_brick_rsp rsp = {0,}; - ctx = op_ctx; - if (ctx && -- dict_get_str (ctx, "errstr", &rsp.op_errstr)) -- rsp.op_errstr = ""; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- rsp.volname = ""; -- cli_rsp = &rsp; -+ dict_get_str (ctx, "errstr", &cli_rsp.rmb_rsp.op_errstr)) -+ cli_rsp.rmb_rsp.op_errstr = ""; -+ cli_rsp.rmb_rsp.op_ret = op_ret; -+ cli_rsp.rmb_rsp.op_errno = op_errno; -+ cli_rsp.rmb_rsp.volname = ""; - sfunc = gf_xdr_serialize_cli_remove_brick_rsp; - break; - } - - case GD_OP_REPLACE_BRICK: - { -- gf1_cli_replace_brick_rsp rsp = {0,}; - ctx = op_ctx; - if (ctx && -- dict_get_str (ctx, "status-reply", &rsp.status)) -- rsp.status = ""; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- if (op_errstr) -- rsp.op_errstr = op_errstr; -- else -- rsp.op_errstr = ""; -- rsp.volname = ""; -- cli_rsp = &rsp; -+ dict_get_str (ctx, "status-reply", &cli_rsp.replb_rsp.status)) -+ cli_rsp.replb_rsp.status = ""; -+ cli_rsp.replb_rsp.op_ret = op_ret; -+ cli_rsp.replb_rsp.op_errno = op_errno; -+ cli_rsp.replb_rsp.volname = ""; -+ cli_rsp.replb_rsp.op_errstr = op_errstr ? op_errstr : ""; - sfunc = gf_xdr_serialize_cli_replace_brick_rsp; - break; - } - - case GD_OP_SET_VOLUME: - { -- gf1_cli_set_vol_rsp rsp = {0,}; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- rsp.volname = ""; - ctx = op_ctx; -- -- if (op_errstr) -- rsp.op_errstr = op_errstr; -- else -- rsp.op_errstr = ""; - if (ctx) { - ret = dict_allocate_and_serialize (ctx, -- &rsp.dict.dict_val, -- (size_t*)&rsp.dict.dict_len); -+ &cli_rsp.setv_rsp.dict.dict_val, -+ (size_t*)&cli_rsp.setv_rsp.dict.dict_len); - if (ret == 0) -- free_ptr = rsp.dict.dict_val; -+ free_ptr = cli_rsp.setv_rsp.dict.dict_val; - } -- -- cli_rsp = &rsp; -+ cli_rsp.setv_rsp.op_errno = op_errno; -+ cli_rsp.setv_rsp.volname = ""; -+ cli_rsp.setv_rsp.op_errstr = op_errstr ? op_errstr : ""; - sfunc = gf_xdr_serialize_cli_set_vol_rsp; - break; - } -@@ -213,55 +188,35 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret, - case GD_OP_RESET_VOLUME: - { - gf_log ("", GF_LOG_DEBUG, "Return value to CLI"); -- gf1_cli_reset_vol_rsp rsp = {0,}; -- rsp.op_ret = op_ret; -- rsp.op_errno = 1; -- rsp.volname = ""; -- if (op_errstr) -- rsp.op_errstr = op_errstr; -- else -- rsp.op_errstr = "Error while resetting options"; -- cli_rsp = &rsp; -+ cli_rsp.resetv_rsp.op_ret = op_ret; -+ cli_rsp.resetv_rsp.op_errno = 1; -+ cli_rsp.resetv_rsp.volname = ""; -+ cli_rsp.resetv_rsp.op_errstr = op_errstr ? op_errstr : "Error while resetting options"; - sfunc = gf_xdr_serialize_cli_reset_vol_rsp; - break; - } - - case GD_OP_LOG_FILENAME: - { -- gf1_cli_log_filename_rsp rsp = {0,}; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- if (op_errstr) -- rsp.errstr = op_errstr; -- else -- rsp.errstr = ""; -- cli_rsp = &rsp; -+ cli_rsp.logfn_rsp.op_ret = op_ret; -+ cli_rsp.logfn_rsp.op_errno = op_errno; -+ cli_rsp.logfn_rsp.errstr = op_errstr ? op_errstr : ""; - sfunc = gf_xdr_serialize_cli_log_filename_rsp; - break; - } - case GD_OP_LOG_ROTATE: - { -- gf1_cli_log_rotate_rsp rsp = {0,}; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- if (op_errstr) -- rsp.errstr = op_errstr; -- else -- rsp.errstr = ""; -- cli_rsp = &rsp; -+ cli_rsp.logrot_rsp.op_ret = op_ret; -+ cli_rsp.logrot_rsp.op_errno = op_errno; -+ cli_rsp.logrot_rsp.errstr = op_errstr ? op_errstr : ""; - sfunc = gf_xdr_serialize_cli_log_rotate_rsp; - break; - } - case GD_OP_SYNC_VOLUME: - { -- gf1_cli_sync_volume_rsp rsp = {0,}; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- if (op_errstr) -- rsp.op_errstr = op_errstr; -- else -- rsp.op_errstr = ""; -- cli_rsp = &rsp; -+ cli_rsp.syncv_rsp.op_ret = op_ret; -+ cli_rsp.syncv_rsp.op_errno = op_errno; -+ cli_rsp.syncv_rsp.op_errstr = op_errstr ? op_errstr : ""; - sfunc = gf_xdr_from_cli_sync_volume_rsp; - break; - } -@@ -273,72 +228,56 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret, - char *slave = NULL; - char *op_name = NULL; - char *subop = NULL; -- gf1_cli_gsync_set_rsp rsp = {0,}; - -+ cli_rsp.gsyncs_rsp.op_ret = op_ret; -+ cli_rsp.gsyncs_rsp.op_errno = op_errno; -+ cli_rsp.gsyncs_rsp.op_errstr = op_errstr ? op_errstr : ""; -+ cli_rsp.gsyncs_rsp.op_name = ""; -+ cli_rsp.gsyncs_rsp.subop = ""; -+ cli_rsp.gsyncs_rsp.master = ""; -+ cli_rsp.gsyncs_rsp.slave = ""; -+ cli_rsp.gsyncs_rsp.glusterd_workdir = conf->workdir; -+ cli_rsp.gsyncs_rsp.gsync_prefix = GSYNCD_PREFIX; - ctx = op_ctx; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- rsp.op_errstr = ""; -- rsp.op_name = ""; -- rsp.subop = ""; -- rsp.master = ""; -- rsp.slave = ""; -- rsp.glusterd_workdir = conf->workdir; -- rsp.gsync_prefix = GSYNCD_PREFIX; - if (ctx) { - ret = dict_get_str (ctx, "errstr", &str); - if (ret == 0) -- rsp.op_errstr = str; -+ cli_rsp.gsyncs_rsp.op_errstr = str; - ret = dict_get_int32 (ctx, "type", &type); - if (ret == 0) -- rsp.type = type; -+ cli_rsp.gsyncs_rsp.type = type; - ret = dict_get_str (ctx, "master", &master); - if (ret == 0) -- rsp.master = master; -+ cli_rsp.gsyncs_rsp.master = master; - - ret = dict_get_str (ctx, "slave", &slave); - if (ret == 0) -- rsp.slave = slave; -+ cli_rsp.gsyncs_rsp.slave = slave; - - if (type == GF_GSYNC_OPTION_TYPE_CONFIG) { - if (dict_get_str (ctx, "op_name", &op_name) == 0) -- rsp.op_name = op_name; -+ cli_rsp.gsyncs_rsp.op_name = op_name; - if (dict_get_str (ctx, "subop", &subop) == 0) -- rsp.subop = subop; -+ cli_rsp.gsyncs_rsp.subop = subop; - } - - ret = dict_allocate_and_serialize (ctx, -- &rsp.status_dict.status_dict_val, -- (size_t*)&rsp.status_dict.status_dict_len); -+ &cli_rsp.gsyncs_rsp.status_dict.status_dict_val, -+ (size_t*)&cli_rsp.gsyncs_rsp.status_dict.status_dict_len); - - if (ret == 0) -- free_ptr = rsp.status_dict.status_dict_val; -+ free_ptr = cli_rsp.gsyncs_rsp.status_dict.status_dict_val; - - } -- if (op_errstr) -- rsp.op_errstr = op_errstr; -- cli_rsp = &rsp; - sfunc = gf_xdr_serialize_cli_gsync_set_rsp; - break; - } -- case GD_OP_RENAME_VOLUME: -- case GD_OP_START_BRICK: -- case GD_OP_STOP_BRICK: -- case GD_OP_LOG_LOCATE: -- { -- gf_log ("", GF_LOG_DEBUG, "not supported op %d", op); -- break; -- } - case GD_OP_PROFILE_VOLUME: - { -- gf1_cli_stats_volume_rsp rsp = {0,}; - int32_t count = 0; -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- if (op_errstr) -- rsp.op_errstr = op_errstr; -- else -- rsp.op_errstr = ""; -+ cli_rsp.statsv_rsp.op_ret = op_ret; -+ cli_rsp.statsv_rsp.op_errno = op_errno; -+ cli_rsp.statsv_rsp.op_errstr = op_errstr ? op_errstr : ""; - ctx = op_ctx; - if (dict_get_int32 (ctx, "count", &count)) { - ret = dict_set_int32 (ctx, "count", 0); -@@ -347,10 +286,9 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret, - "to set brick count."); - } - dict_allocate_and_serialize (ctx, -- &rsp.stats_info.stats_info_val, -- (size_t*)&rsp.stats_info.stats_info_len); -- free_ptr = rsp.stats_info.stats_info_val; -- cli_rsp = &rsp; -+ &cli_rsp.statsv_rsp.stats_info.stats_info_val, -+ (size_t*)&cli_rsp.statsv_rsp.stats_info.stats_info_len); -+ free_ptr = cli_rsp.statsv_rsp.stats_info.stats_info_val; - sfunc = gf_xdr_from_cli_stats_volume_rsp; - break; - } -@@ -360,49 +298,56 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret, - int32_t type; - char *str = NULL; - char *errstr = NULL; -- gf1_cli_quota_rsp rsp = {0,}; - -- rsp.op_ret = op_ret; -- rsp.op_errno = op_errno; -- rsp.volname = ""; -+ cli_rsp.quota_rsp.op_ret = op_ret; -+ cli_rsp.quota_rsp.op_errno = op_errno; -+ cli_rsp.quota_rsp.volname = ""; - - ctx = op_ctx; - - if (op_errstr) -- rsp.op_errstr = op_errstr; -+ cli_rsp.quota_rsp.op_errstr = op_errstr; - else { - ret = dict_get_str (ctx, "errstr", &errstr); - if (ret == 0) -- rsp.op_errstr = errstr; -+ cli_rsp.quota_rsp.op_errstr = errstr; - else -- rsp.op_errstr = ""; -+ cli_rsp.quota_rsp.op_errstr = ""; - } - -- rsp.limit_list = ""; -+ cli_rsp.quota_rsp.limit_list = ""; - - if (op_ret == 0 && ctx) { - ret = dict_get_str (ctx, "volname", &str); - if (ret == 0) -- rsp.volname = str; -+ cli_rsp.quota_rsp.volname = str; - - ret = dict_get_int32 (ctx, "type", &type); - if (ret == 0) -- rsp.type = type; -+ cli_rsp.quota_rsp.type = type; - else -- rsp.type = 0; -+ cli_rsp.quota_rsp.type = 0; - - if (type == GF_QUOTA_OPTION_TYPE_LIST) { - ret = dict_get_str (ctx,"limit_list", &str); - - if (ret == 0) -- rsp.limit_list = str; -+ cli_rsp.quota_rsp.limit_list = str; - } - } -- cli_rsp = &rsp; - sfunc = gf_xdr_serialize_cli_quota_rsp; - break; - } - -+ case GD_OP_RENAME_VOLUME: -+ case GD_OP_START_BRICK: -+ case GD_OP_STOP_BRICK: -+ case GD_OP_LOG_LOCATE: -+ { -+ gf_log ("", GF_LOG_DEBUG, "not supported op %d", op); -+ break; -+ } -+ - case GD_OP_NONE: - case GD_OP_MAX: - { -@@ -411,7 +356,7 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret, - } - } - -- ret = glusterd_submit_reply (req, cli_rsp, NULL, 0, NULL, -+ ret = glusterd_submit_reply (req, &cli_rsp, NULL, 0, NULL, - sfunc); - - if (free_ptr) diff --git a/glusterfs-3.3.0.cli.cli-rpc-ops.c.patch b/glusterfs-3.3.0.cli.cli-rpc-ops.c.patch deleted file mode 100644 index 3d7ca10..0000000 --- a/glusterfs-3.3.0.cli.cli-rpc-ops.c.patch +++ /dev/null @@ -1,20 +0,0 @@ -*** cli/src/cli-rpc-ops.c.orig 2012-07-18 13:16:43.720998232 -0400 ---- cli/src/cli-rpc-ops.c 2012-07-18 13:19:52.463999495 -0400 -*************** -*** 5832,5838 **** - if (!time) { - cli_out ("%s", path); - } else { -! tm = localtime ((time_t*)(&time)); - strftime (timestr, sizeof (timestr), - "%Y-%m-%d %H:%M:%S", tm); - if (i ==0) { ---- 5832,5839 ---- - if (!time) { - cli_out ("%s", path); - } else { -! time_t hack = time; -! tm = localtime (&hack); - strftime (timestr, sizeof (timestr), - "%Y-%m-%d %H:%M:%S", tm); - if (i ==0) { diff --git a/glusterfs-3.3.0.libglusterfs.Makefile.patch b/glusterfs-3.3.0.libglusterfs.Makefile.patch deleted file mode 100644 index bd9bde7..0000000 --- a/glusterfs-3.3.0.libglusterfs.Makefile.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- libglusterfs/src/Makefile.am.orig 2012-05-17 12:30:57.000000000 -0400 -+++ libglusterfs/src/Makefile.am 2012-05-18 08:52:55.469998306 -0400 -@@ -44,7 +44,8 @@ - $(LEX) -t $(srcdir)/graph.l > $@ - - y.tab.h: graph.y -- $(YACC) -d $(srcdir)/graph.y -+ $(YACC) -d -b foo $(srcdir)/graph.y -+ mv foo.tab.h y.tab.h && mv foo.tab.c y.tab.c - - CLEANFILES = graph.lex.c y.tab.c y.tab.h - CONFIG_CLEAN_FILES = $(CONTRIB_BUILDDIR)/uuid/uuid_types.h ---- libglusterfs/src/Makefile.in.orig 2012-05-17 12:31:12.000000000 -0400 -+++ libglusterfs/src/Makefile.in 2012-05-18 09:02:31.108002281 -0400 -@@ -941,7 +941,8 @@ - $(LEX) -t $(srcdir)/graph.l > $@ - - y.tab.h: graph.y -- $(YACC) -d $(srcdir)/graph.y -+ $(YACC) -d -b foo $(srcdir)/graph.y -+ mv foo.tab.h y.tab.h && mv foo.tab.c y.tab.c - # Tell versions [3.59,3.63) of GNU make to not export all variables. - # Otherwise a system limit (for SysV at least) may be exceeded. - .NOEXPORT: diff --git a/glusterfs-3.3.0.swift.patch b/glusterfs-3.3.0.swift.patch deleted file mode 100644 index 8ed5070..0000000 --- a/glusterfs-3.3.0.swift.patch +++ /dev/null @@ -1,797 +0,0 @@ -diff --git a/setup.py b/setup.py -index d195d34..b5b5ca2 100644 ---- a/setup.py -+++ b/setup.py -@@ -1,5 +1,6 @@ - #!/usr/bin/python - # Copyright (c) 2010-2012 OpenStack, LLC. -+# Copyright (c) 2011 Red Hat, Inc. - # - # Licensed under the Apache License, Version 2.0 (the "License"); - # you may not use this file except in compliance with the License. -@@ -94,6 +95,7 @@ setup( - 'tempurl=swift.common.middleware.tempurl:filter_factory', - 'formpost=swift.common.middleware.formpost:filter_factory', - 'name_check=swift.common.middleware.name_check:filter_factory', -+ 'gluster=swift.common.middleware.gluster:filter_factory', - ], - }, - ) -diff --git a/swift/account/server.py b/swift/account/server.py -index 800b3c0..cb17970 100644 ---- a/swift/account/server.py -+++ b/swift/account/server.py -@@ -1,4 +1,5 @@ - # Copyright (c) 2010-2012 OpenStack, LLC. -+# Copyright (c) 2011 Red Hat, Inc. - # - # Licensed under the Apache License, Version 2.0 (the "License"); - # you may not use this file except in compliance with the License. -@@ -31,7 +32,7 @@ import simplejson - - from swift.common.db import AccountBroker - from swift.common.utils import get_logger, get_param, hash_path, \ -- normalize_timestamp, split_path, storage_directory -+ normalize_timestamp, split_path, storage_directory, plugin_enabled - from swift.common.constraints import ACCOUNT_LISTING_LIMIT, \ - check_mount, check_float, check_utf8 - from swift.common.db_replicator import ReplicatorRpc -@@ -39,6 +40,8 @@ from swift.common.db_replicator import ReplicatorRpc - - DATADIR = 'accounts' - -+if plugin_enabled(): -+ from swift.plugins.DiskDir import DiskAccount - - class AccountController(object): - """WSGI controller for the account server.""" -@@ -52,8 +55,12 @@ class AccountController(object): - self.mount_check, logger=self.logger) - self.auto_create_account_prefix = \ - conf.get('auto_create_account_prefix') or '.' -+ self.fs_object = None - - def _get_account_broker(self, drive, part, account): -+ if self.fs_object: -+ return DiskAccount(self.root, account, self.fs_object); -+ - hsh = hash_path(account) - db_dir = storage_directory(DATADIR, part, hsh) - db_path = os.path.join(self.root, drive, db_dir, hsh + '.db') -@@ -121,9 +128,15 @@ class AccountController(object): - if broker.is_deleted(): - return HTTPConflict(request=req) - metadata = {} -- metadata.update((key, (value, timestamp)) -- for key, value in req.headers.iteritems() -- if key.lower().startswith('x-account-meta-')) -+ if not self.fs_object: -+ metadata.update((key, (value, timestamp)) -+ for key, value in req.headers.iteritems() -+ if key.lower().startswith('x-account-meta-')) -+ else: -+ metadata.update((key, value) -+ for key, value in req.headers.iteritems() -+ if key.lower().startswith('x-account-meta-')) -+ - if metadata: - broker.update_metadata(metadata) - if created: -@@ -153,6 +166,9 @@ class AccountController(object): - broker.stale_reads_ok = True - if broker.is_deleted(): - return HTTPNotFound(request=req) -+ if self.fs_object and not self.fs_object.object_only: -+ broker.list_containers_iter(None, None,None, -+ None, None) - info = broker.get_info() - headers = { - 'X-Account-Container-Count': info['container_count'], -@@ -164,9 +180,16 @@ class AccountController(object): - container_ts = broker.get_container_timestamp(container) - if container_ts is not None: - headers['X-Container-Timestamp'] = container_ts -- headers.update((key, value) -- for key, (value, timestamp) in broker.metadata.iteritems() -- if value != '') -+ if not self.fs_object: -+ headers.update((key, value) -+ for key, (value, timestamp) in broker.metadata.iteritems() -+ if value != '') -+ else: -+ headers.update((key, value) -+ for key, value in broker.metadata.iteritems() -+ if value != '') -+ -+ - return HTTPNoContent(request=req, headers=headers) - - def GET(self, req): -@@ -190,9 +213,15 @@ class AccountController(object): - 'X-Account-Bytes-Used': info['bytes_used'], - 'X-Timestamp': info['created_at'], - 'X-PUT-Timestamp': info['put_timestamp']} -- resp_headers.update((key, value) -- for key, (value, timestamp) in broker.metadata.iteritems() -- if value != '') -+ if not self.fs_object: -+ resp_headers.update((key, value) -+ for key, (value, timestamp) in broker.metadata.iteritems() -+ if value != '') -+ else: -+ resp_headers.update((key, value) -+ for key, value in broker.metadata.iteritems() -+ if value != '') -+ - try: - prefix = get_param(req, 'prefix') - delimiter = get_param(req, 'delimiter') -@@ -224,6 +253,7 @@ class AccountController(object): - content_type='text/plain', request=req) - account_list = broker.list_containers_iter(limit, marker, end_marker, - prefix, delimiter) -+ - if out_content_type == 'application/json': - json_pattern = ['"name":%s', '"count":%s', '"bytes":%s'] - json_pattern = '{' + ','.join(json_pattern) + '}' -@@ -298,15 +328,29 @@ class AccountController(object): - return HTTPNotFound(request=req) - timestamp = normalize_timestamp(req.headers['x-timestamp']) - metadata = {} -- metadata.update((key, (value, timestamp)) -- for key, value in req.headers.iteritems() -- if key.lower().startswith('x-account-meta-')) -+ if not self.fs_object: -+ metadata.update((key, (value, timestamp)) -+ for key, value in req.headers.iteritems() -+ if key.lower().startswith('x-account-meta-')) -+ else: -+ metadata.update((key, value) -+ for key, value in req.headers.iteritems() -+ if key.lower().startswith('x-account-meta-')) - if metadata: - broker.update_metadata(metadata) - return HTTPNoContent(request=req) - -+ def plugin(self, env): -+ if env.get('Gluster_enabled', False): -+ self.fs_object = env.get('fs_object') -+ self.root = env.get('root') -+ self.mount_check = False -+ else: -+ self.fs_object = None -+ - def __call__(self, env, start_response): - start_time = time.time() -+ self.plugin(env) - req = Request(env) - self.logger.txn_id = req.headers.get('x-trans-id', None) - if not check_utf8(req.path_info): -diff --git a/swift/common/middleware/gluster.py b/swift/common/middleware/gluster.py -new file mode 100644 -index 0000000..341285d ---- /dev/null -+++ b/swift/common/middleware/gluster.py -@@ -0,0 +1,55 @@ -+# Copyright (c) 2011 Red Hat, Inc. -+# -+# Licensed under the Apache License, Version 2.0 (the "License"); -+# you may not use this file except in compliance with the License. -+# You may obtain a copy of the License at -+# -+# http://www.apache.org/licenses/LICENSE-2.0 -+# -+# Unless required by applicable law or agreed to in writing, software -+# distributed under the License is distributed on an "AS IS" BASIS, -+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -+# implied. -+# See the License for the specific language governing permissions and -+# limitations under the License. -+ -+from swift.common.utils import get_logger, plugin_enabled -+from swift import plugins -+from ConfigParser import ConfigParser -+ -+class Gluster_plugin(object): -+ """ -+ Update the environment with keys that reflect Gluster_plugin enabled -+ """ -+ -+ def __init__(self, app, conf): -+ self.app = app -+ self.conf = conf -+ self.fs_name = 'Glusterfs' -+ self.logger = get_logger(conf, log_route='gluster') -+ -+ def __call__(self, env, start_response): -+ if not plugin_enabled(): -+ return self.app(env, start_response) -+ env['Gluster_enabled'] =True -+ fs_object = getattr(plugins, self.fs_name, False) -+ if not fs_object: -+ raise Exception('%s plugin not found', self.fs_name) -+ -+ env['fs_object'] = fs_object() -+ fs_conf = ConfigParser() -+ if fs_conf.read('/etc/swift/fs.conf'): -+ try: -+ env['root'] = fs_conf.get ('DEFAULT', 'mount_path') -+ except NoSectionError, NoOptionError: -+ self.logger.exception(_('ERROR mount_path not present')) -+ return self.app(env, start_response) -+ -+def filter_factory(global_conf, **local_conf): -+ """Returns a WSGI filter app for use with paste.deploy.""" -+ conf = global_conf.copy() -+ conf.update(local_conf) -+ -+ def gluster_filter(app): -+ return Gluster_plugin(app, conf) -+ return gluster_filter -diff --git a/swift/common/utils.py b/swift/common/utils.py -index 47edce8..03701ce 100644 ---- a/swift/common/utils.py -+++ b/swift/common/utils.py -@@ -1,4 +1,5 @@ - # Copyright (c) 2010-2012 OpenStack, LLC. -+# Copyright (c) 2011 Red Hat, Inc. - # - # Licensed under the Apache License, Version 2.0 (the "License"); - # you may not use this file except in compliance with the License. -@@ -1138,3 +1139,11 @@ def streq_const_time(s1, s2): - for (a, b) in zip(s1, s2): - result |= ord(a) ^ ord(b) - return result == 0 -+ -+def plugin_enabled(): -+ swift_conf = ConfigParser() -+ swift_conf.read(os.path.join('/etc/swift', 'swift.conf')) -+ try: -+ return swift_conf.get('DEFAULT', 'Enable_plugin', 'no') in TRUE_VALUES -+ except NoOptionError, NoSectionError: -+ return False -diff --git a/swift/container/server.py b/swift/container/server.py -index 8a18cfd..93943a3 100644 ---- a/swift/container/server.py -+++ b/swift/container/server.py -@@ -1,4 +1,5 @@ - # Copyright (c) 2010-2012 OpenStack, LLC. -+# Copyright (c) 2011 Red Hat, Inc. - # - # Licensed under the Apache License, Version 2.0 (the "License"); - # you may not use this file except in compliance with the License. -@@ -31,7 +32,8 @@ from webob.exc import HTTPAccepted, HTTPBadRequest, HTTPConflict, \ - - from swift.common.db import ContainerBroker - from swift.common.utils import get_logger, get_param, hash_path, \ -- normalize_timestamp, storage_directory, split_path, validate_sync_to -+ normalize_timestamp, storage_directory, split_path, validate_sync_to, \ -+ plugin_enabled - from swift.common.constraints import CONTAINER_LISTING_LIMIT, \ - check_mount, check_float, check_utf8 - from swift.common.bufferedhttp import http_connect -@@ -40,6 +42,9 @@ from swift.common.db_replicator import ReplicatorRpc - - DATADIR = 'containers' - -+if plugin_enabled(): -+ from swift.plugins.DiskDir import DiskDir -+ - - class ContainerController(object): - """WSGI Controller for the container server.""" -@@ -62,6 +67,7 @@ class ContainerController(object): - ContainerBroker, self.mount_check, logger=self.logger) - self.auto_create_account_prefix = \ - conf.get('auto_create_account_prefix') or '.' -+ self.fs_object = None - - def _get_container_broker(self, drive, part, account, container): - """ -@@ -73,6 +79,11 @@ class ContainerController(object): - :param container: container name - :returns: ContainerBroker object - """ -+ if self.fs_object: -+ return DiskDir(self.root, drive, part, account, -+ container, self.logger, -+ fs_object = self.fs_object) -+ - hsh = hash_path(account, container) - db_dir = storage_directory(DATADIR, part, hsh) - db_path = os.path.join(self.root, drive, db_dir, hsh + '.db') -@@ -211,10 +222,18 @@ class ContainerController(object): - if broker.is_deleted(): - return HTTPConflict(request=req) - metadata = {} -- metadata.update((key, (value, timestamp)) -- for key, value in req.headers.iteritems() -- if key.lower() in self.save_headers or -- key.lower().startswith('x-container-meta-')) -+ #Note: check the structure of req.headers -+ if not self.fs_object: -+ metadata.update((key, (value, timestamp)) -+ for key, value in req.headers.iteritems() -+ if key.lower() in self.save_headers or -+ key.lower().startswith('x-container-meta-')) -+ else: -+ metadata.update((key, value) -+ for key, value in req.headers.iteritems() -+ if key.lower() in self.save_headers or -+ key.lower().startswith('x-container-meta-')) -+ - if metadata: - if 'X-Container-Sync-To' in metadata: - if 'X-Container-Sync-To' not in broker.metadata or \ -@@ -222,6 +241,7 @@ class ContainerController(object): - broker.metadata['X-Container-Sync-To'][0]: - broker.set_x_container_sync_points(-1, -1) - broker.update_metadata(metadata) -+ - resp = self.account_update(req, account, container, broker) - if resp: - return resp -@@ -245,6 +265,11 @@ class ContainerController(object): - broker.stale_reads_ok = True - if broker.is_deleted(): - return HTTPNotFound(request=req) -+ -+ if self.fs_object and not self.fs_object.object_only: -+ broker.list_objects_iter(None, None, None, None, -+ None, None) -+ - info = broker.get_info() - headers = { - 'X-Container-Object-Count': info['object_count'], -@@ -252,10 +277,17 @@ class ContainerController(object): - 'X-Timestamp': info['created_at'], - 'X-PUT-Timestamp': info['put_timestamp'], - } -- headers.update((key, value) -- for key, (value, timestamp) in broker.metadata.iteritems() -- if value != '' and (key.lower() in self.save_headers or -- key.lower().startswith('x-container-meta-'))) -+ if not self.fs_object: -+ headers.update((key, value) -+ for key, (value, timestamp) in broker.metadata.iteritems() -+ if value != '' and (key.lower() in self.save_headers or -+ key.lower().startswith('x-container-meta-'))) -+ else: -+ headers.update((key, value) -+ for key, value in broker.metadata.iteritems() -+ if value != '' and (key.lower() in self.save_headers or -+ key.lower().startswith('x-container-meta-'))) -+ - return HTTPNoContent(request=req, headers=headers) - - def GET(self, req): -@@ -268,6 +300,7 @@ class ContainerController(object): - request=req) - if self.mount_check and not check_mount(self.root, drive): - return Response(status='507 %s is not mounted' % drive) -+ - broker = self._get_container_broker(drive, part, account, container) - broker.pending_timeout = 0.1 - broker.stale_reads_ok = True -@@ -280,10 +313,17 @@ class ContainerController(object): - 'X-Timestamp': info['created_at'], - 'X-PUT-Timestamp': info['put_timestamp'], - } -- resp_headers.update((key, value) -- for key, (value, timestamp) in broker.metadata.iteritems() -- if value != '' and (key.lower() in self.save_headers or -- key.lower().startswith('x-container-meta-'))) -+ if not self.fs_object: -+ resp_headers.update((key, value) -+ for key, (value, timestamp) in broker.metadata.iteritems() -+ if value != '' and (key.lower() in self.save_headers or -+ key.lower().startswith('x-container-meta-'))) -+ else: -+ resp_headers.update((key, value) -+ for key, value in broker.metadata.iteritems() -+ if value != '' and (key.lower() in self.save_headers or -+ key.lower().startswith('x-container-meta-'))) -+ - try: - path = get_param(req, 'path') - prefix = get_param(req, 'prefix') -@@ -414,10 +454,17 @@ class ContainerController(object): - return HTTPNotFound(request=req) - timestamp = normalize_timestamp(req.headers['x-timestamp']) - metadata = {} -- metadata.update((key, (value, timestamp)) -- for key, value in req.headers.iteritems() -- if key.lower() in self.save_headers or -- key.lower().startswith('x-container-meta-')) -+ if not self.fs_object: -+ metadata.update((key, (value, timestamp)) -+ for key, value in req.headers.iteritems() -+ if key.lower() in self.save_headers or -+ key.lower().startswith('x-container-meta-')) -+ else: -+ metadata.update((key, value) -+ for key, value in req.headers.iteritems() -+ if key.lower() in self.save_headers or -+ key.lower().startswith('x-container-meta-')) -+ - if metadata: - if 'X-Container-Sync-To' in metadata: - if 'X-Container-Sync-To' not in broker.metadata or \ -@@ -427,8 +474,19 @@ class ContainerController(object): - broker.update_metadata(metadata) - return HTTPNoContent(request=req) - -+ def plugin(self, env): -+ if env.get('Gluster_enabled', False): -+ self.fs_object = env.get('fs_object') -+ if not self.fs_object: -+ raise NoneTypeError -+ self.root = env.get('root') -+ self.mount_check = False -+ else: -+ self.fs_object = None -+ - def __call__(self, env, start_response): - start_time = time.time() -+ self.plugin(env) - req = Request(env) - self.logger.txn_id = req.headers.get('x-trans-id', None) - if not check_utf8(req.path_info): -diff --git a/swift/obj/server.py b/swift/obj/server.py -index 9cca16b..a45daff 100644 ---- a/swift/obj/server.py -+++ b/swift/obj/server.py -@@ -1,4 +1,5 @@ - # Copyright (c) 2010-2012 OpenStack, LLC. -+# Copyright (c) 2011 Red Hat, Inc. - # - # Licensed under the Apache License, Version 2.0 (the "License"); - # you may not use this file except in compliance with the License. -@@ -26,6 +27,7 @@ from hashlib import md5 - from tempfile import mkstemp - from urllib import unquote - from contextlib import contextmanager -+from ConfigParser import ConfigParser - - from webob import Request, Response, UTC - from webob.exc import HTTPAccepted, HTTPBadRequest, HTTPCreated, \ -@@ -37,16 +39,23 @@ from eventlet import sleep, Timeout, tpool - - from swift.common.utils import mkdirs, normalize_timestamp, \ - storage_directory, hash_path, renamer, fallocate, \ -- split_path, drop_buffer_cache, get_logger, write_pickle -+ split_path, drop_buffer_cache, get_logger, write_pickle, \ -+ plugin_enabled - from swift.common.bufferedhttp import http_connect --from swift.common.constraints import check_object_creation, check_mount, \ -- check_float, check_utf8 -+if plugin_enabled(): -+ from swift.plugins.constraints import check_object_creation -+ from swift.plugins.utils import X_TYPE, X_OBJECT_TYPE, FILE, DIR, MARKER_DIR, \ -+ OBJECT, DIR_TYPE, FILE_TYPE -+else: -+ from swift.common.constraints import check_object_creation -+ -+from swift.common.constraints import check_mount, check_float, check_utf8 -+ - from swift.common.exceptions import ConnectionTimeout, DiskFileError, \ - DiskFileNotExist - from swift.obj.replicator import tpooled_get_hashes, invalidate_hash, \ - quarantine_renamer - -- - DATADIR = 'objects' - ASYNCDIR = 'async_pending' - PICKLE_PROTOCOL = 2 -@@ -339,6 +348,9 @@ class DiskFile(object): - raise - raise DiskFileNotExist('Data File does not exist.') - -+if plugin_enabled(): -+ from swift.plugins.DiskFile import Gluster_DiskFile -+ - - class ObjectController(object): - """Implements the WSGI application for the Swift Object Server.""" -@@ -377,6 +389,17 @@ class ObjectController(object): - 'expiring_objects' - self.expiring_objects_container_divisor = \ - int(conf.get('expiring_objects_container_divisor') or 86400) -+ self.fs_object = None -+ -+ def get_DiskFile_obj(self, path, device, partition, account, container, obj, -+ logger, keep_data_fp=False, disk_chunk_size=65536): -+ if self.fs_object: -+ return Gluster_DiskFile(path, device, partition, account, container, -+ obj, logger, keep_data_fp, -+ disk_chunk_size, fs_object = self.fs_object); -+ else: -+ return DiskFile(path, device, partition, account, container, -+ obj, logger, keep_data_fp, disk_chunk_size) - - def async_update(self, op, account, container, obj, host, partition, - contdevice, headers_out, objdevice): -@@ -493,7 +516,7 @@ class ObjectController(object): - content_type='text/plain') - if self.mount_check and not check_mount(self.devices, device): - return Response(status='507 %s is not mounted' % device) -- file = DiskFile(self.devices, device, partition, account, container, -+ file = self.get_DiskFile_obj(self.devices, device, partition, account, container, - obj, self.logger, disk_chunk_size=self.disk_chunk_size) - - if 'X-Delete-At' in file.metadata and \ -@@ -548,7 +571,7 @@ class ObjectController(object): - if new_delete_at and new_delete_at < time.time(): - return HTTPBadRequest(body='X-Delete-At in past', request=request, - content_type='text/plain') -- file = DiskFile(self.devices, device, partition, account, container, -+ file = self.get_DiskFile_obj(self.devices, device, partition, account, container, - obj, self.logger, disk_chunk_size=self.disk_chunk_size) - orig_timestamp = file.metadata.get('X-Timestamp') - upload_expiration = time.time() + self.max_upload_time -@@ -580,12 +603,29 @@ class ObjectController(object): - if 'etag' in request.headers and \ - request.headers['etag'].lower() != etag: - return HTTPUnprocessableEntity(request=request) -- metadata = { -- 'X-Timestamp': request.headers['x-timestamp'], -- 'Content-Type': request.headers['content-type'], -- 'ETag': etag, -- 'Content-Length': str(os.fstat(fd).st_size), -- } -+ content_type = request.headers['content-type'] -+ if self.fs_object and not content_type: -+ content_type = FILE_TYPE -+ if not self.fs_object: -+ metadata = { -+ 'X-Timestamp': request.headers['x-timestamp'], -+ 'Content-Type': request.headers['content-type'], -+ 'ETag': etag, -+ 'Content-Length': str(os.fstat(fd).st_size), -+ } -+ else: -+ metadata = { -+ 'X-Timestamp': request.headers['x-timestamp'], -+ 'Content-Type': request.headers['content-type'], -+ 'ETag': etag, -+ 'Content-Length': str(os.fstat(fd).st_size), -+ X_TYPE: OBJECT, -+ X_OBJECT_TYPE: FILE, -+ } -+ -+ if self.fs_object and \ -+ request.headers['content-type'].lower() == DIR_TYPE: -+ metadata.update({X_OBJECT_TYPE: MARKER_DIR}) - metadata.update(val for val in request.headers.iteritems() - if val[0].lower().startswith('x-object-meta-') and - len(val[0]) > 14) -@@ -612,7 +652,7 @@ class ObjectController(object): - 'x-timestamp': file.metadata['X-Timestamp'], - 'x-etag': file.metadata['ETag'], - 'x-trans-id': request.headers.get('x-trans-id', '-')}, -- device) -+ (self.fs_object and account) or device) - resp = HTTPCreated(request=request, etag=etag) - return resp - -@@ -626,9 +666,9 @@ class ObjectController(object): - content_type='text/plain') - if self.mount_check and not check_mount(self.devices, device): - return Response(status='507 %s is not mounted' % device) -- file = DiskFile(self.devices, device, partition, account, container, -- obj, self.logger, keep_data_fp=True, -- disk_chunk_size=self.disk_chunk_size) -+ file = self.get_DiskFile_obj(self.devices, device, partition, account, container, -+ obj, self.logger, keep_data_fp=True, -+ disk_chunk_size=self.disk_chunk_size) - if file.is_deleted() or ('X-Delete-At' in file.metadata and - int(file.metadata['X-Delete-At']) <= time.time()): - if request.headers.get('if-match') == '*': -@@ -702,7 +742,7 @@ class ObjectController(object): - return resp - if self.mount_check and not check_mount(self.devices, device): - return Response(status='507 %s is not mounted' % device) -- file = DiskFile(self.devices, device, partition, account, container, -+ file = self.get_DiskFile_obj(self.devices, device, partition, account, container, - obj, self.logger, disk_chunk_size=self.disk_chunk_size) - if file.is_deleted() or ('X-Delete-At' in file.metadata and - int(file.metadata['X-Delete-At']) <= time.time()): -@@ -744,7 +784,7 @@ class ObjectController(object): - if self.mount_check and not check_mount(self.devices, device): - return Response(status='507 %s is not mounted' % device) - response_class = HTTPNoContent -- file = DiskFile(self.devices, device, partition, account, container, -+ file = self.get_DiskFile_obj(self.devices, device, partition, account, container, - obj, self.logger, disk_chunk_size=self.disk_chunk_size) - if 'x-if-delete-at' in request.headers and \ - int(request.headers['x-if-delete-at']) != \ -@@ -797,9 +837,18 @@ class ObjectController(object): - raise hashes - return Response(body=pickle.dumps(hashes)) - -+ def plugin(self, env): -+ if env.get('Gluster_enabled', False): -+ self.fs_object = env.get('fs_object') -+ self.devices = env.get('root') -+ self.mount_check = False -+ else: -+ self.fs_object = None -+ - def __call__(self, env, start_response): - """WSGI Application entry point for the Swift Object Server.""" - start_time = time.time() -+ self.plugin(env) - req = Request(env) - self.logger.txn_id = req.headers.get('x-trans-id', None) - if not check_utf8(req.path_info): -diff --git a/swift/proxy/server.py b/swift/proxy/server.py -index 17613b8..d277d28 100644 ---- a/swift/proxy/server.py -+++ b/swift/proxy/server.py -@@ -1,4 +1,5 @@ - # Copyright (c) 2010-2012 OpenStack, LLC. -+# Copyright (c) 2011 Red Hat, Inc. - # - # Licensed under the Apache License, Version 2.0 (the "License"); - # you may not use this file except in compliance with the License. -@@ -53,11 +54,20 @@ from webob import Request, Response - - from swift.common.ring import Ring - from swift.common.utils import cache_from_env, ContextPool, get_logger, \ -- get_remote_client, normalize_timestamp, split_path, TRUE_VALUES -+ get_remote_client, normalize_timestamp, split_path, TRUE_VALUES, \ -+ plugin_enabled - from swift.common.bufferedhttp import http_connect --from swift.common.constraints import check_metadata, check_object_creation, \ -- check_utf8, CONTAINER_LISTING_LIMIT, MAX_ACCOUNT_NAME_LENGTH, \ -- MAX_CONTAINER_NAME_LENGTH, MAX_FILE_SIZE -+ -+if plugin_enabled(): -+ from swift.plugins.constraints import check_object_creation, \ -+ MAX_ACCOUNT_NAME_LENGTH, MAX_CONTAINER_NAME_LENGTH, MAX_FILE_SIZE -+else: -+ from swift.common.constraints import check_object_creation, \ -+ MAX_ACCOUNT_NAME_LENGTH, MAX_CONTAINER_NAME_LENGTH, MAX_FILE_SIZE -+ -+from swift.common.constraints import check_metadata, check_utf8, \ -+ CONTAINER_LISTING_LIMIT -+ - from swift.common.exceptions import ChunkReadTimeout, \ - ChunkWriteTimeout, ConnectionTimeout - -diff --git a/test/__init__.py b/test/__init__.py -index ef2ce31..363a051 100644 ---- a/test/__init__.py -+++ b/test/__init__.py -@@ -6,8 +6,16 @@ import sys - import os - from ConfigParser import MissingSectionHeaderError - from StringIO import StringIO -- - from swift.common.utils import readconf -+from swift.common.utils import plugin_enabled -+if plugin_enabled(): -+ from swift.plugins.constraints import MAX_OBJECT_NAME_LENGTH, \ -+ MAX_CONTAINER_NAME_LENGTH, MAX_ACCOUNT_NAME_LENGTH, \ -+ MAX_FILE_SIZE -+else: -+ from swift.common.constraints import MAX_OBJECT_NAME_LENGTH, \ -+ MAX_CONTAINER_NAME_LENGTH, MAX_ACCOUNT_NAME_LENGTH, \ -+ MAX_FILE_SIZE - - setattr(__builtin__, '_', lambda x: x) - -diff --git a/test/functional/tests.py b/test/functional/tests.py -index b25b4fd..8d12f58 100644 ---- a/test/functional/tests.py -+++ b/test/functional/tests.py -@@ -31,6 +31,16 @@ import urllib - from test import get_config - from swift import Account, AuthenticationFailed, Connection, Container, \ - File, ResponseError -+from test import plugin_enabled -+if plugin_enabled(): -+ from test import MAX_OBJECT_NAME_LENGTH, \ -+ MAX_CONTAINER_NAME_LENGTH, MAX_ACCOUNT_NAME_LENGTH, \ -+ MAX_FILE_SIZE -+else: -+ from test import MAX_OBJECT_NAME_LENGTH, \ -+ MAX_CONTAINER_NAME_LENGTH, MAX_ACCOUNT_NAME_LENGTH, \ -+ MAX_FILE_SIZE -+ - - config = get_config() - -@@ -361,7 +371,7 @@ class TestContainer(Base): - set_up = False - - def testContainerNameLimit(self): -- limit = 256 -+ limit = MAX_CONTAINER_NAME_LENGTH - - for l in (limit-100, limit-10, limit-1, limit, - limit+1, limit+10, limit+100): -@@ -949,7 +959,7 @@ class TestFile(Base): - self.assert_status(404) - - def testNameLimit(self): -- limit = 1024 -+ limit = MAX_OBJECT_NAME_LENGTH - - for l in (1, 10, limit/2, limit-1, limit, limit+1, limit*2): - file = self.env.container.file('a'*l) -@@ -1093,7 +1103,7 @@ class TestFile(Base): - self.assert_(file.read(hdrs={'Range': r}) == data[0:1000]) - - def testFileSizeLimit(self): -- limit = 5*2**30 + 2 -+ limit = MAX_FILE_SIZE - tsecs = 3 - - for i in (limit-100, limit-10, limit-1, limit, limit+1, limit+10, -diff --git a/test/unit/obj/test_server.py b/test/unit/obj/test_server.py -index 075700e..5b6f32d 100644 ---- a/test/unit/obj/test_server.py -+++ b/test/unit/obj/test_server.py -@@ -1355,7 +1355,7 @@ class TestObjectController(unittest.TestCase): - - def test_max_object_name_length(self): - timestamp = normalize_timestamp(time()) -- req = Request.blank('/sda1/p/a/c/' + ('1' * 1024), -+ req = Request.blank('/sda1/p/a/c/' + ('1' * MAX_OBJECT_NAME_LENGTH), - environ={'REQUEST_METHOD': 'PUT'}, - headers={'X-Timestamp': timestamp, - 'Content-Length': '4', -diff --git a/test/unit/proxy/test_server.py b/test/unit/proxy/test_server.py -index 364370e..c17fe59 100644 ---- a/test/unit/proxy/test_server.py -+++ b/test/unit/proxy/test_server.py -@@ -21,7 +21,6 @@ import os - import sys - import unittest - from nose import SkipTest --from ConfigParser import ConfigParser - from contextlib import contextmanager - from cStringIO import StringIO - from gzip import GzipFile -@@ -44,8 +43,18 @@ from swift.account import server as account_server - from swift.container import server as container_server - from swift.obj import server as object_server - from swift.common import ring --from swift.common.constraints import MAX_META_NAME_LENGTH, \ -- MAX_META_VALUE_LENGTH, MAX_META_COUNT, MAX_META_OVERALL_SIZE, MAX_FILE_SIZE -+from swift.common.utils import plugin_enabled -+if plugin_enabled(): -+ from swift.plugins.constraints import MAX_META_NAME_LENGTH, \ -+ MAX_META_VALUE_LENGTH, MAX_META_COUNT, MAX_META_OVERALL_SIZE, \ -+ MAX_FILE_SIZE, MAX_ACCOUNT_NAME_LENGTH, MAX_CONTAINER_NAME_LENGTH, \ -+ MAX_OBJECT_NAME_LENGTH -+else: -+ from swift.plugins.constraints import MAX_META_NAME_LENGTH, \ -+ MAX_META_VALUE_LENGTH, MAX_META_COUNT, MAX_META_OVERALL_SIZE, \ -+ MAX_FILE_SIZE, MAX_ACCOUNT_NAME_LENGTH, MAX_CONTAINER_NAME_LENGTH, \ -+ MAX_OBJECT_NAME_LENGTH -+ - from swift.common.utils import mkdirs, normalize_timestamp, NullLogger - from swift.common.wsgi import monkey_patch_mimetools - -@@ -3207,7 +3216,8 @@ class TestContainerController(unittest.TestCase): - def test_PUT_max_container_name_length(self): - with save_globals(): - controller = proxy_server.ContainerController(self.app, 'account', -- '1' * 256) -+ '1' * -+ MAX_CONTAINER_NAME_LENGTH,) - self.assert_status_map(controller.PUT, - (200, 200, 200, 201, 201, 201), 201, - missing_container=True) -@@ -3813,7 +3823,8 @@ class TestAccountController(unittest.TestCase): - def test_PUT_max_account_name_length(self): - with save_globals(): - self.app.allow_account_management = True -- controller = proxy_server.AccountController(self.app, '1' * 256) -+ controller = proxy_server.AccountController(self.app, '1' * -+ MAX_ACCOUNT_NAME_LENGTH) - self.assert_status_map(controller.PUT, (201, 201, 201), 201) - controller = proxy_server.AccountController(self.app, '2' * 257) - self.assert_status_map(controller.PUT, (201, 201, 201), 400) diff --git a/glusterfs-3.3.0.xlator.mount.fuse.fuse-bridge.c.patch b/glusterfs-3.3.0.xlator.mount.fuse.fuse-bridge.c.patch deleted file mode 100644 index 13fbb58..0000000 --- a/glusterfs-3.3.0.xlator.mount.fuse.fuse-bridge.c.patch +++ /dev/null @@ -1,76 +0,0 @@ ---- xlators/mount/fuse/src/fuse-bridge.c.orig -+++ xlators/mount/fuse/src/fuse-bridge.c -@@ -4198,13 +4198,11 @@ fuse_thread_proc (void *data) - finh->uid == priv->uid_map_root) - finh->uid = 0; - --#ifdef GF_DARWIN_HOST_OS - if (finh->opcode >= FUSE_OP_HIGH) - /* turn down MacFUSE specific messages */ - fuse_enosys (this, finh, msg); - else --#endif -- fuse_ops[finh->opcode] (this, finh, msg); -+ fuse_ops[finh->opcode] (this, finh, msg); - - iobuf_unref (iobuf); - continue; -@@ -4423,40 +4421,47 @@ mem_acct_init (xlator_t *this) - - - static fuse_handler_t *fuse_std_ops[FUSE_OP_HIGH] = { -- [FUSE_INIT] = fuse_init, -- [FUSE_DESTROY] = fuse_destroy, - [FUSE_LOOKUP] = fuse_lookup, - [FUSE_FORGET] = fuse_forget, - [FUSE_GETATTR] = fuse_getattr, - [FUSE_SETATTR] = fuse_setattr, -- [FUSE_OPENDIR] = fuse_opendir, -- [FUSE_READDIR] = fuse_readdir, -- [FUSE_RELEASEDIR] = fuse_releasedir, -- [FUSE_ACCESS] = fuse_access, - [FUSE_READLINK] = fuse_readlink, -+ [FUSE_SYMLINK] = fuse_symlink, - [FUSE_MKNOD] = fuse_mknod, - [FUSE_MKDIR] = fuse_mkdir, - [FUSE_UNLINK] = fuse_unlink, - [FUSE_RMDIR] = fuse_rmdir, -- [FUSE_SYMLINK] = fuse_symlink, - [FUSE_RENAME] = fuse_rename, - [FUSE_LINK] = fuse_link, -- [FUSE_CREATE] = fuse_create, - [FUSE_OPEN] = fuse_open, - [FUSE_READ] = fuse_readv, - [FUSE_WRITE] = fuse_write, -- [FUSE_FLUSH] = fuse_flush, -+ [FUSE_STATFS] = fuse_statfs, - [FUSE_RELEASE] = fuse_release, - [FUSE_FSYNC] = fuse_fsync, -- [FUSE_FSYNCDIR] = fuse_fsyncdir, -- [FUSE_STATFS] = fuse_statfs, - [FUSE_SETXATTR] = fuse_setxattr, - [FUSE_GETXATTR] = fuse_getxattr, - [FUSE_LISTXATTR] = fuse_listxattr, - [FUSE_REMOVEXATTR] = fuse_removexattr, -+ [FUSE_FLUSH] = fuse_flush, -+ [FUSE_INIT] = fuse_init, -+ [FUSE_OPENDIR] = fuse_opendir, -+ [FUSE_READDIR] = fuse_readdir, -+ [FUSE_RELEASEDIR] = fuse_releasedir, -+ [FUSE_FSYNCDIR] = fuse_fsyncdir, - [FUSE_GETLK] = fuse_getlk, - [FUSE_SETLK] = fuse_setlk, - [FUSE_SETLKW] = fuse_setlk, -+ [FUSE_ACCESS] = fuse_access, -+ [FUSE_CREATE] = fuse_create, -+ /* [FUSE_INTERRUPT] */ -+ /* [FUSE_BMAP] */ -+ [FUSE_DESTROY] = fuse_destroy, -+ /* [FUSE_IOCTL] */ -+ /* [FUSE_POLL] */ -+ /* [FUSE_NOTIFY_REPLY] */ -+ /* [FUSE_BATCH_FORGET] */ -+ /* [FUSE_FALLOCATE] */ - }; - - diff --git a/glusterfs-3.3.1.rpc.rpcxprt.rdma.name.c.patch b/glusterfs-3.3.1.rpc.rpcxprt.rdma.name.c.patch deleted file mode 100644 index 67367ae..0000000 --- a/glusterfs-3.3.1.rpc.rpcxprt.rdma.name.c.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/rpc/rpc-transport/rdma/src/name.c 2012-10-11 13:38:22.000000000 -0400 -+++ b/rpc/rpc-transport/rdma/src/name.c 2013-04-12 13:50:07.000000000 -0400 -@@ -352,6 +352,8 @@ - if (listen_port_data) { - listen_port = data_to_uint16 (listen_port_data); - } else { -+ listen_port = GF_DEFAULT_RDMA_LISTEN_PORT; -+ - if (addr->sa_family == AF_INET6) { - struct sockaddr_in6 *in = (struct sockaddr_in6 *) addr; - in->sin6_addr = in6addr_any; diff --git a/glusterfs-3.3.1.swift.constraints.backport-1.7.4.patch b/glusterfs-3.3.1.swift.constraints.backport-1.7.4.patch deleted file mode 100644 index 78e3220..0000000 --- a/glusterfs-3.3.1.swift.constraints.backport-1.7.4.patch +++ /dev/null @@ -1,567 +0,0 @@ -From 9ce581c9c548c6a843e682f79f9ae510121501ac Mon Sep 17 00:00:00 2001 -From: Peter Portante -Date: Thu, 4 Oct 2012 11:32:56 -0400 -Subject: [PATCH] Backport commit a2ac5efaa64f57fbbe059066c6c4636dfd0715c2, - 'swift constraints are now settable via config', excluding - PEP8 changes that did not involve the constraints. - ---- - etc/swift.conf-sample | 73 ++++++++++++++++++++++++++++++++++ - swift/common/constraints.py | 29 +++++++++++++ - swift/container/sync.py | 8 +++- - test/functional/tests.py | 63 ++++++++++++++++++++++++----- - test/sample.conf | 15 +++++++ - test/unit/common/test_constraints.py | 9 +++- - test/unit/obj/test_server.py | 6 ++- - test/unit/proxy/test_server.py | 50 ++++++++++++++--------- - 8 files changed, 218 insertions(+), 35 deletions(-) - -diff --git a/etc/swift.conf-sample b/etc/swift.conf-sample -index 7e1c31d..2f4192a 100644 ---- a/etc/swift.conf-sample -+++ b/etc/swift.conf-sample -@@ -1,3 +1,76 @@ - [swift-hash] -+ -+# swift_hash_path_suffix is used as part of the hashing algorithm -+# when determining data placement in the cluster. This value should -+# remain secret and MUST NOT change once a cluster has been deployed. -+ - swift_hash_path_suffix = changeme - -+ -+ -+# The swift-constraints section sets the basic constraints on data -+# saved in the swift cluster. -+ -+[swift-constraints] -+ -+# max_file_size is the largest "normal" object that can be saved in -+# the cluster. This is also the limit on the size of each segment of -+# a "large" object when using the large object manifest support. -+# This value is set in bytes. Setting it to lower than 1MiB will cause -+# some tests to fail. It is STRONGLY recommended to leave this value at -+# the default (5 * 2**30 + 2). -+ -+#max_file_size = 5368709122 -+ -+ -+# max_meta_name_length is the max number of bytes in the utf8 encoding -+# of the name portion of a metadata header. -+ -+#max_meta_name_length = 128 -+ -+ -+# max_meta_value_length is the max number of bytes in the utf8 encoding -+# of a metadata value -+ -+#max_meta_value_length = 256 -+ -+ -+# max_meta_count is the max number of metadata keys that can be stored -+# on a single account, container, or object -+ -+#max_meta_count = 90 -+ -+ -+# max_meta_overall_size is the max number of bytes in the utf8 encoding -+# of the metadata (keys + values) -+ -+#max_meta_overall_size = 4096 -+ -+ -+# max_object_name_length is the max number of bytes in the utf8 encoding -+# of an object name -+ -+#max_object_name_length = 1024 -+ -+ -+# container_listing_limit is the default (and max) number of items -+# returned for a container listing request -+ -+#container_listing_limit = 10000 -+ -+ -+# account_listing_limit is the default (and max) number of items returned -+# for an account listing request -+#account_listing_limit = 10000 -+ -+ -+# max_account_name_length is the max number of bytes in the utf8 encoding -+# of an account name -+ -+#max_account_name_length = 256 -+ -+ -+# max_container_name_length is the max number of bytes in the utf8 encoding -+# of a container name -+ -+#max_container_name_length = 256 -diff --git a/swift/common/constraints.py b/swift/common/constraints.py -index a797b8b..0083346 100644 ---- a/swift/common/constraints.py -+++ b/swift/common/constraints.py -@@ -14,29 +14,58 @@ - # limitations under the License. - - import os -+from ConfigParser import ConfigParser, NoSectionError, NoOptionError, \ -+ RawConfigParser - - from webob.exc import HTTPBadRequest, HTTPLengthRequired, \ - HTTPRequestEntityTooLarge - -+constraints_conf = ConfigParser() -+constraints_conf.read('/etc/swift/swift.conf') -+ -+ -+def constraints_conf_int(name, default): -+ try: -+ return int(constraints_conf.get('swift-constraints', name)) -+ except (NoSectionError, NoOptionError): -+ return default -+ - - #: Max file size allowed for objects - MAX_FILE_SIZE = 5 * 1024 * 1024 * 1024 + 2 -+MAX_FILE_SIZE = constraints_conf_int('max_file_size', -+ 5368709122) # 5 * 1024 * 1024 * 1024 + 2 - #: Max length of the name of a key for metadata - MAX_META_NAME_LENGTH = 128 -+MAX_META_NAME_LENGTH = constraints_conf_int('max_meta_name_length', 128) - #: Max length of the value of a key for metadata - MAX_META_VALUE_LENGTH = 256 -+MAX_META_VALUE_LENGTH = constraints_conf_int('max_meta_value_length', 256) - #: Max number of metadata items - MAX_META_COUNT = 90 -+MAX_META_COUNT = constraints_conf_int('max_meta_count', 90) - #: Max overall size of metadata - MAX_META_OVERALL_SIZE = 4096 -+MAX_META_OVERALL_SIZE = constraints_conf_int('max_meta_overall_size', 4096) - #: Max object name length - MAX_OBJECT_NAME_LENGTH = 1024 -+MAX_OBJECT_NAME_LENGTH = constraints_conf_int('max_object_name_length', 1024) - #: Max object list length of a get request for a container - CONTAINER_LISTING_LIMIT = 10000 -+CONTAINER_LISTING_LIMIT = constraints_conf_int('container_listing_limit', -+ 10000) - #: Max container list length of a get request for an account - ACCOUNT_LISTING_LIMIT = 10000 - MAX_ACCOUNT_NAME_LENGTH = 256 - MAX_CONTAINER_NAME_LENGTH = 256 -+ACCOUNT_LISTING_LIMIT = constraints_conf_int('account_listing_limit', 10000) -+#: Max account name length -+MAX_ACCOUNT_NAME_LENGTH = constraints_conf_int('max_account_name_length', 256) -+#: Max container name length -+MAX_CONTAINER_NAME_LENGTH = constraints_conf_int('max_container_name_length', -+ 256) -+ -+ - #: Query string format= values to their corresponding content-type values - FORMAT2CONTENT_TYPE = {'plain': 'text/plain', 'json': 'application/json', - 'xml': 'application/xml'} -diff --git a/swift/container/sync.py b/swift/container/sync.py -index d7152ac..472d33a 100644 ---- a/swift/container/sync.py -+++ b/swift/container/sync.py -@@ -21,8 +21,12 @@ from eventlet import sleep, Timeout - - import swift.common.db - from swift.container import server as container_server --from swiftclient import ClientException, delete_object, put_object, \ -- quote -+try: -+ from swiftclient import ClientException, delete_object, put_object, \ -+ quote -+except: -+ import sys -+ raise Exception("\n".join(sys.path)) - from swift.common.direct_client import direct_get_object - from swift.common.ring import Ring - from swift.common.db import ContainerBroker -diff --git a/test/functional/tests.py b/test/functional/tests.py -index a412f83..bcdd76f 100644 ---- a/test/functional/tests.py -+++ b/test/functional/tests.py -@@ -15,6 +15,7 @@ - # limitations under the License. - - from datetime import datetime -+from ConfigParser import ConfigParser - import locale - import random - import StringIO -@@ -26,8 +27,50 @@ from nose import SkipTest - - from test import get_config - from test.functional.swift import Account, Connection, File, ResponseError -- -+from swift.common.constraints import MAX_FILE_SIZE, MAX_META_NAME_LENGTH, \ -+ MAX_META_VALUE_LENGTH, MAX_META_COUNT, MAX_META_OVERALL_SIZE, \ -+ MAX_OBJECT_NAME_LENGTH, CONTAINER_LISTING_LIMIT, ACCOUNT_LISTING_LIMIT, \ -+ MAX_ACCOUNT_NAME_LENGTH, MAX_CONTAINER_NAME_LENGTH -+ -+default_constraints = dict(( -+ ('max_file_size', MAX_FILE_SIZE), -+ ('max_meta_name_length', MAX_META_NAME_LENGTH), -+ ('max_meta_value_length', MAX_META_VALUE_LENGTH), -+ ('max_meta_count', MAX_META_COUNT), -+ ('max_meta_overall_size', MAX_META_OVERALL_SIZE), -+ ('max_object_name_length', MAX_OBJECT_NAME_LENGTH), -+ ('container_listing_limit', CONTAINER_LISTING_LIMIT), -+ ('account_listing_limit', ACCOUNT_LISTING_LIMIT), -+ ('max_account_name_length', MAX_ACCOUNT_NAME_LENGTH), -+ ('max_container_name_length', MAX_CONTAINER_NAME_LENGTH))) -+constraints_conf = ConfigParser() -+conf_exists = constraints_conf.read('/etc/swift/swift.conf') -+# Constraints are set first from the test config, then from -+# /etc/swift/swift.conf if it exists. If swift.conf doesn't exist, -+# then limit test coverage. This allows SAIO tests to work fine but -+# requires remote funtional testing to know something about the cluster -+# that is being tested. - config = get_config('func_test') -+for k in default_constraints: -+ if k in config: -+ # prefer what's in test.conf -+ config[k] = int(config[k]) -+ elif conf_exists: -+ # swift.conf exists, so use what's defined there (or swift defaults) -+ # This normally happens when the test is running locally to the cluster -+ # as in a SAIO. -+ config[k] = default_constraints[k] -+ else: -+ # .functests don't know what the constraints of the tested cluster are, -+ # so the tests can't reliably pass or fail. Therefore, skip those -+ # tests. -+ config[k] = '%s constraint is not defined' % k -+ -+def load_constraint(name): -+ c = config[name] -+ if not isinstance(c, int): -+ raise SkipTest(c) -+ return c - - locale.setlocale(locale.LC_COLLATE, config.get('collate', 'C')) - -@@ -225,8 +268,7 @@ class TestAccount(Base): - 'application/xml; charset=utf-8') - - def testListingLimit(self): -- limit = 10000 -- -+ limit = load_constraint('account_listing_limit') - for l in (1, 100, limit/2, limit-1, limit, limit+1, limit*2): - p = {'limit':l} - -@@ -353,7 +395,7 @@ class TestContainer(Base): - set_up = False - - def testContainerNameLimit(self): -- limit = 256 -+ limit = load_constraint('max_container_name_length') - - for l in (limit-100, limit-10, limit-1, limit, - limit+1, limit+10, limit+100): -@@ -398,6 +440,7 @@ class TestContainer(Base): - self.assert_(cont.files(parms={'prefix': f}) == [f]) - - def testPrefixAndLimit(self): -+ load_constraint('container_listing_limit') - cont = self.env.account.container(Utils.create_name()) - self.assert_(cont.create()) - -@@ -941,7 +984,7 @@ class TestFile(Base): - self.assert_status(404) - - def testNameLimit(self): -- limit = 1024 -+ limit = load_constraint('max_object_name_length') - - for l in (1, 10, limit/2, limit-1, limit, limit+1, limit*2): - file = self.env.container.file('a'*l) -@@ -989,13 +1032,12 @@ class TestFile(Base): - self.assert_status(400) - - def testMetadataNumberLimit(self): -- number_limit = 90 -+ number_limit = load_constraint('max_meta_count') -+ size_limit = load_constraint('max_meta_overall_size') - - for i in (number_limit-10, number_limit-1, number_limit, - number_limit+1, number_limit+10, number_limit+100): - -- size_limit = 4096 -- - j = size_limit/(i * 2) - - size = 0 -@@ -1096,7 +1138,7 @@ class TestFile(Base): - self.assert_(file.read(hdrs={'Range': r}) == data[0:1000]) - - def testFileSizeLimit(self): -- limit = 5*2**30 + 2 -+ limit = load_constraint('max_file_size') - tsecs = 3 - - for i in (limit-100, limit-10, limit-1, limit, limit+1, limit+10, -@@ -1150,7 +1192,8 @@ class TestFile(Base): - self.assert_status(200) - - def testMetadataLengthLimits(self): -- key_limit, value_limit = 128, 256 -+ key_limit = load_constraint('max_meta_name_length') -+ value_limit = load_constraint('max_meta_value_length') - lengths = [[key_limit, value_limit], [key_limit, value_limit+1], \ - [key_limit+1, value_limit], [key_limit, 0], \ - [key_limit, value_limit*10], [key_limit*10, value_limit]] -diff --git a/test/sample.conf b/test/sample.conf -index 7594c02..d3eced0 100644 ---- a/test/sample.conf -+++ b/test/sample.conf -@@ -19,6 +19,21 @@ password2 = testing2 - username3 = tester3 - password3 = testing3 - -+# Default constraints if not defined here, the test runner will try -+# to set them from /etc/swift/swift.conf. If that file isn't found, -+# the test runner will skip tests that depend on these values. -+# Note that the cluster must have "sane" values for the test suite to pass. -+#max_file_size = 5368709122 -+#max_meta_name_length = 128 -+#max_meta_value_length = 256 -+#max_meta_count = 90 -+#max_meta_overall_size = 4096 -+#max_object_name_length = 1024 -+#container_listing_limit = 10000 -+#account_listing_limit = 10000 -+#max_account_name_length = 256 -+#max_container_name_length = 256 -+ - collate = C - - [unit_test] -diff --git a/test/unit/common/test_constraints.py b/test/unit/common/test_constraints.py -index 37ed225..000a0b4 100644 ---- a/test/unit/common/test_constraints.py -+++ b/test/unit/common/test_constraints.py -@@ -84,8 +84,13 @@ class TestConstraints(unittest.TestCase): - x += 1 - self.assertEquals(constraints.check_metadata(Request.blank('/', - headers=headers), 'object'), None) -- headers['X-Object-Meta-9999%s' % -- ('a' * (constraints.MAX_META_NAME_LENGTH - 4))] = \ -+ # add two more headers in case adding just one falls exactly on the -+ # limit (eg one header adds 1024 and the limit is 2048) -+ headers['X-Object-Meta-%04d%s' % -+ (x, 'a' * (constraints.MAX_META_NAME_LENGTH - 4))] = \ -+ 'v' * constraints.MAX_META_VALUE_LENGTH -+ headers['X-Object-Meta-%04d%s' % -+ (x + 1, 'a' * (constraints.MAX_META_NAME_LENGTH - 4))] = \ - 'v' * constraints.MAX_META_VALUE_LENGTH - self.assert_(isinstance(constraints.check_metadata(Request.blank('/', - headers=headers), 'object'), HTTPBadRequest)) -diff --git a/test/unit/obj/test_server.py b/test/unit/obj/test_server.py -index 0d94dba..f78baa1 100644 ---- a/test/unit/obj/test_server.py -+++ b/test/unit/obj/test_server.py -@@ -35,6 +35,7 @@ from swift.common import utils - from swift.common.utils import hash_path, mkdirs, normalize_timestamp, \ - NullLogger, storage_directory - from swift.common.exceptions import DiskFileNotExist -+from swift.common import constraints - from eventlet import tpool - - -@@ -1389,7 +1390,8 @@ class TestObjectController(unittest.TestCase): - - def test_max_object_name_length(self): - timestamp = normalize_timestamp(time()) -- req = Request.blank('/sda1/p/a/c/' + ('1' * 1024), -+ max_name_len = constraints.MAX_OBJECT_NAME_LENGTH -+ req = Request.blank('/sda1/p/a/c/' + ('1' * max_name_len), - environ={'REQUEST_METHOD': 'PUT'}, - headers={'X-Timestamp': timestamp, - 'Content-Length': '4', -@@ -1397,7 +1399,7 @@ class TestObjectController(unittest.TestCase): - req.body = 'DATA' - resp = self.object_controller.PUT(req) - self.assertEquals(resp.status_int, 201) -- req = Request.blank('/sda1/p/a/c/' + ('2' * 1025), -+ req = Request.blank('/sda1/p/a/c/' + ('2' * (max_name_len + 1)), - environ={'REQUEST_METHOD': 'PUT'}, - headers={'X-Timestamp': timestamp, - 'Content-Length': '4', -diff --git a/test/unit/proxy/test_server.py b/test/unit/proxy/test_server.py -index 80ef9f7..0e3f30d 100644 ---- a/test/unit/proxy/test_server.py -+++ b/test/unit/proxy/test_server.py -@@ -46,7 +46,8 @@ from swift.obj import server as object_server - from swift.common import ring - from swift.common.exceptions import ChunkReadTimeout - from swift.common.constraints import MAX_META_NAME_LENGTH, \ -- MAX_META_VALUE_LENGTH, MAX_META_COUNT, MAX_META_OVERALL_SIZE, MAX_FILE_SIZE -+ MAX_META_VALUE_LENGTH, MAX_META_COUNT, MAX_META_OVERALL_SIZE, \ -+ MAX_FILE_SIZE, MAX_ACCOUNT_NAME_LENGTH, MAX_CONTAINER_NAME_LENGTH - from swift.common.utils import mkdirs, normalize_timestamp, NullLogger - from swift.common.wsgi import monkey_patch_mimetools - from swift.proxy.controllers.obj import SegmentedIterable -@@ -1060,47 +1061,50 @@ class TestObjectController(unittest.TestCase): - - def test_POST_meta_val_len(self): - with save_globals(): -+ limit = MAX_META_VALUE_LENGTH - self.app.object_post_as_copy = False - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') - set_http_connect(200, 200, 202, 202, 202) - # acct cont obj obj obj - req = Request.blank('/a/c/o', {}, headers={ -- 'Content-Type': 'foo/bar', -- 'X-Object-Meta-Foo': 'x' * 256}) -+ 'Content-Type': 'foo/bar', -+ 'X-Object-Meta-Foo': 'x' * limit}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 202) - set_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers={ -- 'Content-Type': 'foo/bar', -- 'X-Object-Meta-Foo': 'x' * 257}) -+ 'Content-Type': 'foo/bar', -+ 'X-Object-Meta-Foo': 'x' * (limit + 1)}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 400) - - def test_POST_as_copy_meta_val_len(self): - with save_globals(): -+ limit = MAX_META_VALUE_LENGTH - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') - set_http_connect(200, 200, 200, 200, 200, 202, 202, 202) - # acct cont objc objc objc obj obj obj - req = Request.blank('/a/c/o', {}, headers={ -- 'Content-Type': 'foo/bar', -- 'X-Object-Meta-Foo': 'x' * 256}) -+ 'Content-Type': 'foo/bar', -+ 'X-Object-Meta-Foo': 'x' * limit}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 202) - set_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers={ -- 'Content-Type': 'foo/bar', -- 'X-Object-Meta-Foo': 'x' * 257}) -+ 'Content-Type': 'foo/bar', -+ 'X-Object-Meta-Foo': 'x' * (limit + 1)}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 400) - - def test_POST_meta_key_len(self): - with save_globals(): -+ limit = MAX_META_NAME_LENGTH - self.app.object_post_as_copy = False - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') -@@ -1108,44 +1112,46 @@ class TestObjectController(unittest.TestCase): - # acct cont obj obj obj - req = Request.blank('/a/c/o', {}, headers={ - 'Content-Type': 'foo/bar', -- ('X-Object-Meta-' + 'x' * 128): 'x'}) -+ ('X-Object-Meta-' + 'x' * limit): 'x'}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 202) - set_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers={ - 'Content-Type': 'foo/bar', -- ('X-Object-Meta-' + 'x' * 129): 'x'}) -+ ('X-Object-Meta-' + 'x' * (limit + 1)): 'x'}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 400) - - def test_POST_as_copy_meta_key_len(self): - with save_globals(): -+ limit = MAX_META_NAME_LENGTH - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') - set_http_connect(200, 200, 200, 200, 200, 202, 202, 202) - # acct cont objc objc objc obj obj obj - req = Request.blank('/a/c/o', {}, headers={ - 'Content-Type': 'foo/bar', -- ('X-Object-Meta-' + 'x' * 128): 'x'}) -+ ('X-Object-Meta-' + 'x' * limit): 'x'}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 202) - set_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers={ - 'Content-Type': 'foo/bar', -- ('X-Object-Meta-' + 'x' * 129): 'x'}) -+ ('X-Object-Meta-' + 'x' * (limit + 1)): 'x'}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 400) - - def test_POST_meta_count(self): - with save_globals(): -+ limit = MAX_META_COUNT - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') - headers = dict( -- (('X-Object-Meta-' + str(i), 'a') for i in xrange(91))) -+ (('X-Object-Meta-' + str(i), 'a') for i in xrange(limit + 1))) - headers.update({'Content-Type': 'foo/bar'}) - set_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers=headers) -@@ -1155,10 +1161,13 @@ class TestObjectController(unittest.TestCase): - - def test_POST_meta_size(self): - with save_globals(): -+ limit = MAX_META_OVERALL_SIZE - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') -+ count = limit / 256 # enough to cause the limit to be reched - headers = dict( -- (('X-Object-Meta-' + str(i), 'a' * 256) for i in xrange(1000))) -+ (('X-Object-Meta-' + str(i), 'a' * 256) -+ for i in xrange(count + 1))) - headers.update({'Content-Type': 'foo/bar'}) - set_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers=headers) -@@ -3408,13 +3417,14 @@ class TestContainerController(unittest.TestCase): - - def test_PUT_max_container_name_length(self): - with save_globals(): -+ limit = MAX_CONTAINER_NAME_LENGTH - controller = proxy_server.ContainerController(self.app, 'account', -- '1' * 256) -+ '1' * limit) - self.assert_status_map(controller.PUT, - (200, 200, 200, 201, 201, 201), 201, - missing_container=True) - controller = proxy_server.ContainerController(self.app, 'account', -- '2' * 257) -+ '2' * (limit + 1)) - self.assert_status_map(controller.PUT, (201, 201, 201), 400, - missing_container=True) - -@@ -3961,9 +3971,11 @@ class TestAccountController(unittest.TestCase): - def test_PUT_max_account_name_length(self): - with save_globals(): - self.app.allow_account_management = True -- controller = proxy_server.AccountController(self.app, '1' * 256) -+ limit = MAX_ACCOUNT_NAME_LENGTH -+ controller = proxy_server.AccountController(self.app, '1' * limit) - self.assert_status_map(controller.PUT, (201, 201, 201), 201) -- controller = proxy_server.AccountController(self.app, '2' * 257) -+ controller = proxy_server.AccountController( -+ self.app, '2' * (limit + 1)) - self.assert_status_map(controller.PUT, (201, 201, 201), 400) - - def test_PUT_connect_exceptions(self): --- -1.7.7.6 - diff --git a/glusterfs-3.3.1.swift.constraints.backport.patch b/glusterfs-3.3.1.swift.constraints.backport.patch deleted file mode 100644 index bb61a67..0000000 --- a/glusterfs-3.3.1.swift.constraints.backport.patch +++ /dev/null @@ -1,518 +0,0 @@ -From fc2421b04022ac6bbe9d5014362ec5f99f94c5e0 Mon Sep 17 00:00:00 2001 -From: Peter Portante -Date: Tue, 25 Sep 2012 13:27:59 -0400 -Subject: [PATCH] Backport commit a2ac5efaa64f57fbbe059066c6c4636dfd0715c2, - 'swift constraints are now settable via config', excluding - PEP8 changes that did not involve the constraints. - ---- - etc/swift.conf-sample | 73 ++++++++++++++++++++++++++++++++++ - swift/common/constraints.py | 37 ++++++++++++----- - test/functional/tests.py | 62 ++++++++++++++++++++++++---- - test/unit/common/test_constraints.py | 9 +++- - test/unit/obj/test_server.py | 7 ++- - test/unit/proxy/test_server.py | 50 ++++++++++++++--------- - 6 files changed, 196 insertions(+), 42 deletions(-) - -diff --git a/etc/swift.conf-sample b/etc/swift.conf-sample -index 7e1c31d..2f4192a 100644 ---- a/etc/swift.conf-sample -+++ b/etc/swift.conf-sample -@@ -1,3 +1,76 @@ - [swift-hash] -+ -+# swift_hash_path_suffix is used as part of the hashing algorithm -+# when determining data placement in the cluster. This value should -+# remain secret and MUST NOT change once a cluster has been deployed. -+ - swift_hash_path_suffix = changeme - -+ -+ -+# The swift-constraints section sets the basic constraints on data -+# saved in the swift cluster. -+ -+[swift-constraints] -+ -+# max_file_size is the largest "normal" object that can be saved in -+# the cluster. This is also the limit on the size of each segment of -+# a "large" object when using the large object manifest support. -+# This value is set in bytes. Setting it to lower than 1MiB will cause -+# some tests to fail. It is STRONGLY recommended to leave this value at -+# the default (5 * 2**30 + 2). -+ -+#max_file_size = 5368709122 -+ -+ -+# max_meta_name_length is the max number of bytes in the utf8 encoding -+# of the name portion of a metadata header. -+ -+#max_meta_name_length = 128 -+ -+ -+# max_meta_value_length is the max number of bytes in the utf8 encoding -+# of a metadata value -+ -+#max_meta_value_length = 256 -+ -+ -+# max_meta_count is the max number of metadata keys that can be stored -+# on a single account, container, or object -+ -+#max_meta_count = 90 -+ -+ -+# max_meta_overall_size is the max number of bytes in the utf8 encoding -+# of the metadata (keys + values) -+ -+#max_meta_overall_size = 4096 -+ -+ -+# max_object_name_length is the max number of bytes in the utf8 encoding -+# of an object name -+ -+#max_object_name_length = 1024 -+ -+ -+# container_listing_limit is the default (and max) number of items -+# returned for a container listing request -+ -+#container_listing_limit = 10000 -+ -+ -+# account_listing_limit is the default (and max) number of items returned -+# for an account listing request -+#account_listing_limit = 10000 -+ -+ -+# max_account_name_length is the max number of bytes in the utf8 encoding -+# of an account name -+ -+#max_account_name_length = 256 -+ -+ -+# max_container_name_length is the max number of bytes in the utf8 encoding -+# of a container name -+ -+#max_container_name_length = 256 -diff --git a/swift/common/constraints.py b/swift/common/constraints.py -index 235dcca..0fe5078 100644 ---- a/swift/common/constraints.py -+++ b/swift/common/constraints.py -@@ -14,29 +14,46 @@ - # limitations under the License. - - import os -+from ConfigParser import ConfigParser, NoSectionError, NoOptionError, \ -+ RawConfigParser - - from webob.exc import HTTPBadRequest, HTTPLengthRequired, \ - HTTPRequestEntityTooLarge - -+constraints_conf = ConfigParser() -+constraints_conf.read('/etc/swift/swift.conf') -+ -+ -+def constraints_conf_int(name, default): -+ try: -+ return int(constraints_conf.get('swift-constraints', name)) -+ except (NoSectionError, NoOptionError): -+ return default -+ - - #: Max file size allowed for objects --MAX_FILE_SIZE = 5 * 1024 * 1024 * 1024 + 2 -+MAX_FILE_SIZE = constraints_conf_int('max_file_size', -+ 5368709122) # 5 * 1024 * 1024 * 1024 + 2 - #: Max length of the name of a key for metadata --MAX_META_NAME_LENGTH = 128 -+MAX_META_NAME_LENGTH = constraints_conf_int('max_meta_name_length', 128) - #: Max length of the value of a key for metadata --MAX_META_VALUE_LENGTH = 256 -+MAX_META_VALUE_LENGTH = constraints_conf_int('max_meta_value_length', 256) - #: Max number of metadata items --MAX_META_COUNT = 90 -+MAX_META_COUNT = constraints_conf_int('max_meta_count', 90) - #: Max overall size of metadata --MAX_META_OVERALL_SIZE = 4096 -+MAX_META_OVERALL_SIZE = constraints_conf_int('max_meta_overall_size', 4096) - #: Max object name length --MAX_OBJECT_NAME_LENGTH = 1024 -+MAX_OBJECT_NAME_LENGTH = constraints_conf_int('max_object_name_length', 1024) - #: Max object list length of a get request for a container --CONTAINER_LISTING_LIMIT = 10000 -+CONTAINER_LISTING_LIMIT = constraints_conf_int('container_listing_limit', -+ 10000) - #: Max container list length of a get request for an account --ACCOUNT_LISTING_LIMIT = 10000 --MAX_ACCOUNT_NAME_LENGTH = 256 --MAX_CONTAINER_NAME_LENGTH = 256 -+ACCOUNT_LISTING_LIMIT = constraints_conf_int('account_listing_limit', 10000) -+#: Max account name length -+MAX_ACCOUNT_NAME_LENGTH = constraints_conf_int('max_account_name_length', 256) -+#: Max container name length -+MAX_CONTAINER_NAME_LENGTH = constraints_conf_int('max_container_name_length', -+ 256) - - - def check_metadata(req, target_type): -diff --git a/test/functional/tests.py b/test/functional/tests.py -index b25b4fd..3b18fc4 100644 ---- a/test/functional/tests.py -+++ b/test/functional/tests.py -@@ -27,12 +27,55 @@ import threading - import uuid - import unittest - import urllib -+from ConfigParser import ConfigParser - - from test import get_config - from swift import Account, AuthenticationFailed, Connection, Container, \ - File, ResponseError -- -+from swift.common.constraints import MAX_FILE_SIZE, MAX_META_NAME_LENGTH, \ -+ MAX_META_VALUE_LENGTH, MAX_META_COUNT, MAX_META_OVERALL_SIZE, \ -+ MAX_OBJECT_NAME_LENGTH, CONTAINER_LISTING_LIMIT, ACCOUNT_LISTING_LIMIT, \ -+ MAX_ACCOUNT_NAME_LENGTH, MAX_CONTAINER_NAME_LENGTH -+ -+default_constraints = dict(( -+ ('max_file_size', MAX_FILE_SIZE), -+ ('max_meta_name_length', MAX_META_NAME_LENGTH), -+ ('max_meta_value_length', MAX_META_VALUE_LENGTH), -+ ('max_meta_count', MAX_META_COUNT), -+ ('max_meta_overall_size', MAX_META_OVERALL_SIZE), -+ ('max_object_name_length', MAX_OBJECT_NAME_LENGTH), -+ ('container_listing_limit', CONTAINER_LISTING_LIMIT), -+ ('account_listing_limit', ACCOUNT_LISTING_LIMIT), -+ ('max_account_name_length', MAX_ACCOUNT_NAME_LENGTH), -+ ('max_container_name_length', MAX_CONTAINER_NAME_LENGTH))) -+constraints_conf = ConfigParser() -+conf_exists = constraints_conf.read('/etc/swift/swift.conf') -+# Constraints are set first from the test config, then from -+# /etc/swift/swift.conf if it exists. If swift.conf doesn't exist, -+# then limit test coverage. This allows SAIO tests to work fine but -+# requires remote funtional testing to know something about the cluster -+# that is being tested. - config = get_config() -+for k in default_constraints: -+ if k in config: -+ # prefer what's in test.conf -+ config[k] = int(config[k]) -+ elif conf_exists: -+ # swift.conf exists, so use what's defined there (or swift defaults) -+ # This normally happens when the test is running locally to the cluster -+ # as in a SAIO. -+ config[k] = default_constraints[k] -+ else: -+ # .functests don't know what the constraints of the tested cluster are, -+ # so the tests can't reliably pass or fail. Therefore, skip those -+ # tests. -+ config[k] = '%s constraint is not defined' % k -+ -+def load_constraint(name): -+ c = config[name] -+ if not isinstance(c, int): -+ raise SkipTest(c) -+ return c - - locale.setlocale(locale.LC_COLLATE, config.get('collate', 'C')) - -@@ -233,7 +276,7 @@ class TestAccount(Base): - 'application/xml; charset=utf-8') - - def testListingLimit(self): -- limit = 10000 -+ limit = load_constraint('account_listing_limit') - - for l in (1, 100, limit/2, limit-1, limit, limit+1, limit*2): - p = {'limit':l} -@@ -361,7 +404,7 @@ class TestContainer(Base): - set_up = False - - def testContainerNameLimit(self): -- limit = 256 -+ limit = load_constraint('max_container_name_length') - - for l in (limit-100, limit-10, limit-1, limit, - limit+1, limit+10, limit+100): -@@ -406,6 +449,7 @@ class TestContainer(Base): - self.assert_(cont.files(parms={'prefix': f}) == [f]) - - def testPrefixAndLimit(self): -+ load_constraint('container_listing_limit') - cont = self.env.account.container(Utils.create_name()) - self.assert_(cont.create()) - -@@ -949,7 +993,7 @@ class TestFile(Base): - self.assert_status(404) - - def testNameLimit(self): -- limit = 1024 -+ limit = load_constraint('max_object_name_length') - - for l in (1, 10, limit/2, limit-1, limit, limit+1, limit*2): - file = self.env.container.file('a'*l) -@@ -997,13 +1041,12 @@ class TestFile(Base): - self.assert_status(400) - - def testMetadataNumberLimit(self): -- number_limit = 90 -+ number_limit = load_constraint('max_meta_count') -+ size_limit = load_constraint('max_meta_overall_size') - - for i in (number_limit-10, number_limit-1, number_limit, - number_limit+1, number_limit+10, number_limit+100): - -- size_limit = 4096 -- - j = size_limit/(i * 2) - - size = 0 -@@ -1093,7 +1136,7 @@ class TestFile(Base): - self.assert_(file.read(hdrs={'Range': r}) == data[0:1000]) - - def testFileSizeLimit(self): -- limit = 5*2**30 + 2 -+ limit = load_constraint('max_file_size') - tsecs = 3 - - for i in (limit-100, limit-10, limit-1, limit, limit+1, limit+10, -@@ -1147,7 +1190,8 @@ class TestFile(Base): - self.assert_status(200) - - def testMetadataLengthLimits(self): -- key_limit, value_limit = 128, 256 -+ key_limit = load_constraint('max_meta_name_length') -+ value_limit = load_constraint('max_meta_value_length') - lengths = [[key_limit, value_limit], [key_limit, value_limit+1], \ - [key_limit+1, value_limit], [key_limit, 0], \ - [key_limit, value_limit*10], [key_limit*10, value_limit]] -diff --git a/test/unit/common/test_constraints.py b/test/unit/common/test_constraints.py -index 478b2a8..4b0c997 100644 ---- a/test/unit/common/test_constraints.py -+++ b/test/unit/common/test_constraints.py -@@ -84,8 +84,13 @@ class TestConstraints(unittest.TestCase): - x += 1 - self.assertEquals(constraints.check_metadata(Request.blank('/', - headers=headers), 'object'), None) -- headers['X-Object-Meta-9999%s' % -- ('a' * (constraints.MAX_META_NAME_LENGTH - 4))] = \ -+ # add two more headers in case adding just one falls exactly on the -+ # limit (eg one header adds 1024 and the limit is 2048) -+ headers['X-Object-Meta-%04d%s' % -+ (x, 'a' * (constraints.MAX_META_NAME_LENGTH - 4))] = \ -+ 'v' * constraints.MAX_META_VALUE_LENGTH -+ headers['X-Object-Meta-%04d%s' % -+ (x + 1, 'a' * (constraints.MAX_META_NAME_LENGTH - 4))] = \ - 'v' * constraints.MAX_META_VALUE_LENGTH - self.assert_(isinstance(constraints.check_metadata(Request.blank('/', - headers=headers), 'object'), HTTPBadRequest)) -diff --git a/test/unit/obj/test_server.py b/test/unit/obj/test_server.py -index 075700e..5160830 100644 ---- a/test/unit/obj/test_server.py -+++ b/test/unit/obj/test_server.py -@@ -38,6 +38,7 @@ from swift.common import utils - from swift.common.utils import hash_path, mkdirs, normalize_timestamp, \ - NullLogger, storage_directory - from swift.common.exceptions import DiskFileNotExist -+from swift.common import constraints - from swift.obj import replicator - from eventlet import tpool - -@@ -1355,7 +1356,9 @@ class TestObjectController(unittest.TestCase): - - def test_max_object_name_length(self): - timestamp = normalize_timestamp(time()) -- req = Request.blank('/sda1/p/a/c/' + ('1' * 1024), -+ max_name_len = constraints.MAX_OBJECT_NAME_LENGTH -+ req = Request.blank('/sda1/p/a/c/' + ('1' * max_name_len), -+ - environ={'REQUEST_METHOD': 'PUT'}, - headers={'X-Timestamp': timestamp, - 'Content-Length': '4', -@@ -1363,7 +1366,7 @@ class TestObjectController(unittest.TestCase): - req.body = 'DATA' - resp = self.object_controller.PUT(req) - self.assertEquals(resp.status_int, 201) -- req = Request.blank('/sda1/p/a/c/' + ('2' * 1025), -+ req = Request.blank('/sda1/p/a/c/' + ('2' * (max_name_len + 1)), - environ={'REQUEST_METHOD': 'PUT'}, - headers={'X-Timestamp': timestamp, - 'Content-Length': '4', -diff --git a/test/unit/proxy/test_server.py b/test/unit/proxy/test_server.py -index 364370e..d28f604 100644 ---- a/test/unit/proxy/test_server.py -+++ b/test/unit/proxy/test_server.py -@@ -45,7 +45,8 @@ from swift.container import server as container_server - from swift.obj import server as object_server - from swift.common import ring - from swift.common.constraints import MAX_META_NAME_LENGTH, \ -- MAX_META_VALUE_LENGTH, MAX_META_COUNT, MAX_META_OVERALL_SIZE, MAX_FILE_SIZE -+ MAX_META_VALUE_LENGTH, MAX_META_COUNT, MAX_META_OVERALL_SIZE, \ -+ MAX_FILE_SIZE, MAX_ACCOUNT_NAME_LENGTH, MAX_CONTAINER_NAME_LENGTH - from swift.common.utils import mkdirs, normalize_timestamp, NullLogger - from swift.common.wsgi import monkey_patch_mimetools - -@@ -1168,6 +1169,7 @@ class TestObjectController(unittest.TestCase): - - def test_POST_meta_val_len(self): - with save_globals(): -+ limit = MAX_META_VALUE_LENGTH - self.app.object_post_as_copy = False - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') -@@ -1175,42 +1177,44 @@ class TestObjectController(unittest.TestCase): - fake_http_connect(200, 200, 202, 202, 202) - # acct cont obj obj obj - req = Request.blank('/a/c/o', {}, headers={ -- 'Content-Type': 'foo/bar', -- 'X-Object-Meta-Foo': 'x' * 256}) -+ 'Content-Type': 'foo/bar', -+ 'X-Object-Meta-Foo': 'x' * limit}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 202) - proxy_server.http_connect = fake_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers={ -- 'Content-Type': 'foo/bar', -- 'X-Object-Meta-Foo': 'x' * 257}) -+ 'Content-Type': 'foo/bar', -+ 'X-Object-Meta-Foo': 'x' * (limit + 1)}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 400) - - def test_POST_as_copy_meta_val_len(self): - with save_globals(): -+ limit = MAX_META_VALUE_LENGTH - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') - proxy_server.http_connect = \ - fake_http_connect(200, 200, 200, 200, 200, 202, 202, 202) - # acct cont objc objc objc obj obj obj - req = Request.blank('/a/c/o', {}, headers={ -- 'Content-Type': 'foo/bar', -- 'X-Object-Meta-Foo': 'x' * 256}) -+ 'Content-Type': 'foo/bar', -+ 'X-Object-Meta-Foo': 'x' * limit}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 202) - proxy_server.http_connect = fake_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers={ -- 'Content-Type': 'foo/bar', -- 'X-Object-Meta-Foo': 'x' * 257}) -+ 'Content-Type': 'foo/bar', -+ 'X-Object-Meta-Foo': 'x' * (limit + 1)}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 400) - - def test_POST_meta_key_len(self): - with save_globals(): -+ limit = MAX_META_NAME_LENGTH - self.app.object_post_as_copy = False - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') -@@ -1219,20 +1223,21 @@ class TestObjectController(unittest.TestCase): - # acct cont obj obj obj - req = Request.blank('/a/c/o', {}, headers={ - 'Content-Type': 'foo/bar', -- ('X-Object-Meta-' + 'x' * 128): 'x'}) -+ ('X-Object-Meta-' + 'x' * limit): 'x'}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 202) - proxy_server.http_connect = fake_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers={ - 'Content-Type': 'foo/bar', -- ('X-Object-Meta-' + 'x' * 129): 'x'}) -+ ('X-Object-Meta-' + 'x' * (limit + 1)): 'x'}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 400) - - def test_POST_as_copy_meta_key_len(self): - with save_globals(): -+ limit = MAX_META_NAME_LENGTH - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') - proxy_server.http_connect = \ -@@ -1240,24 +1245,25 @@ class TestObjectController(unittest.TestCase): - # acct cont objc objc objc obj obj obj - req = Request.blank('/a/c/o', {}, headers={ - 'Content-Type': 'foo/bar', -- ('X-Object-Meta-' + 'x' * 128): 'x'}) -+ ('X-Object-Meta-' + 'x' * limit): 'x'}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 202) - proxy_server.http_connect = fake_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers={ - 'Content-Type': 'foo/bar', -- ('X-Object-Meta-' + 'x' * 129): 'x'}) -+ ('X-Object-Meta-' + 'x' * (limit + 1)): 'x'}) - self.app.update_request(req) - res = controller.POST(req) - self.assertEquals(res.status_int, 400) - - def test_POST_meta_count(self): - with save_globals(): -+ limit = MAX_META_COUNT - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') - headers = dict( -- (('X-Object-Meta-' + str(i), 'a') for i in xrange(91))) -+ (('X-Object-Meta-' + str(i), 'a') for i in xrange(limit + 1))) - headers.update({'Content-Type': 'foo/bar'}) - proxy_server.http_connect = fake_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers=headers) -@@ -1267,10 +1273,13 @@ class TestObjectController(unittest.TestCase): - - def test_POST_meta_size(self): - with save_globals(): -+ limit = MAX_META_OVERALL_SIZE - controller = proxy_server.ObjectController(self.app, 'account', - 'container', 'object') -+ count = limit / 256 # enough to cause the limit to be reched - headers = dict( -- (('X-Object-Meta-' + str(i), 'a' * 256) for i in xrange(1000))) -+ (('X-Object-Meta-' + str(i), 'a' * 256) -+ for i in xrange(count + 1))) - headers.update({'Content-Type': 'foo/bar'}) - proxy_server.http_connect = fake_http_connect(202, 202, 202) - req = Request.blank('/a/c/o', {}, headers=headers) -@@ -3206,13 +3215,14 @@ class TestContainerController(unittest.TestCase): - - def test_PUT_max_container_name_length(self): - with save_globals(): -+ limit = MAX_CONTAINER_NAME_LENGTH - controller = proxy_server.ContainerController(self.app, 'account', -- '1' * 256) -+ '1' * limit) - self.assert_status_map(controller.PUT, - (200, 200, 200, 201, 201, 201), 201, - missing_container=True) - controller = proxy_server.ContainerController(self.app, 'account', -- '2' * 257) -+ '2' * (limit + 1)) - self.assert_status_map(controller.PUT, (201, 201, 201), 400, - missing_container=True) - -@@ -3813,9 +3823,11 @@ class TestAccountController(unittest.TestCase): - def test_PUT_max_account_name_length(self): - with save_globals(): - self.app.allow_account_management = True -- controller = proxy_server.AccountController(self.app, '1' * 256) -+ limit = MAX_ACCOUNT_NAME_LENGTH -+ controller = proxy_server.AccountController(self.app, '1' * limit) - self.assert_status_map(controller.PUT, (201, 201, 201), 201) -- controller = proxy_server.AccountController(self.app, '2' * 257) -+ controller = proxy_server.AccountController( -+ self.app, '2' * (limit + 1)) - self.assert_status_map(controller.PUT, (201, 201, 201), 400) - - def test_PUT_connect_exceptions(self): --- -1.7.7.6 - diff --git a/glusterfs-3.3.1.ufo.gluster.multi-volume.backport-1.1.patch b/glusterfs-3.3.1.ufo.gluster.multi-volume.backport-1.1.patch deleted file mode 100644 index 6d7830b..0000000 --- a/glusterfs-3.3.1.ufo.gluster.multi-volume.backport-1.1.patch +++ /dev/null @@ -1,406 +0,0 @@ -diff -ru a/ufo/bin/gluster-swift-gen-builders b/ufo/bin/gluster-swift-gen-builders ---- a/ufo/bin/gluster-swift-gen-builders 2012-12-07 12:24:00.000000000 -0500 -+++ b/ufo/bin/gluster-swift-gen-builders 2013-04-29 15:16:22.748000000 -0400 -@@ -1,9 +1,25 @@ - #!/bin/bash - -+# Note that these port numbers must match the configured values for the -+# various servers in their configuration files. -+declare -A port=(["account.builder"]=6012 ["container.builder"]=6011 \ -+ ["object.builder"]=6010) -+ -+builder_files="account.builder container.builder object.builder" -+ - function create { -- swift-ring-builder $1 create 0 1 1 -- swift-ring-builder $1 add z1-127.0.0.1:$2/$3_ 100.0 -+ swift-ring-builder $1 create 1 1 1 >> /tmp/out -+} -+ -+function add { -+ swift-ring-builder $1 add z$2-127.0.0.1:$3/$4_ 100.0 -+} -+ -+function rebalance { - swift-ring-builder $1 rebalance -+} -+ -+function build { - swift-ring-builder $1 - } - -@@ -12,8 +28,17 @@ - exit 1 - fi - --# Note that these port numbers must match the configured values for the --# various servers in their configuration files. --create account.builder 6012 $1 --create container.builder 6011 $1 --create object.builder 6010 $1 -+for builder_file in $builder_files -+do -+ create $builder_file -+ -+ zone=1 -+ for volname in $@ -+ do -+ add $builder_file $zone ${port[$builder_file]} $volname -+ zone=$(expr $zone + 1) -+ done -+ -+ rebalance $builder_file -+ build $builder_file -+done -diff -ru a/ufo/etc/fs.conf-gluster b/ufo/etc/fs.conf-gluster ---- a/ufo/etc/fs.conf-gluster 2012-12-07 12:24:00.000000000 -0500 -+++ b/ufo/etc/fs.conf-gluster 2013-04-29 15:16:22.752000000 -0400 -@@ -3,10 +3,6 @@ - # local host. - mount_ip = localhost - --# The GlusterFS server need not be local, a remote server can also be used --# by setting "remote_cluster = yes". --remote_cluster = no -- - # By default it is assumed the Gluster volumes can be accessed using other - # methods besides UFO (not object only), which disables a caching - # optimizations in order to keep in sync with file system changes. -diff -ru a/ufo/gluster/swift/common/constraints.py b/ufo/gluster/swift/common/constraints.py ---- a/ufo/gluster/swift/common/constraints.py 2012-12-07 12:24:00.000000000 -0500 -+++ b/ufo/gluster/swift/common/constraints.py 2013-04-29 15:16:22.749000000 -0400 -@@ -16,7 +16,8 @@ - from webob.exc import HTTPBadRequest - - import swift.common.constraints --from gluster.swift.common import Glusterfs -+import swift.common.ring as _ring -+from gluster.swift.common import Glusterfs, ring - - - MAX_OBJECT_NAME_COMPONENT_LENGTH = swift.common.constraints.constraints_conf_int( -@@ -80,3 +81,9 @@ - - # Replace the original check mount with ours - swift.common.constraints.check_mount = gluster_check_mount -+ -+# Save the original Ring class -+__Ring = _ring.Ring -+ -+# Replace the original Ring class -+_ring.Ring = ring.Ring -diff -ru a/ufo/gluster/swift/common/Glusterfs.py b/ufo/gluster/swift/common/Glusterfs.py ---- a/ufo/gluster/swift/common/Glusterfs.py 2012-12-07 12:24:00.000000000 -0500 -+++ b/ufo/gluster/swift/common/Glusterfs.py 2013-04-29 15:16:22.753000000 -0400 -@@ -12,33 +12,35 @@ - # implied. - # See the License for the specific language governing permissions and - # limitations under the License. -+ - import logging - import os, fcntl, time --from ConfigParser import ConfigParser --from swift.common.utils import TRUE_VALUES -+from ConfigParser import ConfigParser, NoSectionError, NoOptionError -+from swift.common.utils import TRUE_VALUES, search_tree - from gluster.swift.common.fs_utils import mkdirs - -- - # - # Read the fs.conf file once at startup (module load) - # - _fs_conf = ConfigParser() - MOUNT_IP = 'localhost' --REMOTE_CLUSTER = False - OBJECT_ONLY = False -+RUN_DIR='/var/run/swift' -+SWIFT_DIR = '/etc/swift' - if _fs_conf.read(os.path.join('/etc/swift', 'fs.conf')): - try: - MOUNT_IP = _fs_conf.get('DEFAULT', 'mount_ip', 'localhost') - except (NoSectionError, NoOptionError): - pass - try: -- REMOTE_CLUSTER = _fs_conf.get('DEFAULT', 'remote_cluster', False) in TRUE_VALUES -+ OBJECT_ONLY = _fs_conf.get('DEFAULT', 'object_only', "no") in TRUE_VALUES - except (NoSectionError, NoOptionError): - pass - try: -- OBJECT_ONLY = _fs_conf.get('DEFAULT', 'object_only', "no") in TRUE_VALUES -+ RUN_DIR = _fs_conf.get('DEFAULT', 'run_dir', '/var/run/swift') - except (NoSectionError, NoOptionError): - pass -+ - NAME = 'glusterfs' - - -@@ -60,7 +62,7 @@ - if drive == export: - break - else: -- logging.error('No export found in %r matching drive %s', el, drive) -+ logging.error('No export found in %r matching drive, %s', el, drive) - return False - - # NOTE: root is typically the default value of /mnt/gluster-object -@@ -68,13 +70,12 @@ - if not os.path.isdir(full_mount_path): - mkdirs(full_mount_path) - -- pid_dir = "/var/lib/glusterd/vols/%s/run/" % drive -- pid_file = os.path.join(pid_dir, 'swift.pid'); -+ lck_file = os.path.join(RUN_DIR, '%s.lock' %drive); - -- if not os.path.exists(pid_dir): -- mkdirs(pid_dir) -+ if not os.path.exists(RUN_DIR): -+ mkdirs(RUN_DIR) - -- fd = os.open(pid_file, os.O_CREAT|os.O_RDWR) -+ fd = os.open(lck_file, os.O_CREAT|os.O_RDWR) - with os.fdopen(fd, 'r+b') as f: - try: - fcntl.lockf(f, fcntl.LOCK_EX|fcntl.LOCK_NB) -@@ -100,19 +101,12 @@ - logging.error('Unable to unmount %s %s' % (full_mount_path, NAME)) - - def _get_export_list(): -- if REMOTE_CLUSTER: -- cmnd = 'gluster --remote-host=%s volume info' % MOUNT_IP -- else: -- cmnd = 'gluster volume info' -+ cmnd = 'gluster --remote-host=%s volume info' % MOUNT_IP - - export_list = [] - - if os.system(cmnd + ' >> /dev/null'): -- if REMOTE_CLUSTER: -- logging.error('Getting volume info failed for %s, make sure '\ -- 'gluster --remote-host=%s works', NAME, MOUNT_IP) -- else: -- logging.error('Getting volume info failed for %s', NAME) -+ logging.error('Getting volume info failed for %s', NAME) - else: - fp = os.popen(cmnd) - while True: -@@ -124,3 +118,20 @@ - export_list.append(item.split(':')[1].strip(' ')) - - return export_list -+ -+def get_mnt_point(vol_name, conf_dir=SWIFT_DIR, conf_file="object-server*"): -+ """Read the object-server's configuration file and return -+ the device value""" -+ -+ mnt_dir = '' -+ conf_files = search_tree(conf_dir, conf_file, '.conf') -+ if not conf_files: -+ raise Exception("Config file not found") -+ -+ _conf = ConfigParser() -+ if _conf.read(conf_files[0]): -+ try: -+ mnt_dir = _conf.get('DEFAULT', 'devices', '') -+ except (NoSectionError, NoOptionError): -+ raise -+ return os.path.join(mnt_dir, vol_name) -diff -ru a/ufo/gluster/swift/common/ring.py b/ufo/gluster/swift/common/ring.py ---- a/ufo/gluster/swift/common/ring.py 2013-04-30 08:21:55.948000000 -0400 -+++ b/ufo/gluster/swift/common/ring.py 2013-04-29 15:16:22.755000000 -0400 -@@ -0,0 +1,111 @@ -+# Copyright (c) 2013 Red Hat, Inc. -+# -+# Licensed under the Apache License, Version 2.0 (the "License"); -+# you may not use this file except in compliance with the License. -+# You may obtain a copy of the License at -+# -+# http://www.apache.org/licenses/LICENSE-2.0 -+# -+# Unless required by applicable law or agreed to in writing, software -+# distributed under the License is distributed on an "AS IS" BASIS, -+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -+# implied. -+# See the License for the specific language governing permissions and -+# limitations under the License. -+ -+from ConfigParser import ConfigParser -+from swift.common.ring import ring -+from swift.common.utils import search_tree -+from gluster.swift.common.Glusterfs import SWIFT_DIR -+ -+reseller_prefix = "AUTH_" -+conf_files = search_tree(SWIFT_DIR, "proxy-server*", 'conf') -+if conf_files: -+ conf_file = conf_files[0] -+ -+_conf = ConfigParser() -+if conf_files and _conf.read(conf_file): -+ if _conf.defaults().get("reseller_prefix", None): -+ reseller_prefix = _conf.defaults().get("reseller_prefix") -+ else: -+ for key, value in _conf._sections.items(): -+ if value.get("reseller_prefix", None): -+ reseller_prefix = value["reseller_prefix"] -+ break -+ -+if not reseller_prefix.endswith('_'): -+ reseller_prefix = reseller_prefix + '_' -+ -+class Ring(ring.Ring): -+ def _get_part_nodes(self, part): -+ seen_ids = set() -+ nodes = [dev for dev in self._devs \ -+ if dev['device'] == self.acc_name \ -+ and not (dev['id'] in seen_ids \ -+ or seen_ids.add(dev['id']))] -+ if not nodes: -+ nodes = [self.false_node] -+ return nodes -+ -+ def get_part_nodes(self, part): -+ """ -+ Get the nodes that are responsible for the partition. If one -+ node is responsible for more than one replica of the same -+ partition, it will only appear in the output once. -+ -+ :param part: partition to get nodes for -+ :returns: list of node dicts -+ -+ See :func:`get_nodes` for a description of the node dicts. -+ """ -+ return self._get_part_nodes(part) -+ -+ def get_nodes(self, account, container=None, obj=None): -+ """ -+ Get the partition and nodes for an account/container/object. -+ If a node is responsible for more than one replica, it will -+ only appear in the output once. -+ :param account: account name -+ :param container: container name -+ :param obj: object name -+ :returns: a tuple of (partition, list of node dicts) -+ -+ Each node dict will have at least the following keys: -+ ====== =============================================================== -+ id unique integer identifier amongst devices -+ weight a float of the relative weight of this device as compared to -+ others; this indicates how many partitions the builder will try -+ to assign to this device -+ zone integer indicating which zone the device is in; a given -+ partition will not be assigned to multiple devices within the -+ same zone -+ ip the ip address of the device -+ port the tcp port of the device -+ device the device's name on disk (sdb1, for example) -+ meta general use 'extra' field; for example: the online date, the -+ hardware description -+ ====== =============================================================== -+ """ -+ self.false_node = {'zone': 1, 'weight': 100.0, 'ip': '127.0.0.1', 'id': 0, \ -+ 'meta': '', 'device': 'volume_not_in_ring', \ -+ 'port': 6012} -+ if account.startswith(reseller_prefix): -+ self.acc_name = account.replace(reseller_prefix, '', 1) -+ else: -+ self.acc_name = account -+ -+ part = 0 -+ return part, self._get_part_nodes(part) -+ -+ -+ def get_more_nodes(self, part): -+ """ -+ Generator to get extra nodes for a partition for hinted handoff. -+ -+ :param part: partition to get handoff nodes for -+ :returns: generator of node dicts -+ -+ See :func:`get_nodes` for a description of the node dicts. -+ Should never be called in the swift UFO environment, so yield nothing -+ """ -+ yield self.false_node -diff -ru a/ufo/test/unit/common/test_ring.py b/ufo/test/unit/common/test_ring.py ---- a/ufo/test/unit/common/test_ring.py 2013-04-30 08:22:08.975000000 -0400 -+++ b/ufo/test/unit/common/test_ring.py 2013-04-29 15:16:22.756000000 -0400 -@@ -0,0 +1,81 @@ -+# Copyright (c) 2013 Red Hat, Inc. -+# -+# Licensed under the Apache License, Version 2.0 (the "License"); -+# you may not use this file except in compliance with the License. -+# You may obtain a copy of the License at -+# -+# http://www.apache.org/licenses/LICENSE-2.0 -+# -+# Unless required by applicable law or agreed to in writing, software -+# distributed under the License is distributed on an "AS IS" BASIS, -+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -+# implied. -+# See the License for the specific language governing permissions and -+# limitations under the License. -+ -+import unittest -+import gluster.swift.common.constraints -+from gluster.swift.common.ring import * -+from gluster.swift.common.Glusterfs import SWIFT_DIR -+ -+def _mock_ring_data(): -+ return [{'zone': 1, 'weight': 100.0, 'ip': '127.0.0.1', 'port': 6012, \ -+ 'meta': '', 'device': 'test', 'id': 0}, -+ {'zone': 2, 'weight': 100.0, 'ip': '127.0.0.1', 'id': 1, \ -+ 'meta': '', 'device': 'iops', 'port': 6012}] -+ -+class TestRing(unittest.TestCase): -+ """ Tests for common.utils """ -+ -+ def setUp(self): -+ self.ring = Ring(SWIFT_DIR, ring_name='object') -+ -+ def test_first_device(self): -+ try: -+ __devs = self.ring._devs -+ self.ring._devs = _mock_ring_data() -+ -+ part, node = self.ring.get_nodes('test') -+ assert node[0]['device'] == 'test' -+ node = self.ring.get_part_nodes(0) -+ assert node[0]['device'] == 'test' -+ for node in self.ring.get_more_nodes(0): -+ assert node['device'] == 'volume_not_in_ring' -+ finally: -+ self.ring._devs = __devs -+ -+ def test_invalid_device(self): -+ try: -+ __devs = self.ring._devs -+ self.ring._devs = _mock_ring_data() -+ -+ part, node = self.ring.get_nodes('test2') -+ assert node[0]['device'] == 'volume_not_in_ring' -+ node = self.ring.get_part_nodes(0) -+ assert node[0]['device'] == 'volume_not_in_ring' -+ finally: -+ self.ring._devs = __devs -+ -+ def test_second_device(self): -+ try: -+ __devs = self.ring._devs -+ self.ring._devs = _mock_ring_data() -+ -+ part, node = self.ring.get_nodes('iops') -+ assert node[0]['device'] == 'iops' -+ node = self.ring.get_part_nodes(0) -+ assert node[0]['device'] == 'iops' -+ for node in self.ring.get_more_nodes(0): -+ assert node['device'] == 'volume_not_in_ring' -+ finally: -+ self.ring._devs = __devs -+ -+ def test_second_device_with_reseller_prefix(self): -+ try: -+ __devs = self.ring._devs -+ self.ring._devs = _mock_ring_data() -+ -+ part, node = self.ring.get_nodes('AUTH_iops') -+ assert node[0]['device'] == 'iops' -+ finally: -+ self.ring._devs = __devs diff --git a/glusterfs-3.3.1.ufo.gluster.swift.common.DiskFile-1.7.4.patch b/glusterfs-3.3.1.ufo.gluster.swift.common.DiskFile-1.7.4.patch deleted file mode 100644 index 24af87f..0000000 --- a/glusterfs-3.3.1.ufo.gluster.swift.common.DiskFile-1.7.4.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- ufo/gluster/swift/common/DiskFile.py.orig 2012-12-21 11:40:12.763297073 -0500 -+++ ufo/gluster/swift/common/DiskFile.py 2013-01-09 16:44:02.607838685 -0500 -@@ -55,7 +55,8 @@ - - def __init__(self, path, device, partition, account, container, obj, - logger, keep_data_fp=False, disk_chunk_size=65536, -- uid=DEFAULT_UID, gid=DEFAULT_GID): -+ uid=DEFAULT_UID, gid=DEFAULT_GID, iter_hook=None): -+ self.iter_hook = iter_hook - self.disk_chunk_size = disk_chunk_size - #Don't support obj_name ending/begining with '/', like /a, a/, /a/b/ etc - obj = obj.strip('/') diff --git a/glusterfs-3.3.2.libglusterfs.Makefile.patch b/glusterfs-3.3.2.libglusterfs.Makefile.patch deleted file mode 100644 index f539b91..0000000 --- a/glusterfs-3.3.2.libglusterfs.Makefile.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- libglusterfs/src/Makefile.am.orig 2013-07-12 13:50:20.000000000 -0400 -+++ libglusterfs/src/Makefile.am 2013-07-12 20:10:12.156000000 -0400 -@@ -48,7 +48,8 @@ - $(LEX) -t $(srcdir)/graph.l > $@ - - y.tab.h: graph.y -- $(YACC) -d $(srcdir)/graph.y -+ $(YACC) -d -b foo $(srcdir)/graph.y -+ mv foo.tab.h y.tab.h && mv foo.tab.c y.tab.c - - CLEANFILES = graph.lex.c y.tab.c y.tab.h - CONFIG_CLEAN_FILES = $(CONTRIB_BUILDDIR)/uuid/uuid_types.h ---- libglusterfs/src/Makefile.in.orig 2013-07-12 20:10:12.157000000 -0400 -+++ libglusterfs/src/Makefile.in 2013-07-12 20:12:43.022000000 -0400 -@@ -1101,7 +1101,8 @@ - $(LEX) -t $(srcdir)/graph.l > $@ - - y.tab.h: graph.y -- $(YACC) -d $(srcdir)/graph.y -+ $(YACC) -d -b foo $(srcdir)/graph.y -+ mv foo.tab.h y.tab.h && mv foo.tab.c y.tab.c - - # Tell versions [3.59,3.63) of GNU make to not export all variables. - # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/glusterfs-3.4.0.swift.egginfo-grizzly.patch b/glusterfs-3.4.0.swift.egginfo-grizzly.patch deleted file mode 100644 index ec9661b..0000000 --- a/glusterfs-3.4.0.swift.egginfo-grizzly.patch +++ /dev/null @@ -1,9 +0,0 @@ ---- a/tools/pip-requires 2013-04-05 10:55:21.988000000 -0400 -+++ b/tools/pip-requires 2013-04-05 10:55:28.649000000 -0400 -@@ -3,5 +3,5 @@ - netifaces>=0.5 - pastedeploy>=1.3.3 - simplejson>=2.0.9 --xattr>=0.4 -+pyxattr>=0.4 - python-swiftclient diff --git a/glusterfs-fuse.logrotate b/glusterfs-fuse.logrotate deleted file mode 100644 index d96663b..0000000 --- a/glusterfs-fuse.logrotate +++ /dev/null @@ -1,6 +0,0 @@ -/var/log/glusterfs/glusterfs.log { - missingok - postrotate - /usr/bin/killall -HUP gluster 2>/dev/null || true - endscript -} diff --git a/glusterfs.logrotate b/glusterfs.logrotate deleted file mode 100644 index 32b3ef9..0000000 --- a/glusterfs.logrotate +++ /dev/null @@ -1,6 +0,0 @@ -/var/log/glusterfs/glusterfs.log { - missingok - postrotate - /usr/bin/killall -HUP glusterfs 2>/dev/null || true - endscript -} diff --git a/glusterfs.spec b/glusterfs.spec index 4d0f0ae..c125810 100644 --- a/glusterfs.spec +++ b/glusterfs.spec @@ -3,250 +3,513 @@ %global _for_fedora_koji_builds 1 -# uncomment and add '%' to use the prereltag for pre-releases -# %%global prereltag rc1 +# uncomment and add '%' to use the %%dev for pre-releases +# %%global prereltag rc0 -# if you wish to compile an rpm without rdma support, compile like this... -# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without rdma -%{?_without_rdma:%global _without_rdma --disable-ibverbs} +##----------------------------------------------------------------------------- +## All package definitions should be placed here in alphabetical order +## -# No RDMA Support on s390(x) -%ifarch s390 s390x -%global _without_rdma --disable-ibverbs +# asan +# if you wish to compile an rpm with address sanitizer... +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with asan +%{?_with_asan:%global _with_asan --enable-asan} + +%if ( 0%{?rhel} && 0%{?rhel} < 7 ) +%global _with_asan %{nil} %endif +# cmocka +# if you wish to compile an rpm with cmocka unit testing... +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with cmocka +%{?_with_cmocka:%global _with_cmocka --enable-cmocka} + +# debug +# if you wish to compile an rpm with debugging... +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with debug +%{?_with_debug:%global _with_debug --enable-debug} + +# epoll # if you wish to compile an rpm without epoll... # rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without epoll %{?_without_epoll:%global _without_epoll --disable-epoll} +# fusermount # if you wish to compile an rpm without fusermount... # rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without fusermount %{?_without_fusermount:%global _without_fusermount --disable-fusermount} +# geo-rep # if you wish to compile an rpm without geo-replication support, compile like this... # rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without georeplication -%{?_without_georeplication:%global _without_georeplication --disable-geo-replication} +%{?_without_georeplication:%global _without_georeplication --disable-georeplication} +# gnfs +# if you wish to compile an rpm with the legacy gNFS server xlator +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with gnfs +%{?_without_gnfs:%global _with_gnfs --disable-gnfs} + +# ipv6default +# if you wish to compile an rpm with IPv6 default... +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with ipv6default +%{?_with_ipv6default:%global _with_ipv6default --with-ipv6-default} + +# linux-io_uring +# If you wish to compile an rpm without linux-io_uring support... +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without-linux-io_uring +%{?_without_linux_io_uring:%global _without_linux_io_uring --disable-linux-io_uring} + +# libtirpc +# if you wish to compile an rpm without TIRPC (i.e. use legacy glibc rpc) +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without libtirpc +%{?_without_libtirpc:%global _without_libtirpc --without-libtirpc} + +# Do not use libtirpc on EL6, it does not have xdr_uint64_t() and xdr_uint32_t +# Do not use libtirpc on EL7, it does not have xdr_sizeof() +%if ( 0%{?rhel} && 0%{?rhel} < 8 ) +%global _without_libtirpc --without-libtirpc +%endif + +# libtcmalloc +# if you wish to compile an rpm without tcmalloc (i.e. use gluster mempool) +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without tcmalloc +%{?_without_tcmalloc:%global _without_tcmalloc --without-tcmalloc} + +%ifnarch x86_64 +%global _without_tcmalloc --without-tcmalloc +%endif + +# ocf # if you wish to compile an rpm without the OCF resource agents... # rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without ocf %{?_without_ocf:%global _without_ocf --without-ocf} -# there is no systemtap support! Perhaps some day there will be -%global _without_systemtap --enable-systemtap=no +# server +# if you wish to build rpms without server components, compile like this +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without server +%{?_without_server:%global _without_server --without-server} -# if you wish to compile an rpm without the BD map support... -# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without bd -%{?_without_bd:%global _without_bd --disable-bd-xlator} - -%if ( 0%{?rhel} && 0%{?rhel} < 6 ) -%define _without_bd --disable-bd-xlator +# disable server components forcefully as rhel <= 6 +%if ( 0%{?rhel} && 0%{?rhel} < 7 ) +%global _without_server --without-server %endif -%if ( 0%{?fedora} && 0%{?fedora} > 16 ) || ( 0%{?rhel} && 0%{?rhel} > 6 ) -%global _with_systemd true +# syslog +# if you wish to build rpms without syslog logging, compile like this +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without syslog +%{?_without_syslog:%global _without_syslog --disable-syslog} + +# disable syslog forcefully as rhel <= 6 doesn't have rsyslog or rsyslog-mmcount +# Fedora deprecated syslog, see +# https://fedoraproject.org/wiki/Changes/NoDefaultSyslog +# (And what about RHEL7?) +%if ( ( 0%{?fedora} ) || ( 0%{?rhel} && 0%{?rhel} < 7 ) ) +%global _without_syslog --disable-syslog %endif -Summary: Cluster File System -%if ( 0%{_for_fedora_koji_builds} ) -Name: glusterfs -Version: 3.4.1 -Release: 2%{?prereltag:.%{prereltag}}%{?dist} -Vendor: Fedora Project +# tsan +# if you wish to compile an rpm with thread sanitizer... +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with tsan +%{?_with_tsan:%global _with_tsan --enable-tsan} + +%if ( 0%{?rhel} && 0%{?rhel} < 7 ) +%global _with_tsan %{nil} +%endif + +# valgrind +# if you wish to compile an rpm to run all processes under valgrind... +# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with valgrind +%{?_with_valgrind:%global _with_valgrind --enable-valgrind} + +##----------------------------------------------------------------------------- +## All package definitions should be placed here in alphabetical order +## + +# selinux booleans whose default value needs modification +# these booleans will be consumed by "%%selinux_set_booleans" macro. +%if ( 0%{?rhel} && 0%{?rhel} >= 8 ) +%global selinuxbooleans rsync_full_access=1 rsync_client=1 +%endif + +%if ( 0%{?fedora} || ( 0%{?rhel} && 0%{?rhel} > 6 ) ) +%global _with_firewalld --enable-firewalld +%endif + +%if ( 0%{?_tmpfilesdir:1} ) +%global _with_tmpfilesdir --with-tmpfilesdir=%{_tmpfilesdir} %else -Name: @PACKAGE_NAME@ -Version: @PACKAGE_VERSION@ -Release: 1%{?dist} -Vendor: glusterfs.org +%global _with_tmpfilesdir --without-tmpfilesdir %endif -License: GPLv2 or LGPLv3+ -Group: System Environment/Base -URL: http://www.gluster.org/docs/index.php/GlusterFS -%if ( 0%{_for_fedora_koji_builds} ) -Source0: http://download.gluster.org/pub/gluster/glusterfs/3.4/%{version}%{?prereltag}/glusterfs-%{version}%{?prereltag}.tar.gz -Source1: glusterd.sysconfig -Source2: glusterfsd.sysconfig -Source3: glusterfs-fuse.logrotate -Source4: glusterd.logrotate -Source5: glusterfsd.logrotate -Source6: rhel5-load-fuse-modules -Source11: glusterfsd.service -Source13: glusterfsd.init -Patch0: %{name}-3.2.5.configure.ac.patch -Patch1: %{name}-3.3.0.libglusterfs.Makefile.patch -Patch2: %{name}-3.3.1.rpc.rpcxprt.rdma.name.c.patch + +# without server should also disable some server-only components +%if ( 0%{?_without_server:1} ) +%global _without_events --disable-events +%global _without_georeplication --disable-georeplication +%global _with_gnfs %{nil} +%global _without_ocf --without-ocf +%endif + +%if ( 0%{?fedora} ) || ( 0%{?rhel} && 0%{?rhel} > 7 ) +%global _usepython3 1 +%global _pythonver 3 %else -Source0: @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz +%global _usepython3 0 +%global _pythonver 2 %endif -BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) - -%if ( 0%{?_with_systemd:1} ) -%if ( 0%{_for_fedora_koji_builds} ) -%global glusterfsd_service %{S:%{SOURCE11}} -%endif -BuildRequires: systemd-units -Requires(post): systemd-units -Requires(preun): systemd-units -Requires(postun): systemd-units -%define _init_enable() /bin/systemctl enable %1.service ; -%define _init_disable() /bin/systemctl disable %1.service ; -%define _init_restart() /bin/systemctl try-restart %1.service ; -%define _init_stop() /bin/systemctl stop %1.service ; -%define _init_install() %{__install} -D -p -m 0644 %1 %{buildroot}%{_unitdir}/%2.service ; +%global service_start() /bin/systemctl --quiet start %1.service || : \ +%{nil} +%global service_stop() /bin/systemctl --quiet stop %1.service || :\ +%{nil} +%global service_install() install -D -p -m 0644 %{_sourcedir}/%1.service %{buildroot}%2 \ +%{nil} # can't seem to make a generic macro that works -%define _init_glusterd %{_unitdir}/glusterd.service -%define _init_glusterfsd %{_unitdir}/glusterfsd.service -%else -%if ( 0%{_for_fedora_koji_builds} ) -%global glusterfsd_service %{S:%{SOURCE13}} -%endif -Requires(post): /sbin/chkconfig -Requires(preun): /sbin/service -Requires(preun): /sbin/chkconfig -Requires(postun): /sbin/service -%define _init_enable() /sbin/chkconfig --add %1 ; -%define _init_disable() /sbin/chkconfig --del %1 ; -%define _init_restart() /sbin/service %1 condrestart &>/dev/null ; -%define _init_stop() /sbin/service %1 stop &>/dev/null ; -%define _init_install() %{__install} -D -p -m 0755 %1 %{buildroot}%{_sysconfdir}/init.d/%2 ; -# can't seem to make a generic macro that works -%define _init_glusterd %{_sysconfdir}/init.d/glusterd -%define _init_glusterfsd %{_sysconfdir}/init.d/glusterfsd -%endif +%global glusterd_svcfile %{_unitdir}/glusterd.service +%global glusterfsd_svcfile %{_unitdir}/glusterfsd.service +%global glusterta_svcfile %{_unitdir}/gluster-ta-volume.service +%global glustereventsd_svcfile %{_unitdir}/glustereventsd.service +%global glusterfssharedstorage_svcfile %{_unitdir}/glusterfssharedstorage.service -Requires: %{name}-libs = %{version}-%{release} -BuildRequires: bison flex -BuildRequires: gcc make automake libtool -BuildRequires: ncurses-devel readline-devel -BuildRequires: libxml2-devel openssl-devel -BuildRequires: libaio-devel -BuildRequires: python-devel -BuildRequires: python-ctypes -%if ( 0%{!?_without_systemtap:1} ) -BuildRequires: systemtap-sdt-devel -%endif -%if ( 0%{!?_without_bd:1} ) -BuildRequires: lvm2-devel -%endif +%{!?_pkgdocdir: %global _pkgdocdir %{_docdir}/%{name}-%{version}} -Obsoletes: hekafs <= 0.7 -Obsoletes: %{name}-libs <= 2.0.0 -Obsoletes: %{name}-common < %{version}-%{release} -Obsoletes: %{name}-core < %{version}-%{release} -Provides: %{name}-libs = %{version}-%{release} -Provides: %{name}-common = %{version}-%{release} -Provides: %{name}-core = %{version}-%{release} - -# We do not want to generate useless provides and requires for xlator .so files +# We do not want to generate useless provides and requires for xlator +# .so files to be set for glusterfs packages. # Filter all generated: # # TODO: RHEL5 does not have a convenient solution %if ( 0%{?rhel} == 6 ) - # filter_setup exists in RHEL6 only - %filter_provides_in %{_libdir}/glusterfs/%{version}/ - %global __filter_from_req %{?__filter_from_req} | %{__grep} -v -P '^(?!lib).*\.so.*$' - %filter_setup +# filter_setup exists in RHEL6 only +%filter_provides_in %{_libdir}/glusterfs/%{version}/ +%global __filter_from_req %{?__filter_from_req} | grep -v -P '^(?!lib).*\.so.*$' +%filter_setup %else - # modern rpm and current Fedora do not generate requires when the - # provides are filtered - %global __provides_exclude_from ^%{_libdir}/glusterfs/%{version}/.*$ +# modern rpm and current Fedora do not generate requires when the +# provides are filtered +%global __provides_exclude_from ^%{_libdir}/glusterfs/%{version}/.*$ %endif + +##----------------------------------------------------------------------------- +## All package definitions should be placed here in alphabetical order +## +Summary: Distributed File System +%if ( 0%{_for_fedora_koji_builds} ) +Name: glusterfs +Version: 11.2 +Release: 4%{?prereltag:%{prereltag}}%{?dist} +%else +Name: @PACKAGE_NAME@ +Version: @PACKAGE_VERSION@ +Release: 0.@PACKAGE_RELEASE@%{?dist}.26 +%endif +License: GPL-2.0-only OR LGPL-3.0-or-later +URL: http://docs.gluster.org/ +%if ( 0%{_for_fedora_koji_builds} ) +Source0: http://github.com/gluster/glusterfs/archive/v%{version}%{?prereltag}/glusterfs-%{version}%{?prereltag}.tar.gz +Source1: glusterd.sysconfig +Source2: glusterfsd.sysconfig +Source7: glusterfsd.service +Source8: glusterfsd.init +%else +Source0: @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz +%endif +Patch0001: 0001-configure.ac.patch +Patch0002: 0002-contrib-aclocal-python.m4.patch +Patch0003: 0003-makefile-am-subdirs.patch + +BuildRequires: systemd + +%if 0%{!?_without_tcmalloc:1} +Requires: gperftools-libs%{?_isa} +%endif + +Requires: libglusterfs0%{?_isa} = %{version}-%{release} +Requires: libgfrpc0%{?_isa} = %{version}-%{release} +Requires: libgfxdr0%{?_isa} = %{version}-%{release} +%{?systemd_requires} +%if 0%{?_with_asan:1} && !( 0%{?rhel} && 0%{?rhel} < 7 ) +BuildRequires: libasan +%endif +%if 0%{?_with_tsan:1} && !( 0%{?rhel} && 0%{?rhel} < 7 ) +BuildRequires: libtsan +%endif +BuildRequires: bison flex +BuildRequires: gcc make libtool +%ifarch x86_64 aarch64 +BuildRequires: mold +%endif +BuildRequires: ncurses-devel readline-devel +BuildRequires: libxml2-devel openssl-devel openssl +BuildRequires: libaio-devel libacl-devel +BuildRequires: python%{_pythonver}-devel +%if 0%{!?_without_tcmalloc:1} +BuildRequires: gperftools-devel +%endif +%if ( 0%{?rhel} && 0%{?rhel} < 8 ) +BuildRequires: python-ctypes +%endif +%if ( ( 0%{?_with_ipv6default:1} ) || ( 0%{!?_without_libtirpc:1} ) ) +BuildRequires: libtirpc-devel +%endif +%if ( 0%{?fedora} && 0%{?fedora} > 27 ) || ( 0%{?rhel} && 0%{?rhel} > 7 ) +BuildRequires: rpcgen +%endif +BuildRequires: userspace-rcu-devel >= 0.7 +%if ( 0%{?rhel} && 0%{?rhel} < 7 ) +BuildRequires: automake +%endif +BuildRequires: libuuid-devel +%if ( 0%{?_with_cmocka:1} ) +BuildRequires: libcmocka-devel >= 1.0.1 +%endif +%if ( 0%{!?_without_georeplication:1} ) +BuildRequires: libattr-devel +%endif + +%if ( 0%{?_with_firewalld:1} ) +BuildRequires: firewalld +%endif + +%if ( 0%{!?_without_linux_io_uring:1} ) +BuildRequires: liburing-devel +%endif + +Obsoletes: hekafs <= %{version}-%{release} +Obsoletes: %{name}-common < %{version}-%{release} +Obsoletes: %{name}-core < %{version}-%{release} +%if ( 0%{_for_fedora_koji_builds} ) +Obsoletes: %{name}-regression-tests <= %{version}-%{release} +%endif +Obsoletes: %{name}-ufo <= %{version}-%{release} +%if ( 0%{!?_with_gnfs:1} ) +Obsoletes: %{name}-gnfs <= %{version}-%{release} +%endif +Obsoletes: %{name}-rdma < %{version}-%{release} +Provides: %{name}-common = %{version}-%{release} +Provides: %{name}-core = %{version}-%{release} +Provides: %{name}-rdma = %{version}-%{release} + %description -GlusterFS is a clustered file-system capable of scaling to several -petabytes. It aggregates various storage bricks over Infiniband RDMA -or TCP/IP interconnect into one large parallel network file -system. GlusterFS is one of the most sophisticated file systems in -terms of features and extensibility. It borrows a powerful concept -called Translators from GNU Hurd kernel. Much of the code in GlusterFS -is in user space and easily manageable. +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. This package includes the glusterfs binary, the glusterfsd daemon and the -gluster command line, libglusterfs and glusterfs translator modules common to -both GlusterFS server and client framework. - -%package libs -Summary: GlusterFS common libraries -Group: Applications/File - -%description libs -GlusterFS is a clustered file-system capable of scaling to several -petabytes. It aggregates various storage bricks over Infiniband RDMA -or TCP/IP interconnect into one large parallel network file -system. GlusterFS is one of the most sophisticated file systems in -terms of features and extensibility. It borrows a powerful concept -called Translators from GNU Hurd kernel. Much of the code in GlusterFS -is in user space and easily manageable. - -This package provides the base GlusterFS libraries +libglusterfs and glusterfs translator modules common to both GlusterFS server +and client framework. %package cli Summary: GlusterFS CLI -Group: Applications/File -Requires: %{name}-libs = %{version}-%{release} +%if ( ! (0%{?rhel} && 0%{?rhel} < 7) ) +BuildRequires: pkgconfig(bash-completion) +# bash-completion >= 1.90 satisfies this requirement. +# If it is not available, the condition can be adapted +# and the completion script will be installed in the backwards compatible +# %{sysconfdir}/bash_completion.d +%endif +Requires: libglusterfs0%{?_isa} = %{version}-%{release} + +%if "%{_sbindir}" == "%{_bindir}" +# Compat symlinks for Requires in other packages. +# We rely on filesystem to create the symlinks for us. +Requires: filesystem(unmerged-sbin-symlinks) +Provides: /usr/sbin/gluster +%endif %description cli -GlusterFS is a clustered file-system capable of scaling to several -petabytes. It aggregates various storage bricks over Infiniband RDMA -or TCP/IP interconnect into one large parallel network file -system. GlusterFS is one of the most sophisticated file systems in -terms of features and extensibility. It borrows a powerful concept -called Translators from GNU Hurd kernel. Much of the code in GlusterFS -is in user space and easily manageable. +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. This package provides the GlusterFS CLI application and its man page -%if ( 0%{!?_without_rdma:1} ) -%package rdma -Summary: GlusterFS rdma support for ib-verbs -Group: Applications/File -BuildRequires: libibverbs-devel -BuildRequires: librdmacm-devel -Requires: %{name} = %{version}-%{release} +%package client-xlators +Summary: GlusterFS client-side translators -%description rdma -GlusterFS is a clustered file-system capable of scaling to several -petabytes. It aggregates various storage bricks over Infiniband RDMA -or TCP/IP interconnect into one large parallel network file -system. GlusterFS is one of the most sophisticated file systems in -terms of features and extensibility. It borrows a powerful concept -called Translators from GNU Hurd kernel. Much of the code in GlusterFS -is in user space and easily manageable. +%description client-xlators +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. -This package provides support to ib-verbs library. +This package provides the translators needed on any GlusterFS client. + +%package cloudsync-plugins +Summary: Cloudsync Plugins +BuildRequires: libcurl-devel + +%description cloudsync-plugins +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides cloudsync plugins for archival feature. + +%if ( 0%{!?_without_events:1} ) +%package events +Summary: GlusterFS Events +Requires: %{name}-server%{?_isa} = %{version}-%{release} +Requires: python%{_pythonver} +Requires: python%{_pythonver}-prettytable +Requires: python%{_pythonver}-gluster = %{version}-%{release} +%if ( 0%{?rhel} && 0%{?rhel} < 8 ) +Requires: python-requests +%else +Requires: python%{_pythonver}-requests +%endif +%if ( 0%{?rhel} && 0%{?rhel} < 7 ) +Requires: python-argparse +%endif +%{?systemd_requires} + +%description events +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides the GlusterFS Events %endif -%if ( 0%{!?_without_georeplication:1} ) -%package geo-replication -Summary: GlusterFS Geo-replication -Group: Applications/File -Requires: %{name} = %{version}-%{release} -Requires: %{name}-server = %{version}-%{release} +%package extra-xlators +Summary: Extra Gluster filesystem Translators +# We need python2-gluster rpm for gluster module's __init__.py in Python +# site-packages area +Requires: python%{_pythonver}-gluster = %{version}-%{release} +Requires: python%{_pythonver} -%description geo-replication -GlusterFS is a clustered file-system capable of scaling to several -peta-bytes. It aggregates various storage bricks over Infiniband RDMA -or TCP/IP interconnect into one large parallel network file -system. GlusterFS is one of the most sophisticated file system in -terms of features and extensibility. It borrows a powerful concept -called Translators from GNU Hurd kernel. Much of the code in GlusterFS -is in userspace and easily manageable. +%description extra-xlators +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. -This package provides support to geo-replication. -%endif +This package provides extra filesystem Translators, such as Glupy, +for GlusterFS. %package fuse Summary: Fuse client -Group: Applications/File -BuildRequires: fuse-devel +BuildRequires: fuse3-devel +Requires: attr +Requires: psmisc Requires: %{name} = %{version}-%{release} +Requires: %{name}-client-xlators = %{version}-%{release} Obsoletes: %{name}-client < %{version}-%{release} Provides: %{name}-client = %{version}-%{release} %description fuse -GlusterFS is a clustered file-system capable of scaling to several +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides support to FUSE based clients and includes the +glusterfs and glusterfsd binaries. + +%if ( 0%{!?_without_server:1} ) +%package ganesha +Summary: NFS-Ganesha configuration +Group: Applications/File + +Requires: %{name}-server%{?_isa} = %{version}-%{release} +Requires: nfs-ganesha-selinux >= 2.7.6 +Requires: nfs-ganesha-gluster >= 2.7.6 +Requires: pcs >= 0.10.0 +Requires: resource-agents >= 4.2.0 +Requires: dbus + +%if ( 0%{?rhel} && 0%{?rhel} == 6 ) +Requires: cman, pacemaker, corosync +%endif + +%if ( 0%{?fedora} ) || ( 0%{?rhel} && 0%{?rhel} > 5 ) +# we need portblock resource-agent in 3.9.5 and later. +Requires: net-tools +%endif + +%if ( 0%{?fedora} && 0%{?fedora} > 25 || ( 0%{?rhel} && 0%{?rhel} > 6 ) ) +%if ( 0%{?rhel} && 0%{?rhel} < 8 ) +Requires: selinux-policy >= 3.13.1-160 +Requires(post): policycoreutils-python +Requires(postun): policycoreutils-python +%else +Requires(post): policycoreutils-python-utils +Requires(postun): policycoreutils-python-utils +%endif +%endif + +%description ganesha +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides the configuration and related files for using +NFS-Ganesha as the NFS server using GlusterFS +%endif + +%if ( 0%{!?_without_georeplication:1} ) +%package geo-replication +Summary: GlusterFS Geo-replication +Requires: %{name} = %{version}-%{release} +Requires: %{name}-server = %{version}-%{release} +Requires: python%{_pythonver} +Requires: python%{_pythonver}-prettytable +Requires: python%{_pythonver}-gluster = %{version}-%{release} + +Requires: rsync +Requires: util-linux +Requires: tar +# required for setting selinux bools +%if ( 0%{?rhel} && 0%{?rhel} >= 8 ) +Requires(post): policycoreutils-python-utils +Requires(postun): policycoreutils-python-utils +Requires: selinux-policy-targeted +Requires(post): selinux-policy-targeted +BuildRequires: selinux-policy-devel +%endif + +%description geo-replication +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides support to geo-replication. +%endif + +%if ( 0%{?_with_gnfs:1} ) +%package gnfs +Summary: GlusterFS gNFS server +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: %{name}-client-xlators%{?_isa} = %{version}-%{release} +Requires: nfs-utils + +%description gnfs +GlusterFS is a distributed file-system capable of scaling to several petabytes. It aggregates various storage bricks over Infiniband RDMA or TCP/IP interconnect into one large parallel network file system. GlusterFS is one of the most sophisticated file systems in @@ -254,23 +517,275 @@ terms of features and extensibility. It borrows a powerful concept called Translators from GNU Hurd kernel. Much of the code in GlusterFS is in user space and easily manageable. -This package provides support to FUSE based clients. +This package provides the glusterfs legacy gNFS server xlator +%endif -%package server -Summary: Clustered file-system server -Group: System Environment/Daemons +%package -n libglusterfs0 +Summary: GlusterFS libglusterfs library +Requires: libgfrpc0%{?_isa} = %{version}-%{release} +Requires: libgfxdr0%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-libs <= %{version}-%{release} +Provides: %{name}-libs = %{version}-%{release} +Obsoletes: libglusterd0 <= %{version}-%{release} +Provides: libglusterd0 = %{version}-%{release} + +%description -n libglusterfs0 +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides the base libglusterfs library + +%package -n libglusterfs-devel +Summary: GlusterFS libglusterfs library +Requires: libgfrpc-devel%{?_isa} = %{version}-%{release} +Requires: libgfxdr-devel%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-devel <= %{version}-%{release} +Provides: %{name}-devel = %{version}-%{release} + +%description -n libglusterfs-devel +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides libglusterfs.so and the gluster C header files. + +%package -n libgfapi0 +Summary: GlusterFS api library +Requires: libglusterfs0%{?_isa} = %{version}-%{release} +Requires: %{name}-client-xlators%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-api <= %{version}-%{release} +Provides: %{name}-api = %{version}-%{release} + +%description -n libgfapi0 +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides the glusterfs libgfapi library. + +%package -n libgfapi-devel +Summary: Development Libraries +Requires: libglusterfs-devel%{?_isa} = %{version}-%{release} +Requires: libacl-devel +Obsoletes: %{name}-api-devel <= %{version}-%{release} +Provides: %{name}-api-devel = %{version}-%{release} + +%description -n libgfapi-devel +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides libgfapi.so and the api C header files. + +%package -n libgfchangelog0 +Summary: GlusterFS libchangelog library +Requires: libglusterfs0%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-libs <= %{version}-%{release} + +%description -n libgfchangelog0 +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides the libgfchangelog library + +%package -n libgfchangelog-devel +Summary: GlusterFS libchangelog library +Requires: libglusterfs-devel%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-devel <= %{version}-%{release} + +%description -n libgfchangelog-devel +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides libgfchangelog.so and changelog C header files. + +%package -n libgfrpc0 +Summary: GlusterFS libgfrpc0 library +Requires: libglusterfs0%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-libs <= %{version}-%{release} + +%description -n libgfrpc0 +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides the libgfrpc library + +%package -n libgfrpc-devel +Summary: GlusterFS libgfrpc library +Requires: libglusterfs0%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-devel <= %{version}-%{release} + +%description -n libgfrpc-devel +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides libgfrpc.so and rpc C header files. + +%package -n libgfxdr0 +Summary: GlusterFS libgfxdr0 library +Requires: libglusterfs0%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-libs <= %{version}-%{release} + +%description -n libgfxdr0 +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides the libgfxdr library + +%package -n libgfxdr-devel +Summary: GlusterFS libgfxdr library +Requires: libglusterfs0%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-devel <= %{version}-%{release} + +%description -n libgfxdr-devel +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides libgfxdr.so. + +%package -n python%{_pythonver}-gluster +Summary: GlusterFS python library +Requires: python%{_pythonver} +%if ( ! %{_usepython3} ) +%{?python_provide:%python_provide python-gluster} +Provides: python-gluster = %{version}-%{release} +Obsoletes: python-gluster < 3.10 +%endif + +%description -n python%{_pythonver}-gluster +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package contains the python modules of GlusterFS and own gluster +namespace. + +%if ( ! 0%{_for_fedora_koji_builds} ) +%package regression-tests +Summary: Development Tools Requires: %{name} = %{version}-%{release} -Requires: %{name}-cli = %{version}-%{release} -Requires: %{name}-libs = %{version}-%{release} Requires: %{name}-fuse = %{version}-%{release} -%if ( 0%{?fedora} ) || ( 0%{?rhel} && 0%{?rhel} >= 6 ) +Requires: %{name}-server = %{version}-%{release} +## thin provisioning support +Requires: lvm2 >= 2.02.89 +Requires: perl(App::Prove) perl(Test::Harness) gcc util-linux-ng +Requires: python%{_pythonver} attr dbench file git libacl-devel net-tools +Requires: nfs-utils xfsprogs yajl psmisc bc + +%description regression-tests +The Gluster Test Framework, is a suite of scripts used for +regression testing of Gluster. +%endif + +%if ( 0%{!?_without_ocf:1} ) +%package resource-agents +Summary: OCF Resource Agents for GlusterFS +License: GPL-3.0-or-later +BuildArch: noarch +# for glusterd +Requires: %{name}-server = %{version}-%{release} +# depending on the distribution, we need pacemaker or resource-agents +Requires: resource-agents + +%description resource-agents +GlusterFS is a distributed file-system capable of scaling to several +petabytes. It aggregates various storage bricks over TCP/IP interconnect +into one large parallel network filesystem. GlusterFS is one of the +most sophisticated file systems in terms of features and extensibility. +It borrows a powerful concept called Translators from GNU Hurd kernel. +Much of the code in GlusterFS is in user space and easily manageable. + +This package provides the resource agents which plug glusterd into +Open Cluster Framework (OCF) compliant cluster resource managers, +like Pacemaker. +%endif + +%if ( 0%{!?_without_server:1} ) +%package server +Summary: Distributed file-system server +Requires: %{name} = %{version}-%{release} +Requires: libglusterfs0%{?_isa} = %{version}-%{release} +Requires: libgfchangelog0%{?_isa} = %{version}-%{release} +Requires: %{name}-cli = %{version}-%{release} +%if ( 0%{?fedora} && 0%{?fedora} >= 30 || ( 0%{?rhel} && 0%{?rhel} >= 8 ) ) +# Requires: %%{name}-selinux >= 0.1.0-2 +%endif +# some daemons (like quota) use a fuse-mount, glusterfsd is part of -fuse +Requires: %{name}-fuse = %{version}-%{release} +# self-heal daemon, rebalance, nfs-server etc. are actually clients +Requires: libgfapi0%{?_isa} = %{version}-%{release} +Requires: %{name}-client-xlators = %{version}-%{release} +# lvm2 for snapshot, and nfs-utils and rpcbind/portmap for gnfs server +Requires: psmisc +Requires: lvm2 +%{?systemd_requires} +%if (0%{?_with_firewalld:1}) +# we install firewalld rules, so we need to have the directory owned +%if ( 0%{!?rhel} ) +# not on RHEL because firewalld-filesystem appeared in 7.3 +# when EL7 rpm gets weak dependencies we can add a Suggests: +Requires: firewalld-filesystem +%endif +%endif +%if ( 0%{?fedora} ) || ( 0%{?rhel} ) Requires: rpcbind %else Requires: portmap %endif +%if ( 0%{?rhel} && 0%{?rhel} < 7 ) +Requires: python-argparse +%endif +%if ( 0%{?fedora} && 0%{?fedora} > 27 ) || ( 0%{?rhel} && 0%{?rhel} > 7 ) +Requires: python%{_pythonver}-pyxattr +%else +Requires: pyxattr +%endif +%if (0%{?_with_valgrind:1}) +Requires: valgrind +%endif %description server -GlusterFS is a clustered file-system capable of scaling to several +GlusterFS is a distributed file-system capable of scaling to several petabytes. It aggregates various storage bricks over Infiniband RDMA or TCP/IP interconnect into one large parallel network file system. GlusterFS is one of the most sophisticated file systems in @@ -279,162 +794,119 @@ called Translators from GNU Hurd kernel. Much of the code in GlusterFS is in user space and easily manageable. This package provides the glusterfs server daemon. - -%package api -Summary: Clustered file-system api library -Group: System Environment/Daemons -Requires: %{name} = %{version}-%{release} - -%description api -GlusterFS is a clustered file-system capable of scaling to several -petabytes. It aggregates various storage bricks over Infiniband RDMA -or TCP/IP interconnect into one large parallel network file -system. GlusterFS is one of the most sophisticated file systems in -terms of features and extensibility. It borrows a powerful concept -called Translators from GNU Hurd kernel. Much of the code in GlusterFS -is in user space and easily manageable. - -This package provides the glusterfs libgfapi library - -%if ( 0%{!?_without_ocf:1} ) -%package resource-agents -Summary: OCF Resource Agents for GlusterFS -License: GPLv3+ -%if ( ! ( 0%{?rhel} && 0%{?rhel} < 6 ) ) -# EL5 does not support noarch sub-packages -BuildArch: noarch -%endif -# this Group handling comes from the Fedora resource-agents package -%if ( 0%{?fedora} || 0%{?centos_version} || 0%{?rhel} ) -Group: System Environment/Base -%else -Group: Productivity/Clustering/HA -%endif -# for glusterd -Requires: glusterfs-server -# depending on the distribution, we need pacemaker or resource-agents -Requires: %{_prefix}/lib/ocf/resource.d - -%description resource-agents -GlusterFS is a clustered file-system capable of scaling to several -petabytes. It aggregates various storage bricks over Infiniband RDMA -or TCP/IP interconnect into one large parallel network file -system. GlusterFS is one of the most sophisticated file systems in -terms of features and extensibility. It borrows a powerful concept -called Translators from GNU Hurd kernel. Much of the code in GlusterFS -is in user space and easily manageable. - -This package provides the resource agents which plug glusterd into -Open Cluster Framework (OCF) compliant cluster resource managers, -like Pacemaker. %endif -%package devel -Summary: Development Libraries -Group: Development/Libraries -Requires: %{name} = %{version}-%{release} +%package thin-arbiter +Summary: GlusterFS thin-arbiter module +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: %{name}-server%{?_isa} = %{version}-%{release} -%description devel -GlusterFS is a clustered file-system capable of scaling to several -petabytes. It aggregates various storage bricks over Infiniband RDMA -or TCP/IP interconnect into one large parallel network file -system. GlusterFS is one of the most sophisticated file systems in -terms of features and extensibility. It borrows a powerful concept -called Translators from GNU Hurd kernel. Much of the code in GlusterFS -is in user space and easily manageable. +%description thin-arbiter +This package provides a tie-breaker functionality to GlusterFS +replicate volume. It includes translators required to provide the +functionality, and also few other scripts required for setup. -This package provides the development libraries and include files. - -%package api-devel -Summary: Development Libraries -Group: Development/Libraries -Requires: %{name} = %{version}-%{release} -Requires: %{name}-devel = %{version}-%{release} - -%description api-devel -GlusterFS is a clustered file-system capable of scaling to several -petabytes. It aggregates various storage bricks over Infiniband RDMA -or TCP/IP interconnect into one large parallel network file -system. GlusterFS is one of the most sophisticated file systems in -terms of features and extensibility. It borrows a powerful concept -called Translators from GNU Hurd kernel. Much of the code in GlusterFS -is in user space and easily manageable. - -This package provides the api include files. +This package provides the glusterfs thin-arbiter translator. %prep %setup -q -n %{name}-%{version}%{?prereltag} -%if ( 0%{_for_fedora_koji_builds} ) -#%patch0 -p0 -%patch1 -p0 -F4 -%if ( "%{version}" == "3.3.1" ) -%patch2 -p1 +%ifarch x86_64 aarch64 +%patch 0001 -p1 %endif +%patch 0002 -p1 +%patch 0003 -p1 +%if ( ! %{_usepython3} ) +echo "fixing python shebangs..." +for f in api events extras geo-replication libglusterfs tools xlators; do +find $f -type f -exec sed -i 's|/usr/bin/python3|/usr/bin/python2|' {} \; +done %endif +# Create a sysusers.d config file +cat >glusterfs.sysusers.conf < VERSION +cat VERSION +./autogen.sh && %configure \ + %{?_with_asan} \ + %{?_with_cmocka} \ + %{?_with_debug} \ + %{?_with_firewalld} \ + %{?_with_gnfs} \ + %{?_with_tmpfilesdir} \ + %{?_with_tsan} \ + %{?_with_valgrind} \ + %{?_without_epoll} \ + %{?_without_events} \ + %{?_without_fusermount} \ + %{?_without_georeplication} \ + %{?_without_ocf} \ + %{?_without_server} \ + %{?_with_ipv6default} \ + %{?_without_linux_io_uring} \ + %{?_without_libtirpc} \ + %{?_without_tcmalloc} + +# remove option mold doesn't recognize +for file in $(find . -type f -name Makefile -print); do +sed -i -e 's/-Wl,-dT.*$//' $file +done # fix hardening and remove rpath in shlibs -%if ( 0%{?fedora} && 0%{?fedora} > 17 ) || ( 0%{?rhel} && 0%{?rhel} > 6 ) -%{__sed} -i 's| \\\$compiler_flags |&\\\$LDFLAGS |' libtool +%if ( 0%{?fedora} ) || ( 0%{?rhel} && 0%{?rhel} > 6 ) +sed -i 's| \\\$compiler_flags |&\\\$LDFLAGS |' libtool %endif -%{__sed} -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|' libtool -%{__sed} -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|' libtool +sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|' libtool +sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|' libtool -%{__make} %{?_smp_mflags} +%make_build V=1 GCC_COLORS= + +%check +%make_build check %install -%{__rm} -rf %{buildroot} -%{__make} install DESTDIR=%{buildroot} -# Install include directory -%{__mkdir_p} %{buildroot}%{_includedir}/glusterfs -%{__install} -p -m 0644 libglusterfs/src/*.h \ - %{buildroot}%{_includedir}/glusterfs/ -%{__install} -p -m 0644 contrib/uuid/*.h \ - %{buildroot}%{_includedir}/glusterfs/ -# Following needed by hekafs multi-tenant translator -%{__mkdir_p} %{buildroot}%{_includedir}/glusterfs/rpc -%{__install} -p -m 0644 rpc/rpc-lib/src/*.h \ - %{buildroot}%{_includedir}/glusterfs/rpc/ -%{__install} -p -m 0644 rpc/xdr/src/*.h \ - %{buildroot}%{_includedir}/glusterfs/rpc/ -%{__mkdir_p} %{buildroot}%{_includedir}/glusterfs/server -%{__install} -p -m 0644 xlators/protocol/server/src/*.h \ - %{buildroot}%{_includedir}/glusterfs/server/ +rm -rf %{buildroot} +%make_install +%if ( 0%{!?_without_server:1} ) %if ( 0%{_for_fedora_koji_builds} ) -%{__install} -D -p -m 0644 %{SOURCE1} \ +%if ( 0%{!?_without_server:1} ) +install -D -p -m 0644 %{SOURCE1} \ %{buildroot}%{_sysconfdir}/sysconfig/glusterd -%{__install} -D -p -m 0644 %{SOURCE2} \ +install -D -p -m 0644 %{SOURCE2} \ %{buildroot}%{_sysconfdir}/sysconfig/glusterfsd +%endif %else -%{__install} -D -p -m 0644 extras/glusterd-sysconfig \ +install -D -p -m 0644 extras/glusterd-sysconfig \ %{buildroot}%{_sysconfdir}/sysconfig/glusterd %endif -%if ( 0%{?rhel} && 0%{?rhel} > 5 ) -%{__mkdir_p} %{buildroot}%{python_sitelib}/gluster -touch %{buildroot}%{python_sitelib}/gluster/__init__.py %endif -%if ( 0%{_for_fedora_koji_builds} ) -%if ( 0%{?rhel} && 0%{?rhel} <= 5 ) -%{__install} -D -p -m 0755 %{SOURCE6} \ - %{buildroot}%{_sysconfdir}/sysconfig/modules/glusterfs-fuse.modules -%endif -%endif - -%{__mkdir_p} %{buildroot}%{_localstatedir}/log/glusterd -%{__mkdir_p} %{buildroot}%{_localstatedir}/log/glusterfs -%{__mkdir_p} %{buildroot}%{_localstatedir}/log/glusterfsd -%{__mkdir_p} %{buildroot}%{_localstatedir}/run/gluster +mkdir -p %{buildroot}%{_localstatedir}/log/glusterd +mkdir -p %{buildroot}%{_localstatedir}/log/glusterfs +mkdir -p %{buildroot}%{_localstatedir}/log/glusterfsd +mkdir -p %{buildroot}%{_rundir}/gluster/metrics # Remove unwanted files from all the shared libraries find %{buildroot}%{_libdir} -name '*.a' -delete find %{buildroot}%{_libdir} -name '*.la' -delete -# Remove installed docs, they're included by %%doc -%{__rm} -rf %{buildroot}%{_datadir}/doc/glusterfs/ +# Remove installed docs, the ones we want are included by %%doc, in +# /usr/share/doc/glusterfs or /usr/share/doc/glusterfs-x.y.z depending +# on the distribution +%if ( 0%{?fedora} ) || ( 0%{?rhel} && 0%{?rhel} > 6 ) +rm -rf %{buildroot}%{_pkgdocdir}/* +%else +rm -rf %{buildroot}%{_defaultdocdir}/%{name} +mkdir -p %{buildroot}%{_pkgdocdir} +%endif head -50 ChangeLog > ChangeLog.head && mv ChangeLog.head ChangeLog cat << EOM >> ChangeLog @@ -443,266 +915,156 @@ https://forge.gluster.org/glusterfs-core/glusterfs/commits/v%{version}%{?prerelt EOM # Remove benchmarking and other unpackaged files -%{__rm} -rf %{buildroot}/benchmarking -%{__rm} -f %{buildroot}/glusterfs-mode.el -%{__rm} -f %{buildroot}/glusterfs.vim +# make install always puts these in %%{_defaultdocdir}/%%{name} so don't +# use %%{_pkgdocdir}; that will be wrong on later Fedora distributions +rm -rf %{buildroot}%{_defaultdocdir}/%{name}/benchmarking +rm -f %{buildroot}%{_defaultdocdir}/%{name}/glusterfs-mode.el +rm -f %{buildroot}%{_defaultdocdir}/%{name}/glusterfs.vim +%if ( 0%{!?_without_server:1} ) # Create working directory -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd +mkdir -p %{buildroot}%{_sharedstatedir}/glusterd # Update configuration file to /var/lib working directory sed -i 's|option working-directory /etc/glusterd|option working-directory %{_sharedstatedir}/glusterd|g' \ %{buildroot}%{_sysconfdir}/glusterfs/glusterd.vol - -# Install glusterfsd .service or init.d file -%if ( 0%{_for_fedora_koji_builds} ) -%_init_install %{glusterfsd_service} glusterfsd %endif +# Install glusterfsd .service or init.d file +%if ( 0%{!?_without_server:1} ) %if ( 0%{_for_fedora_koji_builds} ) -# Client logrotate entry -%{__install} -D -p -m 0644 %{SOURCE3} \ - %{buildroot}%{_sysconfdir}/logrotate.d/glusterfs-fuse +%service_install glusterfsd %{glusterfsd_svcfile} +%endif +%endif -# Server logrotate entry -%{__install} -D -p -m 0644 %{SOURCE4} \ - %{buildroot}%{_sysconfdir}/logrotate.d/glusterd -# Legacy server logrotate entry -%{__install} -D -p -m 0644 %{SOURCE5} \ - %{buildroot}%{_sysconfdir}/logrotate.d/glusterfsd -%else -%{__install} -D -p -m 0644 extras/glusterfs-logrotate \ +install -D -p -m 0644 extras/glusterfs-logrotate \ %{buildroot}%{_sysconfdir}/logrotate.d/glusterfs + +# ganesha ghosts +%if ( 0%{!?_without_server:1} ) +mkdir -p %{buildroot}%{_sysconfdir}/ganesha +touch %{buildroot}%{_sysconfdir}/ganesha/ganesha-ha.conf +mkdir -p %{buildroot}%{_localstatedir}/run/gluster/shared_storage/nfs-ganesha/ +touch %{buildroot}%{_localstatedir}/run/gluster/shared_storage/nfs-ganesha/ganesha.conf +touch %{buildroot}%{_localstatedir}/run/gluster/shared_storage/nfs-ganesha/ganesha-ha.conf %endif %if ( 0%{!?_without_georeplication:1} ) # geo-rep ghosts -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/geo-replication -touch %{buildroot}%{_sharedstatedir}/glusterd/geo-replication/gsyncd.conf +mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/geo-replication +touch %{buildroot}%{_sharedstatedir}/glusterd/geo-replication/gsyncd_template.conf +install -D -p -m 0644 extras/glusterfs-georep-logrotate \ + %{buildroot}%{_sysconfdir}/logrotate.d/glusterfs-georep %endif +%if ( 0%{!?_without_server:1} ) # the rest of the ghosts touch %{buildroot}%{_sharedstatedir}/glusterd/glusterd.info touch %{buildroot}%{_sharedstatedir}/glusterd/options -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1 -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/stop -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/stop/post -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/stop/pre -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/start -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/start/post -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/start/pre -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/remove-brick -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/remove-brick/post -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/remove-brick/pre -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/add-brick -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/add-brick/post -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/add-brick/pre -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/set -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/set/post -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/set/pre -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/create -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/create/post -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/create/pre -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/delete -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/delete/post -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/delete/pre -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/glustershd -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/peers -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/vols -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/groups -%{__mkdir_p} %{buildroot}%{_sharedstatedir}/glusterd/nfs/run +subdirs=(add-brick create copy-file delete gsync-create remove-brick reset set start stop) +for dir in ${subdirs[@]}; do + mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/"$dir"/{pre,post} +done +mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/glustershd +mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/peers +mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/vols +mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/nfs/run +mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/bitd +mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/quotad +mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/scrub +mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/snaps +mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/ss_brick touch %{buildroot}%{_sharedstatedir}/glusterd/nfs/nfs-server.vol touch %{buildroot}%{_sharedstatedir}/glusterd/nfs/run/nfs.pid - -%clean -%{__rm} -rf %{buildroot} - -%post -/sbin/ldconfig - -%postun -/sbin/ldconfig - -%files -%defattr(-,root,root,-) -%doc ChangeLog COPYING-GPLV2 COPYING-LGPLV3 INSTALL README THANKS -%config(noreplace) %{_sysconfdir}/logrotate.d/* -%config(noreplace) %{_sysconfdir}/sysconfig/* -%{_libdir}/glusterfs -%{_sbindir}/glusterfs* -%{_mandir}/man8/*gluster*.8* -%exclude %{_mandir}/man8/gluster.8* -%dir %{_localstatedir}/log/glusterfs -%dir %{_localstatedir}/run/gluster -%dir %{_sharedstatedir}/glusterd -%if ( 0%{!?_without_rdma:1} ) -%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/rpc-transport/rdma* %endif -# server-side, etc., xlators in other RPMs -%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount/api* -%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount/fuse* -%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/storage* -%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/posix* -%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/protocol/server* -%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mgmt* -%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/nfs* -# sample xlators not generally used or usable -%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/encryption/rot-13* -%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/mac-compat* -%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/testing/performance/symlink-cache* -%post libs -/sbin/ldconfig +%if ( ! 0%{_for_fedora_koji_builds} ) +find ./tests ./run-tests.sh -type f | cpio -pd %{buildroot}%{_prefix}/share/glusterfs +%endif -%postun libs -/sbin/ldconfig +# Fix installation paths +mv -v %{buildroot}/sbin/* %{buildroot}%{_sbindir}/ -%files libs -%{_libdir}/*.so.* -%exclude %{_libdir}/libgfapi.* +%global bashcompdir %(pkg-config --variable=completionsdir bash-completion 2>/dev/null) +%if "%{bashcompdir}" == "" +%global bashcompdir ${sysconfdir}/bash_completion.d +%endif -%files cli -%{_sbindir}/gluster -%{_mandir}/man8/gluster.8* +##----------------------------------------------------------------------------- +## All package definitions should be placed here in alphabetical order -%if ( 0%{!?_without_rdma:1} ) -%files rdma -%defattr(-,root,root,-) -%{_libdir}/glusterfs/%{version}%{?prereltag}/rpc-transport/rdma* +install -m0644 -D glusterfs.sysusers.conf %{buildroot}%{_sysusersdir}/glusterfs.conf +## +%post +%{?ldconfig} +%if ( 0%{!?_without_syslog:1} ) +%if ( 0%{?fedora} ) || ( 0%{?rhel} ) +%systemd_postun_with_restart rsyslog +%endif +%endif +exit 0 + +# post and postun scriptlets for libs +%ldconfig_scriptlets libglusterfs0 + +%ldconfig_scriptlets libgfchangelog0 + +%ldconfig_scriptlets libgfapi0 + +%ldconfig_scriptlets libgfrpc0 + +%ldconfig_scriptlets libgfxdr0 + +%ldconfig_scriptlets libgfglusterd0 + +%if ( 0%{!?_without_events:1} ) +%post events +%systemd_post glustereventsd +exit 0 +%endif + +%if ( 0%{!?_without_server:1} ) +%if ( 0%{?fedora} && 0%{?fedora} > 25 || ( 0%{?rhel} && 0%{?rhel} > 6 ) ) +%post ganesha +# first install +if [ $1 -eq 1 ]; then + %selinux_set_booleans ganesha_use_fusefs=1 +fi +exit 0 +%endif %endif %if ( 0%{!?_without_georeplication:1} ) %post geo-replication -#restart glusterd. -if [ $1 -ge 1 ]; then - %_init_restart glusterd +%if ( 0%{?rhel} && 0%{?rhel} >= 8 ) +if [ $1 -eq 1 ]; then + %selinux_set_booleans %{selinuxbooleans} fi - -%files geo-replication -%defattr(-,root,root) -%{_libexecdir}/glusterfs/gsyncd -%{_libexecdir}/glusterfs/python/syncdaemon/* -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/geo-replication -%ghost %attr(0644,-,-) %{_sharedstatedir}/glusterd/geo-replication/gsyncd.conf +%endif +if [ $1 -ge 1 ]; then + %systemd_postun_with_restart glusterd +fi +exit 0 %endif -%files fuse -%defattr(-,root,root,-) -%if ( 0%{_for_fedora_koji_builds} ) -%config(noreplace) %{_sysconfdir}/logrotate.d/glusterfs-fuse -%endif -%{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount/fuse* -/sbin/mount.glusterfs -%if ( 0%{!?_without_fusermount:1} ) -%{_bindir}/fusermount-glusterfs -%endif -%if ( 0%{_for_fedora_koji_builds} ) -%if ( 0%{?rhel} && 0%{?rhel} <= 5 ) -%{_sysconfdir}/sysconfig/modules/glusterfs-fuse.modules -%endif -%endif - -%files server -%defattr(-,root,root,-) -%doc extras/clear_xattrs.sh -%if ( 0%{_for_fedora_koji_builds} ) -%config(noreplace) %{_sysconfdir}/logrotate.d/glusterd -%endif -%config(noreplace) %{_sysconfdir}/sysconfig/glusterd -%config(noreplace) %{_sysconfdir}/glusterfs -# Legacy configs -%if ( 0%{_for_fedora_koji_builds} ) -%config(noreplace) %{_sysconfdir}/logrotate.d/glusterfsd -%config(noreplace) %{_sysconfdir}/sysconfig/glusterfsd -%endif -# init files -%_init_glusterd -%if ( 0%{_for_fedora_koji_builds} ) -%_init_glusterfsd -%endif -# binaries -%{_sbindir}/glusterd -%{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/storage* -%{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/posix* -%{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/protocol/server* -%{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mgmt* -%{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/nfs* -%ghost %attr(0644,-,-) %config(noreplace) %{_sharedstatedir}/glusterd/glusterd.info -%ghost %attr(0600,-,-) %{_sharedstatedir}/glusterd/options -# This is really ugly, but I have no idea how to mark these directories in an -# other way. They should belong to the glusterfs-server package, but don't -# exist after installation. They are generated on the first start... -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1 -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop/post -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop/pre -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start/post -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start/pre -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/remove-brick -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/remove-brick/post -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/remove-brick/pre -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/pre -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set/post -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set/pre -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create/post -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create/pre -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/delete -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/delete/post -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/delete/pre -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/glustershd -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/vols -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/peers -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/groups -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/nfs -%ghost %attr(0600,-,-) %{_sharedstatedir}/glusterd/nfs/nfs-server.vol -%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/nfs/run -%ghost %attr(0600,-,-) %{_sharedstatedir}/glusterd/nfs/run/nfs.pid - -%post api -/sbin/ldconfig - -%postun api -/sbin/ldconfig - -%files api -%exclude %{_libdir}/*.so -%{_libdir}/libgfapi.* -%{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount/api* -%if ( 0%{?rhel} && 0%{?rhel} > 5 ) -%{python_sitelib}/gluster/__init__.p* -%endif - -%if ( 0%{!?_without_ocf:1} ) -%files resource-agents -%defattr(-,root,root) -# /usr/lib is the standard for OCF, also on x86_64 -%{_prefix}/lib/ocf/resource.d/glusterfs -%endif - -%files devel -%defattr(-,root,root,-) -%{_includedir}/glusterfs -%exclude %{_includedir}/glusterfs/y.tab.h -%exclude %{_includedir}/glusterfs/api -%exclude %{_libdir}/libgfapi.so -%{_libdir}/*.so - -%files api-devel -%{_libdir}/pkgconfig/glusterfs-api.pc -%{_libdir}/libgfapi.so -%{_includedir}/glusterfs/api/* +# post and postun scriptlets for libs +%ldconfig_scriptlets libs +%if ( 0%{!?_without_server:1} ) %post server # Legacy server -%_init_enable glusterd -%_init_enable glusterfsd +%systemd_post glusterd +%if ( 0%{_for_fedora_koji_builds} ) +%systemd_post glusterfsd +%endif +# ".cmd_log_history" is renamed to "cmd_history.log" in GlusterFS-3.7 . +# While upgrading glusterfs-server package form GlusterFS version <= 3.6 to +# GlusterFS version 3.7, ".cmd_log_history" should be renamed to +# "cmd_history.log" to retain cli command history contents. +if [ -f %{_localstatedir}/log/glusterfs/.cmd_log_history ]; then + mv %{_localstatedir}/log/glusterfs/.cmd_log_history \ + %{_localstatedir}/log/glusterfs/cmd_history.log +fi # Genuine Fedora (and EPEL) builds never put gluster files in /etc; if # there are any files in /etc from a prior gluster.org install, move them @@ -710,14 +1072,14 @@ fi # in gluster.org RPMs.) Be careful to copy them on the off chance that # /etc and /var/lib are on separate file systems if [ -d /etc/glusterd -a ! -h %{_sharedstatedir}/glusterd ]; then - %{__mkdir_p} %{_sharedstatedir}/glusterd + mkdir -p %{_sharedstatedir}/glusterd cp -a /etc/glusterd %{_sharedstatedir}/glusterd rm -rf /etc/glusterd ln -sf %{_sharedstatedir}/glusterd /etc/glusterd fi # Rename old volfiles in an RPM-standard way. These aren't actually -# considered package config files, so %config doesn't work for them. +# considered package config files, so %%config doesn't work for them. if [ -d %{_sharedstatedir}/glusterd/vols ]; then for file in $(find %{_sharedstatedir}/glusterd/vols -name '*.vol'); do newfile=${file}.rpmsave @@ -733,37 +1095,1365 @@ if [ -e /etc/ld.so.conf.d/glusterfs.conf ]; then rm -f /etc/ld.so.conf.d/glusterfs.conf /sbin/ldconfig fi + +%if (0%{?_with_firewalld:1}) + %firewalld_reload +%endif + pidof -c -o %PPID -x glusterd &> /dev/null if [ $? -eq 0 ]; then kill -9 `pgrep -f gsyncd.py` &> /dev/null - killall glusterd &> /dev/null + killall --wait glusterd &> /dev/null glusterd --xlator-option *.upgrade=on -N + + #Cleaning leftover glusterd socket file which is created by glusterd in + #rpm_script_t context. + rm -f %{_rundir}/glusterd.socket + + # glusterd _was_ running, we killed it, it exited after *.upgrade=on, + # so start it again + %service_start glusterd else glusterd --xlator-option *.upgrade=on -N + + #Cleaning leftover glusterd socket file which is created by glusterd in + #rpm_script_t context. + rm -f %{_rundir}/glusterd.socket fi +exit 0 +%endif +##----------------------------------------------------------------------------- +## All package definitions should be placed here in alphabetical order +## +%pre +##----------------------------------------------------------------------------- +## All package definitions should be placed here in alphabetical order +## +%if ( 0%{!?_without_events:1} ) +%preun events +if [ $1 -eq 0 ]; then + if [ -f %glustereventsd_svcfile ]; then + %service_stop glustereventsd + %systemd_preun glustereventsd + fi +fi +exit 0 +%endif +%if ( 0%{!?_without_server:1} ) %preun server if [ $1 -eq 0 ]; then - if [ -f %_init_glusterfsd ]; then - %_init_stop glusterfsd + if [ -f %glusterfsd_svcfile ]; then + %service_stop glusterfsd fi - %_init_stop glusterd - if [ -f %_init_glusterfsd ]; then - %_init_disable glusterfsd + %service_stop glusterd + if [ -f %glusterfsd_svcfile ]; then + %systemd_preun glusterfsd fi - %_init_disable glusterd + %systemd_preun glusterd fi if [ $1 -ge 1 ]; then - if [ -f %_init_glusterfsd ]; then - %_init_restart glusterfsd + if [ -f %glusterfsd_svcfile ]; then + %systemd_postun_with_restart glusterfsd + fi + %systemd_postun_with_restart glusterd +fi +exit 0 +%endif + +%preun thin-arbiter +if [ $1 -eq 0 ]; then + if [ -f %glusterta_svcfile ]; then + %service_stop gluster-ta-volume + %systemd_preun gluster-ta-volume fi - %_init_restart glusterd fi +##----------------------------------------------------------------------------- +## All package definitions should be placed here in alphabetical order +## +%postun +%{?ldconfig} +%if ( 0%{!?_without_syslog:1} ) +%if ( 0%{?fedora} ) || ( 0%{?rhel} ) +%systemd_postun_with_restart rsyslog +%endif +%endif +exit 0 + +%if ( 0%{!?_without_server:1} ) +%postun server +%{?ldconfig} +%if (0%{?_with_firewalld:1}) + %firewalld_reload +%endif +exit 0 +%endif + +%if ( 0%{!?_without_server:1} ) +%if ( 0%{?fedora} && 0%{?fedora} > 25 || ( 0%{?rhel} && 0%{?rhel} > 6 ) ) +%postun ganesha +if [ $1 -eq 0 ]; then + # use the value of ganesha_use_fusefs from before glusterfs-ganesha was installed + %selinux_unset_booleans ganesha_use_fusefs=1 +fi +exit 0 +%endif +%endif + +%if ( 0%{!?_without_georeplication:1} ) +%postun geo-replication +%if ( 0%{?rhel} && 0%{?rhel} >= 8 ) +if [ $1 -eq 0 ]; then + %selinux_unset_booleans %{selinuxbooleans} +fi +exit 0 +%endif +%endif + +##----------------------------------------------------------------------------- +## All trriggerun should be placed here in alphabetical order +## +%if ( 0%{!?_without_server:1} ) +%if ( 0%{?fedora} && 0%{?fedora} > 25 || ( 0%{?rhel} && 0%{?rhel} > 6 ) ) +# ensure ganesha_use_fusefs is on in case of policy mode switch (eg. mls->targeted) +%triggerun ganesha -- selinux-policy-targeted +semanage boolean -m ganesha_use_fusefs --on -S targeted +exit 0 +%endif +%endif + +##----------------------------------------------------------------------------- +## All package definitions should be placed here in alphabetical order +## +%files +%{!?_licensedir:%global license %%doc} +%license COPYING-GPLV2 COPYING-LGPLV3 +%doc ChangeLog INSTALL README.md THANKS COMMITMENT +%{_mandir}/man8/*gluster*.8* +%if ( 0%{!?_without_server:1} ) +%exclude %{_mandir}/man8/gluster.8* +%endif +%dir %{_localstatedir}/log/glusterfs +%if ( 0%{!?_without_server:1} ) +%dir %{_datadir}/glusterfs +%dir %{_datadir}/glusterfs/scripts + %{_datadir}/glusterfs/scripts/post-upgrade-script-for-quota.sh + %{_datadir}/glusterfs/scripts/pre-upgrade-script-for-quota.sh +%endif +# xlators that are needed on the client- and on the server-side +%dir %{_libdir}/glusterfs +%dir %{_libdir}/glusterfs/%{version}%{?prereltag} +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/auth + %{_libdir}/glusterfs/%{version}%{?prereltag}/auth/addr.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/auth/login.so +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/rpc-transport + %{_libdir}/glusterfs/%{version}%{?prereltag}/rpc-transport/socket.so +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug/error-gen.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug/delay-gen.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug/io-stats.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug/sink.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug/trace.so +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/access-control.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/barrier.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/cdc.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/changelog.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/utime.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/gfid-access.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/namespace.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/read-only.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/shard.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/snapview-client.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/worm.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/cloudsync.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/meta.so +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/io-cache.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/io-threads.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/md-cache.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/open-behind.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/quick-read.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/read-ahead.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/readdir-ahead.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/stat-prefetch.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/write-behind.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/nl-cache.so +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/system + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/system/posix-acl.so +%dir %attr(0775,gluster,gluster) %{_rundir}/gluster +%dir %attr(0775,gluster,gluster) %{_rundir}/gluster/metrics +%if 0%{?_tmpfilesdir:1} +%{_tmpfilesdir}/gluster.conf +%endif + +%if ( 0%{?_without_server:1} ) +#exclude ganesha related files +%exclude %{_sysconfdir}/ganesha/ganesha-ha.conf.sample +%exclude %{_libexecdir}/ganesha/* +%exclude %{_prefix}/lib/ocf/resource.d/heartbeat/* +%endif +%{_sysusersdir}/glusterfs.conf + +%files cli +%{_sbindir}/gluster +%{_mandir}/man8/gluster.8* +%{bash_completions_dir}/gluster.bash + +%files client-xlators +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/cluster + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/cluster/*.so +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/protocol +%{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/protocol/client.so + +%files cloudsync-plugins +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/cloudsync-plugins + %{_libdir}/glusterfs/%{version}%{?prereltag}/cloudsync-plugins/cloudsyncs3.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/cloudsync-plugins/cloudsynccvlt.so + +%files -n libglusterfs-devel +%dir %{_includedir}/glusterfs + %{_includedir}/glusterfs/*.h + %{_includedir}/glusterfs/server/*.h +%{_libdir}/libglusterfs.so + +%files -n libgfapi-devel +%dir %{_includedir}/glusterfs/api + %{_includedir}/glusterfs/api/*.h +%{_libdir}/libgfapi.so +%{_libdir}/pkgconfig/glusterfs-api.pc + + +%files -n libgfchangelog-devel +%dir %{_includedir}/glusterfs/gfchangelog + %{_includedir}/glusterfs/gfchangelog/*.h +%{_libdir}/libgfchangelog.so +%{_libdir}/pkgconfig/libgfchangelog.pc + +%files -n libgfrpc-devel +%dir %{_includedir}/glusterfs/rpc + %{_includedir}/glusterfs/rpc/*.h +%{_libdir}/libgfrpc.so + +%files -n libgfxdr-devel +%{_libdir}/libgfxdr.so + +# Events +%if ( 0%{!?_without_events:1} ) +%files events +%config(noreplace) %{_sysconfdir}/glusterfs/eventsconfig.json +%dir %{_sharedstatedir}/glusterd +%dir %{_sharedstatedir}/glusterd/events +%dir %{_libexecdir}/glusterfs +%dir %{_libexecdir}/glusterfs/gfevents + %{_libexecdir}/glusterfs/gfevents/* + %{_libexecdir}/glusterfs/peer_eventsapi.py* +%{_sbindir}/glustereventsd +%{_sbindir}/gluster-eventsapi +%{_datadir}/glusterfs/scripts/eventsdash.py* +%{_unitdir}/glustereventsd.service +%endif + +%files extra-xlators +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/quiesce.so +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/playground + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/playground/template.so + +%files fuse +# glusterfs is a symlink to glusterfsd, -server depends on -fuse. +%{_sbindir}/glusterfs +%{_sbindir}/glusterfsd +%config(noreplace) %{_sysconfdir}/logrotate.d/glusterfs +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount/fuse.so +%{_sbindir}/mount.glusterfs +%if ( 0%{!?_without_fusermount:1} ) +%{_bindir}/fusermount-glusterfs +%endif + +%if ( 0%{?_with_gnfs:1} && 0%{!?_without_server:1} ) +%files gnfs +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/nfs + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/nfs/* +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/nfs +%ghost %attr(0600,-,-) %{_sharedstatedir}/glusterd/nfs/nfs-server.vol +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/nfs/run +%ghost %attr(0600,-,-) %{_sharedstatedir}/glusterd/nfs/run/nfs.pid +%endif + + +%if ( 0%{!?_without_server:1} ) +%files ganesha +%dir %{_libexecdir}/ganesha +%{_sysconfdir}/ganesha/ganesha-ha.conf.sample +%{_libexecdir}/ganesha/* +%{_prefix}/lib/ocf/resource.d/heartbeat/* +%{_sharedstatedir}/glusterd/hooks/1/start/post/S31ganesha-start.sh +%ghost %attr(0644,-,-) %config(noreplace) %{_sysconfdir}/ganesha/ganesha-ha.conf +%ghost %dir %attr(0755,-,-) %{_localstatedir}/run/gluster/shared_storage/nfs-ganesha +%ghost %attr(0644,-,-) %config(noreplace) %{_localstatedir}/run/gluster/shared_storage/nfs-ganesha/ganesha.conf +%ghost %attr(0644,-,-) %config(noreplace) %{_localstatedir}/run/gluster/shared_storage/nfs-ganesha/ganesha-ha.conf +%endif + +%if ( 0%{!?_without_georeplication:1} ) +%files geo-replication +%config(noreplace) %{_sysconfdir}/logrotate.d/glusterfs-georep + +%{_sbindir}/gfind_missing_files +%{_sbindir}/gluster-mountbroker +%dir %{_libexecdir}/glusterfs +%dir %{_libexecdir}/glusterfs/python +%dir %{_libexecdir}/glusterfs/python/syncdaemon + %{_libexecdir}/glusterfs/gsyncd + %{_libexecdir}/glusterfs/python/syncdaemon/* +%dir %{_libexecdir}/glusterfs/scripts + %{_libexecdir}/glusterfs/scripts/get-gfid.sh + %{_libexecdir}/glusterfs/scripts/secondary-upgrade.sh + %{_libexecdir}/glusterfs/scripts/gsync-upgrade.sh + %{_libexecdir}/glusterfs/scripts/generate-gfid-file.sh + %{_libexecdir}/glusterfs/scripts/gsync-sync-gfid + %{_libexecdir}/glusterfs/scripts/schedule_georep.py* + %{_libexecdir}/glusterfs/gverify.sh + %{_libexecdir}/glusterfs/set_geo_rep_pem_keys.sh + %{_libexecdir}/glusterfs/peer_gsec_create + %{_libexecdir}/glusterfs/peer_mountbroker + %{_libexecdir}/glusterfs/peer_mountbroker.py* + %{_libexecdir}/glusterfs/gfind_missing_files + %{_libexecdir}/glusterfs/peer_georep-sshkey.py* +%{_sbindir}/gluster-georep-sshkey + + + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/geo-replication +%ghost %attr(0644,-,-) %{_sharedstatedir}/glusterd/geo-replication/gsyncd_template.conf + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/gsync-create + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/gsync-create/post + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/gsync-create/post/S56glusterd-geo-rep-create-post.sh +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/gsync-create/pre +%endif + +%files -n libglusterfs0 +%{_libdir}/libglusterfs.so.* + +%files -n libgfapi0 +%{_libdir}/libgfapi.so.* +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount/api.so + +%files -n libgfchangelog0 +%{_libdir}/libgfchangelog.so.* + +%files -n libgfrpc0 +%{_libdir}/libgfrpc.so.* + +%files -n libgfxdr0 +%{_libdir}/libgfxdr.so.* + +%files -n python%{_pythonver}-gluster +# introducing glusterfs module in site packages. +# so that all other gluster submodules can reside in the same namespace. +%if ( %{_usepython3} ) +%dir %{python3_sitelib}/gluster + %{python3_sitelib}/gluster/__init__.* + %{python3_sitelib}/gluster/__pycache__ + %{python3_sitelib}/gluster/cliutils +%else +%dir %{python2_sitelib}/gluster + %{python2_sitelib}/gluster/__init__.* + %{python2_sitelib}/gluster/cliutils +%endif + +%if ( ! 0%{_for_fedora_koji_builds} ) +%files regression-tests +%dir %{_prefix}/share/glusterfs + %{_prefix}/share/glusterfs/run-tests.sh +%dir %{_prefix}/share/glusterfs/tests + %{_datadir}/glusterfs/tests/* +%exclude %{_datadir}/glusterfs/tests/vagrant +%endif + +%if ( 0%{!?_without_ocf:1} ) +%files resource-agents +# /usr/lib is the standard for OCF, also on x86_64 +%{_prefix}/lib/ocf/resource.d/glusterfs +%endif + +%if ( 0%{!?_without_server:1} ) +%files server +%doc extras/clear_xattrs.sh +# sysconf +%config(noreplace) %{_sysconfdir}/glusterfs +%exclude %{_sysconfdir}/glusterfs/thin-arbiter.vol +%exclude %{_sysconfdir}/glusterfs/eventsconfig.json +%exclude %{_sharedstatedir}/glusterd/nfs/nfs-server.vol +%exclude %{_sharedstatedir}/glusterd/nfs/run/nfs.pid +%if ( 0%{?_with_gnfs:1} ) +%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/nfs/* +%endif +%config(noreplace) %{_sysconfdir}/sysconfig/glusterd +%if ( 0%{_for_fedora_koji_builds} ) +%config(noreplace) %{_sysconfdir}/sysconfig/glusterfsd +%endif + +# init files +%glusterd_svcfile +%if ( 0%{_for_fedora_koji_builds} ) +%glusterfsd_svcfile +%endif +%glusterfssharedstorage_svcfile + +# binaries +%{_sbindir}/glusterd +%{_libexecdir}/glusterfs/glfsheal +%{_sbindir}/gf_attach +%{_sbindir}/gluster-setgfid2path +# {_sbindir}/glusterfsd is the actual binary, but glusterfs (client) is a +# symlink. The binary itself (and symlink) are part of the glusterfs-fuse +# package, because glusterfs-server depends on that anyway. + +# Manpages +%{_mandir}/man8/gluster-setgfid2path.8* + +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/arbiter.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/bit-rot.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/bitrot-stub.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/sdfs.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/index.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/locks.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/posix* + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/snapview-server.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/marker.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/simple-quota.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/quota* + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/selinux.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/trash.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/upcall.so + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/leases.so +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mgmt + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mgmt/glusterd.so +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/protocol + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/protocol/server.so +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/storage + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/storage/posix.so + +# snap_scheduler +%{_sbindir}/snap_scheduler.py +%{_sbindir}/gcron.py +%{_sbindir}/conf.py + +# /var/lib/glusterd, e.g. hookscripts, etc. +%ghost %attr(0644,-,-) %config(noreplace) %{_sharedstatedir}/glusterd/glusterd.info + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/bitd + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/groups + %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/virt + %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/metadata-cache + %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/gluster-block + %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/nl-cache + %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/db-workload + %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/distributed-virt + %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/samba + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/glusterfind + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/glusterfind/.keys +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/glustershd + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1 + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post/disabled-quota-root-xattr-heal.sh + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post/S10selinux-label-brick.sh + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post/S13create-subdir-mounts.sh + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/pre + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/pre/S28Quota-enable-root-xattr-heal.sh + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create/post + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create/post/S10selinux-label-brick.sh +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create/pre +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/copy-file +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/copy-file/post +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/copy-file/pre + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/delete + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/delete/post + %{_sharedstatedir}/glusterd/hooks/1/delete/post/S57glusterfind-delete-post + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/delete/pre + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/delete/pre/S10selinux-del-fcontext.sh +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/remove-brick +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/remove-brick/post +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/remove-brick/pre + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/reset + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/reset/post +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/reset/pre + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set/post + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set/post/S30samba-set.sh + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set/post/S32gluster_enable_shared_storage.sh +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set/pre + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start/post + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start/post/S29CTDBsetup.sh + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start/post/S30samba-start.sh +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start/pre + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop/post + %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop/pre + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop/pre/S30samba-stop.sh + %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop/pre/S29CTDB-teardown.sh +%config(noreplace) %ghost %attr(0600,-,-) %{_sharedstatedir}/glusterd/options +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/peers +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/quotad +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/scrub +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/snaps +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/ss_brick +%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/vols + +# Extra utility script +%dir %{_datadir}/glusterfs +%dir %{_datadir}/glusterfs/scripts +%{_datadir}/glusterfs/scripts/stop-all-gluster-processes.sh + %{_libexecdir}/glusterfs/mount-shared-storage.sh + %{_datadir}/glusterfs/scripts/control-cpu-load.sh + %{_datadir}/glusterfs/scripts/control-mem.sh + +# Incrementalapi +%dir %{_libexecdir}/glusterfs + %{_libexecdir}/glusterfs/glusterfind + %{_libexecdir}/glusterfs/peer_add_secret_pub +%{_bindir}/glusterfind + +%if ( 0%{?_with_firewalld:1} ) +%{_prefix}/lib/firewalld/services/glusterfs.xml +%endif + +# end of server files +%endif + +%files thin-arbiter +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator +%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features + %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/thin-arbiter.so +%dir %{_datadir}/glusterfs/scripts + %{_datadir}/glusterfs/scripts/setup-thin-arbiter.sh +%config %{_sysconfdir}/glusterfs/thin-arbiter.vol +%{_unitdir}/gluster-ta-volume.service %changelog +* Fri Sep 19 2025 Python Maint - 11.2-4 +- Rebuilt for Python 3.14.0rc3 bytecode + +* Fri Aug 15 2025 Python Maint - 11.2-3 +- Rebuilt for Python 3.14.0rc2 bytecode + +* Wed Jul 23 2025 Fedora Release Engineering - 11.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + +* Wed Jul 02 2025 Benson Muite - 11.2-1 +- Update to latest release + +* Tue Jun 03 2025 Python Maint - 11.1-10 +- Rebuilt for Python 3.14 + +* Tue Feb 11 2025 Zbigniew Jędrzejewski-Szmek - 11.1-9 +- Add sysusers.d config file to allow rpm to create users/groups automatically + +* Thu Jan 16 2025 Fedora Release Engineering - 11.1-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + +* Sun Jan 12 2025 Zbigniew Jędrzejewski-Szmek - 11.1-7 +- Rebuilt for the bin-sbin merge (2nd attempt) + +* Thu Jul 18 2024 Fedora Release Engineering - 11.1-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + +* Tue Jul 09 2024 Zbigniew Jędrzejewski-Szmek - 11.1-5 +- Rebuilt for the bin-sbin merge + +* Fri Jun 07 2024 Python Maint - 11.1-4 +- Rebuilt for Python 3.13 + +* Wed Jan 24 2024 Fedora Release Engineering - 11.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Fri Jan 19 2024 Kaleb S. KEITHLEY - 11.1-2 +- rebuild with gcc-14 + +* Mon Nov 6 2023 Kaleb S. KEITHLEY - 11.1-1 +- glusterfs 11.1 GA + +* Thu Oct 5 2023 Kaleb S. KEITHLEY - 11.0-6 +- glusterfs 11, build in side tag f40-build-side-74974 + +* Tue Aug 22 2023 Kaleb S. KEITHLEY - 11.0-5 +- glusterfs 11, /usr/lib/ocf/resource-agents.d -> resource-agents + rhbz#2229910 + +* Wed Jul 19 2023 Fedora Release Engineering - 11.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Thu Jun 15 2023 Python Maint - 11.0-3 +- Rebuilt for Python 3.12 + +* Thu May 4 2023 Kaleb S. KEITHLEY - 11.0-2 +- glusterfs 11, remove unnecessary BR for ldconfig, i.e. glibc, also + rhbz#1731689 + +* Fri Feb 10 2023 Adam Williamson - 11.0-1 +- Fix a mistake in the libglusterd0 obsolete + +* Tue Feb 7 2023 Kaleb S. KEITHLEY - 11.0-0 +- glusterfs 11 GA + +* Fri Nov 11 2022 Kaleb S. KEITHLEY +- SPDX migration + +* Tue Sep 20 2022 Kaleb S. KEITHLEY - 10.3-1 +- 10.3 GA + +* Thu Jul 21 2022 Fedora Release Engineering - 10.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Mon Jun 13 2022 Python Maint - 10.2-2 +- Rebuilt for Python 3.11 + +* Fri May 13 2022 Kaleb S. KEITHLEY - 10.2-1 +- 10.2 GA + +* Mon Jan 31 2022 Kaleb S. KEITHLEY - 10.1-4 +- 10.1, w/ modern linker, this time for real + +* Wed Jan 26 2022 Kaleb S. KEITHLEY - 10.1-3 +- 10.1, w/ modern linker (mold) + +* Thu Jan 20 2022 Fedora Release Engineering - 10.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Wed Jan 19 2022 Kaleb S. KEITHLEY - 10.1-1 +- 10.1 GA + +* Sat Jan 15 2022 Kaleb S. KEITHLEY - 10.0-2 +- rebuild with gcc-12 + +* Tue Nov 2 2021 Kaleb S. KEITHLEY - 10.0-1 +- 10.0 GA + +* Fri Oct 29 2021 Kaleb S. KEITHLEY - 10.0-0.3rc0 +- 10.0 RC0, without_tcmalloc, rhbz#2018439 + +* Thu Oct 28 2021 Kaleb S. KEITHLEY - 10.0-0.2rc0 +- 10.0 RC0, armv7hl + +* Tue Oct 19 2021 Kaleb S. KEITHLEY - 10.0-0.1rc0 +- 10.0 RC0 + +* Mon Oct 4 2021 Kaleb S. KEITHLEY - 9.4-1 +- 9.4 GA + +* Tue Sep 14 2021 Sahana Prasad - 9.3-3 +- Rebuilt with OpenSSL 3.0.0 + +* Thu Jul 22 2021 Fedora Release Engineering - 9.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Tue Jun 29 2021 Kaleb S. KEITHLEY - 9.3-1 +- 9.3 GA + +* Tue Jun 22 2021 Kaleb S. KEITHLEY - 9.2-5 +- Rebuilt for userspace-rcu-0.13 again + +* Fri Jun 11 2021 Kaleb S. KEITHLEY - 9.2-4 +- https://src.fedoraproject.org/rpms/glusterfs/pull-request/7 + +* Tue Jun 8 2021 Kaleb S. KEITHLEY - 9.2-3 +- Rebuilt for userspace-rcu-0.13 + +* Fri Jun 04 2021 Python Maint - 9.2-2 +- Rebuilt for Python 3.10 + +* Sun May 9 2021 Kaleb S. KEITHLEY - 9.2-1 +- 9.2 GA + +* Wed Apr 14 2021 Richard W.M. Jones - 9.1-2 +- Rebuild for updated liburing. + +* Tue Mar 30 2021 Kaleb S. KEITHLEY - 9.1-1 +- 9.1 GA + +* Tue Mar 02 2021 Zbigniew Jędrzejewski-Szmek - 9.0-4 +- Rebuilt for updated systemd-rpm-macros + See https://pagure.io/fesco/issue/2583. + +* Wed Jan 27 2021 Kaleb S. KEITHLEY - 9.0-3 +- 9.0, w/ liburing + +* Tue Jan 26 2021 Fedora Release Engineering - 9.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Tue Jan 19 2021 Kaleb S. KEITHLEY - 9.0-1 +- 9.0 GA + +* Thu Jan 7 2021 Kaleb S. KEITHLEY - 9.0-0.2 +- 9.0 RC0, fuse3 + +* Wed Jan 6 2021 Kaleb S. KEITHLEY - 9.0-0.1 +- 9.0 RC0 + +* Tue Dec 1 2020 Kaleb S. KEITHLEY - 8.3-1 +- 8.3 GA + +* Thu Nov 5 2020 Kaleb S. KEITHLEY - 8.2-2 +- 8.2, rdma + +* Thu Sep 17 2020 Kaleb S. KEITHLEY - 8.2-1 +- 8.2 GA + +* Tue Aug 25 2020 Kaleb S. KEITHLEY - 8.1-1 +- 8.1 GA + +* Mon Jul 27 2020 Fedora Release Engineering - 8.0-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jul 22 2020 Kaleb S. KEITHLEY - 8.0-5 +- eliminate contrib/sunrpc/xdr_sizeof.c + +* Mon Jul 20 2020 Kaleb S. KEITHLEY - 8.0-4 +- use %make_install macro + +* Wed Jul 8 2020 Kaleb S. KEITHLEY - 8.0-3 +- thin-arbiter, w/o libglusterfs0 + +* Tue Jul 7 2020 Kaleb S. KEITHLEY - 8.0-2 +- 8.0, thin-arbiter + +* Mon Jul 6 2020 Kaleb S. KEITHLEY - 8.0-1 +- 8.0 GA + +* Sat Jul 4 2020 Kaleb S. KEITHLEY - 8.0-0.3rc0 +- 8.0 fix symbol versions, enable LTO + +* Wed Jul 1 2020 Jeff Law - 8.0-0.2rc0 +- Disable LTO + +* Mon Jun 1 2020 Kaleb S. KEITHLEY - 8.0-0.1rc0 +- 8.0 RC0 + +* Tue May 26 2020 Miro Hrončok - 7.6-2 +- Rebuilt for Python 3.9 + +* Mon May 18 2020 Kaleb S. KEITHLEY - 7.6-1 +- 7.6 GA + +* Thu Apr 16 2020 Kaleb S. KEITHLEY - 7.5-1 +- 7.5 GA + +* Wed Mar 18 2020 Kaleb S. KEITHLEY - 7.4-1 +- 7.4 GA + +* Mon Feb 17 2020 Kaleb S. KEITHLEY - 7.3-1 +- 7.3 GA + +* Tue Jan 28 2020 Fedora Release Engineering - 7.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Wed Jan 22 2020 Kaleb S. KEITHLEY - 7.2-2 +- 7.2, gcc-10 fix + +* Wed Jan 15 2020 Kaleb S. KEITHLEY - 7.2-1 +- 7.2 GA + +* Mon Dec 23 2019 Kaleb S. KEITHLEY - 7.1-1 +- 7.1 GA + +* Tue Oct 15 2019 Kaleb S. KEITHLEY - 7.0-1 +- 7.0 GA + +* Wed Oct 9 2019 Kaleb S. KEITHLEY +- bd xlator was removed in glusterfs-6 + +* Tue Oct 1 2019 Kaleb S. KEITHLEY - 7.0-0.5rc3 +- 7.0 RC3 (note, rc2 was tagged but not released) + +* Mon Sep 16 2019 Kaleb S. KEITHLEY - 7.0-0.4rc1 +- disable gnfs by default + +* Mon Sep 16 2019 Kaleb S. KEITHLEY - 7.0-0.3rc1 +- 7.0 RC1 + +* Wed Aug 28 2019 Kaleb S. KEITHLEY - 7.0-0.2rc0 +- python3-requests, el-8 + +* Thu Aug 22 2019 Kaleb S. KEITHLEY - 7.0-0.1rc0 +- 7.0 RC0 + +* Mon Aug 19 2019 Kaleb S. KEITHLEY - 6.5-2 +- Rebuilt for Python 3.8, again + +* Mon Aug 19 2019 Miro Hrončok - 6.5-1.1 +- Rebuilt for Python 3.8 + +* Wed Aug 7 2019 Kaleb S. KEITHLEY - 6.5-1 +- 6.5 GA + +* Thu Aug 1 2019 Kaleb S. KEITHLEY - 6.4-3 +- restore i686 + +* Thu Aug 1 2019 Kaleb S. KEITHLEY - 6.4-2 +- temporarily exclude i686 pending firewalld resolution + +* Thu Jul 25 2019 Fedora Release Engineering - 6.4-1.1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Wed Jul 17 2019 Kaleb S. KEITHLEY - 6.4-1 +- 6.4 GA + +* Wed Jul 17 2019 Kaleb S. KEITHLEY - 6.4-1 +- 6.4 GA + +* Tue Jun 11 2019 Kaleb S. KEITHLEY - 6.3-1 +- 6.3 GA + +* Fri May 24 2019 Kaleb S. KEITHLEY - 6.2-1 +- 6.2 GA + +* Mon Apr 22 2019 Kaleb S. KEITHLEY - 6.1-2 +- 6.1 GA, glusterfs-thin-arbiter Requires: glusterfs-libs + +* Wed Apr 17 2019 Kaleb S. KEITHLEY - 6.1-1 +- 6.1 GA + +* Wed Mar 20 2019 Kaleb S. KEITHLEY - 6.0-1 +- 6.0 GA + +* Wed Mar 13 2019 Kaleb S. KEITHLEY - 6.0rc1-0.4 +- 6.0 RC1 + +* Wed Mar 6 2019 Kaleb S. KEITHLEY - 6.0rc0-0.3 +- 6.0 RC0 +- restore s390x rdma +- remove obsolete scripts from +- https://src.fedoraproject.org/rpms/glusterfs/pull-request/5 + +* Fri Mar 1 2019 Kaleb S. KEITHLEY - 6.0rc0-0.2 +- 6.0 RC0, s390x, armv7hl no rdma + +* Fri Feb 22 2019 Kaleb S. KEITHLEY - 6.0rc0-0.1 +- 6.0 RC0 + +* Wed Feb 20 2019 Kaleb S. KEITHLEY - 5.3-2 +- re-rebuild for f31/rawhide + +* Wed Feb 20 2019 Kaleb S. KEITHLEY - 5.3-1 +- rebuild for f31/rawhide + +* Sun Feb 17 2019 Igor Gnatenko - 5.3-2.1 +- Rebuild for readline 8.0 + +* Thu Feb 14 2019 Kaleb S. KEITHLEY - 5.3-2 +- Re-rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Thu Jan 31 2019 Fedora Release Engineering - 5.3-1.1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Thu Jan 17 2019 Kaleb S. KEITHLEY - 5.3-1 +- 5.3 GA + +* Thu Dec 13 2018 Kaleb S. KEITHLEY - 5.2-1 +- 5.2 GA + +* Wed Nov 14 2018 Kaleb S. KEITHLEY - 5.1-1 +- 5.1 GA + +* Thu Oct 18 2018 Kaleb S. KEITHLEY - 5.0-1 +- 5.0 GA + +* Fri Oct 5 2018 Kaleb S. KEITHLEY - 5.0-0.5.rc1 +- 5.0 RC1 + +* Mon Sep 24 2018 Kaleb S. KEITHLEY - 5.0-0.3.rc0 +- 5.0 RC0, unbork python shebangs + +* Thu Sep 20 2018 Kaleb S. KEITHLEY - 5.0-0.2.rc0 +- 5.0 RC0 + +* Tue Sep 18 2018 Kaleb S. KEITHLEY - 5.0-0.1.rc0 +- 5.0 RC0 + +* Thu Sep 6 2018 Kaleb S. KEITHLEY - 4.1.4-1 +- 4.1.4 GA + +* Tue Sep 4 2018 Kaleb S. KEITHLEY - 4.1.3-2 +- missing /run/gluster/metrics, see bz#1624006 + +* Tue Sep 4 2018 Kaleb S. KEITHLEY +- --with-ipv6-default bz#1614769 + +* Mon Aug 27 2018 Kaleb S. KEITHLEY - 4.1.3-1 +- 4.1.3 GA + +* Wed Jul 25 2018 Kaleb S. KEITHLEY - 4.1.2-3 +- 4.1.2, again + +* Tue Jul 24 2018 Kaleb S. KEITHLEY - 4.1.2-2 +- 4.1.2, gsyncd.conf /usr/local/sbin + +* Tue Jul 24 2018 Kaleb S. KEITHLEY - 4.1.2-1 +- 4.1.2 GA + +* Fri Jul 13 2018 Fedora Release Engineering - 4.1.1-2.1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Jul 11 2018 Kaleb S. KEITHLEY - 4.1.1-2 +- missed python->python2 in shebang + +* Tue Jun 26 2018 Kaleb S. KEITHLEY - 4.1.1-1 +- 4.1.1 GA + +* Tue Jun 12 2018 Kaleb S. KEITHLEY - 4.1.0-1 +- 4.1.0 GA + +* Fri Jun 1 2018 Kaleb S. KEITHLEY - 4.1.0rc0 +- 4.1.0 RC0 + +* Tue Apr 24 2018 Niels de Vos - 4.0.2-1 +- 4.0.2 GA + +* Thu Apr 19 2018 Kaleb S. KEITHLEY - 4.0.1-3 +- 4.0.1, restore python->python2 -prettytable + +* Wed Mar 21 2018 Kaleb S. KEITHLEY - 4.0.1-2 +- 4.0.1 GA + +* Wed Mar 21 2018 Kaleb S. KEITHLEY - 4.0.1-1 +- (skipped by accident) + +* Tue Mar 6 2018 Kaleb S. KEITHLEY - 4.0.0-2 +- 4.0.0 GA (v4.0.0-2 respin) + +* Tue Mar 6 2018 Kaleb S. KEITHLEY - 4.0.0-1 +- 4.0.0 GA + +* Thu Mar 1 2018 Kaleb S. KEITHLEY - 4.0.0-0.2rc1 +- 4.0.0 RC1, python2-prettytable, .../rpms/glusterfs/pull-request/3 + +* Tue Feb 27 2018 Kaleb S. KEITHLEY - 4.0.0-0.1rc1 +- 4.0.0 RC1 + +* Fri Feb 2 2018 Kaleb S. KEITHLEY - 4.0.0rc0-1 +- 4.0.0 RC0 + +* Sat Jan 20 2018 Kaleb S. KEITHLEY - 3.13.2-1 +- 3.13.2 GA + +* Thu Jan 18 2018 Kaleb S. KEITHLEY - 3.13.1-3 +- glibc in Fedora 28 has removed rpc headers and rpcgen, use libtirpc + +* Mon Dec 25 2017 Niels de Vos - 3.13.1-2 +- Fedora 28 has renamed pyxattr + +* Thu Dec 21 2017 Kaleb S. KEITHLEY - 3.13.1-1 +- 3.13.1 GA + +* Sat Dec 2 2017 Kaleb S. KEITHLEY - 3.13.0-1 +- 3.13.0 GA + +* Wed Nov 22 2017 Kaleb S. KEITHLEY - 3.13.0-0.1.rc0 +- 3.13.0 RC0 + +* Mon Nov 13 2017 Kaleb S. KEITHLEY - 3.12.3-1 +- 3.12.3 GA + +* Mon Oct 23 2017 Kaleb S. KEITHLEY - 3.12.2-2 +- 3.12.2, bz #1504256 + +* Fri Oct 13 2017 Kaleb S. KEITHLEY - 3.12.2-1 +- 3.12.2 GA + +* Thu Sep 28 2017 Kaleb S. KEITHLEY - 3.12.1-2 +- 3.12.1 bz 1495858 + +* Mon Sep 11 2017 Kaleb S. KEITHLEY - 3.12.1-1 +- 3.12.1 GA + +* Wed Aug 30 2017 Kaleb S. KEITHLEY - 3.12.0-1 +- 3.12.0 GA + +* Tue Aug 22 2017 Kaleb S. KEITHLEY - 3.11.3-2 +- 3.11.3 libibverbs-devel, librdmacm-devel -> rdma-core-devel + +* Mon Aug 21 2017 Kaleb S. KEITHLEY - 3.11.3-1 +- 3.11.3 GA + +* Wed Aug 02 2017 Fedora Release Engineering - 3.11.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 3.11.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Jul 21 2017 Kaleb S. KEITHLEY - 3.11.2-1 +- 3.11.2 GA + +* Fri Jul 07 2017 Igor Gnatenko - 3.11.1-2 +- Rebuild due to bug in RPM (RHBZ #1468476) + +* Wed Jun 28 2017 Kaleb S. KEITHLEY - 3.11.1-1 +- 3.11.1 GA + +* Sun Jun 25 2017 Kaleb S. KEITHLEY - 3.11.0-2 +- rebuild with userspace-rcu-0.10.0 (liburcu-bp.so.6) + +* Tue May 30 2017 Kaleb S. KEITHLEY - 3.11.0-1 +- 3.11.0 GA + +* Tue May 23 2017 Kaleb S. KEITHLEY - 3.11.0-0.4rc1 +- 3.11.0 RC1 + +* Tue May 9 2017 Kaleb S. KEITHLEY - 3.11.0-0.3rc0 +- Enable gnfs subpackage + +* Tue May 9 2017 Niels de Vos - 3.11.0-0.2rc0 +- remove conflicting _localstate_/run/gluster dir + +* Mon May 8 2017 Kaleb S. KEITHLEY - 3.11.0-0.1rc0 +- 3.11.0 RC0 + +* Thu Mar 30 2017 Kaleb S. KEITHLEY - 3.10.1-1 +- 3.10.1 GA + +* Thu Feb 23 2017 Kaleb S. KEITHLEY - 3.10.0-1 +- 3.10.0 GA + +* Tue Feb 21 2017 Kaleb S. KEITHLEY - 3.10.0-0.2rc1 +- 3.10.0 RC1 + +* Tue Feb 7 2017 Kaleb S. KEITHLEY - 3.10.0-0.1rc0 +- 3.10.0 RC0 + +* Tue Jan 17 2017 Kaleb S. KEITHLEY - 3.9.1-1 +- 3.9.1 GA + +* Mon Jan 16 2017 Kaleb S. KEITHLEY - 3.9.0-4 +- firewalld nit + +* Thu Jan 12 2017 Igor Gnatenko - 3.9.0-3 +- Rebuild for readline 7.x + +* Fri Jan 6 2017 Kaleb S. KEITHLEY - 3.9.0-2 +- firewalld fixes + +* Tue Nov 15 2016 Kaleb S. KEITHLEY - 3.9.0-1 +- 3.9.0 GA +- w/ glfs_free(), needed for nfs-ganesha-2.4.1 w/ patched FSAL_GLUSTER + +* Mon Oct 31 2016 Kaleb S. KEITHLEY - 3.9.0-0.3rc2 +- glfs_free(), needed for nfs-ganesha-2.4.1 w/ patched FSAL_GLUSTER + +* Thu Oct 27 2016 Kaleb S. KEITHLEY - 3.9.0-0.2rc2 +- portblock RA (1389293) + +* Wed Oct 26 2016 Kaleb S. KEITHLEY - 3.9.0-0.1rc2 +- 3.9.0rc2 + +* Thu Oct 13 2016 Kaleb S. KEITHLEY - 3.8.5-1 +- 3.8.5 GA + +* Wed Sep 21 2016 Kaleb S. KEITHLEY - 3.8.4-2 +- 3.8.4 GA, remove python-ctypes in rawhide per cstratak at redhat.com + +* Sat Sep 10 2016 Kaleb S. KEITHLEY - 3.8.4-1 +- 3.8.4 GA + +* Mon Aug 22 2016 Kaleb S. KEITHLEY - 3.8.3-1 +- 3.8.3 GA + +* Wed Aug 10 2016 Kaleb S. KEITHLEY - 3.8.2-1 +- 3.8.2 GA + +* Tue Jul 19 2016 Fedora Release Engineering - 3.8.1-2 +- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages + +* Fri Jul 8 2016 Kaleb S. KEITHLEY - 3.8.1-1 +- 3.8.1 GA + +* Mon Jun 27 2016 Kaleb S. KEITHLEY - 3.8.0-3 +- 3.8.0 GA, http://review.gluster.org/#/c/14779/ + +* Wed Jun 22 2016 Kaleb S. KEITHLEY - 3.8.0-2 +- 3.8.0 GA, rebuild after userspace-rcu SONAME bump + +* Tue Jun 14 2016 Kaleb S. KEITHLEY - 3.8.0-1 +- 3.8.0 GA + +* Wed May 25 2016 Kaleb S. KEITHLEY - 3.8.0-0.2rc2 +- 3.8.0 RC2 + +* Mon May 16 2016 Kaleb S. KEITHLEY - 3.8.0-0.1rc1 +- 3.8.0 RC1 + +* Wed Apr 27 2016 Kaleb S. KEITHLEY - 3.7.11-2 +- %%postun libs on RHEL6 w/o firewalld + +* Mon Apr 18 2016 Kaleb S. KEITHLEY - 3.7.11-1 +- GlusterFS 3.7.11 GA + +* Fri Apr 1 2016 Kaleb S. KEITHLEY - 3.7.10-1 +- GlusterFS 3.7.10 GA + +* Sat Mar 19 2016 Kaleb S. KEITHLEY - 3.7.9-2 +- glusterfs-ganesha requires cman, pacemaker, corosync on RHEL6 + +* Sat Mar 19 2016 Kaleb S. KEITHLEY - 3.7.9-1 +- GlusterFS 3.7.9 GA + +* Fri Mar 4 2016 Kaleb S. KEITHLEY - 3.7.8-4 +- %%post, %%pre -p /sbin/ldconfig handling (1312374, 1315024) + +* Fri Mar 4 2016 Kaleb S. KEITHLEY - 3.7.8-3 +- Requires /bin/dbus -> dbus +- quiet %%post server (1312897) +- syslog dependency (1310437) + +* Fri Feb 26 2016 Niels de Vos - 3.7.8-2 +- Just run /sbin/ldconfig without arguments, not as interpreter (#1312374) + +* Mon Feb 8 2016 Kaleb S. KEITHLEY - 3.7.8-1 +- GlusterFS 3.7.8 GA + +* Wed Feb 03 2016 Fedora Release Engineering - 3.7.7-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Mon Feb 1 2016 Kaleb S. KEITHLEY - 3.7.7-1 +- GlusterFS 3.7.7 GA + +* Mon Nov 9 2015 Kaleb S. KEITHLEY - 3.7.6-2 +- glusterfs-server Requires: glusterfs-api +- s/%%define/%%global/ + +* Mon Nov 9 2015 Kaleb S. KEITHLEY - 3.7.6-1 +- GlusterFS 3.7.6 GA + +* Wed Oct 7 2015 Kaleb S. KEITHLEY - 3.7.5-1 +- GlusterFS 3.7.5 GA + +* Tue Sep 1 2015 Kaleb S. KEITHLEY - 3.7.4-2 +- GlusterFS 3.7.4 cpio mkdir /var/lib/glusterd/hooks/1/delete/post error + +* Mon Aug 31 2015 Kaleb S. KEITHLEY - 3.7.4-1 +- GlusterFS 3.7.4 GA + +* Tue Jul 28 2015 Kaleb S. KEITHLEY - 3.7.3-1 +- GlusterFS 3.7.3 GA + +* Tue Jun 23 2015 Kaleb S. KEITHLEY - 3.7.2-3 +- revised workaround for %%ghost issue + +* Mon Jun 22 2015 Kaleb S. KEITHLEY - 3.7.2-2 +- workaround for %%ghost %%{_sharedstatedir}/glusterd/hooks/1/delete/post + pending correct fix that also packages the .pyc and .pyo files. + +* Fri Jun 19 2015 Kaleb S. KEITHLEY - 3.7.2-1 +- GlusterFS 3.7.2 GA + +* Wed Jun 17 2015 Fedora Release Engineering - 3.7.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Mon Jun 1 2015 Kaleb S. KEITHLEY - 3.7.1-1 +- GlusterFS 3.7.1 GA + +* Wed May 20 2015 Kaleb S. KEITHLEY - 3.7.0-2 +- GlusterFS 3.7.0, move lib{gfdb,gfchangelog}.pc from -api-devel to -devel + +* Fri May 15 2015 Kaleb S. KEITHLEY - 3.7.0-1 +- GlusterFS 3.7.0 GA + +* Tue May 12 2015 Kaleb S. KEITHLEY - 3.7.0-0.8beta2 +- GlusterFS 3.7.0beta2 + +* Tue May 12 2015 Kaleb S. KEITHLEY - 3.7.0-0.7beta2 +- GlusterFS 3.7.0beta2, extra-xlators requires python-gluster + +* Tue May 12 2015 Kaleb S. KEITHLEY - 3.7.0-0.6beta2 +- GlusterFS 3.7.0beta2, noarch python-gluster + +* Tue May 12 2015 Kaleb S. KEITHLEY - 3.7.0-0.5beta2 +- GlusterFS 3.7.0beta2 + +* Fri May 8 2015 Kaleb S. KEITHLEY - 3.7.0-0.4beta1 +- GlusterFS 3.7.0beta1, BZ 1195947, 1218440 + +* Tue May 5 2015 Kaleb S. KEITHLEY - 3.7.0-0.3beta1 +- GlusterFS 3.7.0beta1, BZ 1218442 + +* Tue May 5 2015 Kaleb S. KEITHLEY - 3.7.0-0.2beta1 +- GlusterFS 3.7.0beta1, BZ 1218359 + +* Wed Apr 29 2015 Kaleb S. KEITHLEY - 3.7.0-0.1beta1 +- GlusterFS 3.7.0beta1 + +* Wed Apr 22 2015 Kaleb S. KEITHLEY - 3.6.3-1 +- GlusterFS 3.6.3 GA + +* Wed Apr 15 2015 Kaleb S. KEITHLEY +- preliminary for 3.7.0alpha + +* Wed Apr 1 2015 Humble Chirammal - 3.6.3beta2 +- GlusterFS 3.6.3beta2 release. + +* Thu Feb 12 2015 Humble Chirammal - 3.6.3beta1 +- GlusterFS 3.6.3beta1 release. + +* Tue Feb 10 2015 Kaleb S. KEITHLEY +- Ownership of /usr/lib/python2.7/site-packages/gluster, BZ 1190832 +- N.B. gfapi.py was removed in 3.6 (to resurface another day?) + +* Mon Feb 02 2015 Lalatendu Mohanty - 3.6.2-2 +- GlusterFS 3.6.2-2 + +* Fri Jan 30 2015 Nandaja Varma 1033 +- remove checks for rpmbuild/mock from run-tests.sh (#178008) + +* Wed Jan 28 2015 Kaleb S. KEITHLEY +- glusterfs-fuse Requires: attr. See BZ 1184626, 1184627 + +* Thu Jan 22 2015 Lalatendu Mohanty - 3.6.2-1 +- GlusterFS 3.6.2 GA + +* Thu Jan 15 2015 Lalatendu Mohanty - 3.6.2beta2-1 +- GlusterFS 3.6.2beta2 + +* Tue Jan 06 2015 Pranith Kumar Karampuri +- Adding glfsheal binary + +* Fri Dec 19 2014 Lalatendu Mohanty - 3.6.2beta1-1 +- GlusterFS 3.6.2beta1 + +* Fri Dec 12 2014 Niels de Vos +- do not package all /usr/share/glusterfs/* files in regression-tests (#1169005) + +* Sat Nov 29 2014 Lalatendu Mohanty - 3.6.1-4 +- Fix build on el5 (upstream bug 1169004) + +* Thu Nov 20 2014 Niels de Vos - 3.6.1-3 +- Fix version in gluster-api.pc (upstream bug 1166232) + +* Wed Nov 19 2014 Lalatendu Mohanty +- Changes to remove regression-tests RPM from Fedora + +* Fri Nov 07 2014 Lalatendu Mohanty +- GlusterFS 3.6.1 GA + +* Wed Oct 1 2014 Humble Chirammal +- glusterfs-3.6.0beta3 release + +* Thu Sep 25 2014 Kaleb S. KEITHLEY +- add psmisc for -server +- add smarter logic to restart glusterd in %%post server + +* Thu Sep 25 2014 Kaleb S. KEITHLEY +- glusterfs-3.6.0beta2.tar.gz + +* Wed Sep 24 2014 Balamurugan Arumugam +- remove /sbin/ldconfig as interpreter (#1145992) + +* Mon Sep 22 2014 Kaleb S. KEITHLEY +- More make fedora master glusterfs spec compatible with upstream GlusterFS 3.6 spec + +* Mon Sep 22 2014 Humble Chirammal +- Make fedora master glusterfs spec compatible with upstream GlusterFS 3.6 spec + +* Fri Sep 5 2014 Lalatendu Mohanty +- Changed the description as "GlusterFS a distributed filesystem" + +* Sat Aug 16 2014 Fedora Release Engineering - 3.5.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Tue Aug 5 2014 Kaleb S. KEITHLEY +- use upstream logrotate files exclusively (#1126788) + +* Thu Jul 31 2014 Lalatendu Mohanty - 3.5.2-1 +- GlusterFS 3.5.2 GA + +* Mon Jul 21 2014 Lalatendu Mohanty - 3.5.2-0.1.beta1 +- GlusterFS 3.5.2 beta1 + +* Wed Jul 9 2014 Kaleb S. KEITHLEY - 3.5.1-2 +- glusterd.init, BZ 1073217 + +* Fri Jun 27 2014 Kaleb S. KEITHLEY +- killall --wait in %%post server (#1113959, #1113745) + +* Wed Jun 25 2014 Vikhyat Umrao +- add nfs-utils package dependency for server package (#1113007) + +* Tue Jun 24 2014 Lalatendu Mohanty - 3.5.1-1 +- GlusterFS 3.5.1 GA + +* Wed Jun 11 2014 Humble Chirammal - 3.5.1-0.3.beta2 +- GlusterFS 3.5.1 beta2 + +* Sat Jun 07 2014 Fedora Release Engineering - 3.5.1-0.2.beta1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Mon May 26 2014 Kaleb S. KEITHLEY - 3.5.1-0.1.beta1 +- GlusterFS 3.5.1 beta1 + +* Thu May 1 2014 Kaleb S. KEITHLEY - 3.5.0-3 +- syslog deprecated in Fedora20 BZ #1093318 + +* Fri Apr 25 2014 Kaleb S. KEITHLEY +- sync with upstream glusterfs.spec.in BZ #1091392 + +* Wed Apr 23 2014 Kaleb S. KEITHLEY - 3.5.0-2 +- GlusterFS 3.5.0 GA, glusterfs-3.5.0-2, glusterfs.spec nits + +* Thu Apr 17 2014 Kaleb S. KEITHLEY - 3.5.0-1 +- GlusterFS 3.5.0 GA + +* Fri Apr 4 2014 Kaleb S. KEITHLEY - 3.5.0-0.7.beta5 +- GlusterFS 3.5.0 beta5 + +* Sat Mar 8 2014 Kaleb S. KEITHLEY - 3.5.0-0.6.beta4 +- GlusterFS 3.5.0 beta4 + +* Tue Feb 11 2014 Kaleb S. KEITHLEY - 3.5.0-0.5.beta3 +- GlusterFS 3.5.0 beta3 + +* Mon Jan 27 2014 Kaleb S. KEITHLEY - 3.5.0-0.4.beta2 +- GlusterFS 3.5.0 beta2 + +* Thu Jan 16 2014 Kaleb S. KEITHLEY - 3.5.0-0.3.beta1 +- GlusterFS 3.5.0 beta1 + +* Thu Jan 16 2014 Ville Skyttä - 3.5.0-0.2.beta1 +- Drop unnecessary ldconfig calls, do remaining ones without shell. +- Drop INSTALL from docs. + +* Wed Jan 15 2014 Kaleb S. KEITHLEY - 3.5.0-0.1.beta1 +- GlusterFS 3.5.0 beta1 , glusterfs-3.5.0-0.1beta1 + +* Fri Dec 6 2013 Kaleb S. KEITHLEY - 3.5.0-0.1.qa3 +- GlusterFS 3.5.0 QA3 , glusterfs-3.5.0-0.1qa3 + +* Wed Nov 6 2013 Kaleb S. KEITHLEY +- obsolete glusterfs-ufo (#1025059) +- ownership of /usr/share/doc/glusterfs(-x.y.z) (#846737) +- clear_xattrs.sh belongs in /usr/share/doc/glusterfs(-x.y.z), not + in /usr/share/doc/glusterfs-server(-x.y.z) +- remove defattr (per pkg review of another package) +- don't use %%{__foo} macros (per package review of another package) + +* Sun Oct 27 2013 Niels de Vos - 3.4.1-3 +- Correctly start+stop glusterfsd.service (#1022542) +- fix "warning: File listed twice: .../glusterd.info" while building + +* Sat Oct 26 2013 Niels de Vos +- add base-port config option to /etc/glusterd/glusterd.vol (#1023653) + +* Wed Oct 9 2013 Kaleb S. KEITHLEY +- nit, sync with upstream spec + * Wed Oct 9 2013 Niels de Vos - glusterfs-api-devel requires glusterfs-devel (#1016938, #1017094) diff --git a/glusterfsd.logrotate b/glusterfsd.logrotate deleted file mode 100644 index 81d1abc..0000000 --- a/glusterfsd.logrotate +++ /dev/null @@ -1,6 +0,0 @@ -/var/log/glusterfs/*glusterfsd.log /var/log/glusterfs/bricks/*.log { - missingok - postrotate - /bin/kill -HUP `cat /var/run/glusterfsd.pid 2>/dev/null` 2>/dev/null || true - endscript -} diff --git a/glusterfsd.service b/glusterfsd.service index 4454ad8..e25405d 100644 --- a/glusterfsd.service +++ b/glusterfsd.service @@ -1,12 +1,16 @@ [Unit] -Description=GlusterFS an clustered file-system server +Description=GlusterFS brick processes (stopping only) After=network.target glusterd.service [Service] -Type=forking -PIDFile=/run/glusterfsd.pid -LimitNOFILE=65536 -ExecStart=/usr/sbin/glusterfsd -p /run/glusterfsd.pid +Type=oneshot +# glusterd starts the glusterfsd processed on-demand +# /bin/true will mark this service as started, RemainAfterExit keeps it active +ExecStart=/bin/true +RemainAfterExit=yes +# if there are no glusterfsd processes, a stop/reload should not give an error +ExecStop=/bin/sh -c "/bin/killall --wait glusterfsd || /bin/true" +ExecReload=/bin/sh -c "/bin/killall -HUP glusterfsd || /bin/true" [Install] WantedBy=multi-user.target diff --git a/object-expirer.conf b/object-expirer.conf deleted file mode 100644 index b75963c..0000000 --- a/object-expirer.conf +++ /dev/null @@ -1,17 +0,0 @@ -[DEFAULT] - -[object-expirer] -# auto_create_account_prefix = . - -[pipeline:main] -pipeline = catch_errors cache proxy-server - -[app:proxy-server] -use = egg:swift#proxy - -[filter:cache] -use = egg:swift#memcache -memcache_servers = 127.0.0.1:11211 - -[filter:catch_errors] -use = egg:swift#catch_errors diff --git a/object-server.conf b/object-server.conf deleted file mode 100644 index 3a3d9be..0000000 --- a/object-server.conf +++ /dev/null @@ -1,16 +0,0 @@ -[DEFAULT] -bind_ip = 127.0.0.1 -bind_port = 6010 -workers = 3 - -[pipeline:main] -pipeline = object-server - -[app:object-server] -use = egg:swift#object - -[object-replicator] - -[object-updater] - -[object-auditor] diff --git a/openstack-swift-docmod.patch b/openstack-swift-docmod.patch deleted file mode 100644 index 03f193c..0000000 --- a/openstack-swift-docmod.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- swift-1.4.4/doc/source/conf.py.orig 2011-11-24 08:59:50.000000000 -0500 -+++ swift-1.4.4/doc/source/conf.py 2012-01-04 22:35:55.571492761 -0500 -@@ -31,7 +31,10 @@ - # If extensions (or modules to document with autodoc) are in another directory, - # add these directories to sys.path here. If the directory is relative to the - # documentation root, use os.path.abspath to make it absolute, like shown here. --sys.path.append([os.path.abspath('../swift'), os.path.abspath('..'), os.path.abspath('../bin')]) -+sys.path = [os.path.abspath('../../swift'), -+ os.path.abspath('../..'), -+ os.path.abspath('../../bin') -+ ] + sys.path - - # -- General configuration ----------------------------------------------------- - diff --git a/openstack-swift-newdeps.patch b/openstack-swift-newdeps.patch deleted file mode 100644 index 3b4222a..0000000 --- a/openstack-swift-newdeps.patch +++ /dev/null @@ -1,36 +0,0 @@ -diff -ru swift-1.4.4-ORIG/swift/__init__.py swift-1.4.4/swift/__init__.py ---- swift-1.4.4-ORIG/swift/__init__.py 2011-11-24 14:59:50.000000000 +0100 -+++ swift-1.4.4/swift/__init__.py 2012-01-04 00:09:10.122030579 +0100 -@@ -1,3 +1,32 @@ -+import sys -+import pkg_resources -+ -+# If there is a conflicting non egg module, -+# i.e. an older standard system module installed, -+# then replace it with this requirement -+def replace_dist(requirement): -+ try: -+ return pkg_resources.require(requirement) -+ except pkg_resources.VersionConflict: -+ e = sys.exc_info()[1] -+ dist=e.args[0] -+ req=e.args[1] -+ if dist.key == req.key and not dist.location.endswith('.egg'): -+ del pkg_resources.working_set.by_key[dist.key] -+ # We assume there is no need to adjust sys.path -+ # and the associated pkg_resources.working_set.entries -+ return pkg_resources.require(requirement) -+ -+replace_dist("WebOb >= 1.0") -+ -+replace_dist("PasteDeploy >= 1.5.0") -+# This hack is needed because replace_dist() results in -+# the standard paste module path being at the start of __path__. -+# TODO: See can we get pkg_resources to do the right thing directly -+import paste -+paste.__path__.insert(0, paste.__path__.pop(-1)) -+ -+ - import gettext - - diff --git a/openstack-swift-nonet.patch b/openstack-swift-nonet.patch deleted file mode 100644 index af8cad4..0000000 --- a/openstack-swift-nonet.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- swift-1.4.4/doc/source/conf.py.orig 2012-01-04 22:40:43.190300958 -0500 -+++ swift-1.4.4/doc/source/conf.py 2012-01-04 22:41:26.980492712 -0500 -@@ -40,7 +40,7 @@ - - # Add any Sphinx extension module names here, as strings. They can be extensions - # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. --extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.pngmath', 'sphinx.ext.ifconfig'] -+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.pngmath', 'sphinx.ext.ifconfig'] - todo_include_todos = True - - # Add any paths that contain templates here, relative to this directory. diff --git a/proxy-server.conf b/proxy-server.conf deleted file mode 100644 index 3e4b88a..0000000 --- a/proxy-server.conf +++ /dev/null @@ -1,39 +0,0 @@ -[DEFAULT] -bind_port = 8080 -workers = 8 -user = swift - -[pipeline:main] -pipeline = healthcheck cache authtoken keystone proxy-server - -[app:proxy-server] -use = egg:swift#proxy -allow_account_management = true -account_autocreate = true - -[filter:cache] -use = egg:swift#memcache -memcache_servers = 127.0.0.1:11211 - -[filter:catch_errors] -use = egg:swift#catch_errors - -[filter:healthcheck] -use = egg:swift#healthcheck - -[filter:keystone] -paste.filter_factory = keystone.middleware.swift_auth:filter_factory -operator_roles = admin, SwiftOperator -is_admin = true -cache = swift.cache - -[filter:authtoken] -paste.filter_factory = keystone.middleware.auth_token:filter_factory -admin_tenant_name = %SERVICE_TENANT_NAME% -admin_user = %SERVICE_USER% -admin_password = %SERVICE_PASSWORD% -auth_host = 127.0.0.1 -auth_port = 35357 -auth_protocol = http -signing_dir = /tmp/keystone-signing-swift - diff --git a/rhel5-load-fuse-modules b/rhel5-load-fuse-modules deleted file mode 100755 index ee194db..0000000 --- a/rhel5-load-fuse-modules +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -# -# fusermount-glusterfs requires the /dev/fuse character device. The fuse module -# provides this and is loaded on demand in newer Linux distributions. -# - -[ -c /dev/fuse ] || /sbin/modprobe fuse diff --git a/sources b/sources index e68d688..167f189 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -dce3d066b7351b360454ea9ca4cabe4c glusterfs-3.4.1.tar.gz +SHA512 (glusterfs-11.2.tar.gz) = 6ac463047c5b1fee1d00ca9d6c16169762ed31c7d3b8dfb341bb8a90b83c15fdd9d48ebbe6cf79eee885f764cfa5391f4107837764c0a182eff1b51bede63d48 diff --git a/swift.conf b/swift.conf deleted file mode 100644 index adbd96f..0000000 --- a/swift.conf +++ /dev/null @@ -1,2 +0,0 @@ -[swift-hash] -swift_hash_path_suffix = %SWIFT_HASH_PATH_SUFFIX%