)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c916616a_14c64ac2","updated":"2024-09-25 09:22:18.000000000","message":"nice catch! IIUC we have seen this in prod so good to fix. Have to agree -1 with zuul re py2 😞","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bf5286a8c8cd194978c40b0f28bf4d06d67d52f9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"53bd3f40_4ffddd0f","updated":"2024-10-02 16:19:17.000000000","message":"this is great, just a suggestion to improve the test mocking\n\nAlso, can we move this to be based on master and perhaps merge? - it looks to be independent of the parallel strategy chain","commit_id":"38d222860a725e59fa9052c8ae0f6e8b06f33ba6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b89281735b550b69693578e5bbf3244b72aa0c70","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"79e82385_b7520318","updated":"2024-10-03 09:05:30.000000000","message":"I\u0027m a co-author so leaving for another core to +A","commit_id":"b74d022574dbb662caf829e977e3220e0bbb8939"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"835ec6fbda99d04aefde200be66d95204ce22763","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"9b692b32_0a7b652f","updated":"2024-10-11 15:59:46.000000000","message":"I think I would prefer these tests to use a slightly different style, I ended up rewording them to remove some mocking and just use an improved Fake to convince myself they covered the behaviors we want to maintain - but everything seems in order so I see no reason to delay merge.  The new test infra can be an optional follow-up.","commit_id":"7980b6a0d371c97dd3a381d6cd645d8b19f7dcb7"}],"swift/obj/expirer.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":true,"context_lines":[{"line_number":661,"context_line":"        return get_delay_reaping(self.delay_reaping_times, target_account,"},{"line_number":662,"context_line":"                                 target_container)"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    def _process_container(self, task_account, task_container,"},{"line_number":665,"context_line":"                           my_index, divisor):"},{"line_number":666,"context_line":"        \"\"\""},{"line_number":667,"context_line":"        Iterates the input task container, yields a task expire info dict for"}],"source_content_type":"text/x-python","patch_set":2,"id":"6953f0c5_71260a99","line":664,"updated":"2024-09-25 09:22:18.000000000","message":"nit:\n\nthe call graph is:\n\n``iter_task_to_expire -\u003e _process_container -\u003e iter_objects -\u003e _iter_items``\n\nIt\u0027d be nice if ``_process_container`` was also called ``_iter_\u003csomething\u003e``, perhaps ``_iter_task_container``","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"67c1ad5bd9b0786ae685010ce6d6e35fe423ff36","unresolved":false,"context_lines":[{"line_number":661,"context_line":"        return get_delay_reaping(self.delay_reaping_times, target_account,"},{"line_number":662,"context_line":"                                 target_container)"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    def _process_container(self, task_account, task_container,"},{"line_number":665,"context_line":"                           my_index, divisor):"},{"line_number":666,"context_line":"        \"\"\""},{"line_number":667,"context_line":"        Iterates the input task container, yields a task expire info dict for"}],"source_content_type":"text/x-python","patch_set":2,"id":"23743b71_03d8e5a7","line":664,"in_reply_to":"6953f0c5_71260a99","updated":"2024-10-01 05:31:30.000000000","message":"Done","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":true,"context_lines":[{"line_number":666,"context_line":"        \"\"\""},{"line_number":667,"context_line":"        Iterates the input task container, yields a task expire info dict for"},{"line_number":668,"context_line":"        each delete task if it is assigned to this expirer process."},{"line_number":669,"context_line":"        \"\"\""},{"line_number":670,"context_line":"        container_empty \u003d True"},{"line_number":671,"context_line":"        for o in self.swift.iter_objects(task_account, task_container):"},{"line_number":672,"context_line":"            container_empty \u003d False"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a81f0ab_7a25e41e","line":669,"updated":"2024-09-25 09:22:18.000000000","message":"ok. this is a faithful copy of what used to be inside the loop in ``iter_task_to_expire``","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"67c1ad5bd9b0786ae685010ce6d6e35fe423ff36","unresolved":false,"context_lines":[{"line_number":666,"context_line":"        \"\"\""},{"line_number":667,"context_line":"        Iterates the input task container, yields a task expire info dict for"},{"line_number":668,"context_line":"        each delete task if it is assigned to this expirer process."},{"line_number":669,"context_line":"        \"\"\""},{"line_number":670,"context_line":"        container_empty \u003d True"},{"line_number":671,"context_line":"        for o in self.swift.iter_objects(task_account, task_container):"},{"line_number":672,"context_line":"            container_empty \u003d False"}],"source_content_type":"text/x-python","patch_set":2,"id":"79514e8d_159c67f6","line":669,"in_reply_to":"5a81f0ab_7a25e41e","updated":"2024-10-01 05:31:30.000000000","message":"Acknowledged","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":true,"context_lines":[{"line_number":728,"context_line":"        \"\"\""},{"line_number":729,"context_line":"        for task_account, task_container in task_account_container_list:"},{"line_number":730,"context_line":"            try:"},{"line_number":731,"context_line":"                yield from self._process_container("},{"line_number":732,"context_line":"                    task_account, task_container, my_index, divisor"},{"line_number":733,"context_line":"                )"},{"line_number":734,"context_line":"            except UnexpectedResponse as err:"}],"source_content_type":"text/x-python","patch_set":2,"id":"a7b5b9e5_bd627fd0","line":731,"updated":"2024-09-25 09:22:18.000000000","message":"``yield from`` is a py3ism :( I\u0027m gong to guess that\u0027s why the py2 tests failed.\n\nI recently wanted to use this syntax on feature/mpu !","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"67c1ad5bd9b0786ae685010ce6d6e35fe423ff36","unresolved":false,"context_lines":[{"line_number":728,"context_line":"        \"\"\""},{"line_number":729,"context_line":"        for task_account, task_container in task_account_container_list:"},{"line_number":730,"context_line":"            try:"},{"line_number":731,"context_line":"                yield from self._process_container("},{"line_number":732,"context_line":"                    task_account, task_container, my_index, divisor"},{"line_number":733,"context_line":"                )"},{"line_number":734,"context_line":"            except UnexpectedResponse as err:"}],"source_content_type":"text/x-python","patch_set":2,"id":"eb738615_38ec0dda","line":731,"in_reply_to":"a7b5b9e5_bd627fd0","updated":"2024-10-01 05:31:30.000000000","message":"Done","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":true,"context_lines":[{"line_number":731,"context_line":"                yield from self._process_container("},{"line_number":732,"context_line":"                    task_account, task_container, my_index, divisor"},{"line_number":733,"context_line":"                )"},{"line_number":734,"context_line":"            except UnexpectedResponse as err:"},{"line_number":735,"context_line":"                self.logger.error("},{"line_number":736,"context_line":"                    \u0027Unexpected response while listing objects in container \u0027"},{"line_number":737,"context_line":"                    \u0027%(account)s %(container)s: %(err)s\u0027, {"}],"source_content_type":"text/x-python","patch_set":2,"id":"a57ff853_19b48e99","line":734,"updated":"2024-09-25 09:22:18.000000000","message":"while we\u0027re improving things, we might also have an ``except (Exception, Timeout)`` clause (see how ``self.delete_object`` handles both UnexpectedResponse and the Exception)","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"67c1ad5bd9b0786ae685010ce6d6e35fe423ff36","unresolved":false,"context_lines":[{"line_number":731,"context_line":"                yield from self._process_container("},{"line_number":732,"context_line":"                    task_account, task_container, my_index, divisor"},{"line_number":733,"context_line":"                )"},{"line_number":734,"context_line":"            except UnexpectedResponse as err:"},{"line_number":735,"context_line":"                self.logger.error("},{"line_number":736,"context_line":"                    \u0027Unexpected response while listing objects in container \u0027"},{"line_number":737,"context_line":"                    \u0027%(account)s %(container)s: %(err)s\u0027, {"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ca347c8_ff28be22","line":734,"in_reply_to":"a57ff853_19b48e99","updated":"2024-10-01 05:31:30.000000000","message":"Done","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":true,"context_lines":[{"line_number":739,"context_line":"                        \u0027container\u0027: task_container,"},{"line_number":740,"context_line":"                        \u0027err\u0027: str(err)"},{"line_number":741,"context_line":"                    })"},{"line_number":742,"context_line":"                continue  # Move to the next container"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def run_once(self, *args, **kwargs):"},{"line_number":745,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"08d078ae_5b709a04","line":742,"updated":"2024-09-25 09:22:18.000000000","message":"``continue`` isn\u0027t necessary here - it\u0027s the last line of the for loop","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"67c1ad5bd9b0786ae685010ce6d6e35fe423ff36","unresolved":false,"context_lines":[{"line_number":739,"context_line":"                        \u0027container\u0027: task_container,"},{"line_number":740,"context_line":"                        \u0027err\u0027: str(err)"},{"line_number":741,"context_line":"                    })"},{"line_number":742,"context_line":"                continue  # Move to the next container"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def run_once(self, *args, **kwargs):"},{"line_number":745,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"b2998819_c7cd3e80","line":742,"in_reply_to":"08d078ae_5b709a04","updated":"2024-10-01 05:31:30.000000000","message":"Acknowledged","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4d4d51c21505686f42decd5a06467330bec4aaa2","unresolved":true,"context_lines":[{"line_number":340,"context_line":"        container_empty \u003d True"},{"line_number":341,"context_line":"        for o in self.swift.iter_objects(task_account,"},{"line_number":342,"context_line":"                                         task_container,"},{"line_number":343,"context_line":"                                         acceptable_statuses\u003d[2]):"},{"line_number":344,"context_line":"            container_empty \u003d False"},{"line_number":345,"context_line":"            task_object \u003d o[\u0027name\u0027].encode(\u0027utf8\u0027) if six.PY2 else o[\u0027name\u0027]"},{"line_number":346,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"bd09bc6c_41fa0aaf","line":343,"range":{"start_line":343,"start_character":61,"end_line":343,"end_character":64},"updated":"2024-10-09 00:21:50.000000000","message":"No 404? What if the container is emptied and deleted by some other expirer in between our listings? Or it gets deleted prior to our first listing?\n\nOh, I see -- we moved the handling down below...","commit_id":"7980b6a0d371c97dd3a381d6cd645d8b19f7dcb7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8e27ab6bb5a81337caf30bb69cc7a21d01554b5b","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        container_empty \u003d True"},{"line_number":341,"context_line":"        for o in self.swift.iter_objects(task_account,"},{"line_number":342,"context_line":"                                         task_container,"},{"line_number":343,"context_line":"                                         acceptable_statuses\u003d[2]):"},{"line_number":344,"context_line":"            container_empty \u003d False"},{"line_number":345,"context_line":"            task_object \u003d o[\u0027name\u0027].encode(\u0027utf8\u0027) if six.PY2 else o[\u0027name\u0027]"},{"line_number":346,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"b8b193ad_b54b0f09","line":343,"range":{"start_line":343,"start_character":61,"end_line":343,"end_character":64},"in_reply_to":"bd09bc6c_41fa0aaf","updated":"2024-10-09 08:46:42.000000000","message":"Acknowledged","commit_id":"7980b6a0d371c97dd3a381d6cd645d8b19f7dcb7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4d4d51c21505686f42decd5a06467330bec4aaa2","unresolved":true,"context_lines":[{"line_number":404,"context_line":"                        task_account, task_container, my_index, divisor):"},{"line_number":405,"context_line":"                    yield item"},{"line_number":406,"context_line":"            except UnexpectedResponse as err:"},{"line_number":407,"context_line":"                if err.resp.status_int !\u003d 404:"},{"line_number":408,"context_line":"                    self.logger.error("},{"line_number":409,"context_line":"                        \u0027Unexpected response while listing objects in \u0027"},{"line_number":410,"context_line":"                        \u0027container %(account)s %(container)s: %(err)s\u0027, {"}],"source_content_type":"text/x-python","patch_set":5,"id":"16d9d165_2de75d06","line":407,"updated":"2024-10-09 00:21:50.000000000","message":"What\u0027s the advantage of having the carve-out down here, instead of using the default `acceptable_statuses`? Is it just to avoid the spurious delete on a 404? How often does that actually happen?\n\nIt\u0027s just weird to catch an `UnexpectedResponse` then say, \"wait, actually *this* is still acceptable.\"","commit_id":"7980b6a0d371c97dd3a381d6cd645d8b19f7dcb7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8e27ab6bb5a81337caf30bb69cc7a21d01554b5b","unresolved":true,"context_lines":[{"line_number":404,"context_line":"                        task_account, task_container, my_index, divisor):"},{"line_number":405,"context_line":"                    yield item"},{"line_number":406,"context_line":"            except UnexpectedResponse as err:"},{"line_number":407,"context_line":"                if err.resp.status_int !\u003d 404:"},{"line_number":408,"context_line":"                    self.logger.error("},{"line_number":409,"context_line":"                        \u0027Unexpected response while listing objects in \u0027"},{"line_number":410,"context_line":"                        \u0027container %(account)s %(container)s: %(err)s\u0027, {"}],"source_content_type":"text/x-python","patch_set":5,"id":"a9da147f_ed576e83","line":407,"in_reply_to":"16d9d165_2de75d06","updated":"2024-10-09 08:46:42.000000000","message":"We had a period during the transition from 100 to 10000 task containers when we saw a lot of container DELETE 404s, and they repeated every cycle, because the containers didn\u0027t actually exist.\n\nFurther, the (experimental) parallel strategy pads its task container lists to include all *expected* containers per day, regardless of whether they exist, so non-existent containers could be a regular occurrence.\n\nIMHO the internal client \u0027acceptable statuses\u0027 is a little odd (perhaps necessary for the iterators) because \"acceptable\" really means \"considered success\" and doesn\u0027t mean the same as \"unexpected\". If you read line 406 as ``except UnsuccessfulResponse`` I think it\u0027s a little less weird.","commit_id":"7980b6a0d371c97dd3a381d6cd645d8b19f7dcb7"}],"test/unit/obj/test_expirer.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":true,"context_lines":[{"line_number":2561,"context_line":"                mock_resp \u003d Response(status\u003d503)"},{"line_number":2562,"context_line":"                raise internal_client.UnexpectedResponse("},{"line_number":2563,"context_line":"                    \u0027Mocked error\u0027, mock_resp)"},{"line_number":2564,"context_line":"            yield from real_iter_objects(account, container)"},{"line_number":2565,"context_line":""},{"line_number":2566,"context_line":"        task_account_container_list \u003d ["},{"line_number":2567,"context_line":"            (\u0027.expiring_objects\u0027, self.just_past_time_container),"}],"source_content_type":"text/x-python","patch_set":2,"id":"f88d3ce0_5a5e7b12","line":2564,"range":{"start_line":2564,"start_character":12,"end_line":2564,"end_character":22},"updated":"2024-09-25 09:22:18.000000000","message":"py3ism\n\nSo FakeSwift.iter_objects *returns* a list whereas InternalClient.iter_objects returns an iterator. Hmm, not sure what to think of that. But amyway, here it is sufficient to just:\n\n```\nreturn real_iter_objects(account, container)\n```","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"67c1ad5bd9b0786ae685010ce6d6e35fe423ff36","unresolved":false,"context_lines":[{"line_number":2561,"context_line":"                mock_resp \u003d Response(status\u003d503)"},{"line_number":2562,"context_line":"                raise internal_client.UnexpectedResponse("},{"line_number":2563,"context_line":"                    \u0027Mocked error\u0027, mock_resp)"},{"line_number":2564,"context_line":"            yield from real_iter_objects(account, container)"},{"line_number":2565,"context_line":""},{"line_number":2566,"context_line":"        task_account_container_list \u003d ["},{"line_number":2567,"context_line":"            (\u0027.expiring_objects\u0027, self.just_past_time_container),"}],"source_content_type":"text/x-python","patch_set":2,"id":"e78bbcdc_c87b4259","line":2564,"range":{"start_line":2564,"start_character":12,"end_line":2564,"end_character":22},"in_reply_to":"f88d3ce0_5a5e7b12","updated":"2024-10-01 05:31:30.000000000","message":"Acknowledged","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":true,"context_lines":[{"line_number":2573,"context_line":"            for target_path in self.expired_target_paths[self.past_time]]"},{"line_number":2574,"context_line":""},{"line_number":2575,"context_line":"        with mock.patch.object(self.expirer.swift, \u0027iter_objects\u0027,"},{"line_number":2576,"context_line":"                               side_effect\u003dmock_iter_objects):"},{"line_number":2577,"context_line":"            with mock.patch.object(self.expirer.swift, \u0027delete_container\u0027) \\"},{"line_number":2578,"context_line":"                    as mock_delete_container:"},{"line_number":2579,"context_line":"                self.assertEqual("}],"source_content_type":"text/x-python","patch_set":2,"id":"54318ed4_ea406f51","line":2576,"range":{"start_line":2576,"start_character":31,"end_line":2576,"end_character":43},"updated":"2024-09-25 09:22:18.000000000","message":"not sure it\u0027s necessary to use side_effect: you can just replace the \u0027iter_objects\u0027 method with the mock","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"67c1ad5bd9b0786ae685010ce6d6e35fe423ff36","unresolved":false,"context_lines":[{"line_number":2573,"context_line":"            for target_path in self.expired_target_paths[self.past_time]]"},{"line_number":2574,"context_line":""},{"line_number":2575,"context_line":"        with mock.patch.object(self.expirer.swift, \u0027iter_objects\u0027,"},{"line_number":2576,"context_line":"                               side_effect\u003dmock_iter_objects):"},{"line_number":2577,"context_line":"            with mock.patch.object(self.expirer.swift, \u0027delete_container\u0027) \\"},{"line_number":2578,"context_line":"                    as mock_delete_container:"},{"line_number":2579,"context_line":"                self.assertEqual("}],"source_content_type":"text/x-python","patch_set":2,"id":"3b97dbec_a64d626f","line":2576,"range":{"start_line":2576,"start_character":31,"end_line":2576,"end_character":43},"in_reply_to":"54318ed4_ea406f51","updated":"2024-10-01 05:31:30.000000000","message":"Acknowledged","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":true,"context_lines":[{"line_number":2582,"context_line":"                    expected)"},{"line_number":2583,"context_line":"        log_lines \u003d self.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":2584,"context_line":"        self.assertEqual("},{"line_number":2585,"context_line":"            log_lines[0],"},{"line_number":2586,"context_line":"            \u0027Unexpected response while listing objects in container \u0027"},{"line_number":2587,"context_line":"            \u0027.expiring_objects %s: Mocked error\u0027"},{"line_number":2588,"context_line":"            % self.just_past_time_container,"}],"source_content_type":"text/x-python","patch_set":2,"id":"2e19f149_37131674","line":2585,"updated":"2024-09-25 09:22:18.000000000","message":"do we expect any other error logs? if not, then\n\n```\nself.assertEqual(\n    log_lines,\n    [\u0027Unexpected response while listing objects in container \u0027\n     \u0027.expiring_objects %s: Mocked error\u0027\n     % self.just_past_time_container]\n)\n```","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"67c1ad5bd9b0786ae685010ce6d6e35fe423ff36","unresolved":false,"context_lines":[{"line_number":2582,"context_line":"                    expected)"},{"line_number":2583,"context_line":"        log_lines \u003d self.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":2584,"context_line":"        self.assertEqual("},{"line_number":2585,"context_line":"            log_lines[0],"},{"line_number":2586,"context_line":"            \u0027Unexpected response while listing objects in container \u0027"},{"line_number":2587,"context_line":"            \u0027.expiring_objects %s: Mocked error\u0027"},{"line_number":2588,"context_line":"            % self.just_past_time_container,"}],"source_content_type":"text/x-python","patch_set":2,"id":"95f06d3e_5c4331f7","line":2585,"in_reply_to":"2e19f149_37131674","updated":"2024-10-01 05:31:30.000000000","message":"Done","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":true,"context_lines":[{"line_number":2591,"context_line":"        self.assertEqual("},{"line_number":2592,"context_line":"            {\u0027tasks.assigned\u0027: 5},"},{"line_number":2593,"context_line":"            self.expirer.logger.statsd_client.get_increment_counts()"},{"line_number":2594,"context_line":"        )"},{"line_number":2595,"context_line":""},{"line_number":2596,"context_line":"    def test_iter_task_to_expire_unexpected_response_on_empty_container(self):"},{"line_number":2597,"context_line":"        # Test that object listing on an empty container returns 503 and"}],"source_content_type":"text/x-python","patch_set":2,"id":"becc2fa6_6b6bad29","line":2594,"updated":"2024-09-25 09:22:18.000000000","message":"reverted fix and I see this fail\n\n```\naccount \u003d \u0027.expiring_objects\u0027, container \u003d \u00271727222305\u0027\n\n    def mock_iter_objects(account, container):\n        if container \u003d\u003d self.just_past_time_container:\n            mock_resp \u003d Response(status\u003d503)\n\u003e           raise internal_client.UnexpectedResponse(\n                \u0027Mocked error\u0027, mock_resp)\nE           swift.common.internal_client.UnexpectedResponse: Mocked error\n\ntest_expirer.py:2562: UnexpectedResponse\n```","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"67c1ad5bd9b0786ae685010ce6d6e35fe423ff36","unresolved":false,"context_lines":[{"line_number":2591,"context_line":"        self.assertEqual("},{"line_number":2592,"context_line":"            {\u0027tasks.assigned\u0027: 5},"},{"line_number":2593,"context_line":"            self.expirer.logger.statsd_client.get_increment_counts()"},{"line_number":2594,"context_line":"        )"},{"line_number":2595,"context_line":""},{"line_number":2596,"context_line":"    def test_iter_task_to_expire_unexpected_response_on_empty_container(self):"},{"line_number":2597,"context_line":"        # Test that object listing on an empty container returns 503 and"}],"source_content_type":"text/x-python","patch_set":2,"id":"b529205a_12d58341","line":2594,"in_reply_to":"becc2fa6_6b6bad29","updated":"2024-10-01 05:31:30.000000000","message":"Acknowledged","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":true,"context_lines":[{"line_number":2624,"context_line":"            \u0027.expiring_objects %s: Mocked error\u0027"},{"line_number":2625,"context_line":"            % self.empty_time_container,"},{"line_number":2626,"context_line":"        )"},{"line_number":2627,"context_line":"        # This empty task container won\u0027t get deleted."},{"line_number":2628,"context_line":"        self.assertEqual(mock_delete_container.mock_calls, [])"},{"line_number":2629,"context_line":"        self.assertEqual("},{"line_number":2630,"context_line":"            {}, self.expirer.logger.statsd_client.get_increment_counts())"}],"source_content_type":"text/x-python","patch_set":2,"id":"ee3bf4ab_b2b7a48d","line":2627,"updated":"2024-09-25 09:22:18.000000000","message":"+1 good to check that the DELETE isn\u0027t called","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"67c1ad5bd9b0786ae685010ce6d6e35fe423ff36","unresolved":false,"context_lines":[{"line_number":2624,"context_line":"            \u0027.expiring_objects %s: Mocked error\u0027"},{"line_number":2625,"context_line":"            % self.empty_time_container,"},{"line_number":2626,"context_line":"        )"},{"line_number":2627,"context_line":"        # This empty task container won\u0027t get deleted."},{"line_number":2628,"context_line":"        self.assertEqual(mock_delete_container.mock_calls, [])"},{"line_number":2629,"context_line":"        self.assertEqual("},{"line_number":2630,"context_line":"            {}, self.expirer.logger.statsd_client.get_increment_counts())"}],"source_content_type":"text/x-python","patch_set":2,"id":"fbab51f6_83c8fbc1","line":2627,"in_reply_to":"ee3bf4ab_b2b7a48d","updated":"2024-10-01 05:31:30.000000000","message":"Acknowledged","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7df145cac8dbfea1cf3633d5154c8c2f7cfc977e","unresolved":true,"context_lines":[{"line_number":2627,"context_line":"        # This empty task container won\u0027t get deleted."},{"line_number":2628,"context_line":"        self.assertEqual(mock_delete_container.mock_calls, [])"},{"line_number":2629,"context_line":"        self.assertEqual("},{"line_number":2630,"context_line":"            {}, self.expirer.logger.statsd_client.get_increment_counts())"},{"line_number":2631,"context_line":""},{"line_number":2632,"context_line":"    def _setup_a_bunch_of_tasks("},{"line_number":2633,"context_line":"            self, now, num_days_before_now, num_days_after_now,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9ceaa_db3c985f","line":2630,"updated":"2024-09-25 09:22:18.000000000","message":"reverted fix and I see this fail\n\n```\n    def mock_iter_objects(account, container):\n        mock_resp \u003d Response(status\u003d503)\n\u003e       raise internal_client.UnexpectedResponse(\u0027Mocked error\u0027, mock_resp)\nE       swift.common.internal_client.UnexpectedResponse: Mocked error\n\ntest_expirer.py:2606: UnexpectedResponse\n```","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"67c1ad5bd9b0786ae685010ce6d6e35fe423ff36","unresolved":false,"context_lines":[{"line_number":2627,"context_line":"        # This empty task container won\u0027t get deleted."},{"line_number":2628,"context_line":"        self.assertEqual(mock_delete_container.mock_calls, [])"},{"line_number":2629,"context_line":"        self.assertEqual("},{"line_number":2630,"context_line":"            {}, self.expirer.logger.statsd_client.get_increment_counts())"},{"line_number":2631,"context_line":""},{"line_number":2632,"context_line":"    def _setup_a_bunch_of_tasks("},{"line_number":2633,"context_line":"            self, now, num_days_before_now, num_days_after_now,"}],"source_content_type":"text/x-python","patch_set":2,"id":"004b2d6c_fd27781f","line":2630,"in_reply_to":"ffb9ceaa_db3c985f","updated":"2024-10-01 05:31:30.000000000","message":"Acknowledged","commit_id":"71130baf26f0a179192664c8b0c643a7c0307151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bf5286a8c8cd194978c40b0f28bf4d06d67d52f9","unresolved":true,"context_lines":[{"line_number":2572,"context_line":"                           target_path)"},{"line_number":2573,"context_line":"            for target_path in self.expired_target_paths[self.past_time]]"},{"line_number":2574,"context_line":""},{"line_number":2575,"context_line":"        self.expirer.swift.iter_objects \u003d mock_iter_objects"},{"line_number":2576,"context_line":"        with mock.patch.object(self.expirer.swift, \u0027delete_container\u0027) \\"},{"line_number":2577,"context_line":"                as mock_delete_container:"},{"line_number":2578,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"063c3e05_38d3b065","line":2575,"updated":"2024-10-02 16:19:17.000000000","message":"I\u0027d recommend always using the mock.patch content manager to modify objects because it guarantees to revert the change as it exits. This is particularly important when modifying an instance var (self.expirer) just in case it gets re-used later in the test.\n\nI think my last comment wasn\u0027t clear, sorry. I meant that I *think* you can just write\n\n```\nwith mock.patch.object(self.expirer.swift, \u0027iter_objects\u0027, \n                       mock_iter_objects)\n```","commit_id":"38d222860a725e59fa9052c8ae0f6e8b06f33ba6"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"dffb9fc8f9fb9bc853eab35ad1d5be0cb95c12e7","unresolved":false,"context_lines":[{"line_number":2572,"context_line":"                           target_path)"},{"line_number":2573,"context_line":"            for target_path in self.expired_target_paths[self.past_time]]"},{"line_number":2574,"context_line":""},{"line_number":2575,"context_line":"        self.expirer.swift.iter_objects \u003d mock_iter_objects"},{"line_number":2576,"context_line":"        with mock.patch.object(self.expirer.swift, \u0027delete_container\u0027) \\"},{"line_number":2577,"context_line":"                as mock_delete_container:"},{"line_number":2578,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"892c4396_a8a3a979","line":2575,"in_reply_to":"063c3e05_38d3b065","updated":"2024-10-02 20:07:46.000000000","message":"Done","commit_id":"38d222860a725e59fa9052c8ae0f6e8b06f33ba6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bf5286a8c8cd194978c40b0f28bf4d06d67d52f9","unresolved":true,"context_lines":[{"line_number":2616,"context_line":"                           target_path)"},{"line_number":2617,"context_line":"            for target_path in self.expired_target_paths[self.past_time]]"},{"line_number":2618,"context_line":""},{"line_number":2619,"context_line":"        self.expirer.swift.iter_objects \u003d mock_iter_objects"},{"line_number":2620,"context_line":"        with mock.patch.object(self.expirer.swift, \u0027delete_container\u0027) \\"},{"line_number":2621,"context_line":"                as mock_delete_container:"},{"line_number":2622,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"6742cfb0_43d7533a","line":2619,"updated":"2024-10-02 16:19:17.000000000","message":"same comment as above","commit_id":"38d222860a725e59fa9052c8ae0f6e8b06f33ba6"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"dffb9fc8f9fb9bc853eab35ad1d5be0cb95c12e7","unresolved":false,"context_lines":[{"line_number":2616,"context_line":"                           target_path)"},{"line_number":2617,"context_line":"            for target_path in self.expired_target_paths[self.past_time]]"},{"line_number":2618,"context_line":""},{"line_number":2619,"context_line":"        self.expirer.swift.iter_objects \u003d mock_iter_objects"},{"line_number":2620,"context_line":"        with mock.patch.object(self.expirer.swift, \u0027delete_container\u0027) \\"},{"line_number":2621,"context_line":"                as mock_delete_container:"},{"line_number":2622,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"e8a91fa1_d9c814d7","line":2619,"in_reply_to":"6742cfb0_43d7533a","updated":"2024-10-02 20:07:46.000000000","message":"Done","commit_id":"38d222860a725e59fa9052c8ae0f6e8b06f33ba6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"835ec6fbda99d04aefde200be66d95204ce22763","unresolved":true,"context_lines":[{"line_number":1596,"context_line":"            if container \u003d\u003d self.just_past_time_container:"},{"line_number":1597,"context_line":"                mock_resp \u003d Response(status\u003d503)"},{"line_number":1598,"context_line":"                raise internal_client.UnexpectedResponse("},{"line_number":1599,"context_line":"                    \u0027Mocked error\u0027, mock_resp)"},{"line_number":1600,"context_line":"            return real_iter_objects(account, container)"},{"line_number":1601,"context_line":""},{"line_number":1602,"context_line":"        task_account_container_list \u003d ["}],"source_content_type":"text/x-python","patch_set":5,"id":"29048833_7d3328a4","line":1599,"updated":"2024-10-11 15:59:46.000000000","message":"Since self.expirer.swift is already a FakeInternalClient I might have expected us to either replace it this method directly or extend the aco_dict to stub exception responses.","commit_id":"7980b6a0d371c97dd3a381d6cd645d8b19f7dcb7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"835ec6fbda99d04aefde200be66d95204ce22763","unresolved":true,"context_lines":[{"line_number":1597,"context_line":"                mock_resp \u003d Response(status\u003d503)"},{"line_number":1598,"context_line":"                raise internal_client.UnexpectedResponse("},{"line_number":1599,"context_line":"                    \u0027Mocked error\u0027, mock_resp)"},{"line_number":1600,"context_line":"            return real_iter_objects(account, container)"},{"line_number":1601,"context_line":""},{"line_number":1602,"context_line":"        task_account_container_list \u003d ["},{"line_number":1603,"context_line":"            (\u0027.expiring_objects\u0027, self.just_past_time_container),"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa8a53a2_f3af5ab8","line":1600,"updated":"2024-10-11 15:59:46.000000000","message":"it\u0027s not *really* a \"real_iter_objects\" - it\u0027s just the \"fake_iter_objects\"","commit_id":"7980b6a0d371c97dd3a381d6cd645d8b19f7dcb7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"835ec6fbda99d04aefde200be66d95204ce22763","unresolved":true,"context_lines":[{"line_number":1602,"context_line":"        task_account_container_list \u003d ["},{"line_number":1603,"context_line":"            (\u0027.expiring_objects\u0027, self.just_past_time_container),"},{"line_number":1604,"context_line":"            (\u0027.expiring_objects\u0027, self.past_time_container)"},{"line_number":1605,"context_line":"        ]"},{"line_number":1606,"context_line":"        expected \u003d ["},{"line_number":1607,"context_line":"            self.make_task(self.past_time_container, self.past_time,"},{"line_number":1608,"context_line":"                           target_path)"}],"source_content_type":"text/x-python","patch_set":5,"id":"879d6244_9d51695a","line":1605,"updated":"2024-10-11 15:59:46.000000000","message":"this test was a little confusing to me because the order of the containers should be expected to be lexographical:\n\n```\n(Pdb) !task_account_container_list\n[(\u0027.expiring_objects\u0027, \u00271728604726\u0027), (\u0027.expiring_objects\u0027, \u00271728518326\u0027)]\n(Pdb) !sorted(task_account_container_list)\n[(\u0027.expiring_objects\u0027, \u00271728518326\u0027), (\u0027.expiring_objects\u0027, \u00271728604726\u0027)]\n```","commit_id":"7980b6a0d371c97dd3a381d6cd645d8b19f7dcb7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"835ec6fbda99d04aefde200be66d95204ce22763","unresolved":true,"context_lines":[{"line_number":1609,"context_line":"            for target_path in self.expired_target_paths[self.past_time]]"},{"line_number":1610,"context_line":""},{"line_number":1611,"context_line":"        with mock.patch.object(self.expirer.swift, \u0027iter_objects\u0027,"},{"line_number":1612,"context_line":"                               mock_iter_objects):"},{"line_number":1613,"context_line":"            with mock.patch.object(self.expirer.swift, \u0027delete_container\u0027) \\"},{"line_number":1614,"context_line":"                    as mock_delete_container:"},{"line_number":1615,"context_line":"                self.assertEqual("}],"source_content_type":"text/x-python","patch_set":5,"id":"be3d91e9_a7fe8ee4","line":1612,"updated":"2024-10-11 15:59:46.000000000","message":"I\u0027m a little surprised we don\u0027t make any assertions on the call order of this function","commit_id":"7980b6a0d371c97dd3a381d6cd645d8b19f7dcb7"}]}
