)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0ca84fb8c84a22d3ada2e3f95242c67d1ebc704b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"add ratelimit to expirer"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: If75dabb431bddd4ad6100e41395bb6c31a4ce569"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9f560f44_d7208ab4","line":9,"updated":"2020-10-02 23:32:43.000000000","message":"Partial-Bug: 1784753","commit_id":"dd1e1476eed96de771a7d933118c0acdb9f478af"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4026e3c8930d0f38ce10d8c4ed79a5dafd34d060","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This allows operators to throttle expirers as needed."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Partial-Bug: #1784753"},{"line_number":12,"context_line":"Change-Id: If75dabb431bddd4ad6100e41395bb6c31a4ce569"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3f65232a_0984d20b","line":11,"updated":"2020-10-23 15:36:46.000000000","message":"YES!  I love that bug","commit_id":"b05ad82959f41c5831ca7765e0b36594d6e2bf23"}],"swift/obj/expirer.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0ca84fb8c84a22d3ada2e3f95242c67d1ebc704b","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.conf \u003d conf"},{"line_number":81,"context_line":"        self.logger \u003d logger or get_logger(conf, log_route\u003d\u0027object-expirer\u0027)"},{"line_number":82,"context_line":"        self.interval \u003d int(conf.get(\u0027interval\u0027) or 300)"},{"line_number":83,"context_line":"        self.tasks_per_second \u003d int(conf.get(\u0027tasks_per_second\u0027, 50))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self.conf_path \u003d \\"},{"line_number":86,"context_line":"            self.conf.get(\u0027__file__\u0027) or \u0027/etc/swift/object-expirer.conf\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_773a5ee6","line":83,"updated":"2020-10-02 23:32:43.000000000","message":"I like the name, especially if we ever continue with https://review.opendev.org/#/c/517389/","commit_id":"dd1e1476eed96de771a7d933118c0acdb9f478af"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0ca84fb8c84a22d3ada2e3f95242c67d1ebc704b","unresolved":false,"context_lines":[{"line_number":355,"context_line":"                rate_limited_iter \u003d RateLimitedIterator("},{"line_number":356,"context_line":"                    delete_task_iter,"},{"line_number":357,"context_line":"                    elements_per_second\u003dself.tasks_per_second)"},{"line_number":358,"context_line":"                for delete_task in rate_limited_iter:"},{"line_number":359,"context_line":"                    pool.spawn_n(self.delete_object, **delete_task)"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"            pool.waitall()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_9710d25b","line":358,"updated":"2020-10-02 23:32:43.000000000","message":"So this is limiting the tasks for this particular container; is there a hazard that when containers are sparsely populated (say, because of https://bugs.launchpad.net/swift/+bug/1883561) we won\u0027t limit effectively?","commit_id":"dd1e1476eed96de771a7d933118c0acdb9f478af"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1f699692b1bfaaa154b11c45f6acb91280433644","unresolved":false,"context_lines":[{"line_number":355,"context_line":"                rate_limited_iter \u003d RateLimitedIterator("},{"line_number":356,"context_line":"                    delete_task_iter,"},{"line_number":357,"context_line":"                    elements_per_second\u003dself.tasks_per_second)"},{"line_number":358,"context_line":"                for delete_task in rate_limited_iter:"},{"line_number":359,"context_line":"                    pool.spawn_n(self.delete_object, **delete_task)"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"            pool.waitall()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_24841f0b","line":358,"in_reply_to":"9f560f44_6433b7f8","updated":"2020-10-05 19:45:45.000000000","message":"No, you\u0027re right -- I was being dumb. I saw the\n\n for task_account, my_index, divisor in \\\n     self.iter_task_accounts_to_expire():\n\nloop and for some reason read it as iterating over containers within the expiring objects account.","commit_id":"dd1e1476eed96de771a7d933118c0acdb9f478af"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9c7150a03981ce345a468e76847c6b07057a3783","unresolved":false,"context_lines":[{"line_number":355,"context_line":"                rate_limited_iter \u003d RateLimitedIterator("},{"line_number":356,"context_line":"                    delete_task_iter,"},{"line_number":357,"context_line":"                    elements_per_second\u003dself.tasks_per_second)"},{"line_number":358,"context_line":"                for delete_task in rate_limited_iter:"},{"line_number":359,"context_line":"                    pool.spawn_n(self.delete_object, **delete_task)"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"            pool.waitall()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_6433b7f8","line":358,"in_reply_to":"9f560f44_9710d25b","updated":"2020-10-05 19:23:41.000000000","message":"how do you mean \"for this particular container\" - I think it\u0027s a global iterator - all tasks in all containers\n\nI don\u0027t what order the come out, there\u0027s some crazy code \"round_robin_order\", but that\u0027s wrapping \"iter_task_to_expire\" which takes the whole \"task_account_container_list\"...\n\nin reading, wrapping the outer-most iter just before the spawn was the closest I could get.  It seemed to hit the number I wanted, but there may be other ways to do it.\n\nAny suggestions?","commit_id":"dd1e1476eed96de771a7d933118c0acdb9f478af"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bc7d8c3c055a8aa6582987f182cfa02fdd424a32","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.conf \u003d conf"},{"line_number":81,"context_line":"        self.logger \u003d logger or get_logger(conf, log_route\u003d\u0027object-expirer\u0027)"},{"line_number":82,"context_line":"        self.interval \u003d int(conf.get(\u0027interval\u0027) or 300)"},{"line_number":83,"context_line":"        self.tasks_per_second \u003d int(conf.get(\u0027tasks_per_second\u0027, 50))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self.conf_path \u003d \\"},{"line_number":86,"context_line":"            self.conf.get(\u0027__file__\u0027) or \u0027/etc/swift/object-expirer.conf\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f681702_7150dd33","line":83,"updated":"2020-10-19 19:53:26.000000000","message":"I wonder if this is a good default...","commit_id":"369cb48506b28b5d28def6ada46c87c93e55beca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3543bf4794906fadc8196495fefecd98b8829a0d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.conf \u003d conf"},{"line_number":81,"context_line":"        self.logger \u003d logger or get_logger(conf, log_route\u003d\u0027object-expirer\u0027)"},{"line_number":82,"context_line":"        self.interval \u003d int(conf.get(\u0027interval\u0027) or 300)"},{"line_number":83,"context_line":"        self.tasks_per_second \u003d int(conf.get(\u0027tasks_per_second\u0027, 50))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self.conf_path \u003d \\"},{"line_number":86,"context_line":"            self.conf.get(\u0027__file__\u0027) or \u0027/etc/swift/object-expirer.conf\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f65232a_9719298a","line":83,"in_reply_to":"5f681702_7150dd33","updated":"2020-10-22 17:11:28.000000000","message":"Seems reasonable, anyway. We can always update later if/as needed.","commit_id":"369cb48506b28b5d28def6ada46c87c93e55beca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"88018f868950e4a1773035ccffb373efb52cbce0","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.conf \u003d conf"},{"line_number":81,"context_line":"        self.logger \u003d logger or get_logger(conf, log_route\u003d\u0027object-expirer\u0027)"},{"line_number":82,"context_line":"        self.interval \u003d int(conf.get(\u0027interval\u0027) or 300)"},{"line_number":83,"context_line":"        self.tasks_per_second \u003d int(conf.get(\u0027tasks_per_second\u0027, 50))"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self.conf_path \u003d \\"},{"line_number":86,"context_line":"            self.conf.get(\u0027__file__\u0027) or \u0027/etc/swift/object-expirer.conf\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f65232a_be323da6","line":83,"range":{"start_line":83,"start_character":32,"end_line":83,"end_character":35},"updated":"2020-10-22 22:11:22.000000000","message":"Oh -- int, or float?","commit_id":"ac9a468abcfd6b0312ccf90aec6307446e4b1ae6"}],"test/unit/obj/test_expirer.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4026e3c8930d0f38ce10d8c4ed79a5dafd34d060","unresolved":false,"context_lines":[{"line_number":593,"context_line":"        self.assertEqual(calls, [(["},{"line_number":594,"context_line":"            self.make_task(self.past_time, target_path)"},{"line_number":595,"context_line":"            for target_path in self.expired_target_path_list"},{"line_number":596,"context_line":"        ], 2)])"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"    def test_skip_task_account_without_task_container(self):"},{"line_number":599,"context_line":"        fake_swift \u003d FakeInternalClient({"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f65232a_899e2261","line":596,"updated":"2020-10-23 15:36:46.000000000","message":"this test looks pretty good! thanks","commit_id":"b05ad82959f41c5831ca7765e0b36594d6e2bf23"}]}
