summaryrefslogtreecommitdiffstats
path: root/swift/1.4.8
diff options
context:
space:
mode:
authorPeter Portante <peter.portante@redhat.com>2012-11-07 12:37:26 -0500
committerVijay Bellur <vbellur@redhat.com>2012-11-16 04:52:06 -0800
commite8d95655d5e73462723799d20e59bc4f21bdf973 (patch)
treeb1e37a514241340834896e51e6127bff6c577e75 /swift/1.4.8
parent05cc14c2d301934d79ee37cd36f498247b7a9886 (diff)
object-storage: refactor to use swift devices
Refactor code to use the devices configuration file setting for account, container, and object servers, dropping mount_path from the fs.conf file, and constructing new account, container and object server rings. This removes the next to last set of diffs in the swift diff file. See BZ 870589 (https://bugzilla.redhat.com/show_bug.cgi?id=870589). The key to the change is the dropping of the pre-built account, container and object rings, instead providing a script that will generate them for the user given the gluster volume name in use. In addition, we override the Swift check_mount() method and replace it with Gluster's which attempts to "auto-mount" if it is not already mounted. The following is an enumeration of the changes contained in this refactoring: * The refactoring to override the Swift check_mount() involved condensing a lot of code, removing redundancies and simplifying methods across a number of modules * Drop checking the mount point in the low level DiskDir, DiskAccount and DiskFile objects now that Swift's normal mount checking is used, and enable it by default in the template configuration file * Add missing get_container_timestamp() method for DiskAccount objects * Fix the plugin RPM spec file to provide the new ring builders, and while we were at it, finally fix the over-writing of the configuration files on install * Bug fixes * The monkey patched version of check_object_creation was not working correctly due to a missing import of HTTPBadRequest and a bad reference to validate_obj_name_component() * Only have the utils module import the plugins constraints module for the side effect of monkey patching if gluster is enabled * Removed the db_file.db file in the tree since it is created on the fly * Updated 2011 copyright notices to 2012 Change-Id: I8f4454576b1423021c9bbf3c36176f8db51e62c0 BUG: 870589 Signed-off-by: Peter Portante <peter.portante@redhat.com> Reviewed-on: http://review.gluster.org/4179 Reviewed-by: Pete Zaitcev <zaitcev@redhat.com> Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com> Tested-by: Kaleb KEITHLEY <kkeithle@redhat.com> Reviewed-by: Mohammed Junaid <junaid@redhat.com>
Diffstat (limited to 'swift/1.4.8')
-rw-r--r--swift/1.4.8/gluster-swift-plugin.spec15
-rw-r--r--swift/1.4.8/gluster-swift.spec2
-rw-r--r--swift/1.4.8/plugins/DiskDir.py17
-rw-r--r--swift/1.4.8/plugins/DiskFile.py18
-rw-r--r--swift/1.4.8/plugins/Glusterfs.py83
-rwxr-xr-xswift/1.4.8/plugins/bin/gluster-swift-gen-builders19
-rw-r--r--swift/1.4.8/plugins/conf/account-server/1.conf-gluster6
-rw-r--r--swift/1.4.8/plugins/conf/account.builderbin786843 -> 0 bytes
-rw-r--r--swift/1.4.8/plugins/conf/account.ring.gzbin739 -> 0 bytes
-rw-r--r--swift/1.4.8/plugins/conf/container-server/1.conf-gluster6
-rw-r--r--swift/1.4.8/plugins/conf/container.builderbin786843 -> 0 bytes
-rw-r--r--swift/1.4.8/plugins/conf/container.ring.gzbin741 -> 0 bytes
-rw-r--r--swift/1.4.8/plugins/conf/db_file.db0
-rw-r--r--swift/1.4.8/plugins/conf/fs.conf-gluster3
-rw-r--r--swift/1.4.8/plugins/conf/object-server/1.conf-gluster6
-rw-r--r--swift/1.4.8/plugins/conf/object.builderbin786843 -> 0 bytes
-rw-r--r--swift/1.4.8/plugins/conf/object.ring.gzbin738 -> 0 bytes
-rw-r--r--swift/1.4.8/plugins/conf/proxy-server.conf-gluster14
-rw-r--r--swift/1.4.8/plugins/constraints.py25
-rw-r--r--swift/1.4.8/plugins/fs_utils.py2
-rw-r--r--swift/1.4.8/plugins/utils.py70
-rw-r--r--swift/1.4.8/swift.diff133
-rw-r--r--swift/1.4.8/test/unit/plugins/test_utils.py22
23 files changed, 198 insertions, 243 deletions
diff --git a/swift/1.4.8/gluster-swift-plugin.spec b/swift/1.4.8/gluster-swift-plugin.spec
index 4e4ea4f527f..0a1637dc664 100644
--- a/swift/1.4.8/gluster-swift-plugin.spec
+++ b/swift/1.4.8/gluster-swift-plugin.spec
@@ -13,7 +13,7 @@
%define _confdir /etc/swift
%define _swiftdir /usr/lib/python2.6/site-packages/swift
%define _ufo_version 1.0
-%define _ufo_release 8
+%define _ufo_release 12
Summary : GlusterFS Unified File and Object Storage.
Name : gluster-swift-plugin
@@ -44,6 +44,7 @@ rm -rf %{buildroot}
mkdir -p %{buildroot}/%{_swiftdir}/plugins/middleware
mkdir -p %{buildroot}/%{_confdir}/
+mkdir -p %{buildroot}/%{_bindir}/
cp constraints.py %{buildroot}/%{_swiftdir}/plugins
cp DiskDir.py %{buildroot}/%{_swiftdir}/plugins
@@ -58,8 +59,16 @@ cp middleware/gluster.py %{buildroot}/%{_swiftdir}/plugins/middleware
cp -r conf/* %{buildroot}/%{_confdir}/
+cp bin/gluster-swift-gen-builders %{buildroot}/%{_bindir}/
+
%files
%defattr(-,root,root)
-%{_swiftdir}/plugins/middleware
+%docdir conf
%{_swiftdir}/plugins
-%{_confdir}/
+%{_bindir}/gluster-swift-gen-builders
+%config %{_confdir}/account-server/1.conf-gluster
+%config %{_confdir}/container-server/1.conf-gluster
+%config %{_confdir}/object-server/1.conf-gluster
+%config %{_confdir}/swift.conf-gluster
+%config %{_confdir}/proxy-server.conf-gluster
+%config %{_confdir}/fs.conf-gluster
diff --git a/swift/1.4.8/gluster-swift.spec b/swift/1.4.8/gluster-swift.spec
index f9d9289515c..a525e9e4a83 100644
--- a/swift/1.4.8/gluster-swift.spec
+++ b/swift/1.4.8/gluster-swift.spec
@@ -4,7 +4,7 @@
Name: gluster-swift
Version: 1.4.8
-Release: 8%{?dist}
+Release: 12%{?dist}
Summary: OpenStack Object Storage (swift)
Group: Development/Languages
diff --git a/swift/1.4.8/plugins/DiskDir.py b/swift/1.4.8/plugins/DiskDir.py
index 6887bec6c13..b12827c582b 100644
--- a/swift/1.4.8/plugins/DiskDir.py
+++ b/swift/1.4.8/plugins/DiskDir.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2011 Red Hat, Inc.
+# Copyright (c) 2012 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.
@@ -16,16 +16,15 @@
import os, errno
from swift.plugins.utils import clean_metadata, dir_empty, rmdirs, mkdirs, \
- validate_account, validate_container, check_valid_account, is_marker, \
- get_container_details, get_account_details, get_container_metadata, \
- create_container_metadata, \
+ validate_account, validate_container, is_marker, get_container_details, \
+ get_account_details, get_container_metadata, create_container_metadata, \
create_account_metadata, DEFAULT_GID, DEFAULT_UID, validate_object, \
create_object_metadata, read_metadata, write_metadata, X_CONTENT_TYPE, \
X_CONTENT_LENGTH, X_TIMESTAMP, X_PUT_TIMESTAMP, X_TYPE, X_ETAG, \
X_OBJECTS_COUNT, X_BYTES_USED, X_CONTAINER_COUNT, CONTAINER
from swift.plugins import Glusterfs
-from swift.common.constraints import CONTAINER_LISTING_LIMIT, check_mount
+from swift.common.constraints import CONTAINER_LISTING_LIMIT
from swift.common.utils import normalize_timestamp, TRUE_VALUES
@@ -163,8 +162,6 @@ class DiskDir(DiskCommon):
# Note that the account name has a one-to-one mapping to the gluster
# mount point, or volume name.
self.account = account
- if not check_mount(path, account):
- check_valid_account(account)
assert logger is not None
self.logger = logger
self.metadata = {}
@@ -494,3 +491,9 @@ class DiskAccount(DiskDir):
if include_metadata:
data['metadata'] = self.metadata
return data
+
+ def get_container_timestamp(self, container):
+ cont_path = os.path.join(self.datadir, container)
+ metadata = read_metadata(cont_path)
+
+ return int(metadata.get(X_PUT_TIMESTAMP, ('0',0))[0]) or None
diff --git a/swift/1.4.8/plugins/DiskFile.py b/swift/1.4.8/plugins/DiskFile.py
index 61b1c9cf99b..a57b2ece368 100644
--- a/swift/1.4.8/plugins/DiskFile.py
+++ b/swift/1.4.8/plugins/DiskFile.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2011 Red Hat, Inc.
+# Copyright (c) 2012 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.
@@ -19,14 +19,12 @@ from tempfile import mkstemp
from contextlib import contextmanager
from swift.common.utils import normalize_timestamp, renamer
from swift.plugins.utils import mkdirs, rmdirs, validate_object, \
- check_valid_account, create_object_metadata, do_open, \
- do_close, do_unlink, do_chown, do_stat, do_listdir, read_metadata,\
- write_metadata
-from swift.common.constraints import check_mount
-from swift.plugins.utils import X_CONTENT_TYPE, X_CONTENT_LENGTH, X_TIMESTAMP,\
+ create_object_metadata, do_open, do_close, do_unlink, do_chown, \
+ do_stat, do_listdir, read_metadata, write_metadata
+from swift.plugins.utils import X_CONTENT_TYPE, X_CONTENT_LENGTH, X_TIMESTAMP, \
X_PUT_TIMESTAMP, X_TYPE, X_ETAG, X_OBJECTS_COUNT, X_BYTES_USED, \
- X_OBJECT_TYPE, FILE, DIR, MARKER_DIR, OBJECT, \
- DIR_TYPE, FILE_TYPE, DEFAULT_UID, DEFAULT_GID
+ X_OBJECT_TYPE, FILE, DIR, MARKER_DIR, OBJECT, DIR_TYPE, FILE_TYPE, \
+ DEFAULT_UID, DEFAULT_GID
import logging
from swift.obj.server import DiskFile
@@ -74,11 +72,7 @@ class Gluster_DiskFile(DiskFile):
self.name = container
#Absolute path for obj directory.
self.datadir = os.path.join(path, device, self.name)
-
self.device_path = os.path.join(path, device)
- if not check_mount(path, device):
- check_valid_account(account)
-
self.container_path = os.path.join(path, device, container)
self.tmpdir = os.path.join(path, device, 'tmp')
self.logger = logger
diff --git a/swift/1.4.8/plugins/Glusterfs.py b/swift/1.4.8/plugins/Glusterfs.py
index 35b0c2f5938..c176a247b9b 100644
--- a/swift/1.4.8/plugins/Glusterfs.py
+++ b/swift/1.4.8/plugins/Glusterfs.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2011 Red Hat, Inc.
+# Copyright (c) 2012 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.
@@ -16,7 +16,6 @@ import logging
import os, fcntl, time
from ConfigParser import ConfigParser
from swift.common.utils import TRUE_VALUES
-from hashlib import md5
from swift.plugins.fs_utils import mkdirs
@@ -24,17 +23,12 @@ from swift.plugins.fs_utils import mkdirs
# Read the fs.conf file once at startup (module load)
#
_fs_conf = ConfigParser()
-MOUNT_PATH = '/mnt/gluster-object'
AUTH_ACCOUNT = 'auth'
MOUNT_IP = 'localhost'
REMOTE_CLUSTER = False
OBJECT_ONLY = False
if _fs_conf.read(os.path.join('/etc/swift', 'fs.conf')):
try:
- MOUNT_PATH = _fs_conf.get('DEFAULT', 'mount_path', '/mnt/gluster-object')
- except (NoSectionError, NoOptionError):
- pass
- try:
AUTH_ACCOUNT = _fs_conf.get('DEFAULT', 'auth_account', 'auth')
except (NoSectionError, NoOptionError):
pass
@@ -53,12 +47,6 @@ if _fs_conf.read(os.path.join('/etc/swift', 'fs.conf')):
NAME = 'glusterfs'
-def strip_obj_storage_path(path, mp=MOUNT_PATH):
- """
- strip the mount path off, also stripping the leading and trailing slashes
- """
- return path.replace(mp, '').strip(os.path.sep)
-
def _busy_wait(full_mount_path):
# Iterate for definite number of time over a given
# interval for successful mount
@@ -66,13 +54,26 @@ def _busy_wait(full_mount_path):
if os.path.ismount(os.path.join(full_mount_path)):
return True
time.sleep(2)
+ logging.error('Busy wait for mount timed out for mount %s', full_mount_path)
return False
-def mount(account):
- full_mount_path = os.path.join(MOUNT_PATH, account)
- export = get_export_from_account_id(account)
+def mount(root, drive):
+ # FIXME: Possible thundering herd problem here
- pid_dir = "/var/lib/glusterd/vols/%s/run/" % export
+ el = _get_export_list()
+ for export in el:
+ if drive == export:
+ break
+ else:
+ 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
+ full_mount_path = os.path.join(root, drive)
+ 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');
if not os.path.exists(pid_dir):
@@ -85,52 +86,46 @@ def mount(account):
except:
ex = sys.exc_info()[1]
if isinstance(ex, IOError) and ex.errno in (EACCES, EAGAIN):
- # This means that some other process is mounting the
- # filesystem, so wait for the mount process to complete
+ # This means that some other process is mounting the
+ # filesystem, so wait for the mount process to complete
return _busy_wait(full_mount_path)
mnt_cmd = 'mount -t glusterfs %s:%s %s' % (MOUNT_IP, export, \
full_mount_path)
if os.system(mnt_cmd) or not _busy_wait(full_mount_path):
- raise Exception('Mount failed %s: %s' % (NAME, mnt_cmd))
+ logging.error('Mount failed %s: %s', NAME, mnt_cmd)
+ return False
return True
def unmount(full_mount_path):
+ # FIXME: Possible thundering herd problem here
+
umnt_cmd = 'umount %s 2>> /dev/null' % full_mount_path
if os.system(umnt_cmd):
logging.error('Unable to unmount %s %s' % (full_mount_path, NAME))
-def get_export_list():
+def _get_export_list():
if REMOTE_CLUSTER:
cmnd = 'ssh %s gluster volume info' % MOUNT_IP
else:
cmnd = 'gluster volume info'
+ export_list = []
+
if os.system(cmnd + ' >> /dev/null'):
if REMOTE_CLUSTER:
- raise Exception('Getting volume info failed %s, make sure to have \
- passwordless ssh on %s', NAME, MOUNT_IP)
+ logging.error('Getting volume info failed %s, make sure to have '\
+ 'passwordless ssh on %s', NAME, MOUNT_IP)
else:
- raise Exception('Getting volume failed %s', NAME)
-
- export_list = []
- fp = os.popen(cmnd)
- while True:
- item = fp.readline()
- if not item:
- break
- item = item.strip('\n').strip(' ')
- if item.lower().startswith('volume name:'):
- export_list.append(item.split(':')[1].strip(' '))
+ logging.error('Getting volume failed %s', NAME)
+ else:
+ fp = os.popen(cmnd)
+ while True:
+ item = fp.readline()
+ if not item:
+ break
+ item = item.strip('\n').strip(' ')
+ if item.lower().startswith('volume name:'):
+ export_list.append(item.split(':')[1].strip(' '))
return export_list
-
-def get_export_from_account_id(account):
- if not account:
- raise ValueError('No account given')
-
- for export in get_export_list():
- if account == 'AUTH_' + export:
- return export
-
- raise Exception('No export found %s %s' % (account, NAME))
diff --git a/swift/1.4.8/plugins/bin/gluster-swift-gen-builders b/swift/1.4.8/plugins/bin/gluster-swift-gen-builders
new file mode 100755
index 00000000000..b89cd15fb00
--- /dev/null
+++ b/swift/1.4.8/plugins/bin/gluster-swift-gen-builders
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+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 rebalance
+ swift-ring-builder $1
+}
+
+if [ "$1x" = "x" ]; then
+ echo "Please specify the gluster volume name to use."
+ 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
diff --git a/swift/1.4.8/plugins/conf/account-server/1.conf-gluster b/swift/1.4.8/plugins/conf/account-server/1.conf-gluster
index 911e2837f50..c7a4c10a4fc 100644
--- a/swift/1.4.8/plugins/conf/account-server/1.conf-gluster
+++ b/swift/1.4.8/plugins/conf/account-server/1.conf-gluster
@@ -1,7 +1,7 @@
[DEFAULT]
-devices = /srv/1/node
-mount_check = false
-bind_port = 6012
+devices = /mnt/gluster-object
+mount_check = true
+bind_port = 6012 # Be sure to keep in sync with /usr/bin/gluster-swift-gen-builders
user = root
log_facility = LOG_LOCAL2
diff --git a/swift/1.4.8/plugins/conf/account.builder b/swift/1.4.8/plugins/conf/account.builder
deleted file mode 100644
index 2943b9cfb49..00000000000
--- a/swift/1.4.8/plugins/conf/account.builder
+++ /dev/null
Binary files differ
diff --git a/swift/1.4.8/plugins/conf/account.ring.gz b/swift/1.4.8/plugins/conf/account.ring.gz
deleted file mode 100644
index e1a5e6ae25e..00000000000
--- a/swift/1.4.8/plugins/conf/account.ring.gz
+++ /dev/null
Binary files differ
diff --git a/swift/1.4.8/plugins/conf/container-server/1.conf-gluster b/swift/1.4.8/plugins/conf/container-server/1.conf-gluster
index eb5650afa74..2b97eef6241 100644
--- a/swift/1.4.8/plugins/conf/container-server/1.conf-gluster
+++ b/swift/1.4.8/plugins/conf/container-server/1.conf-gluster
@@ -1,7 +1,7 @@
[DEFAULT]
-devices = /srv/1/node
-mount_check = false
-bind_port = 6011
+devices = /mnt/gluster-object
+mount_check = true
+bind_port = 6011 # Be sure to keep in sync with /usr/bin/gluster-swift-gen-builders
user = root
log_facility = LOG_LOCAL2
diff --git a/swift/1.4.8/plugins/conf/container.builder b/swift/1.4.8/plugins/conf/container.builder
deleted file mode 100644
index 6031d79df60..00000000000
--- a/swift/1.4.8/plugins/conf/container.builder
+++ /dev/null
Binary files differ
diff --git a/swift/1.4.8/plugins/conf/container.ring.gz b/swift/1.4.8/plugins/conf/container.ring.gz
deleted file mode 100644
index fdbcb18b2bf..00000000000
--- a/swift/1.4.8/plugins/conf/container.ring.gz
+++ /dev/null
Binary files differ
diff --git a/swift/1.4.8/plugins/conf/db_file.db b/swift/1.4.8/plugins/conf/db_file.db
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/swift/1.4.8/plugins/conf/db_file.db
+++ /dev/null
diff --git a/swift/1.4.8/plugins/conf/fs.conf-gluster b/swift/1.4.8/plugins/conf/fs.conf-gluster
index b6ec5121f9f..0bd21babff4 100644
--- a/swift/1.4.8/plugins/conf/fs.conf-gluster
+++ b/swift/1.4.8/plugins/conf/fs.conf-gluster
@@ -1,9 +1,8 @@
[DEFAULT]
-mount_path = /mnt/gluster-object
auth_account = auth
#ip of the fs server.
mount_ip = localhost
#fs server need not be local, remote server can also be used,
#set remote_cluster=yes for using remote server.
remote_cluster = no
-object_only = no \ No newline at end of file
+object_only = no
diff --git a/swift/1.4.8/plugins/conf/object-server/1.conf-gluster b/swift/1.4.8/plugins/conf/object-server/1.conf-gluster
index 13dda69bae2..62e2fb49624 100644
--- a/swift/1.4.8/plugins/conf/object-server/1.conf-gluster
+++ b/swift/1.4.8/plugins/conf/object-server/1.conf-gluster
@@ -1,7 +1,7 @@
[DEFAULT]
-devices = /srv/1/node
-mount_check = false
-bind_port = 6010
+devices = /mnt/gluster-object
+mount_check = true
+bind_port = 6010 # Be sure to keep in sync with /usr/bin/gluster-swift-gen-builders
user = root
log_facility = LOG_LOCAL2
diff --git a/swift/1.4.8/plugins/conf/object.builder b/swift/1.4.8/plugins/conf/object.builder
deleted file mode 100644
index ce45350595d..00000000000
--- a/swift/1.4.8/plugins/conf/object.builder
+++ /dev/null
Binary files differ
diff --git a/swift/1.4.8/plugins/conf/object.ring.gz b/swift/1.4.8/plugins/conf/object.ring.gz
deleted file mode 100644
index 73e88d58918..00000000000
--- a/swift/1.4.8/plugins/conf/object.ring.gz
+++ /dev/null
Binary files differ
diff --git a/swift/1.4.8/plugins/conf/proxy-server.conf-gluster b/swift/1.4.8/plugins/conf/proxy-server.conf-gluster
index 9bec6425355..b5e1f6f3515 100644
--- a/swift/1.4.8/plugins/conf/proxy-server.conf-gluster
+++ b/swift/1.4.8/plugins/conf/proxy-server.conf-gluster
@@ -13,6 +13,18 @@ account_autocreate = true
[filter:tempauth]
use = egg:swift#tempauth
+# Here you need to add users explicitly. See the OpenStack Swift Deployment
+# Guide for more information. The user and user64 directives take the
+# following form:
+# user_<account>_<username> = <key> [group] [group] [...] [storage_url]
+# user64_<account_b64>_<username_b64> = <key> [group] [group] [...] [storage_url]
+# Where you use user64 for accounts and/or usernames that include underscores.
+#
+# NOTE (and WARNING): The account name must match the device name specified
+# when generating the account, container, and object build rings.
+#
+# E.g.
+# user_ufo0_admin = abc123 .admin
[filter:healthcheck]
use = egg:swift#healthcheck
@@ -21,4 +33,4 @@ use = egg:swift#healthcheck
use = egg:swift#memcache
[filter:gluster]
-use = egg:swift#gluster \ No newline at end of file
+use = egg:swift#gluster
diff --git a/swift/1.4.8/plugins/constraints.py b/swift/1.4.8/plugins/constraints.py
index d522090829f..6d003b94caf 100644
--- a/swift/1.4.8/plugins/constraints.py
+++ b/swift/1.4.8/plugins/constraints.py
@@ -13,7 +13,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+from webob.exc import HTTPBadRequest
+
import swift.common.constraints
+from swift.plugins import Glusterfs
+
MAX_OBJECT_NAME_COMPONENT_LENGTH = swift.common.constraints.constraints_conf_int(
'max_object_name_component_length', 255)
@@ -25,7 +29,7 @@ def validate_obj_name_component(obj):
return 'cannot be . or ..'
return ''
-# Save the original
+# Save the original check object creation
__check_object_creation = swift.common.constraints.check_object_creation
# Define our new one which invokes the original
@@ -48,7 +52,7 @@ def gluster_check_object_creation(req, object_name):
if ret is None:
for obj in object_name.split('/'):
- reason = validate_obj_name(obj)
+ reason = validate_obj_name_component(obj)
if reason:
bdy = 'Invalid object name "%s", component "%s" %s' \
% (object_name, obj, reason)
@@ -58,4 +62,21 @@ def gluster_check_object_creation(req, object_name):
return ret
+# Replace the original check object creation with ours
swift.common.constraints.check_object_creation = gluster_check_object_creation
+
+# Save the original check mount
+__check_mount = swift.common.constraints.check_mount
+
+# Define our new one which invokes the original
+def gluster_check_mount(root, drive):
+ # FIXME: Potential performance optimization here to not call the original
+ # check mount which makes two stat calls. We could do what they do with
+ # just one.
+ if __check_mount(root, drive):
+ return True
+
+ return Glusterfs.mount(root, drive)
+
+# Replace the original check mount with ours
+swift.common.constraints.check_mount = gluster_check_mount
diff --git a/swift/1.4.8/plugins/fs_utils.py b/swift/1.4.8/plugins/fs_utils.py
index 0c74836cdfb..7f5292c2bf1 100644
--- a/swift/1.4.8/plugins/fs_utils.py
+++ b/swift/1.4.8/plugins/fs_utils.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2011 Red Hat, Inc.
+# Copyright (c) 2012 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.
diff --git a/swift/1.4.8/plugins/utils.py b/swift/1.4.8/plugins/utils.py
index 838c1bd75e9..45990d1da67 100644
--- a/swift/1.4.8/plugins/utils.py
+++ b/swift/1.4.8/plugins/utils.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2011 Red Hat, Inc.
+# Copyright (c) 2012 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.
@@ -137,11 +137,6 @@ def clean_metadata(path):
raise
key += 1
-def get_device_from_account(account):
- if account.startswith(RESELLER_PREFIX):
- device = account.replace(RESELLER_PREFIX, '', 1)
- return device
-
def check_user_xattr(path):
if not os.path.exists(path):
return False
@@ -157,27 +152,6 @@ def check_user_xattr(path):
#Remove xattr may fail in case of concurrent remove.
return True
-def _check_valid_account(account):
- full_mount_path = os.path.join(Glusterfs.MOUNT_PATH, account)
-
- if os.path.ismount(full_mount_path):
- return True
-
- if not _check_account_exists(Glusterfs.get_export_from_account_id(account)):
- logging.error('Account not present %s', account)
- return False
-
- if not os.path.isdir(full_mount_path):
- mkdirs(full_mount_path)
-
- if not Glusterfs.mount(account):
- return False
-
- return True
-
-def check_valid_account(account):
- return _check_valid_account(account)
-
def validate_container(metadata):
if not metadata:
logging.warn('validate_container: No metadata')
@@ -253,9 +227,10 @@ def is_marker(metadata):
else:
return False
-def _update_list(path, const_path, src_list, reg_file=True, object_count=0,
+def _update_list(path, cont_path, src_list, reg_file=True, object_count=0,
bytes_used=0, obj_list=[]):
- obj_path = Glusterfs.strip_obj_storage_path(path, const_path)
+ # strip the prefix off, also stripping the leading and trailing slashes
+ obj_path = path.replace(cont_path, '').strip(os.path.sep)
for i in src_list:
if obj_path:
@@ -270,14 +245,14 @@ def _update_list(path, const_path, src_list, reg_file=True, object_count=0,
return object_count, bytes_used
-def update_list(path, const_path, dirs=[], files=[], object_count=0,
+def update_list(path, cont_path, dirs=[], files=[], object_count=0,
bytes_used=0, obj_list=[]):
- object_count, bytes_used = _update_list (path, const_path, files, True,
- object_count, bytes_used,
- obj_list)
- object_count, bytes_used = _update_list (path, const_path, dirs, False,
- object_count, bytes_used,
- obj_list)
+ object_count, bytes_used = _update_list(path, cont_path, files, True,
+ object_count, bytes_used,
+ obj_list)
+ object_count, bytes_used = _update_list(path, cont_path, dirs, False,
+ object_count, bytes_used,
+ obj_list)
return object_count, bytes_used
@@ -314,7 +289,7 @@ def get_container_details(cont_path, memcache=None):
"""
mkey = ''
if memcache:
- mkey = MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(cont_path)
+ mkey = MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + cont_path
cd = memcache.get(mkey)
if cd:
if not cd.dir_list:
@@ -330,7 +305,7 @@ def get_container_details(cont_path, memcache=None):
if memcache:
memcache.set(mkey, cd)
return cd.obj_list, cd.object_count, cd.bytes_used
-
+
class AccountDetails(object):
""" A simple class to store the three pieces of information associated
@@ -371,7 +346,7 @@ def get_account_details(acc_path, memcache=None):
acc_stats = None
mkey = ''
if memcache:
- mkey = MEMCACHE_ACCOUNT_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(acc_path)
+ mkey = MEMCACHE_ACCOUNT_DETAILS_KEY_PREFIX + acc_path
ad = memcache.get(mkey)
if ad:
# FIXME: Do we really need to stat the file? If we are object
@@ -481,19 +456,6 @@ def create_account_metadata(acc_path, memcache=None):
metadata = get_account_metadata(acc_path, memcache)
return restore_metadata(acc_path, metadata)
-def _check_account_exists(account):
- if account not in get_account_list():
- logging.warn('Account %s does not exist' % account)
- return False
- else:
- return True
-
-def get_account_list():
- return Glusterfs.get_export_list()
-
-def get_account_id(account):
- return RESELLER_PREFIX + md5(account + HASH_PATH_SUFFIX).hexdigest()
-
_DEFAULT_GLUSTER_ENABLED = os.getenv('GLUSTER_UNIT_TEST_ENABLED', 'no')
__swift_conf = ConfigParser()
@@ -507,3 +469,7 @@ _gluster_enabled = _gluster_enabled_val in TRUE_VALUES
def Gluster_enabled():
return _gluster_enabled
+
+if _gluster_enabled:
+ # Monkey patch only when Gluster enabled
+ import swift.plugins.constraints
diff --git a/swift/1.4.8/swift.diff b/swift/1.4.8/swift.diff
index 3f088e21ebd..59bbbe26279 100644
--- a/swift/1.4.8/swift.diff
+++ b/swift/1.4.8/swift.diff
@@ -18,7 +18,7 @@ index d195d34..ef625ff 100644
},
)
diff --git a/swift/account/server.py b/swift/account/server.py
-index 800b3c0..c34d967 100644
+index 800b3c0..eaf9e0d 100644
--- a/swift/account/server.py
+++ b/swift/account/server.py
@@ -1,4 +1,5 @@
@@ -27,34 +27,18 @@ index 800b3c0..c34d967 100644
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
-@@ -35,6 +36,10 @@ from swift.common.utils import get_logger, get_param, hash_path, \
- from swift.common.constraints import ACCOUNT_LISTING_LIMIT, \
- check_mount, check_float, check_utf8
- from swift.common.db_replicator import ReplicatorRpc
+@@ -29,6 +30,10 @@ from webob.exc import HTTPAccepted, HTTPBadRequest, \
+ HTTPPreconditionFailed, HTTPConflict
+ import simplejson
+
+from swift.plugins.utils import Gluster_enabled
+if Gluster_enabled():
+ from swift.plugins.DiskDir import DiskAccount
-+ from swift.plugins import Glusterfs
-
-
- DATADIR = 'accounts'
-@@ -45,15 +50,21 @@ class AccountController(object):
-
- def __init__(self, conf):
- self.logger = get_logger(conf, log_route='account-server')
-- self.root = conf.get('devices', '/srv/node')
-- self.mount_check = conf.get('mount_check', 'true').lower() in \
-- ('true', 't', '1', 'on', 'yes', 'y')
-+ if Gluster_enabled():
-+ self.root = Glusterfs.MOUNT_PATH
-+ self.mount_check = False
-+ else:
-+ self.root = conf.get('devices', '/srv/node')
-+ self.mount_check = conf.get('mount_check', 'true').lower() in \
-+ ('true', 't', '1', 'on', 'yes', 'y')
- self.replicator_rpc = ReplicatorRpc(self.root, DATADIR, AccountBroker,
- self.mount_check, logger=self.logger)
- self.auto_create_account_prefix = \
++
+ from swift.common.db import AccountBroker
+ from swift.common.utils import get_logger, get_param, hash_path, \
+ normalize_timestamp, split_path, storage_directory
+@@ -54,6 +59,8 @@ class AccountController(object):
conf.get('auto_create_account_prefix') or '.'
def _get_account_broker(self, drive, part, account):
@@ -64,7 +48,7 @@ index 800b3c0..c34d967 100644
db_dir = storage_directory(DATADIR, part, hsh)
db_path = os.path.join(self.root, drive, db_dir, hsh + '.db')
diff --git a/swift/container/server.py b/swift/container/server.py
-index 8a18cfd..f5346ce 100644
+index 8a18cfd..3da0f95 100644
--- a/swift/container/server.py
+++ b/swift/container/server.py
@@ -1,4 +1,5 @@
@@ -73,36 +57,18 @@ index 8a18cfd..f5346ce 100644
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
-@@ -37,6 +38,11 @@ from swift.common.constraints import CONTAINER_LISTING_LIMIT, \
- from swift.common.bufferedhttp import http_connect
- from swift.common.exceptions import ConnectionTimeout
- from swift.common.db_replicator import ReplicatorRpc
+@@ -29,6 +30,10 @@ from webob.exc import HTTPAccepted, HTTPBadRequest, HTTPConflict, \
+ HTTPCreated, HTTPInternalServerError, HTTPNoContent, \
+ HTTPNotFound, HTTPPreconditionFailed, HTTPMethodNotAllowed
+
+from swift.plugins.utils import Gluster_enabled
+if Gluster_enabled():
+ from swift.plugins.DiskDir import DiskDir
-+ from swift.plugins import Glusterfs
+
-
- DATADIR = 'containers'
-
-@@ -50,9 +56,13 @@ class ContainerController(object):
-
- def __init__(self, conf):
- self.logger = get_logger(conf, log_route='container-server')
-- self.root = conf.get('devices', '/srv/node/')
-- self.mount_check = conf.get('mount_check', 'true').lower() in \
-- ('true', 't', '1', 'on', 'yes', 'y')
-+ if Gluster_enabled():
-+ self.root = Glusterfs.MOUNT_PATH
-+ self.mount_check = False
-+ else:
-+ self.root = conf.get('devices', '/srv/node/')
-+ self.mount_check = conf.get('mount_check', 'true').lower() in \
-+ ('true', 't', '1', 'on', 'yes', 'y')
- self.node_timeout = int(conf.get('node_timeout', 3))
- self.conn_timeout = float(conf.get('conn_timeout', 0.5))
- self.allowed_sync_hosts = [h.strip()
-@@ -73,6 +83,8 @@ class ContainerController(object):
+ 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
+@@ -73,6 +78,8 @@ class ContainerController(object):
:param container: container name
:returns: ContainerBroker object
"""
@@ -112,7 +78,7 @@ index 8a18cfd..f5346ce 100644
db_dir = storage_directory(DATADIR, part, hsh)
db_path = os.path.join(self.root, drive, db_dir, hsh + '.db')
diff --git a/swift/obj/server.py b/swift/obj/server.py
-index 9cca16b..1861f33 100644
+index 9cca16b..448ea5c 100644
--- a/swift/obj/server.py
+++ b/swift/obj/server.py
@@ -1,4 +1,5 @@
@@ -121,19 +87,16 @@ index 9cca16b..1861f33 100644
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
-@@ -45,6 +46,11 @@ from swift.common.exceptions import ConnectionTimeout, DiskFileError, \
- DiskFileNotExist
- from swift.obj.replicator import tpooled_get_hashes, invalidate_hash, \
- quarantine_renamer
-+from swift.plugins.utils import Gluster_enabled
-+if Gluster_enabled():
-+ from swift.plugins.utils import X_TYPE, X_OBJECT_TYPE, FILE, DIR, MARKER_DIR, \
-+ OBJECT, DIR_TYPE, FILE_TYPE
-+ from swift.plugins import Glusterfs
-
+@@ -35,6 +36,8 @@ from webob.exc import HTTPAccepted, HTTPBadRequest, HTTPCreated, \
+ from xattr import getxattr, setxattr
+ from eventlet import sleep, Timeout, tpool
- DATADIR = 'objects'
-@@ -340,6 +346,10 @@ class DiskFile(object):
++from swift.plugins.utils import Gluster_enabled
++
+ from swift.common.utils import mkdirs, normalize_timestamp, \
+ storage_directory, hash_path, renamer, fallocate, \
+ split_path, drop_buffer_cache, get_logger, write_pickle
+@@ -340,6 +343,10 @@ class DiskFile(object):
raise DiskFileNotExist('Data File does not exist.')
@@ -144,24 +107,7 @@ index 9cca16b..1861f33 100644
class ObjectController(object):
"""Implements the WSGI application for the Swift Object Server."""
-@@ -351,9 +361,13 @@ class ObjectController(object):
- /etc/swift/object-server.conf-sample.
- """
- self.logger = get_logger(conf, log_route='object-server')
-- self.devices = conf.get('devices', '/srv/node/')
-- self.mount_check = conf.get('mount_check', 'true').lower() in \
-- ('true', 't', '1', 'on', 'yes', 'y')
-+ if Gluster_enabled():
-+ self.devices = Glusterfs.MOUNT_PATH
-+ self.mount_check = False
-+ else:
-+ self.devices = conf.get('devices', '/srv/node/')
-+ self.mount_check = conf.get('mount_check', 'true').lower() in \
-+ ('true', 't', '1', 'on', 'yes', 'y')
- self.node_timeout = int(conf.get('node_timeout', 3))
- self.conn_timeout = float(conf.get('conn_timeout', 0.5))
- self.disk_chunk_size = int(conf.get('disk_chunk_size', 65536))
-@@ -378,6 +392,15 @@ class ObjectController(object):
+@@ -378,6 +385,15 @@ class ObjectController(object):
self.expiring_objects_container_divisor = \
int(conf.get('expiring_objects_container_divisor') or 86400)
@@ -177,7 +123,7 @@ index 9cca16b..1861f33 100644
def async_update(self, op, account, container, obj, host, partition,
contdevice, headers_out, objdevice):
"""
-@@ -493,7 +516,7 @@ class ObjectController(object):
+@@ -493,7 +509,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)
@@ -186,7 +132,7 @@ index 9cca16b..1861f33 100644
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):
+@@ -548,7 +564,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')
@@ -195,16 +141,7 @@ index 9cca16b..1861f33 100644
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
-@@ -612,7 +635,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)
-+ (Gluster_enabled() and account) or device)
- resp = HTTPCreated(request=request, etag=etag)
- return resp
-
-@@ -626,9 +649,9 @@ class ObjectController(object):
+@@ -626,9 +642,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)
@@ -217,7 +154,7 @@ index 9cca16b..1861f33 100644
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 +725,7 @@ class ObjectController(object):
+@@ -702,7 +718,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)
@@ -226,7 +163,7 @@ index 9cca16b..1861f33 100644
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 +767,7 @@ class ObjectController(object):
+@@ -744,7 +760,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
diff --git a/swift/1.4.8/test/unit/plugins/test_utils.py b/swift/1.4.8/test/unit/plugins/test_utils.py
index e46c0adbd0b..92c7ff00571 100644
--- a/swift/1.4.8/test/unit/plugins/test_utils.py
+++ b/swift/1.4.8/test/unit/plugins/test_utils.py
@@ -26,7 +26,7 @@ import tarfile
import shutil
from collections import defaultdict
from swift.common.utils import normalize_timestamp
-from swift.plugins import utils, Glusterfs
+from swift.plugins import utils
#
# Somewhat hacky way of emulating the operation of xattr calls. They are made
@@ -542,7 +542,7 @@ class TestUtils(unittest.TestCase):
self.st_mtime = mtime
return MockStat(100)
cd = mock_get_container_details_from_fs(the_path, bu_p=6)
- mc.set(utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(the_path), cd)
+ mc.set(utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + the_path, cd)
orig_gcdff = utils._get_container_details_from_fs
utils._get_container_details_from_fs = mock_get_container_details_from_fs
orig_ds = utils.do_stat
@@ -571,7 +571,7 @@ class TestUtils(unittest.TestCase):
# Be sure we don't miss due to mtimes not matching
self.fail("do_stat should not have been called")
cd = mock_get_container_details_from_fs(the_path + "u", bu_p=6)
- mc.set(utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(the_path + "u"), cd)
+ mc.set(utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + the_path + "u", cd)
orig_gcdff = utils._get_container_details_from_fs
utils._get_container_details_from_fs = mock_get_container_details_from_fs
orig_ds = utils.do_stat
@@ -580,7 +580,7 @@ class TestUtils(unittest.TestCase):
retval = utils.get_container_details(the_path, memcache=mc)
cd = mock_get_container_details_from_fs(the_path)
assert retval == (cd.obj_list, cd.object_count, cd.bytes_used)
- mkey = utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(the_path)
+ mkey = utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + the_path
assert mkey in mc._d
finally:
utils._get_container_details_from_fs = orig_gcdff
@@ -599,7 +599,7 @@ class TestUtils(unittest.TestCase):
# Be sure we don't miss due to mtimes not matching
self.fail("do_stat should not have been called")
cd = mock_get_container_details_from_fs(the_path, bu_p=6)
- mc.set(utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(the_path), cd)
+ mc.set(utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + the_path, cd)
orig_gcdff = utils._get_container_details_from_fs
utils._get_container_details_from_fs = mock_get_container_details_from_fs
orig_ds = utils.do_stat
@@ -608,7 +608,7 @@ class TestUtils(unittest.TestCase):
retval = utils.get_container_details(the_path, memcache=mc)
cd = mock_get_container_details_from_fs(the_path)
assert retval == (cd.obj_list, cd.object_count, cd.bytes_used)
- mkey = utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(the_path)
+ mkey = utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + the_path
assert mkey in mc._d
assert 5 == mc._d[mkey].bytes_used
finally:
@@ -631,7 +631,7 @@ class TestUtils(unittest.TestCase):
self.st_mtime = mtime
return MockStat(200)
cd = mock_get_container_details_from_fs(the_path, bu_p=6)
- mc.set(utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(the_path), cd)
+ mc.set(utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + the_path, cd)
orig_gcdff = utils._get_container_details_from_fs
utils._get_container_details_from_fs = mock_get_container_details_from_fs
orig_ds = utils.do_stat
@@ -640,7 +640,7 @@ class TestUtils(unittest.TestCase):
retval = utils.get_container_details(the_path, memcache=mc)
cd = mock_get_container_details_from_fs(the_path)
assert retval == (cd.obj_list, cd.object_count, cd.bytes_used)
- mkey = utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(the_path)
+ mkey = utils.MEMCACHE_CONTAINER_DETAILS_KEY_PREFIX + the_path
assert mkey in mc._d
assert 5 == mc._d[mkey].bytes_used
finally:
@@ -678,7 +678,7 @@ class TestUtils(unittest.TestCase):
return MockStat(100)
ad = mock_get_account_details_from_fs(the_path, None)
ad.container_list = ['x', 'y']
- mc.set(utils.MEMCACHE_ACCOUNT_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(the_path), ad)
+ mc.set(utils.MEMCACHE_ACCOUNT_DETAILS_KEY_PREFIX + the_path, ad)
orig_gcdff = utils._get_account_details_from_fs
orig_ds = utils.do_stat
utils._get_account_details_from_fs = mock_get_account_details_from_fs
@@ -707,7 +707,7 @@ class TestUtils(unittest.TestCase):
return MockStat(100)
ad = mock_get_account_details_from_fs(the_path, None)
ad.container_list = ['x', 'y']
- mc.set(utils.MEMCACHE_ACCOUNT_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(the_path + 'u'), ad)
+ mc.set(utils.MEMCACHE_ACCOUNT_DETAILS_KEY_PREFIX + the_path + 'u', ad)
orig_gcdff = utils._get_account_details_from_fs
orig_ds = utils.do_stat
utils._get_account_details_from_fs = mock_get_account_details_from_fs
@@ -737,7 +737,7 @@ class TestUtils(unittest.TestCase):
ad = mock_get_account_details_from_fs(the_path, None)
ad.container_list = ['x', 'y']
ad.mtime = 200
- mc.set(utils.MEMCACHE_ACCOUNT_DETAILS_KEY_PREFIX + Glusterfs.strip_obj_storage_path(the_path), ad)
+ mc.set(utils.MEMCACHE_ACCOUNT_DETAILS_KEY_PREFIX + the_path, ad)
orig_gcdff = utils._get_account_details_from_fs
orig_ds = utils.do_stat
utils._get_account_details_from_fs = mock_get_account_details_from_fs