From c7a25662de87b923cbee3cf28a0f8fe8a29d7d9c Mon Sep 17 00:00:00 2001 From: Phil Bridges Date: Wed, 9 Mar 2016 14:04:57 -0600 Subject: [PATCH] Fixed HPSS metadata headers not appearing in a GET or HEAD request --- swiftonhpss/swift/obj/diskfile.py | 31 +++++++++++++++++++++++-- swiftonhpss/swift/obj/server.py | 38 ++++--------------------------- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/swiftonhpss/swift/obj/diskfile.py b/swiftonhpss/swift/obj/diskfile.py index cd8f607..d441cb7 100644 --- a/swiftonhpss/swift/obj/diskfile.py +++ b/swiftonhpss/swift/obj/diskfile.py @@ -316,7 +316,7 @@ class DiskFileWriter(object): hpssfs.ioctl(self._fd, hpssfs.HPSSFS_PURGE_LOCK, int(purgelock)) except IOError as err: raise SwiftOnFileSystemIOError(err.errno, - '%s, hpssfs.ioct("%s", ...)' % ( + '%s, hpssfs.ioctl("%s", ...)' % ( err.strerror, self._fd)) # From the Department of the Redundancy Department, make sure @@ -839,7 +839,34 @@ class DiskFile(object): bytes_on_disk = top_level[2].rstrip(' ') except ValueError: raise SwiftOnFileSystemIOError("Couldn't get system.hpss.level!") - return bytes_on_disk != self._stat.st_size + return int(bytes_on_disk) != self._stat.st_size + + def get_hpss_headers(self): + header_to_xattr = {'X-HPSS-Account': 'account', + 'X-HPSS-Bitfile-ID': 'bitfile', + 'X-HPSS-Comment': 'comment', + 'X-HPSS-Class-Of-Service-ID': 'cos', + 'X-HPSS-Data-Levels': 'level', + 'X-HPSS-Family-ID': 'family', + 'X-HPSS-Fileset-ID': 'fileset', + 'X-HPSS-Optimum-Size': 'optimum', + 'X-HPSS-Purgelock-Status': 'purgelock', + 'X-HPSS-Reads': 'reads', + 'X-HPSS-Realm-ID': 'realm', + 'X-HPSS-Subsys-ID': 'subsys', + 'X-HPSS-Writes': 'writes', } + result = {} + for header in header_to_xattr: + xattr_to_get = 'system.hpss.%s' % header_to_xattr[header] + try: + result[header] = xattr.getxattr(self._data_file, + xattr_to_get) + except IOError as err: + error_message = "Couldn't get HPSS xattr %s from file %s" \ + % (xattr_to_get, self._data_file) + logging.error(error_message) + raise SwiftOnFileSystemIOError(err.errno, error_message) + return result def __enter__(self): """ diff --git a/swiftonhpss/swift/obj/server.py b/swiftonhpss/swift/obj/server.py index 6660161..8c6c2de 100644 --- a/swiftonhpss/swift/obj/server.py +++ b/swiftonhpss/swift/obj/server.py @@ -17,7 +17,6 @@ import math import logging -import time import xattr import os import hpssfs @@ -385,7 +384,8 @@ class ObjectController(server.ObjectController): pass try: - self._get_hpss_xattr(request, response, disk_file) + hpss_headers = disk_file.get_hpss_headers() + response.headers.update(hpss_headers) except SwiftOnFileSystemIOError: return HTTPServiceUnavailable(request=request) @@ -398,6 +398,7 @@ class ObjectController(server.ObjectController): @public @timing_stats() def GET(self, request): + logging.error(request) """Handle HTTP GET requests for the Swift on File object server""" device, partition, account, container, obj, policy = \ get_name_and_placement(request, 5, 5, True) @@ -450,7 +451,8 @@ class ObjectController(server.ObjectController): response.headers['X-Backend-Timestamp'] = file_x_ts.internal # (HPSS) Inject HPSS xattr metadata into headers try: - self._get_hpss_xattr(request, response, disk_file) + hpss_headers = disk_file.get_hpss_headers() + response.headers.update(hpss_headers) except SwiftOnFileSystemIOError: return HTTPServiceUnavailable(request=request) return request.get_response(response) @@ -461,36 +463,6 @@ class ObjectController(server.ObjectController): return HTTPNotFound(request=request, headers=headers, conditional_response=True) - # TODO: refactor this to live in DiskFile! - # Along with all the other HPSS stuff - def _get_hpss_xattr(self, request, response, diskfile): - attrlist = {'X-HPSS-Account': 'account', - 'X-HPSS-BitfileID': 'bitfile', - 'X-HPSS-Comment': 'comment', - 'X-HPSS-ClassOfServiceID': 'cos', - 'X-HPSS-FamilyID': 'family', - 'X-HPSS-FilesetID': 'fileset', - 'X-HPSS-Bytes': 'level', - 'X-HPSS-Reads': 'reads', - 'X-HPSS-RealmID': 'realm', - 'X-HPSS-SubsysID': 'subsys', - 'X-HPSS-Writes': 'writes', - 'X-HPSS-OptimumSize': 'optimum', - 'X-HPSS-Hash': 'hash', - 'X-HPSS-PurgelockStatus': 'purgelock'} - for key in request.headers: - val = attrlist.get(key, None) - if val: - attr = 'system.hpss.%s' % val - try: - response.headers[key] = \ - xattr.getxattr(diskfile._data_file, attr) - except IOError as err: - raise SwiftOnFileSystemIOError( - err.errno, - '%s, xattr.getxattr("%s", ...)' % (err.strerror, attr) - ) - @public @timing_stats() def POST(self, request):