Fixed HPSS metadata headers not appearing in a GET or HEAD request
This commit is contained in:
parent
56238e890c
commit
c7a25662de
swiftonhpss/swift/obj
@ -316,7 +316,7 @@ class DiskFileWriter(object):
|
|||||||
hpssfs.ioctl(self._fd, hpssfs.HPSSFS_PURGE_LOCK, int(purgelock))
|
hpssfs.ioctl(self._fd, hpssfs.HPSSFS_PURGE_LOCK, int(purgelock))
|
||||||
except IOError as err:
|
except IOError as err:
|
||||||
raise SwiftOnFileSystemIOError(err.errno,
|
raise SwiftOnFileSystemIOError(err.errno,
|
||||||
'%s, hpssfs.ioct("%s", ...)' % (
|
'%s, hpssfs.ioctl("%s", ...)' % (
|
||||||
err.strerror, self._fd))
|
err.strerror, self._fd))
|
||||||
|
|
||||||
# From the Department of the Redundancy Department, make sure
|
# From the Department of the Redundancy Department, make sure
|
||||||
@ -839,7 +839,34 @@ class DiskFile(object):
|
|||||||
bytes_on_disk = top_level[2].rstrip(' ')
|
bytes_on_disk = top_level[2].rstrip(' ')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise SwiftOnFileSystemIOError("Couldn't get system.hpss.level!")
|
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):
|
def __enter__(self):
|
||||||
"""
|
"""
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
import math
|
import math
|
||||||
import logging
|
import logging
|
||||||
import time
|
|
||||||
import xattr
|
import xattr
|
||||||
import os
|
import os
|
||||||
import hpssfs
|
import hpssfs
|
||||||
@ -385,7 +384,8 @@ class ObjectController(server.ObjectController):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self._get_hpss_xattr(request, response, disk_file)
|
hpss_headers = disk_file.get_hpss_headers()
|
||||||
|
response.headers.update(hpss_headers)
|
||||||
except SwiftOnFileSystemIOError:
|
except SwiftOnFileSystemIOError:
|
||||||
return HTTPServiceUnavailable(request=request)
|
return HTTPServiceUnavailable(request=request)
|
||||||
|
|
||||||
@ -398,6 +398,7 @@ class ObjectController(server.ObjectController):
|
|||||||
@public
|
@public
|
||||||
@timing_stats()
|
@timing_stats()
|
||||||
def GET(self, request):
|
def GET(self, request):
|
||||||
|
logging.error(request)
|
||||||
"""Handle HTTP GET requests for the Swift on File object server"""
|
"""Handle HTTP GET requests for the Swift on File object server"""
|
||||||
device, partition, account, container, obj, policy = \
|
device, partition, account, container, obj, policy = \
|
||||||
get_name_and_placement(request, 5, 5, True)
|
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
|
response.headers['X-Backend-Timestamp'] = file_x_ts.internal
|
||||||
# (HPSS) Inject HPSS xattr metadata into headers
|
# (HPSS) Inject HPSS xattr metadata into headers
|
||||||
try:
|
try:
|
||||||
self._get_hpss_xattr(request, response, disk_file)
|
hpss_headers = disk_file.get_hpss_headers()
|
||||||
|
response.headers.update(hpss_headers)
|
||||||
except SwiftOnFileSystemIOError:
|
except SwiftOnFileSystemIOError:
|
||||||
return HTTPServiceUnavailable(request=request)
|
return HTTPServiceUnavailable(request=request)
|
||||||
return request.get_response(response)
|
return request.get_response(response)
|
||||||
@ -461,36 +463,6 @@ class ObjectController(server.ObjectController):
|
|||||||
return HTTPNotFound(request=request, headers=headers,
|
return HTTPNotFound(request=request, headers=headers,
|
||||||
conditional_response=True)
|
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
|
@public
|
||||||
@timing_stats()
|
@timing_stats()
|
||||||
def POST(self, request):
|
def POST(self, request):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user