diff options
Diffstat (limited to 'swift/1.4.8/plugins/Glusterfs.py')
-rw-r--r-- | swift/1.4.8/plugins/Glusterfs.py | 44 |
1 files changed, 36 insertions, 8 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): |