Ensure swift.source is set for DLO/SLO requests
SLO was setting it sometimes (the PUT path), but not others (the GET path), and DLO just wasn't doing it at all. One could already distinguish DLO/SLO internal requests by the user agent, but we should set swift.source too. Change-Id: I5d5b7dd49bd1522a9c830d0abd21fff92ae79a39
This commit is contained in:
parent
8902aef591
commit
5fca0d07a8
@ -37,6 +37,7 @@ class GetContext(WSGIContext):
|
|||||||
prefix, marker=''):
|
prefix, marker=''):
|
||||||
con_req = req.copy_get()
|
con_req = req.copy_get()
|
||||||
con_req.script_name = ''
|
con_req.script_name = ''
|
||||||
|
con_req.environ['swift.source'] = 'DLO'
|
||||||
con_req.range = None
|
con_req.range = None
|
||||||
con_req.path_info = '/'.join(['', version, account, container])
|
con_req.path_info = '/'.join(['', version, account, container])
|
||||||
con_req.query_string = 'format=json&prefix=%s' % quote(prefix)
|
con_req.query_string = 'format=json&prefix=%s' % quote(prefix)
|
||||||
@ -197,6 +198,7 @@ class GetContext(WSGIContext):
|
|||||||
app_iter=SegmentedIterable(
|
app_iter=SegmentedIterable(
|
||||||
req, self.dlo.app, listing_iter,
|
req, self.dlo.app, listing_iter,
|
||||||
ua_suffix="DLO MultipartGET",
|
ua_suffix="DLO MultipartGET",
|
||||||
|
swift_source="DLO",
|
||||||
name=req.path, logger=self.logger,
|
name=req.path, logger=self.logger,
|
||||||
max_get_time=self.dlo.max_get_time))
|
max_get_time=self.dlo.max_get_time))
|
||||||
resp.app_iter.response = resp
|
resp.app_iter.response = resp
|
||||||
|
@ -217,6 +217,7 @@ class SloGetContext(WSGIContext):
|
|||||||
sub_req = req.copy_get()
|
sub_req = req.copy_get()
|
||||||
sub_req.range = None
|
sub_req.range = None
|
||||||
sub_req.environ['PATH_INFO'] = '/'.join(['', version, acc, con, obj])
|
sub_req.environ['PATH_INFO'] = '/'.join(['', version, acc, con, obj])
|
||||||
|
sub_req.environ['swift.source'] = 'SLO'
|
||||||
sub_req.user_agent = "%s SLO MultipartGET" % sub_req.user_agent
|
sub_req.user_agent = "%s SLO MultipartGET" % sub_req.user_agent
|
||||||
sub_resp = sub_req.get_response(self.slo.app)
|
sub_resp = sub_req.get_response(self.slo.app)
|
||||||
|
|
||||||
@ -346,6 +347,7 @@ class SloGetContext(WSGIContext):
|
|||||||
|
|
||||||
get_req = req.copy_get()
|
get_req = req.copy_get()
|
||||||
get_req.range = None
|
get_req.range = None
|
||||||
|
get_req.environ['swift.source'] = 'SLO'
|
||||||
get_req.user_agent = "%s SLO MultipartGET" % get_req.user_agent
|
get_req.user_agent = "%s SLO MultipartGET" % get_req.user_agent
|
||||||
resp_iter = self._app_call(get_req.environ)
|
resp_iter = self._app_call(get_req.environ)
|
||||||
|
|
||||||
@ -425,6 +427,7 @@ class SloGetContext(WSGIContext):
|
|||||||
req, self.slo.app, segment_listing_iter,
|
req, self.slo.app, segment_listing_iter,
|
||||||
name=req.path, logger=self.slo.logger,
|
name=req.path, logger=self.slo.logger,
|
||||||
ua_suffix="SLO MultipartGET",
|
ua_suffix="SLO MultipartGET",
|
||||||
|
swift_source="SLO",
|
||||||
max_get_time=self.slo.max_get_time))
|
max_get_time=self.slo.max_get_time))
|
||||||
if req.range:
|
if req.range:
|
||||||
response.headers.pop('Etag')
|
response.headers.pop('Etag')
|
||||||
|
@ -2593,19 +2593,23 @@ class SegmentedIterable(object):
|
|||||||
or (object-path, None, None) to fetch the whole thing.
|
or (object-path, None, None) to fetch the whole thing.
|
||||||
:param max_get_time: maximum permitted duration of a GET request (seconds)
|
:param max_get_time: maximum permitted duration of a GET request (seconds)
|
||||||
:param logger: logger object
|
:param logger: logger object
|
||||||
|
:param swift_source: value of swift.source in subrequest environ
|
||||||
|
(just for logging)
|
||||||
:param ua_suffix: string to append to user-agent.
|
:param ua_suffix: string to append to user-agent.
|
||||||
:param name: name of manifest (used in logging only)
|
:param name: name of manifest (used in logging only)
|
||||||
:param response: optional response object for the response being sent
|
:param response: optional response object for the response being sent
|
||||||
to the client. Only affects logs.
|
to the client. Only affects logs.
|
||||||
"""
|
"""
|
||||||
def __init__(self, req, app, listing_iter, max_get_time,
|
def __init__(self, req, app, listing_iter, max_get_time,
|
||||||
logger, ua_suffix, name='<not specified>', response=None):
|
logger, ua_suffix, swift_source,
|
||||||
|
name='<not specified>', response=None):
|
||||||
self.req = req
|
self.req = req
|
||||||
self.app = app
|
self.app = app
|
||||||
self.listing_iter = listing_iter
|
self.listing_iter = listing_iter
|
||||||
self.max_get_time = max_get_time
|
self.max_get_time = max_get_time
|
||||||
self.logger = logger
|
self.logger = logger
|
||||||
self.ua_suffix = " " + ua_suffix
|
self.ua_suffix = " " + ua_suffix
|
||||||
|
self.swift_source = swift_source
|
||||||
self.name = name
|
self.name = name
|
||||||
self.response = response
|
self.response = response
|
||||||
|
|
||||||
@ -2633,6 +2637,7 @@ class SegmentedIterable(object):
|
|||||||
seg_req = self.req.copy_get()
|
seg_req = self.req.copy_get()
|
||||||
seg_req.range = None
|
seg_req.range = None
|
||||||
seg_req.environ['PATH_INFO'] = seg_path
|
seg_req.environ['PATH_INFO'] = seg_path
|
||||||
|
seg_req.environ['swift.source'] = self.swift_source
|
||||||
seg_req.user_agent = "%s %s" % (seg_req.user_agent,
|
seg_req.user_agent = "%s %s" % (seg_req.user_agent,
|
||||||
self.ua_suffix)
|
self.ua_suffix)
|
||||||
if first_byte is not None or last_byte is not None:
|
if first_byte is not None or last_byte is not None:
|
||||||
|
@ -29,6 +29,7 @@ class FakeSwift(object):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._calls = []
|
self._calls = []
|
||||||
self.req_method_paths = []
|
self.req_method_paths = []
|
||||||
|
self.swift_sources = []
|
||||||
self.uploaded = {}
|
self.uploaded = {}
|
||||||
# mapping of (method, path) --> (response class, headers, body)
|
# mapping of (method, path) --> (response class, headers, body)
|
||||||
self._responses = {}
|
self._responses = {}
|
||||||
@ -43,6 +44,7 @@ class FakeSwift(object):
|
|||||||
|
|
||||||
headers = swob.Request(env).headers
|
headers = swob.Request(env).headers
|
||||||
self._calls.append((method, path, headers))
|
self._calls.append((method, path, headers))
|
||||||
|
self.swift_sources.append(env.get('swift.source'))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
resp_class, raw_headers, body = self._responses[(method, path)]
|
resp_class, raw_headers, body = self._responses[(method, path)]
|
||||||
|
@ -292,6 +292,10 @@ class TestDloGetManifest(DloTestCase):
|
|||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
"DLO MultipartGET" in self.app.calls_with_headers[0][2])
|
"DLO MultipartGET" in self.app.calls_with_headers[0][2])
|
||||||
|
|
||||||
|
# we set swift.source for everything but the first request
|
||||||
|
self.assertEqual(self.app.swift_sources,
|
||||||
|
[None, 'DLO', 'DLO', 'DLO', 'DLO', 'DLO', 'DLO'])
|
||||||
|
|
||||||
def test_get_non_manifest_passthrough(self):
|
def test_get_non_manifest_passthrough(self):
|
||||||
req = swob.Request.blank('/v1/AUTH_test/c/catpicture.jpg',
|
req = swob.Request.blank('/v1/AUTH_test/c/catpicture.jpg',
|
||||||
environ={'REQUEST_METHOD': 'GET'})
|
environ={'REQUEST_METHOD': 'GET'})
|
||||||
|
@ -838,8 +838,9 @@ class TestSloGetManifest(SloTestCase):
|
|||||||
self.assertTrue("SLO MultipartGET" in ua)
|
self.assertTrue("SLO MultipartGET" in ua)
|
||||||
self.assertFalse("SLO MultipartGET SLO MultipartGET" in ua)
|
self.assertFalse("SLO MultipartGET SLO MultipartGET" in ua)
|
||||||
# the first request goes through unaltered
|
# the first request goes through unaltered
|
||||||
|
first_ua = self.app.calls_with_headers[0][2].get("User-Agent")
|
||||||
self.assertFalse(
|
self.assertFalse(
|
||||||
"SLO MultipartGET" in self.app.calls_with_headers[0][2])
|
"SLO MultipartGET" in first_ua)
|
||||||
|
|
||||||
def test_get_manifest_with_submanifest(self):
|
def test_get_manifest_with_submanifest(self):
|
||||||
req = Request.blank(
|
req = Request.blank(
|
||||||
@ -884,6 +885,9 @@ class TestSloGetManifest(SloTestCase):
|
|||||||
self.assertEqual(headers[3].get('Range'), None)
|
self.assertEqual(headers[3].get('Range'), None)
|
||||||
self.assertEqual(headers[4].get('Range'), None)
|
self.assertEqual(headers[4].get('Range'), None)
|
||||||
self.assertEqual(headers[5].get('Range'), 'bytes=0-2')
|
self.assertEqual(headers[5].get('Range'), 'bytes=0-2')
|
||||||
|
# we set swift.source for everything but the first request
|
||||||
|
self.assertEqual(self.app.swift_sources,
|
||||||
|
[None, 'SLO', 'SLO', 'SLO', 'SLO', 'SLO'])
|
||||||
|
|
||||||
def test_range_get_manifest_on_segment_boundaries(self):
|
def test_range_get_manifest_on_segment_boundaries(self):
|
||||||
req = Request.blank(
|
req = Request.blank(
|
||||||
|
Loading…
Reference in New Issue
Block a user