diff options
| -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 | ||||
| -rw-r--r-- | swift/1.4.8/swift.diff | 13 | 
4 files changed, 43 insertions, 16 deletions
diff --git a/swift/1.4.8/plugins/Glusterfs.py b/swift/1.4.8/plugins/Glusterfs.py index eb8d535db..5e191e1bd 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 3cc0b732e..b6ec5121f 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 e28a6bd85..b2bd51128 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): diff --git a/swift/1.4.8/swift.diff b/swift/1.4.8/swift.diff index ef7f06fc2..8ed5070e1 100644 --- a/swift/1.4.8/swift.diff +++ b/swift/1.4.8/swift.diff @@ -18,7 +18,7 @@ index d195d34..b5b5ca2 100644           },       )  diff --git a/swift/account/server.py b/swift/account/server.py -index 800b3c0..99f5de3 100644 +index 800b3c0..cb17970 100644  --- a/swift/account/server.py  +++ b/swift/account/server.py  @@ -1,4 +1,5 @@ @@ -81,7 +81,7 @@ index 800b3c0..99f5de3 100644               broker.stale_reads_ok = True           if broker.is_deleted():               return HTTPNotFound(request=req) -+        if self.fs_object: ++        if self.fs_object and not self.fs_object.object_only:  +            broker.list_containers_iter(None, None,None,  +                                        None, None)           info = broker.get_info() @@ -229,7 +229,7 @@ index 0000000..341285d  +        return Gluster_plugin(app, conf)  +    return gluster_filter  diff --git a/swift/common/utils.py b/swift/common/utils.py -index 47edce8..afc356c 100644 +index 47edce8..03701ce 100644  --- a/swift/common/utils.py  +++ b/swift/common/utils.py  @@ -1,4 +1,5 @@ @@ -238,7 +238,7 @@ index 47edce8..afc356c 100644   #   # 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,12 @@ def streq_const_time(s1, s2): +@@ -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 @@ -250,9 +250,8 @@ index 47edce8..afc356c 100644  +        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..356150f 100644 +index 8a18cfd..93943a3 100644  --- a/swift/container/server.py  +++ b/swift/container/server.py  @@ -1,4 +1,5 @@ @@ -337,7 +336,7 @@ index 8a18cfd..356150f 100644           if broker.is_deleted():               return HTTPNotFound(request=req)  + -+        if self.fs_object: ++        if self.fs_object and not self.fs_object.object_only:  +            broker.list_objects_iter(None, None, None, None,  +                                     None, None)  +  | 
