)]}'
{"swift/common/request_helpers.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f84beeac105dafe9be61df351638d1b35f478278","unresolved":true,"context_lines":[{"line_number":745,"context_line":"        Called when the client disconnect. Ensure that the connection to the"},{"line_number":746,"context_line":"        backend server is closed."},{"line_number":747,"context_line":"        \"\"\""},{"line_number":748,"context_line":"        close_if_possible(self.app_iter)"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":""},{"line_number":751,"context_line":"def http_response_to_document_iters(response, read_chunk_size\u003d4096):"}],"source_content_type":"text/x-python","patch_set":1,"id":"0a8bdb85_b83d3570","line":748,"updated":"2020-12-29 19:12:12.000000000","message":"So, do we ever call this? Or do we mainly just close the iter() of the SegmentedIterable?","commit_id":"5e3302649584b2aec523e5966671e43ea959ed27"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"53f4f5234ba084ea37d474ca7a3c8ec0bfa4884d","unresolved":true,"context_lines":[{"line_number":745,"context_line":"        Called when the client disconnect. Ensure that the connection to the"},{"line_number":746,"context_line":"        backend server is closed."},{"line_number":747,"context_line":"        \"\"\""},{"line_number":748,"context_line":"        close_if_possible(self.app_iter)"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":""},{"line_number":751,"context_line":"def http_response_to_document_iters(response, read_chunk_size\u003d4096):"}],"source_content_type":"text/x-python","patch_set":1,"id":"f6e19cc5_5bac45cd","line":748,"in_reply_to":"0a8bdb85_b83d3570","updated":"2020-12-30 10:46:54.000000000","message":"possibly no longer in swift code, but we did before the related change, and I guess its possible that other users of this class might follow that same pattern of using iter(segmented_iter) and segmented_iter.close(), so I suppose we should leave this as is","commit_id":"5e3302649584b2aec523e5966671e43ea959ed27"}],"test/unit/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f84beeac105dafe9be61df351638d1b35f478278","unresolved":true,"context_lines":[{"line_number":429,"context_line":"        self.close_call_count \u003d 0"},{"line_number":430,"context_line":"        self.values \u003d iter(values)"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def __iter__(self):"},{"line_number":433,"context_line":"        return self"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def __next__(self):"},{"line_number":436,"context_line":"        self.next_call_count +\u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"3592edd6_c555fcad","line":433,"range":{"start_line":432,"start_character":4,"end_line":433,"end_character":19},"updated":"2020-12-29 19:12:12.000000000","message":"I feel like this always trips me up: the difference between calling\n\n x.close()\n\nand\n\n y \u003d iter(x)\n ...\n y.close()\n\nis subtle so I almost always end up doing exactly this with my iterables/iterators so I can do either to achieve the same thing.\n\nI wonder if it would be worth having some helpers where the distinction is easier to write assertions against...","commit_id":"5e3302649584b2aec523e5966671e43ea959ed27"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"53f4f5234ba084ea37d474ca7a3c8ec0bfa4884d","unresolved":true,"context_lines":[{"line_number":429,"context_line":"        self.close_call_count \u003d 0"},{"line_number":430,"context_line":"        self.values \u003d iter(values)"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def __iter__(self):"},{"line_number":433,"context_line":"        return self"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def __next__(self):"},{"line_number":436,"context_line":"        self.next_call_count +\u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ba5d646_540bae6e","line":433,"range":{"start_line":432,"start_character":4,"end_line":433,"end_character":19},"in_reply_to":"3592edd6_c555fcad","updated":"2020-12-30 10:46:54.000000000","message":"agree, the subtlety creates a pitfall. I considered (briefly) having the CloseableChain take not only the iters to be chained, but also \u0027other objects that might have a close() method\u0027 so that it could be passed both x and y and just try to close *everything*.","commit_id":"5e3302649584b2aec523e5966671e43ea959ed27"}],"test/unit/common/middleware/test_slo.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f84beeac105dafe9be61df351638d1b35f478278","unresolved":false,"context_lines":[{"line_number":3328,"context_line":"        leaks \u003d [0]"},{"line_number":3329,"context_line":"        app_resp \u003d self._do_test_generator_closure(leaks)"},{"line_number":3330,"context_line":"        body_iter \u003d iter(app_resp)"},{"line_number":3331,"context_line":"        chunk \u003d next(body_iter)"},{"line_number":3332,"context_line":"        self.assertEqual(chunk, b\u0027aaaaa\u0027)  # sanity check"},{"line_number":3333,"context_line":"        close_method \u003d getattr(body_iter, \u0027close\u0027, None)"},{"line_number":3334,"context_line":"        self.assertIsNotNone(close_method)"},{"line_number":3335,"context_line":"        self.assertTrue(callable(close_method))"}],"source_content_type":"text/x-python","patch_set":1,"id":"584bdb66_5b8eec8b","line":3332,"range":{"start_line":3331,"start_character":0,"end_line":3332,"end_character":57},"updated":"2020-12-29 19:12:12.000000000","message":"Like all good sanity checks, the test still passes without these lines. But with how often generators sneak into app iters, I figured it was worth double-checking that ;-)","commit_id":"5e3302649584b2aec523e5966671e43ea959ed27"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f84beeac105dafe9be61df351638d1b35f478278","unresolved":false,"context_lines":[{"line_number":3331,"context_line":"        chunk \u003d next(body_iter)"},{"line_number":3332,"context_line":"        self.assertEqual(chunk, b\u0027aaaaa\u0027)  # sanity check"},{"line_number":3333,"context_line":"        close_method \u003d getattr(body_iter, \u0027close\u0027, None)"},{"line_number":3334,"context_line":"        self.assertIsNotNone(close_method)"},{"line_number":3335,"context_line":"        self.assertTrue(callable(close_method))"},{"line_number":3336,"context_line":"        close_method()"},{"line_number":3337,"context_line":"        self.assertEqual(0, leaks[0])"}],"source_content_type":"text/x-python","patch_set":1,"id":"86e8790e_9ac184df","line":3334,"updated":"2020-12-29 19:12:12.000000000","message":"Right; backing out the change, the test fails here since the itertools.chain result doesn\u0027t have a close method.","commit_id":"5e3302649584b2aec523e5966671e43ea959ed27"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f84beeac105dafe9be61df351638d1b35f478278","unresolved":true,"context_lines":[{"line_number":8835,"context_line":"        # close"},{"line_number":8836,"context_line":"        chain \u003d utils.CloseableChain([1, 2], [3])"},{"line_number":8837,"context_line":"        chain.close()"},{"line_number":8838,"context_line":"        self.assertEqual([1, 2, 3], [x for x in chain])"}],"source_content_type":"text/x-python","patch_set":1,"id":"8b1029b0_10af8e63","line":8838,"updated":"2020-12-29 19:12:12.000000000","message":"I wonder if it\u0027d be worth throwing in some assertions with generators, too, like\n\ndiff --git a/test/unit/common/test_utils.py b/test/unit/common/test_utils.py\nindex c59172098..d7a704ff7 100644\n--- a/test/unit/common/test_utils.py\n+++ b/test/unit/common/test_utils.py\n@@ -8836,3 +8836,29 @@ class TestCloseableChain(unittest.TestCase):\n         chain \u003d utils.CloseableChain([1, 2], [3])\n         chain.close()\n         self.assertEqual([1, 2, 3], [x for x in chain])\n+\n+        generator_closed \u003d [False]\n+        def gen():\n+            try:\n+                yield 2\n+                yield 3\n+            except GeneratorExit:\n+                generator_closed[0] \u003d True\n+                raise\n+        test_iter1 \u003d FakeIterable([1])\n+        chain \u003d utils.CloseableChain(test_iter1, gen())\n+        self.assertEqual(0, test_iter1.close_call_count)\n+        self.assertFalse(generator_closed[0])\n+        chain.close()\n+        self.assertEqual(1, test_iter1.close_call_count)\n+        # Generator never kicked off, so there\u0027s no GeneratorExit\n+        self.assertFalse(generator_closed[0])\n+\n+        test_iter1 \u003d FakeIterable([1])\n+        chain \u003d utils.CloseableChain(gen(), test_iter1)\n+        self.assertEqual(2, next(chain))  # Kick off the generator\n+        self.assertEqual(0, test_iter1.close_call_count)\n+        self.assertFalse(generator_closed[0])\n+        chain.close()\n+        self.assertEqual(1, test_iter1.close_call_count)\n+        self.assertTrue(generator_closed[0])","commit_id":"5e3302649584b2aec523e5966671e43ea959ed27"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"53f4f5234ba084ea37d474ca7a3c8ec0bfa4884d","unresolved":false,"context_lines":[{"line_number":8835,"context_line":"        # close"},{"line_number":8836,"context_line":"        chain \u003d utils.CloseableChain([1, 2], [3])"},{"line_number":8837,"context_line":"        chain.close()"},{"line_number":8838,"context_line":"        self.assertEqual([1, 2, 3], [x for x in chain])"}],"source_content_type":"text/x-python","patch_set":1,"id":"48d08be3_2fc5eccf","line":8838,"in_reply_to":"8b1029b0_10af8e63","updated":"2020-12-30 10:46:54.000000000","message":"LGTM, see https://review.opendev.org/c/openstack/swift/+/768774","commit_id":"5e3302649584b2aec523e5966671e43ea959ed27"}]}
