diff --git a/setup.py b/setup.py index d195d34..ef625ff 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,6 @@ #!/usr/bin/python # Copyright (c) 2010-2012 OpenStack, LLC. +# 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. @@ -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.plugins.middleware.gluster:filter_factory', ], }, ) diff --git a/swift/account/server.py b/swift/account/server.py index 800b3c0..eaf9e0d 100644 --- a/swift/account/server.py +++ b/swift/account/server.py @@ -1,4 +1,5 @@ # Copyright (c) 2010-2012 OpenStack, LLC. +# 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. @@ -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.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): + if Gluster_enabled(): + return DiskAccount(self.root, account, self.logger) hsh = hash_path(account) 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..3da0f95 100644 --- a/swift/container/server.py +++ b/swift/container/server.py @@ -1,4 +1,5 @@ # Copyright (c) 2010-2012 OpenStack, LLC. +# 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. @@ -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.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 """ + if Gluster_enabled(): + return DiskDir(self.root, account, container, self.logger) hsh = hash_path(account, container) 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..448ea5c 100644 --- a/swift/obj/server.py +++ b/swift/obj/server.py @@ -1,4 +1,5 @@ # Copyright (c) 2010-2012 OpenStack, LLC. +# 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. @@ -35,6 +36,8 @@ from webob.exc import HTTPAccepted, HTTPBadRequest, HTTPCreated, \ from xattr import getxattr, setxattr from eventlet import sleep, Timeout, tpool +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.') +if Gluster_enabled(): + from swift.plugins.DiskFile import Gluster_DiskFile + + class ObjectController(object): """Implements the WSGI application for the Swift Object Server.""" @@ -378,6 +385,15 @@ class ObjectController(object): self.expiring_objects_container_divisor = \ int(conf.get('expiring_objects_container_divisor') or 86400) + def get_DiskFile_obj(self, path, device, partition, account, container, obj, + logger, keep_data_fp=False, disk_chunk_size=65536): + if Gluster_enabled(): + return Gluster_DiskFile(path, device, partition, account, container, + obj, logger, keep_data_fp, disk_chunk_size) + 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 +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) - 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 +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') - 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 @@ -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) - 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 +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) - 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 +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 - 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']) != \