)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"55561fd5ad306ad210000aa378264455a3451995","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-05-14 21:20:08 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"tests: realistic task_container names"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ie5d8b555489d28c3b901e5bbebdcecbde7bb3367"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"15cbc1e0_1308a579","line":7,"updated":"2024-05-15 02:41:56.000000000","message":"it\u0027s not *just* tests","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-05-14 21:20:08 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"tests: realistic task_container names"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ie5d8b555489d28c3b901e5bbebdcecbde7bb3367"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9e222c83_9b3a6d98","line":7,"in_reply_to":"15cbc1e0_1308a579","updated":"2024-05-29 13:42:45.000000000","message":"Done","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"55561fd5ad306ad210000aa378264455a3451995","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"0ca5a5b0_ffbc9aed","updated":"2024-05-15 02:41:56.000000000","message":"a) it\u0027s probably a good idea for our tests to exercise stubs that we think represent the real world\n\nb) it\u0027d probably be a good idea to write the missing tests for invalid task container names\n\nc) when I introduce parallel task_container iteration, I want to rely on their generally being a predictable number of \"containers per day\" - that strategy makes less sense when tests just pick any old timestamp for the task container name.","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ba00a7b68e9792ab8ab3c60c6ef4dd105d828707","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4990233b_a71f03e1","updated":"2024-05-17 15:13:17.000000000","message":"suggestions including tests here https://review.opendev.org/c/openstack/swift/+/919966 sq? test iter_task_account_containers_to_expire names\n\nI wonder about the warning - am I right that after a config change we could see the warning until all the backlog has been cleared?","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f0a1bcf3_6b6d7cc3","in_reply_to":"4990233b_a71f03e1","updated":"2024-05-29 13:42:45.000000000","message":"OMG you\u0027re a saint - THANK YOU for writing those tests!!!  I wasn\u0027t sure we\u0027d have the stomach to even *attempt* a rework of the test setup, depending on how folks felt about me adding the expectation into the expirer design:\n\nhttps://review.opendev.org/c/openstack/swift/+/918366/comment/456ea7af_df97aa59/\n\nbut it sounds likprobae you\u0027re sufficiently onboard making stubs more realistic even just \"in general\" to not only approve but *help out* - that\u0027s amazing.\n\n\u003e am I right that after a config change we could see the warning until all the backlog has been cleared\n\nah, like a change in the *divisor* setting - no one should change that - it was a YAGNI thing added before expirer scaling was understood, and then when we added the REAL scaling value (\"per-divisor\") we didn\u0027t make that ONE configurable (yet) because we\u0027d been burned 😄\n\nYes - if someone changed the divisor setting 😭 they\u0027d see A LOT of warnings every cycle until all their delay_reaping tasks got cleared - that\u0027s not great at all.  I\u0027ll change to \"warn once and then just debug\"\n\nShould we deprecate the divisor setting!?","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f9b33891_8c7edf20","updated":"2024-05-28 19:06:51.000000000","message":"Did we end up squashing in any of Alistair\u0027s follow-up? Do we want to?","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"7cc6a6d0_0be351db","updated":"2024-05-29 13:42:45.000000000","message":"Thanks Tim!  I did another rev and tried to answer some questions - I think it\u0027s a little better!","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b58dfc018ec6cc2c86a489d06d415231bcf82e80","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"50537f99_bfd0362d","in_reply_to":"f9b33891_8c7edf20","updated":"2024-05-29 16:40:18.000000000","message":"OK, I think Al\u0027s tests are moot now that this is tests-only -- they were all about exploring the invalid/unexpected container name validation that\u0027s since been backed out.","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"cd589523a784a6844589a30cc542671a701489be","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"4380b78a_ebe0a00b","updated":"2024-05-29 15:51:51.000000000","message":"LGTM","commit_id":"c9108823e03f4b9e86f1fea5e6775b1808576609"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"55561fd5ad306ad210000aa378264455a3451995","unresolved":true,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"# Most clusters use the default \"expiring_objects_container_divisor\" of 86400."},{"line_number":182,"context_line":"# The number of expirer task containers \"per day\" is not configurable."},{"line_number":183,"context_line":"EXPIRER_CONTAINER_PER_DIVISOR \u003d 100"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"class InvalidHashPathConfigError(ValueError):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9b14bfde_6c95e483","line":183,"updated":"2024-05-15 02:41:56.000000000","message":"this could become a configurable option some day, but today we just make the magic number a constant","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"# Most clusters use the default \"expiring_objects_container_divisor\" of 86400."},{"line_number":182,"context_line":"# The number of expirer task containers \"per day\" is not configurable."},{"line_number":183,"context_line":"EXPIRER_CONTAINER_PER_DIVISOR \u003d 100"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"class InvalidHashPathConfigError(ValueError):"}],"source_content_type":"text/x-python","patch_set":1,"id":"cbf4357c_bba2ff8f","line":183,"in_reply_to":"9b14bfde_6c95e483","updated":"2024-05-29 13:42:45.000000000","message":"Done","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ba00a7b68e9792ab8ab3c60c6ef4dd105d828707","unresolved":true,"context_lines":[{"line_number":4193,"context_line":"    (native string) a/c/o."},{"line_number":4194,"context_line":"    \"\"\""},{"line_number":4195,"context_line":"    shard_int \u003d (int(hash_path(acc, cont, obj), 16) %"},{"line_number":4196,"context_line":"                 EXPIRER_CONTAINER_PER_DIVISOR)"},{"line_number":4197,"context_line":"    return normalize_delete_at_timestamp("},{"line_number":4198,"context_line":"        int(x_delete_at) // expirer_divisor * expirer_divisor - shard_int)"},{"line_number":4199,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ad242930_3d99a449","line":4196,"updated":"2024-05-17 15:13:17.000000000","message":"love it","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":false,"context_lines":[{"line_number":4193,"context_line":"    (native string) a/c/o."},{"line_number":4194,"context_line":"    \"\"\""},{"line_number":4195,"context_line":"    shard_int \u003d (int(hash_path(acc, cont, obj), 16) %"},{"line_number":4196,"context_line":"                 EXPIRER_CONTAINER_PER_DIVISOR)"},{"line_number":4197,"context_line":"    return normalize_delete_at_timestamp("},{"line_number":4198,"context_line":"        int(x_delete_at) // expirer_divisor * expirer_divisor - shard_int)"},{"line_number":4199,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"202b7ad5_28cd1ebe","line":4196,"in_reply_to":"ad242930_3d99a449","updated":"2024-05-29 13:42:45.000000000","message":"Acknowledged","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"}],"swift/obj/expirer.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"55561fd5ad306ad210000aa378264455a3451995","unresolved":true,"context_lines":[{"line_number":310,"context_line":"        for c in self.swift.iter_containers(task_account,"},{"line_number":311,"context_line":"                                            prefix\u003dself.task_container_prefix):"},{"line_number":312,"context_line":"            task_container \u003d str(c[\u0027name\u0027])"},{"line_number":313,"context_line":"            timestamp \u003d self.delete_at_time_of_task_container(task_container)"},{"line_number":314,"context_line":"            if timestamp \u003e Timestamp.now():"},{"line_number":315,"context_line":"                break"},{"line_number":316,"context_line":"            container_list.append(task_container)"}],"source_content_type":"text/x-python","patch_set":1,"id":"a4373f45_64504544","side":"PARENT","line":313,"updated":"2024-05-15 02:41:56.000000000","message":"this loop would have already blown up on lots of invalid container names","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        for c in self.swift.iter_containers(task_account,"},{"line_number":311,"context_line":"                                            prefix\u003dself.task_container_prefix):"},{"line_number":312,"context_line":"            task_container \u003d str(c[\u0027name\u0027])"},{"line_number":313,"context_line":"            timestamp \u003d self.delete_at_time_of_task_container(task_container)"},{"line_number":314,"context_line":"            if timestamp \u003e Timestamp.now():"},{"line_number":315,"context_line":"                break"},{"line_number":316,"context_line":"            container_list.append(task_container)"}],"source_content_type":"text/x-python","patch_set":1,"id":"a56d01da_73af8199","side":"PARENT","line":313,"in_reply_to":"a4373f45_64504544","updated":"2024-05-29 13:42:45.000000000","message":"Done","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ba00a7b68e9792ab8ab3c60c6ef4dd105d828707","unresolved":true,"context_lines":[{"line_number":307,"context_line":"        for c in self.swift.iter_containers(task_account,"},{"line_number":308,"context_line":"                                            prefix\u003dself.task_container_prefix):"},{"line_number":309,"context_line":"            try:"},{"line_number":310,"context_line":"                task_container_int \u003d int(c[\u0027name\u0027])"},{"line_number":311,"context_line":"            except ValueError:"},{"line_number":312,"context_line":"                # XXX untested?"},{"line_number":313,"context_line":"                self.logger.warning(\u0027invalid container name?\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"67b454c6_1be04df8","line":310,"updated":"2024-05-17 15:13:17.000000000","message":"should it be non-negative?","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":true,"context_lines":[{"line_number":307,"context_line":"        for c in self.swift.iter_containers(task_account,"},{"line_number":308,"context_line":"                                            prefix\u003dself.task_container_prefix):"},{"line_number":309,"context_line":"            try:"},{"line_number":310,"context_line":"                task_container_int \u003d int(c[\u0027name\u0027])"},{"line_number":311,"context_line":"            except ValueError:"},{"line_number":312,"context_line":"                # XXX untested?"},{"line_number":313,"context_line":"                self.logger.warning(\u0027invalid container name?\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"e44f5700_92cbe736","line":310,"in_reply_to":"67b454c6_1be04df8","updated":"2024-05-29 13:42:45.000000000","message":"it should!  #willfix","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ba00a7b68e9792ab8ab3c60c6ef4dd105d828707","unresolved":true,"context_lines":[{"line_number":310,"context_line":"                task_container_int \u003d int(c[\u0027name\u0027])"},{"line_number":311,"context_line":"            except ValueError:"},{"line_number":312,"context_line":"                # XXX untested?"},{"line_number":313,"context_line":"                self.logger.warning(\u0027invalid container name?\u0027)"},{"line_number":314,"context_line":"                continue"},{"line_number":315,"context_line":"            r \u003d ((task_container_int - 1) %"},{"line_number":316,"context_line":"                 self.expiring_objects_container_divisor)"}],"source_content_type":"text/x-python","patch_set":1,"id":"97d057cb_e9c96037","line":313,"updated":"2024-05-17 15:13:17.000000000","message":"would be good to include the container name in the message","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":true,"context_lines":[{"line_number":310,"context_line":"                task_container_int \u003d int(c[\u0027name\u0027])"},{"line_number":311,"context_line":"            except ValueError:"},{"line_number":312,"context_line":"                # XXX untested?"},{"line_number":313,"context_line":"                self.logger.warning(\u0027invalid container name?\u0027)"},{"line_number":314,"context_line":"                continue"},{"line_number":315,"context_line":"            r \u003d ((task_container_int - 1) %"},{"line_number":316,"context_line":"                 self.expiring_objects_container_divisor)"}],"source_content_type":"text/x-python","patch_set":1,"id":"e8caba21_85be75e3","line":313,"in_reply_to":"97d057cb_e9c96037","updated":"2024-05-29 13:42:45.000000000","message":"it would!  #willfix","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"55561fd5ad306ad210000aa378264455a3451995","unresolved":true,"context_lines":[{"line_number":315,"context_line":"            r \u003d ((task_container_int - 1) %"},{"line_number":316,"context_line":"                 self.expiring_objects_container_divisor)"},{"line_number":317,"context_line":"            if r \u003c (self.expiring_objects_container_divisor -"},{"line_number":318,"context_line":"                    utils.EXPIRER_CONTAINER_PER_DIVISOR):"},{"line_number":319,"context_line":"                # XXX untested?"},{"line_number":320,"context_line":"                self.logger.warning(\u0027unexpected container name?\u0027)"},{"line_number":321,"context_line":"            if task_container_int \u003e Timestamp.now():"}],"source_content_type":"text/x-python","patch_set":1,"id":"3abdbba5_81f4a4a2","line":318,"updated":"2024-05-15 02:41:56.000000000","message":"this math took me a few minutes to get right","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            r \u003d ((task_container_int - 1) %"},{"line_number":316,"context_line":"                 self.expiring_objects_container_divisor)"},{"line_number":317,"context_line":"            if r \u003c (self.expiring_objects_container_divisor -"},{"line_number":318,"context_line":"                    utils.EXPIRER_CONTAINER_PER_DIVISOR):"},{"line_number":319,"context_line":"                # XXX untested?"},{"line_number":320,"context_line":"                self.logger.warning(\u0027unexpected container name?\u0027)"},{"line_number":321,"context_line":"            if task_container_int \u003e Timestamp.now():"}],"source_content_type":"text/x-python","patch_set":1,"id":"c2bc3dca_8beb7d7a","line":318,"in_reply_to":"3abdbba5_81f4a4a2","updated":"2024-05-29 13:42:45.000000000","message":"Done","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ba00a7b68e9792ab8ab3c60c6ef4dd105d828707","unresolved":true,"context_lines":[{"line_number":317,"context_line":"            if r \u003c (self.expiring_objects_container_divisor -"},{"line_number":318,"context_line":"                    utils.EXPIRER_CONTAINER_PER_DIVISOR):"},{"line_number":319,"context_line":"                # XXX untested?"},{"line_number":320,"context_line":"                self.logger.warning(\u0027unexpected container name?\u0027)"},{"line_number":321,"context_line":"            if task_container_int \u003e Timestamp.now():"},{"line_number":322,"context_line":"                break"},{"line_number":323,"context_line":"            container_list.append(str(task_container_int))"}],"source_content_type":"text/x-python","patch_set":1,"id":"6390ad3d_777b4aa6","line":320,"updated":"2024-05-17 15:13:17.000000000","message":"I _think_ that this condition might be temporarily expected if the expiring_objects_container_divisor config changes...so it is good that this clause does not ``continue`` - but definitely worth having test coverage for that.\n\nhmmm, with delay_reaping I guess it\u0027s possible that this warning might fire for days after a config change?","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":true,"context_lines":[{"line_number":317,"context_line":"            if r \u003c (self.expiring_objects_container_divisor -"},{"line_number":318,"context_line":"                    utils.EXPIRER_CONTAINER_PER_DIVISOR):"},{"line_number":319,"context_line":"                # XXX untested?"},{"line_number":320,"context_line":"                self.logger.warning(\u0027unexpected container name?\u0027)"},{"line_number":321,"context_line":"            if task_container_int \u003e Timestamp.now():"},{"line_number":322,"context_line":"                break"},{"line_number":323,"context_line":"            container_list.append(str(task_container_int))"}],"source_content_type":"text/x-python","patch_set":1,"id":"ac9d6fe5_6e8d58f3","line":320,"in_reply_to":"6390ad3d_777b4aa6","updated":"2024-05-29 13:42:45.000000000","message":"yeah I hadn\u0027t considered that case very carefully - i was dreaming that no one has ever changed divisor and never should.\n\nIf we make per_day configuable, AND don\u0027t prevent ops from *decreaseing* the value - we\u0027ll have the same problem there.  Better to warn once and then debug.","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"}],"test/unit/obj/test_expirer.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"55561fd5ad306ad210000aa378264455a3451995","unresolved":true,"context_lines":[{"line_number":772,"context_line":"                                  swift\u003dself.fake_swift)"},{"line_number":773,"context_line":"        task_con_obj_list \u003d ["},{"line_number":774,"context_line":"            # objects in 0000 timestamp container"},{"line_number":775,"context_line":"            self.make_task(\u00270000\u0027, \u0027a/c0/o0\u0027),"},{"line_number":776,"context_line":"            self.make_task(\u00270000\u0027, \u0027a/c0/o1\u0027),"},{"line_number":777,"context_line":"            # objects in 0001 timestamp container"},{"line_number":778,"context_line":"            self.make_task(\u00270001\u0027, \u0027a/c1/o0\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"46aa1379_e565ef35","line":775,"updated":"2024-05-15 02:41:56.000000000","message":"if we want to change the signature of make_task to *require* the task_container I think this is the only test that would still need to be updated.","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":false,"context_lines":[{"line_number":772,"context_line":"                                  swift\u003dself.fake_swift)"},{"line_number":773,"context_line":"        task_con_obj_list \u003d ["},{"line_number":774,"context_line":"            # objects in 0000 timestamp container"},{"line_number":775,"context_line":"            self.make_task(\u00270000\u0027, \u0027a/c0/o0\u0027),"},{"line_number":776,"context_line":"            self.make_task(\u00270000\u0027, \u0027a/c0/o1\u0027),"},{"line_number":777,"context_line":"            # objects in 0001 timestamp container"},{"line_number":778,"context_line":"            self.make_task(\u00270001\u0027, \u0027a/c1/o0\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"7881f694_c4b8be0f","line":775,"in_reply_to":"46aa1379_e565ef35","updated":"2024-05-29 13:42:45.000000000","message":"Done","commit_id":"49ba4be1eb04a305140a5fd918389a2a211ccfc6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":true,"context_lines":[{"line_number":893,"context_line":""},{"line_number":894,"context_line":"    def make_task(self, task_container, delete_at, target,"},{"line_number":895,"context_line":"                  is_async_delete\u003dFalse):"},{"line_number":896,"context_line":"        task_container \u003d task_container or delete_at"},{"line_number":897,"context_line":"        return {"},{"line_number":898,"context_line":"            \u0027task_account\u0027: \u0027.expiring_objects\u0027,"},{"line_number":899,"context_line":"            \u0027task_container\u0027: task_container,"}],"source_content_type":"text/x-python","patch_set":3,"id":"b699f0f0_21765a2a","line":896,"updated":"2024-05-28 19:06:51.000000000","message":"Why is this needed? Don\u0027t we always pass in a `task_container`? Tests pass without it.","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":false,"context_lines":[{"line_number":893,"context_line":""},{"line_number":894,"context_line":"    def make_task(self, task_container, delete_at, target,"},{"line_number":895,"context_line":"                  is_async_delete\u003dFalse):"},{"line_number":896,"context_line":"        task_container \u003d task_container or delete_at"},{"line_number":897,"context_line":"        return {"},{"line_number":898,"context_line":"            \u0027task_account\u0027: \u0027.expiring_objects\u0027,"},{"line_number":899,"context_line":"            \u0027task_container\u0027: task_container,"}],"source_content_type":"text/x-python","patch_set":3,"id":"77a21517_75bcf3ec","line":896,"in_reply_to":"b699f0f0_21765a2a","updated":"2024-05-29 13:42:45.000000000","message":"leftover from a previous iteration when it was kwarg #willfix","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":true,"context_lines":[{"line_number":907,"context_line":"        x \u003d expirer.ObjectExpirer(self.conf, logger\u003dself.logger,"},{"line_number":908,"context_line":"                                  swift\u003dself.fake_swift)"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        def make_task(delete_at, target_path, is_async_delete\u003dFalse):"},{"line_number":911,"context_line":"            try:"},{"line_number":912,"context_line":"                a, c, o \u003d utils.split_path(\u0027/\u0027 + target_path, 3, 3, True)"},{"line_number":913,"context_line":"            except ValueError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"81293d95_0428012c","line":910,"updated":"2024-05-28 19:06:51.000000000","message":"Not sure I love `make_task` vs `self.make_task`... but it might allow the least amount of extra churn.","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":true,"context_lines":[{"line_number":907,"context_line":"        x \u003d expirer.ObjectExpirer(self.conf, logger\u003dself.logger,"},{"line_number":908,"context_line":"                                  swift\u003dself.fake_swift)"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        def make_task(delete_at, target_path, is_async_delete\u003dFalse):"},{"line_number":911,"context_line":"            try:"},{"line_number":912,"context_line":"                a, c, o \u003d utils.split_path(\u0027/\u0027 + target_path, 3, 3, True)"},{"line_number":913,"context_line":"            except ValueError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fbfc9d43_1e88256f","line":910,"in_reply_to":"81293d95_0428012c","updated":"2024-05-29 13:42:45.000000000","message":"agreed.  But it\u0027s only this test and I couldn\u0027t think of a better name.\n\n    self.make_task(container, delete_at, target)\n    make_task_pick_container(delete_at, target)\n    \n???","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":true,"context_lines":[{"line_number":912,"context_line":"                a, c, o \u003d utils.split_path(\u0027/\u0027 + target_path, 3, 3, True)"},{"line_number":913,"context_line":"            except ValueError:"},{"line_number":914,"context_line":"                # for this test\u0027s stubs, an invalid target_path will also get"},{"line_number":915,"context_line":"                # an unexpected task_container"},{"line_number":916,"context_line":"                return self.make_task(delete_at, delete_at, target_path,"},{"line_number":917,"context_line":"                                      is_async_delete\u003dis_async_delete)"},{"line_number":918,"context_line":"            task_container \u003d self.get_expirer_container(delete_at, a, c, o)"}],"source_content_type":"text/x-python","patch_set":3,"id":"d55a45b5_986c6434","line":915,"range":{"start_line":915,"start_character":21,"end_line":915,"end_character":31},"updated":"2024-05-28 19:06:51.000000000","message":"But not \"invalid\", right? I don\u0027t love the separate paths or how squishy \"an unexpected task_container\" sounds -- would it be so strange to do something like\n```\na, c, o \u003d utils.split_path(\u0027/\u0027 + target_path, 1, 3, True)\ntask_container \u003d self.get_expirer_container(delete_at, a or \u0027a\u0027, c or \u0027c\u0027, o or \u0027o\u0027)\nreturn self.make_task(task_container, delete_at, target_path,\n                      is_async_delete\u003dis_async_delete)\n```\nso we could just have the one return path?","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":false,"context_lines":[{"line_number":912,"context_line":"                a, c, o \u003d utils.split_path(\u0027/\u0027 + target_path, 3, 3, True)"},{"line_number":913,"context_line":"            except ValueError:"},{"line_number":914,"context_line":"                # for this test\u0027s stubs, an invalid target_path will also get"},{"line_number":915,"context_line":"                # an unexpected task_container"},{"line_number":916,"context_line":"                return self.make_task(delete_at, delete_at, target_path,"},{"line_number":917,"context_line":"                                      is_async_delete\u003dis_async_delete)"},{"line_number":918,"context_line":"            task_container \u003d self.get_expirer_container(delete_at, a, c, o)"}],"source_content_type":"text/x-python","patch_set":3,"id":"2029f732_ee78a7cf","line":915,"range":{"start_line":915,"start_character":21,"end_line":915,"end_character":31},"in_reply_to":"d55a45b5_986c6434","updated":"2024-05-29 13:42:45.000000000","message":"i think that would be fine also, the first path I noticed to hit the ValueError was literally `/invalid`","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":true,"context_lines":[{"line_number":951,"context_line":"            make_task(\u00270000\u0027, \u0027a/c0/o1\u0027),"},{"line_number":952,"context_line":"            # objects in 0001 timestamp container"},{"line_number":953,"context_line":"            make_task(\u00270001\u0027, \u0027a/c1/o0\u0027),"},{"line_number":954,"context_line":"            make_task(\u00270001\u0027, \u0027invalid1\u0027),"},{"line_number":955,"context_line":"            make_task(\u00270001\u0027, \u0027a/c1/o1\u0027),"},{"line_number":956,"context_line":"            # objects in 0002 timestamp container"},{"line_number":957,"context_line":"            make_task(\u00270002\u0027, \u0027a/c2/o0\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"c88737d8_4f24cd61","line":954,"updated":"2024-05-29 13:42:45.000000000","message":"this one","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":true,"context_lines":[{"line_number":1141,"context_line":"            mock.call(\u0027.expiring_objects\u0027, self.empty_time_container,"},{"line_number":1142,"context_line":"                      acceptable_statuses\u003d(2, 404, 409))])"},{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"        # non-existent container gets deleted inline"},{"line_number":1145,"context_line":"        task_account_container_list \u003d ["},{"line_number":1146,"context_line":"            (\u0027.expiring_objects\u0027, \u0027does-not-matter\u0027)"},{"line_number":1147,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":3,"id":"3e5b681d_666fa083","line":1144,"range":{"start_line":1144,"start_character":10,"end_line":1144,"end_character":22},"updated":"2024-05-28 19:06:51.000000000","message":"?\n\nIf it shows up in `task_account_container_list`, then I would have thought it exists... no?","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"83d81e49d6ac8778ec686cef6e7a0f5b3afdcc99","unresolved":true,"context_lines":[{"line_number":1141,"context_line":"            mock.call(\u0027.expiring_objects\u0027, self.empty_time_container,"},{"line_number":1142,"context_line":"                      acceptable_statuses\u003d(2, 404, 409))])"},{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"        # non-existent container gets deleted inline"},{"line_number":1145,"context_line":"        task_account_container_list \u003d ["},{"line_number":1146,"context_line":"            (\u0027.expiring_objects\u0027, \u0027does-not-matter\u0027)"},{"line_number":1147,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":3,"id":"32740280_c91c7a18","line":1144,"range":{"start_line":1144,"start_character":10,"end_line":1144,"end_character":22},"in_reply_to":"2a021cb3_bca9edc8","updated":"2024-05-30 14:57:21.000000000","message":"oh lame, I\u0027m used to dealing with FakeSwift instead of FakeInternalClient - this test seems useless.\n\nI think it\u0027d be a good bit more churn to drop FakeInternalClient, but we could probably do it - or maybe just port some specific tests to use FakeSwift.register on the account/container listing calls to get some better coverage on how a real InternalClient will deal with these scenarios.","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":false,"context_lines":[{"line_number":1141,"context_line":"            mock.call(\u0027.expiring_objects\u0027, self.empty_time_container,"},{"line_number":1142,"context_line":"                      acceptable_statuses\u003d(2, 404, 409))])"},{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"        # non-existent container gets deleted inline"},{"line_number":1145,"context_line":"        task_account_container_list \u003d ["},{"line_number":1146,"context_line":"            (\u0027.expiring_objects\u0027, \u0027does-not-matter\u0027)"},{"line_number":1147,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":3,"id":"5e7512b4_6982cab7","line":1144,"range":{"start_line":1144,"start_character":10,"end_line":1144,"end_character":22},"in_reply_to":"3e5b681d_666fa083","updated":"2024-05-29 13:42:45.000000000","message":"unlike, \"empty_time_container\" I *think* \"does-not-matter\" will get a 404 form our FakeSwift - which I think is the main thing this is trying to test (if it gets deleted between account listing and container listing) \n\nand we assert the expirer is robust to the error, and will issue a DELETE because the iter_task_objects is empty.\n\nMaybe not obviously relevant to the topic of the change; I think the comment was Al\u0027s","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b58dfc018ec6cc2c86a489d06d415231bcf82e80","unresolved":false,"context_lines":[{"line_number":1141,"context_line":"            mock.call(\u0027.expiring_objects\u0027, self.empty_time_container,"},{"line_number":1142,"context_line":"                      acceptable_statuses\u003d(2, 404, 409))])"},{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"        # non-existent container gets deleted inline"},{"line_number":1145,"context_line":"        task_account_container_list \u003d ["},{"line_number":1146,"context_line":"            (\u0027.expiring_objects\u0027, \u0027does-not-matter\u0027)"},{"line_number":1147,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":3,"id":"2a021cb3_bca9edc8","line":1144,"range":{"start_line":1144,"start_character":10,"end_line":1144,"end_character":22},"in_reply_to":"5e7512b4_6982cab7","updated":"2024-05-29 16:40:18.000000000","message":"It\u0027ll get an empty listing, just like `empty_time_container` -- since our fake is at the `iter_objects` level, there\u0027s no concept of a response status at all.","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"83d81e49d6ac8778ec686cef6e7a0f5b3afdcc99","unresolved":true,"context_lines":[{"line_number":1528,"context_line":"                        target_a, target_c, \u0027ostub\u0027)"},{"line_number":1529,"context_line":"                    oldest_current_container \u003d ("},{"line_number":1530,"context_line":"                        root_container - containers_per_day)"},{"line_number":1531,"context_line":"                    if Timestamp(task_container) \u003e\u003d oldest_current_container \\"},{"line_number":1532,"context_line":"                            or not self._is_task_reapable(now, stub_task):"},{"line_number":1533,"context_line":"                        suitable_targets.append((target_a, target_c))"},{"line_number":1534,"context_line":"                if not suitable_targets:"}],"source_content_type":"text/x-python","patch_set":4,"id":"0181d0ff_195a99fc","line":1531,"updated":"2024-05-30 14:57:21.000000000","message":"i noticed trying to pull this test-only patch out onto master that this test is added as part of the randomized task container iteration\n\ni\u0027ll need to split up this diff and squash this bit into that one","commit_id":"c9108823e03f4b9e86f1fea5e6775b1808576609"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":true,"context_lines":[{"line_number":1385,"context_line":"                                                          a, c, o)"},{"line_number":1386,"context_line":"        part, nodes \u003d self.container_ring.get_nodes("},{"line_number":1387,"context_line":"            \u0027.expiring_objects\u0027, delete_at_container)"},{"line_number":1388,"context_line":"        # proxy assigns each replica a node, index 0 for test stability"},{"line_number":1389,"context_line":"        nodes \u003d nodes[:node_count]"},{"line_number":1390,"context_line":"        headers.update({"},{"line_number":1391,"context_line":"            \u0027X-Delete-At\u0027: str(delete_at),"}],"source_content_type":"text/x-python","patch_set":3,"id":"f2fe1ed4_241348e3","line":1388,"range":{"start_line":1388,"start_character":53,"end_line":1388,"end_character":71},"updated":"2024-05-28 19:06:51.000000000","message":"Looks like it doesn\u0027t actually matter, the way you\u0027ve written the tests -- they still pass if I do `nodes \u003d nodes[-node_count:]`","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":true,"context_lines":[{"line_number":1385,"context_line":"                                                          a, c, o)"},{"line_number":1386,"context_line":"        part, nodes \u003d self.container_ring.get_nodes("},{"line_number":1387,"context_line":"            \u0027.expiring_objects\u0027, delete_at_container)"},{"line_number":1388,"context_line":"        # proxy assigns each replica a node, index 0 for test stability"},{"line_number":1389,"context_line":"        nodes \u003d nodes[:node_count]"},{"line_number":1390,"context_line":"        headers.update({"},{"line_number":1391,"context_line":"            \u0027X-Delete-At\u0027: str(delete_at),"}],"source_content_type":"text/x-python","patch_set":3,"id":"887c7e39_cbf2df1f","line":1388,"range":{"start_line":1388,"start_character":53,"end_line":1388,"end_character":71},"in_reply_to":"f2fe1ed4_241348e3","updated":"2024-05-29 13:42:45.000000000","message":"oh right, cause they just assert what ever was in the headers is used in the async update\n\nI think originally I had intended to just hard code the expected headers, but it looked stupid cause with this FakeRing it\u0027s always part 0 and the same node no matter what the container...\n\nno sure what would be best here, seems reasonbale enough for the helper to be reliably stable rather than random if a test author did want to depend on that.","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":false,"context_lines":[{"line_number":1394,"context_line":"            \u0027X-Delete-At-Host\u0027: \u0027,\u0027.join(\u0027%(ip)s:%(port)s\u0027 % n for n in nodes),"},{"line_number":1395,"context_line":"            \u0027X-Delete-At-Device\u0027: \u0027,\u0027.join(n[\u0027device\u0027] for n in nodes),"},{"line_number":1396,"context_line":"        })"},{"line_number":1397,"context_line":"        return headers"},{"line_number":1398,"context_line":""},{"line_number":1399,"context_line":"    def test_PUT_if_none_match_but_expired(self):"},{"line_number":1400,"context_line":"        inital_put \u003d next(self.ts)"}],"source_content_type":"text/x-python","patch_set":3,"id":"4edd2ac8_c5d9b4fd","line":1397,"updated":"2024-05-28 19:06:51.000000000","message":"It read a little funny to me, both changing the dict in-place *and* returning the dict, but I see the nicety of it when we actually go to use the helper.","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":false,"context_lines":[{"line_number":5669,"context_line":"            \u0027X-Container-Device\u0027: \u0027sdb1\u0027,"},{"line_number":5670,"context_line":"            \u0027X-Delete-At\u0027: 9999999999,"},{"line_number":5671,"context_line":"        }"},{"line_number":5672,"context_line":"        self._update_delete_at_headers(req_headers, node_count\u003d2)"},{"line_number":5673,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, method\u003d\u0027PUT\u0027, headers\u003dreq_headers)"},{"line_number":5674,"context_line":"        with fake_spawn(), mock.patch.object("},{"line_number":5675,"context_line":"                object_server, \u0027http_connect\u0027, fake_http_connect):"}],"source_content_type":"text/x-python","patch_set":3,"id":"af7bac49_6f041d6e","line":5672,"updated":"2024-05-28 19:06:51.000000000","message":"Good -- we use that `node_count` at least once.","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":false,"context_lines":[{"line_number":6680,"context_line":"        req_headers \u003d {"},{"line_number":6681,"context_line":"            \u0027X-Timestamp\u0027: \u00271\u0027,"},{"line_number":6682,"context_line":"            \u0027X-Trans-Id\u0027: \u00271234\u0027,"},{"line_number":6683,"context_line":"            \u0027X-Delete-At\u0027: \u00272\u0027,"},{"line_number":6684,"context_line":"            \u0027X-Backend-Storage-Policy-Index\u0027: str(int(policy)),"},{"line_number":6685,"context_line":"        }"},{"line_number":6686,"context_line":"        self._update_delete_at_headers(req_headers)"}],"source_content_type":"text/x-python","patch_set":3,"id":"e232edde_64ddaff3","line":6683,"updated":"2024-05-28 19:06:51.000000000","message":"Oh, yeah -- super weird that this wasn\u0027t present before...","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":true,"context_lines":[{"line_number":6688,"context_line":"            \u0027/v1/a/c/o\u0027,"},{"line_number":6689,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":6690,"context_line":"            headers\u003dreq_headers)"},{"line_number":6691,"context_line":"        self.object_controller.delete_at_update(\u0027PUT\u0027, 2, \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"},{"line_number":6692,"context_line":"                                                req, \u0027sda1\u0027, policy)"},{"line_number":6693,"context_line":"        self.assertEqual("},{"line_number":6694,"context_line":"            given_args, ["}],"source_content_type":"text/x-python","patch_set":3,"id":"643179d9_028df3e3","line":6691,"updated":"2024-05-29 13:42:45.000000000","message":"it took me awhile to realize the assertion takes the value from here; but I don\u0027t think it makes the test any weaker to have have it in the request headers.\n\nI think a PUT request *could* potentially call `delete_at_update(\u0027DELETE\u0027, orig_delete_at, ...` w/o a x-delete-at in the request headers; but not PUT I don\u0027t think?","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":false,"context_lines":[{"line_number":6733,"context_line":"                                                req, \u0027sda1\u0027, policy)"},{"line_number":6734,"context_line":"        self.assertEqual("},{"line_number":6735,"context_line":"            self.logger.get_lines_for_level(\u0027warning\u0027),"},{"line_number":6736,"context_line":"            [\u0027X-Delete-At-Container header must be specified for expiring \u0027"},{"line_number":6737,"context_line":"             \u0027objects background PUT to work properly. Making best guess as \u0027"},{"line_number":6738,"context_line":"             \u0027to the container name for now.\u0027])"},{"line_number":6739,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"5423df47_d72e7a8b","line":6736,"updated":"2024-05-28 19:06:51.000000000","message":"OK, good -- we still have at least one test that doesn\u0027t use the `_update_delete_at_headers` helper so we can test not having `X-Delete-At-Container`.","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":false,"context_lines":[{"line_number":6770,"context_line":"            \u0027X-Backend-Storage-Policy-Index\u0027: int(policy),"},{"line_number":6771,"context_line":"        }"},{"line_number":6772,"context_line":"        self._update_delete_at_headers(req_headers)"},{"line_number":6773,"context_line":"        req_headers.pop(\u0027X-Delete-At-Host\u0027)"},{"line_number":6774,"context_line":"        req \u003d Request.blank("},{"line_number":6775,"context_line":"            \u0027/v1/a/c/o\u0027,"},{"line_number":6776,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":3,"id":"254fc4f4_1784470b","line":6773,"updated":"2024-05-28 19:06:51.000000000","message":"Right, and even when we use the helper, it doesn\u0027t mean we have to keep *everything* it provides.","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c2337c37714f31b37b171490a8c2e39b2ce11f4b","unresolved":true,"context_lines":[{"line_number":6800,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":6801,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: 1,"},{"line_number":6802,"context_line":"                     \u0027X-Trans-Id\u0027: \u00271234\u0027,"},{"line_number":6803,"context_line":"                     \u0027X-Delete-At-Container\u0027: delete_at_container,"},{"line_number":6804,"context_line":"                     \u0027X-Delete-At-Host\u0027: \u0027\u0027,"},{"line_number":6805,"context_line":"                     \u0027X-Backend-Storage-Policy-Index\u0027: int(policy)})"},{"line_number":6806,"context_line":"        self.object_controller.delete_at_update(\u0027PUT\u0027, 2, \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"94b51704_c8d47321","line":6803,"updated":"2024-05-28 19:06:51.000000000","message":"...but it\u0027s still going to be timestamp 0, yeah? Was that just good luck?","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b58dfc018ec6cc2c86a489d06d415231bcf82e80","unresolved":false,"context_lines":[{"line_number":6800,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":6801,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: 1,"},{"line_number":6802,"context_line":"                     \u0027X-Trans-Id\u0027: \u00271234\u0027,"},{"line_number":6803,"context_line":"                     \u0027X-Delete-At-Container\u0027: delete_at_container,"},{"line_number":6804,"context_line":"                     \u0027X-Delete-At-Host\u0027: \u0027\u0027,"},{"line_number":6805,"context_line":"                     \u0027X-Backend-Storage-Policy-Index\u0027: int(policy)})"},{"line_number":6806,"context_line":"        self.object_controller.delete_at_update(\u0027PUT\u0027, 2, \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"85b7a0cd_d9b3ddef","line":6803,"in_reply_to":"4b306e6d_8b96b34b","updated":"2024-05-29 16:40:18.000000000","message":"Acknowledged","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ccdf31ae7c1fc4bb289bfc3b6b89e39456b1354d","unresolved":true,"context_lines":[{"line_number":6800,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":6801,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: 1,"},{"line_number":6802,"context_line":"                     \u0027X-Trans-Id\u0027: \u00271234\u0027,"},{"line_number":6803,"context_line":"                     \u0027X-Delete-At-Container\u0027: delete_at_container,"},{"line_number":6804,"context_line":"                     \u0027X-Delete-At-Host\u0027: \u0027\u0027,"},{"line_number":6805,"context_line":"                     \u0027X-Backend-Storage-Policy-Index\u0027: int(policy)})"},{"line_number":6806,"context_line":"        self.object_controller.delete_at_update(\u0027PUT\u0027, 2, \u0027a\u0027, \u0027c\u0027, \u0027o\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"4b306e6d_8b96b34b","line":6803,"in_reply_to":"94b51704_c8d47321","updated":"2024-05-29 13:42:45.000000000","message":"no, I think it\u0027s predicatable - delete-at 1 always lands in task container 0 because normalize won\u0027t allow for negative timestamps?\n\nIt hardly matters, we bail early on no x-delete-at-host, it could be \"booberries\" - but given the title of the change it seemed better to at least make it fixed width `0000000000` - also I think `1` for delete-at was arbitrary; if it changes to use `time.time()` or something else this would be more maintainable.","commit_id":"663d866e3453e7dee54cbb205afd4b74a6f79840"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b58dfc018ec6cc2c86a489d06d415231bcf82e80","unresolved":true,"context_lines":[{"line_number":1388,"context_line":"        # proxy assigns each replica a node, index 0 for test stability"},{"line_number":1389,"context_line":"        nodes \u003d nodes[:node_count]"},{"line_number":1390,"context_line":"        headers.update({"},{"line_number":1391,"context_line":"            \u0027X-Delete-At\u0027: str(delete_at),"},{"line_number":1392,"context_line":"            \u0027X-Delete-At-Container\u0027: delete_at_container,"},{"line_number":1393,"context_line":"            \u0027X-Delete-At-Partition\u0027: str(part),"},{"line_number":1394,"context_line":"            \u0027X-Delete-At-Host\u0027: \u0027,\u0027.join(\u0027%(ip)s:%(port)s\u0027 % n for n in nodes),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3c5536b0_98a8b628","line":1391,"updated":"2024-05-29 16:40:18.000000000","message":"This feels a little funny -- I guess it\u0027s that we want to make sure the header is a string?","commit_id":"c9108823e03f4b9e86f1fea5e6775b1808576609"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"83d81e49d6ac8778ec686cef6e7a0f5b3afdcc99","unresolved":false,"context_lines":[{"line_number":1388,"context_line":"        # proxy assigns each replica a node, index 0 for test stability"},{"line_number":1389,"context_line":"        nodes \u003d nodes[:node_count]"},{"line_number":1390,"context_line":"        headers.update({"},{"line_number":1391,"context_line":"            \u0027X-Delete-At\u0027: str(delete_at),"},{"line_number":1392,"context_line":"            \u0027X-Delete-At-Container\u0027: delete_at_container,"},{"line_number":1393,"context_line":"            \u0027X-Delete-At-Partition\u0027: str(part),"},{"line_number":1394,"context_line":"            \u0027X-Delete-At-Host\u0027: \u0027,\u0027.join(\u0027%(ip)s:%(port)s\u0027 % n for n in nodes),"}],"source_content_type":"text/x-python","patch_set":4,"id":"97402557_8584d1e0","line":1391,"in_reply_to":"3c5536b0_98a8b628","updated":"2024-05-30 14:57:21.000000000","message":"what\u0027s funny about a header value being a string?  FWIW it doesn\u0027t seem to be strictly necessary - probaby just defensive.","commit_id":"c9108823e03f4b9e86f1fea5e6775b1808576609"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"cd589523a784a6844589a30cc542671a701489be","unresolved":true,"context_lines":[{"line_number":5664,"context_line":"            \u0027Content-Type\u0027: \u0027application/burrito\u0027,"},{"line_number":5665,"context_line":"            \u0027Content-Length\u0027: \u00270\u0027,"},{"line_number":5666,"context_line":"            \u0027X-Backend-Storage-Policy-Index\u0027: int(policy),"},{"line_number":5667,"context_line":"            \u0027X-Container-Partition\u0027: \u002720\u0027,"},{"line_number":5668,"context_line":"            \u0027X-Container-Host\u0027: \u00271.2.3.4:5\u0027,"},{"line_number":5669,"context_line":"            \u0027X-Container-Device\u0027: \u0027sdb1\u0027,"},{"line_number":5670,"context_line":"            \u0027X-Delete-At\u0027: 9999999999,"}],"source_content_type":"text/x-python","patch_set":4,"id":"98a95fc5_2c3ba8ce","line":5667,"updated":"2024-05-29 15:51:51.000000000","message":"we don\u0027t need below three lines anymore, since they will be all set within ``_update_delete_at_headers``? \n\n``            \u0027X-Container-Partition\u0027: \u002720\u0027,\n            \u0027X-Container-Host\u0027: \u00271.2.3.4:5\u0027,\n            \u0027X-Container-Device\u0027: \u0027sdb1\u0027,``","commit_id":"c9108823e03f4b9e86f1fea5e6775b1808576609"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"83d81e49d6ac8778ec686cef6e7a0f5b3afdcc99","unresolved":false,"context_lines":[{"line_number":5664,"context_line":"            \u0027Content-Type\u0027: \u0027application/burrito\u0027,"},{"line_number":5665,"context_line":"            \u0027Content-Length\u0027: \u00270\u0027,"},{"line_number":5666,"context_line":"            \u0027X-Backend-Storage-Policy-Index\u0027: int(policy),"},{"line_number":5667,"context_line":"            \u0027X-Container-Partition\u0027: \u002720\u0027,"},{"line_number":5668,"context_line":"            \u0027X-Container-Host\u0027: \u00271.2.3.4:5\u0027,"},{"line_number":5669,"context_line":"            \u0027X-Container-Device\u0027: \u0027sdb1\u0027,"},{"line_number":5670,"context_line":"            \u0027X-Delete-At\u0027: 9999999999,"}],"source_content_type":"text/x-python","patch_set":4,"id":"2634e1a7_55b05729","line":5667,"in_reply_to":"0a200309_3c86fe79","updated":"2024-05-30 14:57:21.000000000","message":"Acknowledged","commit_id":"c9108823e03f4b9e86f1fea5e6775b1808576609"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b58dfc018ec6cc2c86a489d06d415231bcf82e80","unresolved":true,"context_lines":[{"line_number":5664,"context_line":"            \u0027Content-Type\u0027: \u0027application/burrito\u0027,"},{"line_number":5665,"context_line":"            \u0027Content-Length\u0027: \u00270\u0027,"},{"line_number":5666,"context_line":"            \u0027X-Backend-Storage-Policy-Index\u0027: int(policy),"},{"line_number":5667,"context_line":"            \u0027X-Container-Partition\u0027: \u002720\u0027,"},{"line_number":5668,"context_line":"            \u0027X-Container-Host\u0027: \u00271.2.3.4:5\u0027,"},{"line_number":5669,"context_line":"            \u0027X-Container-Device\u0027: \u0027sdb1\u0027,"},{"line_number":5670,"context_line":"            \u0027X-Delete-At\u0027: 9999999999,"}],"source_content_type":"text/x-python","patch_set":4,"id":"0a200309_3c86fe79","line":5667,"in_reply_to":"98a95fc5_2c3ba8ce","updated":"2024-05-29 16:40:18.000000000","message":"No, we still want these -- they\u0027re for the normal container update, rather than the expiry-queue update. We got rid of the `X-Delete-At-*` headers, though.","commit_id":"c9108823e03f4b9e86f1fea5e6775b1808576609"}]}
