Change tpooled_get_hashes back to err,err on Timeout, (object server REPLICATE needs it) and unit tests
Change-Id: Ic60c33570594fd2c0939043863b013aa2103505d
This commit is contained in:
parent
dc9ce595ae
commit
a98ce6eade
@ -202,13 +202,13 @@ def get_hashes(partition_dir, recalculate=[], do_listdir=False,
|
|||||||
def tpooled_get_hashes(*args, **kwargs):
|
def tpooled_get_hashes(*args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Hack to work around Eventlet's tpool not catching and reraising Timeouts.
|
Hack to work around Eventlet's tpool not catching and reraising Timeouts.
|
||||||
We return the Timeout, None if it's raised, the caller looks for it
|
We return the Timeout, Timeout if it's raised, the caller looks for it
|
||||||
and reraises it if found.
|
and reraises it if found.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return get_hashes(*args, **kwargs)
|
return get_hashes(*args, **kwargs)
|
||||||
except Timeout, err:
|
except Timeout, err:
|
||||||
return err, None
|
return err, err
|
||||||
|
|
||||||
|
|
||||||
class ObjectReplicator(Daemon):
|
class ObjectReplicator(Daemon):
|
||||||
|
@ -27,7 +27,7 @@ from time import gmtime, sleep, strftime, time
|
|||||||
from tempfile import mkdtemp
|
from tempfile import mkdtemp
|
||||||
from hashlib import md5
|
from hashlib import md5
|
||||||
|
|
||||||
from eventlet import sleep, spawn, wsgi, listen
|
from eventlet import sleep, spawn, wsgi, listen, Timeout
|
||||||
from webob import Request
|
from webob import Request
|
||||||
from test.unit import FakeLogger
|
from test.unit import FakeLogger
|
||||||
from test.unit import _getxattr as getxattr
|
from test.unit import _getxattr as getxattr
|
||||||
@ -38,6 +38,7 @@ from swift.common import utils
|
|||||||
from swift.common.utils import hash_path, mkdirs, normalize_timestamp, \
|
from swift.common.utils import hash_path, mkdirs, normalize_timestamp, \
|
||||||
NullLogger, storage_directory
|
NullLogger, storage_directory
|
||||||
from swift.common.exceptions import DiskFileNotExist
|
from swift.common.exceptions import DiskFileNotExist
|
||||||
|
from swift.obj import replicator
|
||||||
from eventlet import tpool
|
from eventlet import tpool
|
||||||
|
|
||||||
|
|
||||||
@ -158,12 +159,12 @@ class TestDiskFile(unittest.TestCase):
|
|||||||
df.put(fd, tmppath, metadata, extension=extension)
|
df.put(fd, tmppath, metadata, extension=extension)
|
||||||
if invalid_type == 'ETag':
|
if invalid_type == 'ETag':
|
||||||
etag = md5()
|
etag = md5()
|
||||||
etag.update('1' + '0' * (fsize-1))
|
etag.update('1' + '0' * (fsize - 1))
|
||||||
etag = etag.hexdigest()
|
etag = etag.hexdigest()
|
||||||
metadata['ETag'] = etag
|
metadata['ETag'] = etag
|
||||||
object_server.write_metadata(fd, metadata)
|
object_server.write_metadata(fd, metadata)
|
||||||
if invalid_type == 'Content-Length':
|
if invalid_type == 'Content-Length':
|
||||||
metadata['Content-Length'] = fsize-1
|
metadata['Content-Length'] = fsize - 1
|
||||||
object_server.write_metadata(fd, metadata)
|
object_server.write_metadata(fd, metadata)
|
||||||
|
|
||||||
df = object_server.DiskFile(self.testdir, 'sda1', '0', 'a', 'c',
|
df = object_server.DiskFile(self.testdir, 'sda1', '0', 'a', 'c',
|
||||||
@ -1115,7 +1116,7 @@ class TestObjectController(unittest.TestCase):
|
|||||||
quar_dir = os.path.join(self.testdir, 'sda1', 'quarantined', 'objects',
|
quar_dir = os.path.join(self.testdir, 'sda1', 'quarantined', 'objects',
|
||||||
os.path.basename(os.path.dirname(file.data_file)))
|
os.path.basename(os.path.dirname(file.data_file)))
|
||||||
self.assertEquals(os.listdir(file.datadir)[0], file_name)
|
self.assertEquals(os.listdir(file.datadir)[0], file_name)
|
||||||
body = resp.body # actually does quarantining
|
body = resp.body # actually does quarantining
|
||||||
self.assertEquals(body, 'VERIFY')
|
self.assertEquals(body, 'VERIFY')
|
||||||
self.assertEquals(os.listdir(quar_dir)[0], file_name)
|
self.assertEquals(os.listdir(quar_dir)[0], file_name)
|
||||||
req = Request.blank('/sda1/p/a/c/o')
|
req = Request.blank('/sda1/p/a/c/o')
|
||||||
@ -2046,6 +2047,54 @@ class TestObjectController(unittest.TestCase):
|
|||||||
self.assertEquals(resp.status_int, 400)
|
self.assertEquals(resp.status_int, 400)
|
||||||
self.assertTrue('X-Delete-At in past' in resp.body)
|
self.assertTrue('X-Delete-At in past' in resp.body)
|
||||||
|
|
||||||
|
def test_REPLICATE_works(self):
|
||||||
|
|
||||||
|
def fake_get_hashes(*args, **kwargs):
|
||||||
|
return 0, {1: 2}
|
||||||
|
|
||||||
|
def my_tpool_execute(*args, **kwargs):
|
||||||
|
func = args[0]
|
||||||
|
args = args[1:]
|
||||||
|
return func(*args, **kwargs)
|
||||||
|
|
||||||
|
was_get_hashes = replicator.get_hashes
|
||||||
|
replicator.get_hashes = fake_get_hashes
|
||||||
|
was_tpool_exe = tpool.execute
|
||||||
|
tpool.execute = my_tpool_execute
|
||||||
|
try:
|
||||||
|
req = Request.blank('/sda1/p/suff',
|
||||||
|
environ={'REQUEST_METHOD': 'REPLICATE'},
|
||||||
|
headers={})
|
||||||
|
resp = self.object_controller.REPLICATE(req)
|
||||||
|
self.assertEquals(resp.status_int, 200)
|
||||||
|
p_data = pickle.loads(resp.body)
|
||||||
|
self.assertEquals(p_data, {1: 2})
|
||||||
|
finally:
|
||||||
|
tpool.execute = was_tpool_exe
|
||||||
|
replicator.get_hashes = was_get_hashes
|
||||||
|
|
||||||
|
def test_REPLICATE_timeout(self):
|
||||||
|
|
||||||
|
def fake_get_hashes(*args, **kwargs):
|
||||||
|
raise Timeout()
|
||||||
|
|
||||||
|
def my_tpool_execute(*args, **kwargs):
|
||||||
|
func = args[0]
|
||||||
|
args = args[1:]
|
||||||
|
return func(*args, **kwargs)
|
||||||
|
|
||||||
|
was_get_hashes = replicator.get_hashes
|
||||||
|
replicator.get_hashes = fake_get_hashes
|
||||||
|
was_tpool_exe = tpool.execute
|
||||||
|
tpool.execute = my_tpool_execute
|
||||||
|
try:
|
||||||
|
req = Request.blank('/sda1/p/suff',
|
||||||
|
environ={'REQUEST_METHOD': 'REPLICATE'},
|
||||||
|
headers={})
|
||||||
|
self.assertRaises(Timeout, self.object_controller.REPLICATE, req)
|
||||||
|
finally:
|
||||||
|
tpool.execute = was_tpool_exe
|
||||||
|
replicator.get_hashes = was_get_hashes
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
Reference in New Issue
Block a user