summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-03-21 06:25:35 +0000
committerGerrit Code Review <review@openstack.org>2014-03-21 06:25:35 +0000
commitc0675a5f30132a465bc6a9b94637c6be28db1b34 (patch)
treef51a9e04ecfe7b2f75aa4db5f499b6829e6a3bc0
parent182ff7aefc15ce2325be41076d62adb2baf8f50b (diff)
parent01410c685080c9d700278fc430cc004fa112d783 (diff)
downloadswift-c0675a5f30132a465bc6a9b94637c6be28db1b34.tar.gz
Merge "Make backend container requests use the same X-Timestamp"
-rw-r--r--swift/proxy/controllers/container.py7
-rw-r--r--test/unit/__init__.py1
-rw-r--r--test/unit/proxy/test_server.py53
3 files changed, 58 insertions, 3 deletions
diff --git a/swift/proxy/controllers/container.py b/swift/proxy/controllers/container.py
index d4425d3a7..96cef9f41 100644
--- a/swift/proxy/controllers/container.py
+++ b/swift/proxy/controllers/container.py
@@ -15,8 +15,9 @@
from swift import gettext_ as _
from urllib import unquote
+import time
-from swift.common.utils import public, csv_append
+from swift.common.utils import public, csv_append, normalize_timestamp
from swift.common.constraints import check_metadata, MAX_CONTAINER_NAME_LENGTH
from swift.common.http import HTTP_ACCEPTED
from swift.proxy.controllers.base import Controller, delay_denial, \
@@ -182,7 +183,9 @@ class ContainerController(Controller):
def _backend_requests(self, req, n_outgoing,
account_partition, accounts):
- headers = [self.generate_request_headers(req, transfer=True)
+ additional = {'X-Timestamp': normalize_timestamp(time.time())}
+ headers = [self.generate_request_headers(req, transfer=True,
+ additional=additional)
for _junk in range(n_outgoing)]
for i, account in enumerate(accounts):
diff --git a/test/unit/__init__.py b/test/unit/__init__.py
index 2d2e9c727..1e6bc5d6e 100644
--- a/test/unit/__init__.py
+++ b/test/unit/__init__.py
@@ -235,6 +235,7 @@ class FakeLogger(logging.Logger):
if 'facility' in kwargs:
self.facility = kwargs['facility']
self.statsd_client = None
+ self.thread_locals = None
def _clear(self):
self.log_dict = defaultdict(list)
diff --git a/test/unit/proxy/test_server.py b/test/unit/proxy/test_server.py
index 0e564d5cf..ed037b8c9 100644
--- a/test/unit/proxy/test_server.py
+++ b/test/unit/proxy/test_server.py
@@ -27,6 +27,7 @@ from urllib import quote
from hashlib import md5
from tempfile import mkdtemp
import weakref
+import re
import mock
from eventlet import sleep, spawn, wsgi, listen
@@ -4134,7 +4135,8 @@ class TestContainerController(unittest.TestCase):
self.app = proxy_server.Application(None, FakeMemcache(),
account_ring=FakeRing(),
container_ring=FakeRing(),
- object_ring=FakeRing())
+ object_ring=FakeRing(),
+ logger=FakeLogger())
def test_transfer_headers(self):
src_headers = {'x-remove-versions-location': 'x',
@@ -5056,6 +5058,55 @@ class TestContainerController(unittest.TestCase):
'X-Account-Device': 'sdc'}
])
+ def test_PUT_backed_x_timestamp_header(self):
+ timestamps = []
+
+ def capture_timestamps(*args, **kwargs):
+ headers = kwargs['headers']
+ timestamps.append(headers.get('X-Timestamp'))
+
+ req = Request.blank('/v1/a/c', method='PUT', headers={'': ''})
+ with save_globals():
+ new_connect = set_http_connect(200, # account existance check
+ 201, 201, 201,
+ give_connect=capture_timestamps)
+ resp = self.app.handle_request(req)
+
+ # sanity
+ self.assertRaises(StopIteration, new_connect.code_iter.next)
+ self.assertEqual(2, resp.status_int // 100)
+
+ timestamps.pop(0) # account existance check
+ self.assertEqual(3, len(timestamps))
+ for timestamp in timestamps:
+ self.assertEqual(timestamp, timestamps[0])
+ self.assert_(re.match('[0-9]{10}\.[0-9]{5}', timestamp))
+
+ def test_DELETE_backed_x_timestamp_header(self):
+ timestamps = []
+
+ def capture_timestamps(*args, **kwargs):
+ headers = kwargs['headers']
+ timestamps.append(headers.get('X-Timestamp'))
+
+ req = Request.blank('/v1/a/c', method='DELETE', headers={'': ''})
+ self.app.update_request(req)
+ with save_globals():
+ new_connect = set_http_connect(200, # account existance check
+ 201, 201, 201,
+ give_connect=capture_timestamps)
+ resp = self.app.handle_request(req)
+
+ # sanity
+ self.assertRaises(StopIteration, new_connect.code_iter.next)
+ self.assertEqual(2, resp.status_int // 100)
+
+ timestamps.pop(0) # account existance check
+ self.assertEqual(3, len(timestamps))
+ for timestamp in timestamps:
+ self.assertEqual(timestamp, timestamps[0])
+ self.assert_(re.match('[0-9]{10}\.[0-9]{5}', timestamp))
+
def test_node_read_timeout_retry_to_container(self):
with save_globals():
req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': 'GET'})