Fixed HPSS metadata headers not appearing in a GET or HEAD request

This commit is contained in:
Phil Bridges 2016-03-09 14:04:57 -06:00
parent 56238e890c
commit c7a25662de
2 changed files with 34 additions and 35 deletions

View File

@ -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):
"""

View File

@ -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):