Merge "Docstring omission in class BaseDiskFileManager."
This commit is contained in:
commit
6ef66378c9
@ -679,6 +679,11 @@ class BaseDiskFileManager(object):
|
|||||||
hsh_path, reclaim_age=reclaim_age)['files']
|
hsh_path, reclaim_age=reclaim_age)['files']
|
||||||
|
|
||||||
def _hash_suffix_dir(self, path, mapper, reclaim_age):
|
def _hash_suffix_dir(self, path, mapper, reclaim_age):
|
||||||
|
"""
|
||||||
|
|
||||||
|
:param path: full path to directory
|
||||||
|
:param reclaim_age: age in seconds at which to remove tombstones
|
||||||
|
"""
|
||||||
hashes = defaultdict(hashlib.md5)
|
hashes = defaultdict(hashlib.md5)
|
||||||
try:
|
try:
|
||||||
path_contents = sorted(os.listdir(path))
|
path_contents = sorted(os.listdir(path))
|
||||||
@ -725,6 +730,7 @@ class BaseDiskFileManager(object):
|
|||||||
"""
|
"""
|
||||||
Performs reclamation and returns an md5 of all (remaining) files.
|
Performs reclamation and returns an md5 of all (remaining) files.
|
||||||
|
|
||||||
|
:param path: full path to directory
|
||||||
:param reclaim_age: age in seconds at which to remove tombstones
|
:param reclaim_age: age in seconds at which to remove tombstones
|
||||||
:raises PathNotDir: if given path is not a valid directory
|
:raises PathNotDir: if given path is not a valid directory
|
||||||
:raises OSError: for non-ENOTDIR errors
|
:raises OSError: for non-ENOTDIR errors
|
||||||
@ -831,6 +837,7 @@ class BaseDiskFileManager(object):
|
|||||||
A context manager that will lock on the device given, if
|
A context manager that will lock on the device given, if
|
||||||
configured to do so.
|
configured to do so.
|
||||||
|
|
||||||
|
:param device: name of target device
|
||||||
:raises ReplicationLockTimeout: If the lock on the device
|
:raises ReplicationLockTimeout: If the lock on the device
|
||||||
cannot be granted within the configured timeout.
|
cannot be granted within the configured timeout.
|
||||||
"""
|
"""
|
||||||
@ -846,6 +853,18 @@ class BaseDiskFileManager(object):
|
|||||||
|
|
||||||
def pickle_async_update(self, device, account, container, obj, data,
|
def pickle_async_update(self, device, account, container, obj, data,
|
||||||
timestamp, policy):
|
timestamp, policy):
|
||||||
|
"""
|
||||||
|
Write data describing a container update notification to a pickle file
|
||||||
|
in the async_pending directory.
|
||||||
|
|
||||||
|
:param device: name of target device
|
||||||
|
:param account: account name for the object
|
||||||
|
:param container: container name for the object
|
||||||
|
:param obj: object name for the object
|
||||||
|
:param data: update data to be written to pickle file
|
||||||
|
:param timestamp: a Timestamp
|
||||||
|
:param policy: the StoragePolicy instance
|
||||||
|
"""
|
||||||
device_path = self.construct_dev_path(device)
|
device_path = self.construct_dev_path(device)
|
||||||
async_dir = os.path.join(device_path, get_async_dir(policy))
|
async_dir = os.path.join(device_path, get_async_dir(policy))
|
||||||
ohash = hash_path(account, container, obj)
|
ohash = hash_path(account, container, obj)
|
||||||
@ -859,6 +878,17 @@ class BaseDiskFileManager(object):
|
|||||||
|
|
||||||
def get_diskfile(self, device, partition, account, container, obj,
|
def get_diskfile(self, device, partition, account, container, obj,
|
||||||
policy, **kwargs):
|
policy, **kwargs):
|
||||||
|
"""
|
||||||
|
Returns a BaseDiskFile instance for an object based on the object's
|
||||||
|
partition, path parts and policy.
|
||||||
|
|
||||||
|
:param device: name of target device
|
||||||
|
:param partition: partition on device in which the object lives
|
||||||
|
:param account: account name for the object
|
||||||
|
:param container: container name for the object
|
||||||
|
:param obj: object name for the object
|
||||||
|
:param policy: the StoragePolicy instance
|
||||||
|
"""
|
||||||
dev_path = self.get_dev_path(device)
|
dev_path = self.get_dev_path(device)
|
||||||
if not dev_path:
|
if not dev_path:
|
||||||
raise DiskFileDeviceUnavailable()
|
raise DiskFileDeviceUnavailable()
|
||||||
@ -868,10 +898,21 @@ class BaseDiskFileManager(object):
|
|||||||
pipe_size=self.pipe_size, **kwargs)
|
pipe_size=self.pipe_size, **kwargs)
|
||||||
|
|
||||||
def object_audit_location_generator(self, device_dirs=None):
|
def object_audit_location_generator(self, device_dirs=None):
|
||||||
|
"""
|
||||||
|
Yield an AuditLocation for all objects stored under device_dirs.
|
||||||
|
|
||||||
|
:param device_dirs: directory of target device
|
||||||
|
"""
|
||||||
return object_audit_location_generator(self.devices, self.mount_check,
|
return object_audit_location_generator(self.devices, self.mount_check,
|
||||||
self.logger, device_dirs)
|
self.logger, device_dirs)
|
||||||
|
|
||||||
def get_diskfile_from_audit_location(self, audit_location):
|
def get_diskfile_from_audit_location(self, audit_location):
|
||||||
|
"""
|
||||||
|
Returns a BaseDiskFile instance for an object at the given
|
||||||
|
AuditLocation.
|
||||||
|
|
||||||
|
:param audit_location: object location to be audited
|
||||||
|
"""
|
||||||
dev_path = self.get_dev_path(audit_location.device, mount_check=False)
|
dev_path = self.get_dev_path(audit_location.device, mount_check=False)
|
||||||
return self.diskfile_cls.from_hash_dir(
|
return self.diskfile_cls.from_hash_dir(
|
||||||
self, audit_location.path, dev_path,
|
self, audit_location.path, dev_path,
|
||||||
@ -886,7 +927,12 @@ class BaseDiskFileManager(object):
|
|||||||
instance representing the tombstoned object is returned
|
instance representing the tombstoned object is returned
|
||||||
instead.
|
instead.
|
||||||
|
|
||||||
|
:param device: name of target device
|
||||||
|
:param partition: partition on the device in which the object lives
|
||||||
|
:param object_hash: the hash of an object path
|
||||||
|
:param policy: the StoragePolicy instance
|
||||||
:raises DiskFileNotExist: if the object does not exist
|
:raises DiskFileNotExist: if the object does not exist
|
||||||
|
:returns: an instance of BaseDiskFile
|
||||||
"""
|
"""
|
||||||
dev_path = self.get_dev_path(device)
|
dev_path = self.get_dev_path(device)
|
||||||
if not dev_path:
|
if not dev_path:
|
||||||
@ -924,6 +970,14 @@ class BaseDiskFileManager(object):
|
|||||||
policy=policy, **kwargs)
|
policy=policy, **kwargs)
|
||||||
|
|
||||||
def get_hashes(self, device, partition, suffixes, policy):
|
def get_hashes(self, device, partition, suffixes, policy):
|
||||||
|
"""
|
||||||
|
|
||||||
|
:param device: name of target device
|
||||||
|
:param partition: partition name
|
||||||
|
:param suffixes: a list of suffix directories to be recalculated
|
||||||
|
:param policy: the StoragePolicy instance
|
||||||
|
:returns: a dictionary that maps suffix directories
|
||||||
|
"""
|
||||||
dev_path = self.get_dev_path(device)
|
dev_path = self.get_dev_path(device)
|
||||||
if not dev_path:
|
if not dev_path:
|
||||||
raise DiskFileDeviceUnavailable()
|
raise DiskFileDeviceUnavailable()
|
||||||
@ -936,6 +990,9 @@ class BaseDiskFileManager(object):
|
|||||||
return hashes
|
return hashes
|
||||||
|
|
||||||
def _listdir(self, path):
|
def _listdir(self, path):
|
||||||
|
"""
|
||||||
|
:param path: full path to directory
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
return os.listdir(path)
|
return os.listdir(path)
|
||||||
except OSError as err:
|
except OSError as err:
|
||||||
@ -949,6 +1006,10 @@ class BaseDiskFileManager(object):
|
|||||||
"""
|
"""
|
||||||
Yields tuples of (full_path, suffix_only) for suffixes stored
|
Yields tuples of (full_path, suffix_only) for suffixes stored
|
||||||
on the given device and partition.
|
on the given device and partition.
|
||||||
|
|
||||||
|
:param device: name of target device
|
||||||
|
:param partition: partition name
|
||||||
|
:param policy: the StoragePolicy instance
|
||||||
"""
|
"""
|
||||||
dev_path = self.get_dev_path(device)
|
dev_path = self.get_dev_path(device)
|
||||||
if not dev_path:
|
if not dev_path:
|
||||||
@ -981,6 +1042,11 @@ class BaseDiskFileManager(object):
|
|||||||
|
|
||||||
where timestamps are instances of
|
where timestamps are instances of
|
||||||
:class:`~swift.common.utils.Timestamp`
|
:class:`~swift.common.utils.Timestamp`
|
||||||
|
|
||||||
|
:param device: name of target device
|
||||||
|
:param partition: partition name
|
||||||
|
:param policy: the StoragePolicy instance
|
||||||
|
:param suffixes: optional list of suffix directories to be searched
|
||||||
"""
|
"""
|
||||||
dev_path = self.get_dev_path(device)
|
dev_path = self.get_dev_path(device)
|
||||||
if not dev_path:
|
if not dev_path:
|
||||||
@ -1360,7 +1426,10 @@ class BaseDiskFileReader(object):
|
|||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
def app_iter_range(self, start, stop):
|
def app_iter_range(self, start, stop):
|
||||||
"""Returns an iterator over the data file for range (start, stop)"""
|
"""
|
||||||
|
Returns an iterator over the data file for range (start, stop)
|
||||||
|
|
||||||
|
"""
|
||||||
if start or start == 0:
|
if start or start == 0:
|
||||||
self._fp.seek(start)
|
self._fp.seek(start)
|
||||||
if stop is not None:
|
if stop is not None:
|
||||||
@ -1381,7 +1450,10 @@ class BaseDiskFileReader(object):
|
|||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
def app_iter_ranges(self, ranges, content_type, boundary, size):
|
def app_iter_ranges(self, ranges, content_type, boundary, size):
|
||||||
"""Returns an iterator over the data file for a set of ranges"""
|
"""
|
||||||
|
Returns an iterator over the data file for a set of ranges
|
||||||
|
|
||||||
|
"""
|
||||||
if not ranges:
|
if not ranges:
|
||||||
yield ''
|
yield ''
|
||||||
else:
|
else:
|
||||||
@ -1396,7 +1468,11 @@ class BaseDiskFileReader(object):
|
|||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
def _drop_cache(self, fd, offset, length):
|
def _drop_cache(self, fd, offset, length):
|
||||||
"""Method for no-oping buffer cache drop method."""
|
"""
|
||||||
|
Method for no-oping buffer cache drop method.
|
||||||
|
|
||||||
|
:param fd: file descriptor or filename
|
||||||
|
"""
|
||||||
if not self._keep_cache:
|
if not self._keep_cache:
|
||||||
drop_buffer_cache(fd, offset, length)
|
drop_buffer_cache(fd, offset, length)
|
||||||
|
|
||||||
@ -1718,6 +1794,10 @@ class BaseDiskFile(object):
|
|||||||
return exc
|
return exc
|
||||||
|
|
||||||
def _verify_name_matches_hash(self, data_file):
|
def _verify_name_matches_hash(self, data_file):
|
||||||
|
"""
|
||||||
|
|
||||||
|
:param data_file: data file name, used when quarantines occur
|
||||||
|
"""
|
||||||
hash_from_fs = os.path.basename(self._datadir)
|
hash_from_fs = os.path.basename(self._datadir)
|
||||||
hash_from_name = hash_path(self._name.lstrip('/'))
|
hash_from_name = hash_path(self._name.lstrip('/'))
|
||||||
if hash_from_fs != hash_from_name:
|
if hash_from_fs != hash_from_name:
|
||||||
@ -1794,8 +1874,16 @@ class BaseDiskFile(object):
|
|||||||
return obj_size
|
return obj_size
|
||||||
|
|
||||||
def _failsafe_read_metadata(self, source, quarantine_filename=None):
|
def _failsafe_read_metadata(self, source, quarantine_filename=None):
|
||||||
# Takes source and filename separately so we can read from an open
|
"""
|
||||||
# file if we have one
|
Read metadata from source object file. In case of failure, quarantine
|
||||||
|
the file.
|
||||||
|
|
||||||
|
Takes source and filename separately so we can read from an open
|
||||||
|
file if we have one.
|
||||||
|
|
||||||
|
:param source: file descriptor or filename to load the metadata from
|
||||||
|
:param quarantine_filename: full path of file to load the metadata from
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
return read_metadata(source)
|
return read_metadata(source)
|
||||||
except (DiskFileXattrNotSupported, DiskFileNotExist):
|
except (DiskFileXattrNotSupported, DiskFileNotExist):
|
||||||
@ -2111,6 +2199,7 @@ class DiskFileManager(BaseDiskFileManager):
|
|||||||
"""
|
"""
|
||||||
Performs reclamation and returns an md5 of all (remaining) files.
|
Performs reclamation and returns an md5 of all (remaining) files.
|
||||||
|
|
||||||
|
:param path: full path to directory
|
||||||
:param reclaim_age: age in seconds at which to remove tombstones
|
:param reclaim_age: age in seconds at which to remove tombstones
|
||||||
:raises PathNotDir: if given path is not a valid directory
|
:raises PathNotDir: if given path is not a valid directory
|
||||||
:raises OSError: for non-ENOTDIR errors
|
:raises OSError: for non-ENOTDIR errors
|
||||||
@ -2175,6 +2264,8 @@ class ECDiskFileWriter(BaseDiskFileWriter):
|
|||||||
The only difference between this method and the replication policy
|
The only difference between this method and the replication policy
|
||||||
DiskFileWriter method is the call into manager.make_on_disk_filename
|
DiskFileWriter method is the call into manager.make_on_disk_filename
|
||||||
to construct the data file name.
|
to construct the data file name.
|
||||||
|
|
||||||
|
:param metadata: dictionary of metadata to be associated with object
|
||||||
"""
|
"""
|
||||||
timestamp = Timestamp(metadata['X-Timestamp'])
|
timestamp = Timestamp(metadata['X-Timestamp'])
|
||||||
fi = None
|
fi = None
|
||||||
@ -2246,6 +2337,8 @@ class ECDiskFile(BaseDiskFile):
|
|||||||
The only difference between this method and the replication policy
|
The only difference between this method and the replication policy
|
||||||
DiskFile method is passing in the frag_index kwarg to our manager's
|
DiskFile method is passing in the frag_index kwarg to our manager's
|
||||||
get_ondisk_files method.
|
get_ondisk_files method.
|
||||||
|
|
||||||
|
:param files: list of file names
|
||||||
"""
|
"""
|
||||||
self._ondisk_info = self.manager.get_ondisk_files(
|
self._ondisk_info = self.manager.get_ondisk_files(
|
||||||
files, self._datadir, frag_index=self._frag_index)
|
files, self._datadir, frag_index=self._frag_index)
|
||||||
@ -2288,6 +2381,8 @@ class ECDiskFileManager(BaseDiskFileManager):
|
|||||||
"""
|
"""
|
||||||
Return int representation of frag_index, or raise a DiskFileError if
|
Return int representation of frag_index, or raise a DiskFileError if
|
||||||
frag_index is not a whole number.
|
frag_index is not a whole number.
|
||||||
|
|
||||||
|
:param frag_index: a fragment archive index
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
frag_index = int(str(frag_index))
|
frag_index = int(str(frag_index))
|
||||||
@ -2457,6 +2552,9 @@ class ECDiskFileManager(BaseDiskFileManager):
|
|||||||
Instead of all filenames hashed into a single hasher, each file name
|
Instead of all filenames hashed into a single hasher, each file name
|
||||||
will fall into a bucket either by fragment index for datafiles, or
|
will fall into a bucket either by fragment index for datafiles, or
|
||||||
None (indicating a durable, metadata or tombstone).
|
None (indicating a durable, metadata or tombstone).
|
||||||
|
|
||||||
|
:param path: full path to directory
|
||||||
|
:param reclaim_age: age in seconds at which to remove tombstones
|
||||||
"""
|
"""
|
||||||
# hash_per_fi instead of single hash for whole suffix
|
# hash_per_fi instead of single hash for whole suffix
|
||||||
# here we flatten out the hashers hexdigest into a dictionary instead
|
# here we flatten out the hashers hexdigest into a dictionary instead
|
||||||
|
Loading…
Reference in New Issue
Block a user