Merge "Close ECAppIter's sub-generators before propagating GeneratorExit"

This commit is contained in:
Jenkins
2015-10-19 11:47:50 +00:00
committed by Gerrit Code Review
3 changed files with 9 additions and 7 deletions

View File

@@ -919,6 +919,7 @@ class ResumingGetter(object):
if nchunks % 5 == 0: if nchunks % 5 == 0:
sleep() sleep()
part_iter = None
try: try:
while True: while True:
start_byte, end_byte, length, headers, part = \ start_byte, end_byte, length, headers, part = \
@@ -930,9 +931,12 @@ class ResumingGetter(object):
'entity_length': length, 'headers': headers, 'entity_length': length, 'headers': headers,
'part_iter': part_iter} 'part_iter': part_iter}
self.pop_range() self.pop_range()
except GeneratorExit:
if part_iter:
part_iter.close()
raise
except StopIteration: except StopIteration:
req.environ['swift.non_client_disconnect'] = True req.environ['swift.non_client_disconnect'] = True
return
except ChunkReadTimeout: except ChunkReadTimeout:
self.app.exception_occurred(node[0], _('Object'), self.app.exception_occurred(node[0], _('Object'),

View File

@@ -2001,7 +2001,7 @@ class TestECObjController(BaseObjectControllerMixin, unittest.TestCase):
try: try:
resp.body resp.body
except ECDriverError: except ECDriverError:
pass resp._app_iter.close()
else: else:
self.fail('invalid ec fragment response body did not blow up!') self.fail('invalid ec fragment response body did not blow up!')
error_lines = self.logger.get_lines_for_level('error') error_lines = self.logger.get_lines_for_level('error')

View File

@@ -5620,9 +5620,8 @@ class TestObjectController(unittest.TestCase):
# read most of the object, and disconnect # read most of the object, and disconnect
fd.read(10) fd.read(10)
fd.close() sock.fd._sock.close()
sock.close() sleep(0.1)
sleep(0)
# check for disconnect message! # check for disconnect message!
expected = ['Client disconnected on read'] * 2 expected = ['Client disconnected on read'] * 2
@@ -5678,8 +5677,7 @@ class TestObjectController(unittest.TestCase):
exp = 'HTTP/1.1 200' exp = 'HTTP/1.1 200'
self.assertEqual(headers[:len(exp)], exp) self.assertEqual(headers[:len(exp)], exp)
fd.read(1) fd.read(1)
fd.close() sock.fd._sock.close()
sock.close()
# Make sure the GC is run again for pythons without reference # Make sure the GC is run again for pythons without reference
# counting # counting
for i in range(4): for i in range(4):