def read_metadata(self, fd, obj_path): """ Helper function to read the pickled metadata from an object file. :param fd: file descriptor or filename to load the metadata from :param filename: full path of the file :returns: dictionary of metadata """ metadata = '' key = 0 try: while True: metadata += xattr.getxattr( fd, '%s%s' % (SWIFT_METADATA_KEY, (key or ''))) key += 1 except (IOError, OSError) as e: if metadata == '': return False for err in 'ENOTSUP', 'EOPNOTSUPP': if hasattr(errno, err) and e.errno == getattr(errno, err): msg = "Filesystem at %s does not support xattr" % \ obj_path logging.exception(msg) raise DiskFileXattrNotSupported(e) if e.errno == errno.ENOENT: raise DiskFileNotExist() return pickle.loads(metadata)
def write_metadata(self, fd, metadata, obj_path, xattr_size=65536): """ Helper function to write pickled metadata for an object file. :param obj_path: full path of the file :param metadata: metadata to write """ metastr = pickle.dumps(metadata, PICKLE_PROTOCOL) key = 0 while metastr: try: xattr.setxattr(fd, '%s%s' % (SWIFT_METADATA_KEY, key or ''), metastr[:xattr_size]) metastr = metastr[xattr_size:] key += 1 except IOError as e: for err in 'ENOTSUP', 'EOPNOTSUPP': if hasattr(errno, err) and e.errno == getattr(errno, err): msg = "Filesystem at %s does not support xattr" % \ obj_path logging.exception(msg) raise DiskFileXattrNotSupported(e) if e.errno in (errno.ENOSPC, errno.EDQUOT): msg = "No space left on device for %s" % obj_path logging.exception(msg) raise DiskFileNoSpace() raise
def write_metadata(fd, metadata, xattr_size=65536, md_key=None): """ Helper function to write pickled metadata for an object file. :param fd: file descriptor or filename to write the metadata :param md_key: metadata key to be write to object file :param metadata: metadata to write """ meta_key = SWIFT_METADATA_KEY metastr = pickle.dumps(metadata, PICKLE_PROTOCOL) key = 0 while metastr: try: xattr.setxattr(fd, '%s%s' % (meta_key, key or ''), metastr[:xattr_size]) metastr = metastr[xattr_size:] key += 1 except IOError as e: for err in 'ENOTSUP', 'EOPNOTSUPP': if hasattr(errno, err) and e.errno == getattr(errno, err): msg = "Filesystem at %s does not support xattr" % \ get_filename(fd) logging.exception(msg) raise DiskFileXattrNotSupported(e) if e.errno in (errno.ENOSPC, errno.EDQUOT): msg = "No space left on device for %s" % get_filename(fd) logging.exception(msg) raise DiskFileNoSpace() raise