diff options
Diffstat (limited to 'ufo/gluster/swift/common/DiskFile.py')
-rw-r--r-- | ufo/gluster/swift/common/DiskFile.py | 88 |
1 files changed, 44 insertions, 44 deletions
diff --git a/ufo/gluster/swift/common/DiskFile.py b/ufo/gluster/swift/common/DiskFile.py index ddb53ed4201..e3f00a01ad7 100644 --- a/ufo/gluster/swift/common/DiskFile.py +++ b/ufo/gluster/swift/common/DiskFile.py @@ -14,10 +14,12 @@ # limitations under the License. import os +import errno from eventlet import tpool from tempfile import mkstemp from contextlib import contextmanager from swift.common.utils import normalize_timestamp, renamer +from swift.common.exceptions import DiskFileNotExist from gluster.swift.common.utils import mkdirs, rmdirs, validate_object, \ create_object_metadata, do_open, do_close, do_unlink, do_chown, \ do_stat, do_listdir, read_metadata, write_metadata @@ -37,6 +39,10 @@ KEEP_CACHE_SIZE = (5 * 1024 * 1024) DISALLOWED_HEADERS = set('content-length content-type deleted etag'.split()) +class AlreadyExistsAsDir(Exception): + pass + + class Gluster_DiskFile(DiskFile): """ Manage object files on disk. @@ -142,7 +148,6 @@ class Gluster_DiskFile(DiskFile): mkdirs(dir_path) do_chown(dir_path, self.uid, self.gid) create_object_metadata(dir_path) - return True def put_metadata(self, metadata): obj_path = self.datadir + '/' + self.obj @@ -162,7 +167,7 @@ class Gluster_DiskFile(DiskFile): """ if extension == '.ts': # TombStone marker (deleted) - return True + return # Fix up the metadata to ensure it has a proper value for the # Content-Type metadata, as well as an X_TYPE and X_OBJECT_TYPE @@ -170,6 +175,10 @@ class Gluster_DiskFile(DiskFile): content_type = metadata['Content-Type'] if not content_type: + # FIXME: How can this be some object that evaluates to False? + # + # FIXME: If the file exists, we would already know it is a + # directory. metadata['Content-Type'] = FILE_TYPE x_object_type = FILE else: @@ -178,23 +187,31 @@ class Gluster_DiskFile(DiskFile): metadata[X_OBJECT_TYPE] = x_object_type if extension == '.meta': - # Metadata recorded separately from the file + # Metadata recorded separately from the file, we just update the + # metadata for the file. + # + # FIXME: If the file does not exist, this call will fail. self.put_metadata(metadata) - return True + return + # Our caller will use '.data' here; we just ignore it since we map the + # URL directly to the file system. extension = '' if metadata[X_OBJECT_TYPE] == MARKER_DIR: + # FIXME: If we know it already exists, why call + # create_dir_object()? self.create_dir_object(os.path.join(self.datadir, self.obj)) self.put_metadata(metadata) self.data_file = self.datadir + '/' + self.obj - return True + return # Check if directory already exists. if self.is_dir: - self.logger.error('Directory already exists %s/%s' % \ - (self.datadir , self.obj)) - return False + # FIXME: How can we have a directory and it not be marked as a + # MARKER_DIR (see above)? + raise AlreadyExistsAsDir('File object already exists ' \ + 'as a directory: %s/%s' % (self.datadir , self.obj)) timestamp = normalize_timestamp(metadata[X_TIMESTAMP]) write_metadata(tmppath, metadata) @@ -203,18 +220,15 @@ class Gluster_DiskFile(DiskFile): tpool.execute(os.fsync, fd) if self.obj_path: dir_objs = self.obj_path.split('/') + assert len(dir_objs) >= 1 tmp_path = '' - if len(dir_objs): - for dir_name in dir_objs: - if tmp_path: - tmp_path = tmp_path + '/' + dir_name - else: - tmp_path = dir_name - if not self.create_dir_object(os.path.join(self.container_path, - tmp_path)): - self.logger.error("Failed in subdir %s",\ - os.path.join(self.container_path,tmp_path)) - return False + for dir_name in dir_objs: + if tmp_path: + tmp_path = tmp_path + '/' + dir_name + else: + tmp_path = dir_name + self.create_dir_object( + os.path.join(self.container_path, tmp_path)) renamer(tmppath, os.path.join(self.datadir, self.obj + extension)) @@ -222,7 +236,7 @@ class Gluster_DiskFile(DiskFile): self.uid, self.gid) self.metadata = metadata self.data_file = self.datadir + '/' + self.obj + extension - return True + return def unlinkold(self, timestamp): """ @@ -231,33 +245,19 @@ class Gluster_DiskFile(DiskFile): :param timestamp: timestamp to compare with each file """ - if self.metadata and self.metadata['X-Timestamp'] != timestamp: - self.unlink() + if not self.metadata or self.metadata['X-Timestamp'] >= timestamp: + return - def unlink(self): - """ - Remove the file. - """ - #Marker dir. if self.is_dir: - rmdirs(os.path.join(self.datadir, self.obj)) - if not os.path.isdir(os.path.join(self.datadir, self.obj)): - self.metadata = {} - self.data_file = None - else: + # Marker directory object + if not rmdirs(os.path.join(self.datadir, self.obj)): logging.error('Unable to delete dir %s' % os.path.join(self.datadir, self.obj)) - return - - for fname in do_listdir(self.datadir): - if fname == self.obj: - try: + return + else: + # File object + for fname in do_listdir(self.datadir): + if fname == self.obj: do_unlink(os.path.join(self.datadir, fname)) - except OSError, err: - if err.errno != errno.ENOENT: - raise - - #Remove entire path for object. - #remove_dir_path(self.obj_path, self.container_path) self.metadata = {} self.data_file = None @@ -286,7 +286,7 @@ class Gluster_DiskFile(DiskFile): self.update_object(self.metadata) return file_size - except OSError, err: + except OSError as err: if err.errno != errno.ENOENT: raise raise DiskFileNotExist('Data File does not exist.') |