diff options
Diffstat (limited to 'swift/1.4.8/plugins')
-rw-r--r-- | swift/1.4.8/plugins/Glusterfs.py | 44 | ||||
-rw-r--r-- | swift/1.4.8/plugins/conf/fs.conf | 1 | ||||
-rw-r--r-- | swift/1.4.8/plugins/utils.py | 1 |
3 files changed, 37 insertions, 9 deletions
diff --git a/swift/1.4.8/plugins/Glusterfs.py b/swift/1.4.8/plugins/Glusterfs.py index eb8d535dbf9..5e191e1bd8f 100644 --- a/swift/1.4.8/plugins/Glusterfs.py +++ b/swift/1.4.8/plugins/Glusterfs.py @@ -13,10 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. import logging -import os +import os, fcntl, time from ConfigParser import ConfigParser from swift.common.utils import TRUE_VALUES from hashlib import md5 +from swift.plugins.utils import mkdirs class Glusterfs(object): def __init__(self): @@ -27,16 +28,43 @@ class Glusterfs(object): self.auth_account = self.fs_conf.get('DEFAULT', 'auth_account', 'auth') self.mount_ip = self.fs_conf.get('DEFAULT', 'mount_ip', 'localhost') self.remote_cluster = self.fs_conf.get('DEFAULT', 'remote_cluster', False) in TRUE_VALUES + self.object_only = self.fs_conf.get('DEFAULT', 'object_only', "no") in TRUE_VALUES + + def busy_wait(self, mount_path): + # Iterate for definite number of time over a given + # interval for successful mount + for i in range(0, 5): + if os.path.ismount(os.path.join(mount_path)): + return True + time.sleep(2) + return False def mount(self, account): - export = self.get_export_from_account_id(account) mount_path = os.path.join(self.mount_path, account) - mnt_cmd = 'mount -t glusterfs %s:%s %s' % (self.mount_ip, export, \ - mount_path) - if os.system(mnt_cmd) or \ - not os.path.exists(os.path.join(mount_path)): - raise Exception('Mount failed %s: %s' % (self.name, mnt_cmd)) - return False + export = self.get_export_from_account_id(account) + + pid_dir = "/var/lib/glusterd/vols/%s/run/" %export + pid_file = os.path.join(pid_dir, 'swift.pid'); + + if not os.path.exists(pid_dir): + mkdirs(pid_dir) + + fd = os.open(pid_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) + 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 + return self.busy_wait(mount_path) + + mnt_cmd = 'mount -t glusterfs %s:%s %s' % (self.mount_ip, export, \ + mount_path) + if os.system(mnt_cmd) or not self.busy_wait(mount_path): + raise Exception('Mount failed %s: %s' % (self.name, mnt_cmd)) + return False return True def unmount(self, mount_path): diff --git a/swift/1.4.8/plugins/conf/fs.conf b/swift/1.4.8/plugins/conf/fs.conf index 3cc0b732e93..b6ec5121f9f 100644 --- a/swift/1.4.8/plugins/conf/fs.conf +++ b/swift/1.4.8/plugins/conf/fs.conf @@ -6,3 +6,4 @@ 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 diff --git a/swift/1.4.8/plugins/utils.py b/swift/1.4.8/plugins/utils.py index e28a6bd853c..b2bd5112880 100644 --- a/swift/1.4.8/plugins/utils.py +++ b/swift/1.4.8/plugins/utils.py @@ -332,7 +332,6 @@ def _check_valid_account(account, fs_object): if not os.path.isdir(os.path.join(mount_path, account)): mkdirs(os.path.join(mount_path, account)) - fs_object.unmount(os.path.join(mount_path, account)) if fs_object: if not fs_object.mount(account): |