예제 #1
0
    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)
예제 #2
0
    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
예제 #3
0
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