)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9fa2b90d0c631ebba528e4a942c03c869d6733e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"3fa64bfd_ca8cf63b","updated":"2023-06-21 18:17:16.000000000","message":"please go ahead and set WIP (Draft or something in the title, and Workflow -1) if you don\u0027t expect tests to be passing, but feel free to ping for ongoing feedback even before it\u0027s done!\n\nI think in this case you want to read up on different ways that python can help you express \"inheritience\"\n\nhttps://stackoverflow.com/questions/222877/what-does-super-do-in-python-difference-between-super-init-and-expl","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ed57e77ddc1c0ab305173cffde65c9e754e9a93d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"21d366f2_66ae53b8","updated":"2023-06-23 13:47:02.000000000","message":"follow up to tackle client_chunk_size https://review.opendev.org/c/openstack/swift/+/886823 proxy: remove client_chunk_size and skip_bytes from GetOrHeadHandler","commit_id":"b8dc7b3d353462adb16911f757918bf55ab99277"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"24153800539e19e89a7f1ea98b31eaa67f94139a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"30815175_e9f4193f","updated":"2023-06-27 02:12:43.000000000","message":"i\u0027m feeling pretty good about this - but I can\u0027t tell if it\u0027s still WIP and want to try keep going or if we\u0027re trying to find a half-done stopping point and do more work in follow-ups?","commit_id":"e290d47c435627082b3825b67e27ea3a3c99f01f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2b42d2e83db0d1782eb34b0cb8e4eade0584c5fe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"88e14549_a22662c5","updated":"2023-06-27 02:50:00.000000000","message":"ok, I can see where we\u0027re going\n\nhttps://review.opendev.org/c/openstack/swift/+/886994/\n\n... this is a great first step!","commit_id":"e290d47c435627082b3825b67e27ea3a3c99f01f"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9fa2b90d0c631ebba528e4a942c03c869d6733e3","unresolved":true,"context_lines":[{"line_number":1030,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1031,"context_line":"        self.used_nodes \u003d []"},{"line_number":1032,"context_line":"        self.used_source_etag \u003d \u0027\u0027"},{"line_number":1033,"context_line":"        self.concurrency \u003d concurrency"},{"line_number":1034,"context_line":"        self.policy \u003d policy"},{"line_number":1035,"context_line":"        self.node \u003d None"},{"line_number":1036,"context_line":"        self.source \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"65330aa8_35c37106","side":"PARENT","line":1033,"updated":"2023-06-21 18:17:16.000000000","message":"i think i\u0027m seeing this one went away ... and some of the \"used_*\" attrs","commit_id":"2343521f751388ba2e4158194fb8c2aabc28d08c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1030,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1031,"context_line":"        self.used_nodes \u003d []"},{"line_number":1032,"context_line":"        self.used_source_etag \u003d \u0027\u0027"},{"line_number":1033,"context_line":"        self.concurrency \u003d concurrency"},{"line_number":1034,"context_line":"        self.policy \u003d policy"},{"line_number":1035,"context_line":"        self.node \u003d None"},{"line_number":1036,"context_line":"        self.source \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"cdd85099_6d12770b","side":"PARENT","line":1033,"in_reply_to":"65330aa8_35c37106","updated":"2023-06-26 23:00:41.000000000","message":"Done","commit_id":"2343521f751388ba2e4158194fb8c2aabc28d08c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9fa2b90d0c631ebba528e4a942c03c869d6733e3","unresolved":true,"context_lines":[{"line_number":1052,"context_line":"        if newest is None:"},{"line_number":1053,"context_line":"            self.newest \u003d config_true_value(req.headers.get(\u0027x-newest\u0027, \u0027f\u0027))"},{"line_number":1054,"context_line":"        else:"},{"line_number":1055,"context_line":"            self.newest \u003d newest"},{"line_number":1056,"context_line":""},{"line_number":1057,"context_line":"        # populated when finding source"},{"line_number":1058,"context_line":"        self.statuses \u003d []"}],"source_content_type":"text/x-python","patch_set":3,"id":"72639b1f_a5c2cc12","side":"PARENT","line":1055,"updated":"2023-06-21 18:17:16.000000000","message":"this is gone too","commit_id":"2343521f751388ba2e4158194fb8c2aabc28d08c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1052,"context_line":"        if newest is None:"},{"line_number":1053,"context_line":"            self.newest \u003d config_true_value(req.headers.get(\u0027x-newest\u0027, \u0027f\u0027))"},{"line_number":1054,"context_line":"        else:"},{"line_number":1055,"context_line":"            self.newest \u003d newest"},{"line_number":1056,"context_line":""},{"line_number":1057,"context_line":"        # populated when finding source"},{"line_number":1058,"context_line":"        self.statuses \u003d []"}],"source_content_type":"text/x-python","patch_set":3,"id":"f76825a6_2714aaa5","side":"PARENT","line":1055,"in_reply_to":"72639b1f_a5c2cc12","updated":"2023-06-26 23:00:41.000000000","message":"Ack","commit_id":"2343521f751388ba2e4158194fb8c2aabc28d08c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9fa2b90d0c631ebba528e4a942c03c869d6733e3","unresolved":true,"context_lines":[{"line_number":1014,"context_line":"            return chunk"},{"line_number":1015,"context_line":""},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"class Getter(object):"},{"line_number":1018,"context_line":"    def __init__(self, app, req, server_type, node_iter, partition, policy,"},{"line_number":1019,"context_line":"                 path, backend_headers, logger\u003dNone, client_chunk_size\u003dNone):"},{"line_number":1020,"context_line":"        self.server_type \u003d server_type"}],"source_content_type":"text/x-python","patch_set":3,"id":"64a8beaf_4e704568","line":1017,"updated":"2023-06-21 18:17:16.000000000","message":"it seems to me as tho this is meant to be an Abstract Base Class - that it\u0027s not a concrete class that is supposed to get instantiated directly - that it\u0027s \"just\" a shell that the actual concrete implementations fill out.\n\nThat\u0027s a good pattern!  I think you could make it a little more \"obvious\" with a name like \"GetterBase\" and also define a couple of methods that describe/expose the expected interfaced shared between the concrete subclasses.\n\nsomething like this kind of pattern/idea:\n\n    class BaseDatastore(object):\n\n        def modify(self, offset, content):\n            data \u003d self.read()\n            data[offset] \u003d content\n            self.store(data)\n\n        def read(self):\n            raise NotImplementedError()\n\n        def store(self):\n            raise NotImplementedError()\n\n\n    class FileDatastore(BaseDatastore):\n\n        def read(self):\n            ...\n\n        def store(self):\n            ...\n\n    class ObjectDatastore(BaseDatastore)\n\n        def read(self):\n            ...\n\n        def store(self):\n            ...\n            \n\nAs an aside, in theory you could go the whole \"ZopeInterfaces\" style full on hardcore OOO type system abc module route: https://docs.python.org/3/library/abc.html but IME it\u0027s kind of complex for what you get and doesn\u0027t obviously improve mainteance (in fact, i\u0027m of the opinion, perhaps misguided, that doing that stuff is a turn-off/distraction to most experienced engineers who are already familiar with the design pattern but not necesarily the bespoke tools grafted onto dynamic languages to make java programmers feel better because OBJECT DESIGN AND TYPE SAFTEY!?).  \n\ne.g. python doesn\u0027t have *real* private members/attributes - but you can prefix them with an underscore if you want to hint at the idea or double-und if you REALLY want to be annoying (but please don\u0027t double-und on some misguided quest for \"the right way to do it\", because I\u0027ll just name mangle them to dig them out if I need to anyway and curse you while doing it).","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1014,"context_line":"            return chunk"},{"line_number":1015,"context_line":""},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"class Getter(object):"},{"line_number":1018,"context_line":"    def __init__(self, app, req, server_type, node_iter, partition, policy,"},{"line_number":1019,"context_line":"                 path, backend_headers, logger\u003dNone, client_chunk_size\u003dNone):"},{"line_number":1020,"context_line":"        self.server_type \u003d server_type"}],"source_content_type":"text/x-python","patch_set":3,"id":"b2204ca5_b2dfd11a","line":1017,"in_reply_to":"64a8beaf_4e704568","updated":"2023-06-26 23:00:41.000000000","message":"Done","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26b58d1f3a95f4884afb60c853ee35bb76a9714b","unresolved":true,"context_lines":[{"line_number":1027,"context_line":"        self.path \u003d path"},{"line_number":1028,"context_line":"        self.backend_headers \u003d backend_headers"},{"line_number":1029,"context_line":"        self.req_query_string \u003d req.query_string"},{"line_number":1030,"context_line":"        self.fragment_size \u003d policy.fragment_size"},{"line_number":1031,"context_line":"        self.skip_bytes \u003d 0"},{"line_number":1032,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1033,"context_line":"        self.source \u003d self.node \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"cdf1ac10_be7dde66","line":1030,"updated":"2023-06-22 13:30:49.000000000","message":"this probably should be self.client_chunk_size - we use self.client_chunk_size in learn_size_from_content_range, so it should be an attribute of this base class","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"        self.path \u003d path"},{"line_number":1028,"context_line":"        self.backend_headers \u003d backend_headers"},{"line_number":1029,"context_line":"        self.req_query_string \u003d req.query_string"},{"line_number":1030,"context_line":"        self.fragment_size \u003d policy.fragment_size"},{"line_number":1031,"context_line":"        self.skip_bytes \u003d 0"},{"line_number":1032,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1033,"context_line":"        self.source \u003d self.node \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ae5a1fc_858a9452","line":1030,"in_reply_to":"cdf1ac10_be7dde66","updated":"2023-06-26 23:00:41.000000000","message":"Ack","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7233c58c8701b7ce02d0665a025b1c67b4ffd73a","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"        self.path \u003d path"},{"line_number":1028,"context_line":"        self.backend_headers \u003d backend_headers"},{"line_number":1029,"context_line":"        self.req_query_string \u003d req.query_string"},{"line_number":1030,"context_line":"        self.fragment_size \u003d policy.fragment_size"},{"line_number":1031,"context_line":"        self.skip_bytes \u003d 0"},{"line_number":1032,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1033,"context_line":"        self.source \u003d self.node \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"c7ca8ace_be36bf20","line":1030,"in_reply_to":"cdf1ac10_be7dde66","updated":"2023-06-26 12:08:35.000000000","message":"Done","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26b58d1f3a95f4884afb60c853ee35bb76a9714b","unresolved":true,"context_lines":[{"line_number":1030,"context_line":"        self.fragment_size \u003d policy.fragment_size"},{"line_number":1031,"context_line":"        self.skip_bytes \u003d 0"},{"line_number":1032,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1033,"context_line":"        self.source \u003d self.node \u003d None"},{"line_number":1034,"context_line":"        self.source_parts_iter \u003d None"},{"line_number":1035,"context_line":"        self.latest_404_timestamp \u003d Timestamp(0)"},{"line_number":1036,"context_line":"        if self.server_type \u003d\u003d \u0027Object\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3c52d969_46a85ed5","line":1033,"updated":"2023-06-22 13:30:49.000000000","message":"In general, the base class should only have attributes that both of the existing classes have in common, so everything below here should remain in the GetOrHeadHandler subclass because they are specific to GetOrHeadHandler","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1030,"context_line":"        self.fragment_size \u003d policy.fragment_size"},{"line_number":1031,"context_line":"        self.skip_bytes \u003d 0"},{"line_number":1032,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1033,"context_line":"        self.source \u003d self.node \u003d None"},{"line_number":1034,"context_line":"        self.source_parts_iter \u003d None"},{"line_number":1035,"context_line":"        self.latest_404_timestamp \u003d Timestamp(0)"},{"line_number":1036,"context_line":"        if self.server_type \u003d\u003d \u0027Object\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fda9b006_5a174836","line":1033,"in_reply_to":"3c52d969_46a85ed5","updated":"2023-06-26 23:00:41.000000000","message":"Ack","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7233c58c8701b7ce02d0665a025b1c67b4ffd73a","unresolved":false,"context_lines":[{"line_number":1030,"context_line":"        self.fragment_size \u003d policy.fragment_size"},{"line_number":1031,"context_line":"        self.skip_bytes \u003d 0"},{"line_number":1032,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1033,"context_line":"        self.source \u003d self.node \u003d None"},{"line_number":1034,"context_line":"        self.source_parts_iter \u003d None"},{"line_number":1035,"context_line":"        self.latest_404_timestamp \u003d Timestamp(0)"},{"line_number":1036,"context_line":"        if self.server_type \u003d\u003d \u0027Object\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"60980f6e_f2746cce","line":1033,"in_reply_to":"3c52d969_46a85ed5","updated":"2023-06-26 12:08:35.000000000","message":"Done","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26b58d1f3a95f4884afb60c853ee35bb76a9714b","unresolved":true,"context_lines":[{"line_number":1059,"context_line":"        # populated from response headers"},{"line_number":1060,"context_line":"        self.start_byte \u003d self.end_byte \u003d self.length \u003d None"},{"line_number":1061,"context_line":""},{"line_number":1062,"context_line":"    def fast_forward(self, num_bytes):"},{"line_number":1063,"context_line":"        \"\"\""},{"line_number":1064,"context_line":"        Will skip num_bytes into the current ranges."},{"line_number":1065,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"05eb80c5_8530c3fe","line":1062,"updated":"2023-06-22 13:30:49.000000000","message":"yes, this method is identical in both classes so belongs in the superclass","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"        # populated from response headers"},{"line_number":1060,"context_line":"        self.start_byte \u003d self.end_byte \u003d self.length \u003d None"},{"line_number":1061,"context_line":""},{"line_number":1062,"context_line":"    def fast_forward(self, num_bytes):"},{"line_number":1063,"context_line":"        \"\"\""},{"line_number":1064,"context_line":"        Will skip num_bytes into the current ranges."},{"line_number":1065,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"85793d21_2e981b48","line":1062,"in_reply_to":"05eb80c5_8530c3fe","updated":"2023-06-26 23:00:41.000000000","message":"Ack","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"def95fe88df7a21939ad9b6d9a44732c8c285996","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"        # populated from response headers"},{"line_number":1060,"context_line":"        self.start_byte \u003d self.end_byte \u003d self.length \u003d None"},{"line_number":1061,"context_line":""},{"line_number":1062,"context_line":"    def fast_forward(self, num_bytes):"},{"line_number":1063,"context_line":"        \"\"\""},{"line_number":1064,"context_line":"        Will skip num_bytes into the current ranges."},{"line_number":1065,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"19463d73_b17004f4","line":1062,"in_reply_to":"05eb80c5_8530c3fe","updated":"2023-06-23 13:40:05.000000000","message":"Done","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26b58d1f3a95f4884afb60c853ee35bb76a9714b","unresolved":true,"context_lines":[{"line_number":1107,"context_line":"        # Reset so if we need to do this more than once, we don\u0027t double-up"},{"line_number":1108,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1109,"context_line":""},{"line_number":1110,"context_line":"    def pop_range(self):"},{"line_number":1111,"context_line":"        \"\"\""},{"line_number":1112,"context_line":"        Remove the first byterange from our Range header."},{"line_number":1113,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7424db42_77c27c9d","line":1110,"updated":"2023-06-22 13:30:49.000000000","message":"yes, this method is identical in both classes so belongs in the superclass","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1107,"context_line":"        # Reset so if we need to do this more than once, we don\u0027t double-up"},{"line_number":1108,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1109,"context_line":""},{"line_number":1110,"context_line":"    def pop_range(self):"},{"line_number":1111,"context_line":"        \"\"\""},{"line_number":1112,"context_line":"        Remove the first byterange from our Range header."},{"line_number":1113,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"d47deaa8_974d6d8b","line":1110,"in_reply_to":"7424db42_77c27c9d","updated":"2023-06-26 23:00:41.000000000","message":"Ack","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"def95fe88df7a21939ad9b6d9a44732c8c285996","unresolved":false,"context_lines":[{"line_number":1107,"context_line":"        # Reset so if we need to do this more than once, we don\u0027t double-up"},{"line_number":1108,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1109,"context_line":""},{"line_number":1110,"context_line":"    def pop_range(self):"},{"line_number":1111,"context_line":"        \"\"\""},{"line_number":1112,"context_line":"        Remove the first byterange from our Range header."},{"line_number":1113,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"8b7abeda_558dab88","line":1110,"in_reply_to":"7424db42_77c27c9d","updated":"2023-06-23 13:40:05.000000000","message":"Done","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26b58d1f3a95f4884afb60c853ee35bb76a9714b","unresolved":true,"context_lines":[{"line_number":1131,"context_line":"            else:"},{"line_number":1132,"context_line":"                self.backend_headers.pop(\u0027Range\u0027)"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    def learn_size_from_content_range(self, start, end, length):"},{"line_number":1135,"context_line":"        \"\"\""},{"line_number":1136,"context_line":"        If client_chunk_size is set, makes sure we yield things starting on"},{"line_number":1137,"context_line":"        chunk boundaries based on the Content-Range header in the response."}],"source_content_type":"text/x-python","patch_set":3,"id":"49393747_c54cc9ad","line":1134,"updated":"2023-06-22 13:30:49.000000000","message":"this method is *almost* identical in both classes so it\u0027s worth us working on making it identical so that it can be shared in the superclass","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7233c58c8701b7ce02d0665a025b1c67b4ffd73a","unresolved":false,"context_lines":[{"line_number":1131,"context_line":"            else:"},{"line_number":1132,"context_line":"                self.backend_headers.pop(\u0027Range\u0027)"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    def learn_size_from_content_range(self, start, end, length):"},{"line_number":1135,"context_line":"        \"\"\""},{"line_number":1136,"context_line":"        If client_chunk_size is set, makes sure we yield things starting on"},{"line_number":1137,"context_line":"        chunk boundaries based on the Content-Range header in the response."}],"source_content_type":"text/x-python","patch_set":3,"id":"72276c93_38910843","line":1134,"in_reply_to":"49393747_c54cc9ad","updated":"2023-06-26 12:08:35.000000000","message":"Done","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1131,"context_line":"            else:"},{"line_number":1132,"context_line":"                self.backend_headers.pop(\u0027Range\u0027)"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    def learn_size_from_content_range(self, start, end, length):"},{"line_number":1135,"context_line":"        \"\"\""},{"line_number":1136,"context_line":"        If client_chunk_size is set, makes sure we yield things starting on"},{"line_number":1137,"context_line":"        chunk boundaries based on the Content-Range header in the response."}],"source_content_type":"text/x-python","patch_set":3,"id":"e213fb7c_43faf1cc","line":1134,"in_reply_to":"49393747_c54cc9ad","updated":"2023-06-26 23:00:41.000000000","message":"Done","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26b58d1f3a95f4884afb60c853ee35bb76a9714b","unresolved":true,"context_lines":[{"line_number":1149,"context_line":"            return"},{"line_number":1150,"context_line":""},{"line_number":1151,"context_line":"        if self.client_chunk_size:"},{"line_number":1152,"context_line":"            self.skip_bytes \u003d bytes_to_skip(self.client_chunk_size, start)"},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"        if \u0027Range\u0027 in self.backend_headers:"},{"line_number":1155,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"b3a3c61a_fed60f44","line":1152,"updated":"2023-06-22 13:30:49.000000000","message":"ECFragGetter has\n\n  `self.skip_bytes \u003d bytes_to_skip(self.fragment_size, start)`\n  \nWe can converge the two classes by making ECFragGetter set\n\n  `self.client_chunk_size \u003d self.fragment_size`\n \n in its constructor","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"def95fe88df7a21939ad9b6d9a44732c8c285996","unresolved":true,"context_lines":[{"line_number":1149,"context_line":"            return"},{"line_number":1150,"context_line":""},{"line_number":1151,"context_line":"        if self.client_chunk_size:"},{"line_number":1152,"context_line":"            self.skip_bytes \u003d bytes_to_skip(self.client_chunk_size, start)"},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"        if \u0027Range\u0027 in self.backend_headers:"},{"line_number":1155,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"db97d331_9f81435b","line":1152,"in_reply_to":"b3a3c61a_fed60f44","updated":"2023-06-23 13:40:05.000000000","message":"after further digging, it turns out that client_chunk_size is never set for a GetOrHeadHandler (and shouldn\u0027t be) so we should try to eliminate it from that class","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7233c58c8701b7ce02d0665a025b1c67b4ffd73a","unresolved":false,"context_lines":[{"line_number":1149,"context_line":"            return"},{"line_number":1150,"context_line":""},{"line_number":1151,"context_line":"        if self.client_chunk_size:"},{"line_number":1152,"context_line":"            self.skip_bytes \u003d bytes_to_skip(self.client_chunk_size, start)"},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"        if \u0027Range\u0027 in self.backend_headers:"},{"line_number":1155,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"f8546a92_5378951b","line":1152,"in_reply_to":"db97d331_9f81435b","updated":"2023-06-26 12:08:35.000000000","message":"Done","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9fa2b90d0c631ebba528e4a942c03c869d6733e3","unresolved":true,"context_lines":[{"line_number":1163,"context_line":"        self.backend_headers[\u0027Range\u0027] \u003d ("},{"line_number":1164,"context_line":"            \"bytes\u003d\" + (\",\".join(\"%s-%s\" % (s if s is not None else \u0027\u0027,"},{"line_number":1165,"context_line":"                                            e if e is not None else \u0027\u0027)"},{"line_number":1166,"context_line":"                                 for s, e in new_ranges)))"},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":""},{"line_number":1169,"context_line":"class GetOrHeadHandler(Getter):"}],"source_content_type":"text/x-python","patch_set":3,"id":"25df48ae_dd2d8d4d","line":1166,"updated":"2023-06-21 18:17:16.000000000","message":"it looks like these are three methods we\u0027re pulling out of the ECFragGetter - I assume you already validated they\u0027re exactly equivilent.\n\nSeems like a good start!  It could be really interesting to fully understand *exactly* all the places the two concrete Getter subclasses actually overlap/deviate!","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1163,"context_line":"        self.backend_headers[\u0027Range\u0027] \u003d ("},{"line_number":1164,"context_line":"            \"bytes\u003d\" + (\",\".join(\"%s-%s\" % (s if s is not None else \u0027\u0027,"},{"line_number":1165,"context_line":"                                            e if e is not None else \u0027\u0027)"},{"line_number":1166,"context_line":"                                 for s, e in new_ranges)))"},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":""},{"line_number":1169,"context_line":"class GetOrHeadHandler(Getter):"}],"source_content_type":"text/x-python","patch_set":3,"id":"6e143200_ac3dbc77","line":1166,"in_reply_to":"25df48ae_dd2d8d4d","updated":"2023-06-26 23:00:41.000000000","message":"Ack","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9fa2b90d0c631ebba528e4a942c03c869d6733e3","unresolved":true,"context_lines":[{"line_number":1170,"context_line":"    def __init__(self, app, req, server_type, node_iter, partition, path,"},{"line_number":1171,"context_line":"                 backend_headers, concurrency\u003d1, policy\u003dNone,"},{"line_number":1172,"context_line":"                 client_chunk_size\u003dNone, newest\u003dNone, logger\u003dNone):"},{"line_number":1173,"context_line":"        self.app \u003d app"},{"line_number":1174,"context_line":"        self.node_iter \u003d node_iter"},{"line_number":1175,"context_line":"        self.server_type \u003d server_type"},{"line_number":1176,"context_line":"        self.partition \u003d partition"}],"source_content_type":"text/x-python","patch_set":3,"id":"760e930b_e954ced3","line":1173,"updated":"2023-06-21 18:17:16.000000000","message":"I think the pythonic pattern here would be to call\n\n    super(Getter, self).__init__(all, the, args, that, the, base, wants)\n    \n... and then do any additional setup that this subclass wants.\n\nlike concurrency and newest (which I assume are only relevant for ReplicatedGetter)","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26b58d1f3a95f4884afb60c853ee35bb76a9714b","unresolved":true,"context_lines":[{"line_number":1170,"context_line":"    def __init__(self, app, req, server_type, node_iter, partition, path,"},{"line_number":1171,"context_line":"                 backend_headers, concurrency\u003d1, policy\u003dNone,"},{"line_number":1172,"context_line":"                 client_chunk_size\u003dNone, newest\u003dNone, logger\u003dNone):"},{"line_number":1173,"context_line":"        self.app \u003d app"},{"line_number":1174,"context_line":"        self.node_iter \u003d node_iter"},{"line_number":1175,"context_line":"        self.server_type \u003d server_type"},{"line_number":1176,"context_line":"        self.partition \u003d partition"}],"source_content_type":"text/x-python","patch_set":3,"id":"db3a0105_f7d0624a","line":1173,"in_reply_to":"760e930b_e954ced3","updated":"2023-06-22 13:30:49.000000000","message":"what Clay said, except you need to cite the subclass:\nhttps://stackoverflow.com/questions/2399307/how-to-invoke-the-super-constructor-in-python\n\n`super(GetOrHeadHandler, self).__init__(all, the, args, that, the, base, wants)`","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"    def __init__(self, app, req, server_type, node_iter, partition, path,"},{"line_number":1171,"context_line":"                 backend_headers, concurrency\u003d1, policy\u003dNone,"},{"line_number":1172,"context_line":"                 client_chunk_size\u003dNone, newest\u003dNone, logger\u003dNone):"},{"line_number":1173,"context_line":"        self.app \u003d app"},{"line_number":1174,"context_line":"        self.node_iter \u003d node_iter"},{"line_number":1175,"context_line":"        self.server_type \u003d server_type"},{"line_number":1176,"context_line":"        self.partition \u003d partition"}],"source_content_type":"text/x-python","patch_set":3,"id":"6852ea0c_d638fa27","line":1173,"in_reply_to":"db3a0105_f7d0624a","updated":"2023-06-26 23:00:41.000000000","message":"Ack","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7233c58c8701b7ce02d0665a025b1c67b4ffd73a","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"    def __init__(self, app, req, server_type, node_iter, partition, path,"},{"line_number":1171,"context_line":"                 backend_headers, concurrency\u003d1, policy\u003dNone,"},{"line_number":1172,"context_line":"                 client_chunk_size\u003dNone, newest\u003dNone, logger\u003dNone):"},{"line_number":1173,"context_line":"        self.app \u003d app"},{"line_number":1174,"context_line":"        self.node_iter \u003d node_iter"},{"line_number":1175,"context_line":"        self.server_type \u003d server_type"},{"line_number":1176,"context_line":"        self.partition \u003d partition"}],"source_content_type":"text/x-python","patch_set":3,"id":"271d5f89_8416ac42","line":1173,"in_reply_to":"db3a0105_f7d0624a","updated":"2023-06-26 12:08:35.000000000","message":"Done","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9fa2b90d0c631ebba528e4a942c03c869d6733e3","unresolved":true,"context_lines":[{"line_number":1245,"context_line":"                    # handled elsewhere"},{"line_number":1246,"context_line":"                    start_byte, end_byte, length, headers, part \u003d next("},{"line_number":1247,"context_line":"                        self.source_parts_iter)"},{"line_number":1248,"context_line":"                return start_byte, end_byte, length, headers, part"},{"line_number":1249,"context_line":"            except ChunkReadTimeout:"},{"line_number":1250,"context_line":"                new_source, new_node \u003d self._get_source_and_node()"},{"line_number":1251,"context_line":"                if new_source:"}],"source_content_type":"text/x-python","patch_set":3,"id":"393c9e2d_9d27c6ae","line":1248,"updated":"2023-06-21 18:17:16.000000000","message":"seems like an unrelated change, and I don\u0027t mind the parens (will make the diff easier to read if we add params that cross a line break)","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26b58d1f3a95f4884afb60c853ee35bb76a9714b","unresolved":true,"context_lines":[{"line_number":1245,"context_line":"                    # handled elsewhere"},{"line_number":1246,"context_line":"                    start_byte, end_byte, length, headers, part \u003d next("},{"line_number":1247,"context_line":"                        self.source_parts_iter)"},{"line_number":1248,"context_line":"                return start_byte, end_byte, length, headers, part"},{"line_number":1249,"context_line":"            except ChunkReadTimeout:"},{"line_number":1250,"context_line":"                new_source, new_node \u003d self._get_source_and_node()"},{"line_number":1251,"context_line":"                if new_source:"}],"source_content_type":"text/x-python","patch_set":3,"id":"89013e08_b2cadd12","line":1248,"in_reply_to":"393c9e2d_9d27c6ae","updated":"2023-06-22 13:30:49.000000000","message":"+1 when refactoring avoid any unnecessary or unrelated change","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1245,"context_line":"                    # handled elsewhere"},{"line_number":1246,"context_line":"                    start_byte, end_byte, length, headers, part \u003d next("},{"line_number":1247,"context_line":"                        self.source_parts_iter)"},{"line_number":1248,"context_line":"                return start_byte, end_byte, length, headers, part"},{"line_number":1249,"context_line":"            except ChunkReadTimeout:"},{"line_number":1250,"context_line":"                new_source, new_node \u003d self._get_source_and_node()"},{"line_number":1251,"context_line":"                if new_source:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7d418ff3_30965441","line":1248,"in_reply_to":"89013e08_b2cadd12","updated":"2023-06-26 23:00:41.000000000","message":"Ack","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"def95fe88df7a21939ad9b6d9a44732c8c285996","unresolved":true,"context_lines":[{"line_number":1026,"context_line":"        self.backend_headers \u003d backend_headers"},{"line_number":1027,"context_line":"        self.logger \u003d logger or app.logger"},{"line_number":1028,"context_line":"        self.client_chunk_size \u003d client_chunk_size"},{"line_number":1029,"context_line":"        self.skip_bytes \u003d 0"},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":"    def fast_forward(self, num_bytes):"},{"line_number":1032,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"be7ace0b_6166b7ff","line":1029,"updated":"2023-06-23 13:40:05.000000000","message":"This is going to end up being ECFragGetter specific once we remove client_chunk_size from GetOrHeadHandler","commit_id":"b8dc7b3d353462adb16911f757918bf55ab99277"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":1026,"context_line":"        self.backend_headers \u003d backend_headers"},{"line_number":1027,"context_line":"        self.logger \u003d logger or app.logger"},{"line_number":1028,"context_line":"        self.client_chunk_size \u003d client_chunk_size"},{"line_number":1029,"context_line":"        self.skip_bytes \u003d 0"},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":"    def fast_forward(self, num_bytes):"},{"line_number":1032,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"a5701349_cd86cc1b","line":1029,"in_reply_to":"be7ace0b_6166b7ff","updated":"2023-06-26 23:00:41.000000000","message":"Ack","commit_id":"b8dc7b3d353462adb16911f757918bf55ab99277"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"def95fe88df7a21939ad9b6d9a44732c8c285996","unresolved":true,"context_lines":[{"line_number":1144,"context_line":"                                               backend_headers, logger,"},{"line_number":1145,"context_line":"                                               client_chunk_size)"},{"line_number":1146,"context_line":"        self.server_type \u003d server_type"},{"line_number":1147,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1148,"context_line":"        self.used_nodes \u003d []"},{"line_number":1149,"context_line":"        self.used_source_etag \u003d \u0027\u0027"},{"line_number":1150,"context_line":"        self.concurrency \u003d concurrency"}],"source_content_type":"text/x-python","patch_set":7,"id":"74ab3531_3bac0c6f","line":1147,"updated":"2023-06-23 13:40:05.000000000","message":"this is a common attribute and can go in the superclass","commit_id":"b8dc7b3d353462adb16911f757918bf55ab99277"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7233c58c8701b7ce02d0665a025b1c67b4ffd73a","unresolved":false,"context_lines":[{"line_number":1144,"context_line":"                                               backend_headers, logger,"},{"line_number":1145,"context_line":"                                               client_chunk_size)"},{"line_number":1146,"context_line":"        self.server_type \u003d server_type"},{"line_number":1147,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":1148,"context_line":"        self.used_nodes \u003d []"},{"line_number":1149,"context_line":"        self.used_source_etag \u003d \u0027\u0027"},{"line_number":1150,"context_line":"        self.concurrency \u003d concurrency"}],"source_content_type":"text/x-python","patch_set":7,"id":"0b1790fd_3679d064","line":1147,"in_reply_to":"74ab3531_3bac0c6f","updated":"2023-06-26 12:08:35.000000000","message":"Done","commit_id":"b8dc7b3d353462adb16911f757918bf55ab99277"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"def95fe88df7a21939ad9b6d9a44732c8c285996","unresolved":true,"context_lines":[{"line_number":1148,"context_line":"        self.used_nodes \u003d []"},{"line_number":1149,"context_line":"        self.used_source_etag \u003d \u0027\u0027"},{"line_number":1150,"context_line":"        self.concurrency \u003d concurrency"},{"line_number":1151,"context_line":"        self.node \u003d self.source \u003d None"},{"line_number":1152,"context_line":"        self.source_parts_iter \u003d None"},{"line_number":1153,"context_line":"        self.latest_404_timestamp \u003d Timestamp(0)"},{"line_number":1154,"context_line":"        if self.server_type \u003d\u003d \u0027Object\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7261f6a3_ec376111","line":1151,"updated":"2023-06-23 13:40:05.000000000","message":"these are common attributes and can go in the superclass","commit_id":"b8dc7b3d353462adb16911f757918bf55ab99277"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7233c58c8701b7ce02d0665a025b1c67b4ffd73a","unresolved":false,"context_lines":[{"line_number":1148,"context_line":"        self.used_nodes \u003d []"},{"line_number":1149,"context_line":"        self.used_source_etag \u003d \u0027\u0027"},{"line_number":1150,"context_line":"        self.concurrency \u003d concurrency"},{"line_number":1151,"context_line":"        self.node \u003d self.source \u003d None"},{"line_number":1152,"context_line":"        self.source_parts_iter \u003d None"},{"line_number":1153,"context_line":"        self.latest_404_timestamp \u003d Timestamp(0)"},{"line_number":1154,"context_line":"        if self.server_type \u003d\u003d \u0027Object\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fcf7c97_59d15127","line":1151,"in_reply_to":"7261f6a3_ec376111","updated":"2023-06-26 12:08:35.000000000","message":"Done","commit_id":"b8dc7b3d353462adb16911f757918bf55ab99277"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"def95fe88df7a21939ad9b6d9a44732c8c285996","unresolved":true,"context_lines":[{"line_number":1163,"context_line":"        # stuff from request"},{"line_number":1164,"context_line":"        self.req_method \u003d req.method"},{"line_number":1165,"context_line":"        self.req_path \u003d req.path"},{"line_number":1166,"context_line":"        self.req_query_string \u003d req.query_string"},{"line_number":1167,"context_line":"        if newest is None:"},{"line_number":1168,"context_line":"            self.newest \u003d config_true_value(req.headers.get(\u0027x-newest\u0027, \u0027f\u0027))"},{"line_number":1169,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"98037538_11c76626","line":1166,"updated":"2023-06-23 13:40:05.000000000","message":"this is a common attribute and can go in the superclass\n\nthe two classes take a different approach to de-referencing req: this one de-references to instance attributes here, while ECFragGetter de-references self.req on demand. We can align them and then make the attributes common.","commit_id":"b8dc7b3d353462adb16911f757918bf55ab99277"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7233c58c8701b7ce02d0665a025b1c67b4ffd73a","unresolved":false,"context_lines":[{"line_number":1163,"context_line":"        # stuff from request"},{"line_number":1164,"context_line":"        self.req_method \u003d req.method"},{"line_number":1165,"context_line":"        self.req_path \u003d req.path"},{"line_number":1166,"context_line":"        self.req_query_string \u003d req.query_string"},{"line_number":1167,"context_line":"        if newest is None:"},{"line_number":1168,"context_line":"            self.newest \u003d config_true_value(req.headers.get(\u0027x-newest\u0027, \u0027f\u0027))"},{"line_number":1169,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9d7b91f2_e61f2a6e","line":1166,"in_reply_to":"98037538_11c76626","updated":"2023-06-26 12:08:35.000000000","message":"Done","commit_id":"b8dc7b3d353462adb16911f757918bf55ab99277"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"24153800539e19e89a7f1ea98b31eaa67f94139a","unresolved":true,"context_lines":[{"line_number":1047,"context_line":""},{"line_number":1048,"context_line":"        # stuff from request"},{"line_number":1049,"context_line":"        self.req_method \u003d req.method"},{"line_number":1050,"context_line":"        self.req_path \u003d req.path"},{"line_number":1051,"context_line":"        self.req_query_string \u003d req.query_string"},{"line_number":1052,"context_line":"        if newest is None:"},{"line_number":1053,"context_line":"            self.newest \u003d config_true_value(req.headers.get(\u0027x-newest\u0027, \u0027f\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"41736744_5eeb7e83","side":"PARENT","line":1050,"updated":"2023-06-27 02:12:43.000000000","message":"so before we had self.path and self.req_path, that\u0027s interesting","commit_id":"2343521f751388ba2e4158194fb8c2aabc28d08c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"24153800539e19e89a7f1ea98b31eaa67f94139a","unresolved":true,"context_lines":[{"line_number":1100,"context_line":"            if len(req_range.ranges) \u003e 0:"},{"line_number":1101,"context_line":"                self.backend_headers[\u0027Range\u0027] \u003d str(req_range)"},{"line_number":1102,"context_line":"            else:"},{"line_number":1103,"context_line":"                self.backend_headers.pop(\u0027Range\u0027)"},{"line_number":1104,"context_line":""},{"line_number":1105,"context_line":""},{"line_number":1106,"context_line":"class GetOrHeadHandler(GetterBase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"bcf27885_19b17a50","line":1103,"updated":"2023-06-27 02:12:43.000000000","message":"ok, so GetterBase keeps these two methods:\n\n * fast_forward\n * pop_range","commit_id":"e290d47c435627082b3825b67e27ea3a3c99f01f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"24153800539e19e89a7f1ea98b31eaa67f94139a","unresolved":true,"context_lines":[{"line_number":1112,"context_line":"            partition\u003dpartition, policy\u003dpolicy, path\u003dpath,"},{"line_number":1113,"context_line":"            backend_headers\u003dbackend_headers, logger\u003dlogger)"},{"line_number":1114,"context_line":"        self.server_type \u003d server_type"},{"line_number":1115,"context_line":"        self.client_chunk_size \u003d client_chunk_size"},{"line_number":1116,"context_line":"        self.skip_bytes \u003d 0"},{"line_number":1117,"context_line":"        self.used_nodes \u003d []"},{"line_number":1118,"context_line":"        self.used_source_etag \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"8d8053a8_b082362c","line":1115,"updated":"2023-06-27 02:12:43.000000000","message":"i thought we decided client_chunk_size was really the ec-only fragment-size\n\n... are we gunna save that to clean-up in the follow-up?","commit_id":"e290d47c435627082b3825b67e27ea3a3c99f01f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"24153800539e19e89a7f1ea98b31eaa67f94139a","unresolved":true,"context_lines":[{"line_number":1130,"context_line":"        if newest is None:"},{"line_number":1131,"context_line":"            self.newest \u003d config_true_value(req.headers.get(\u0027x-newest\u0027, \u0027f\u0027))"},{"line_number":1132,"context_line":"        else:"},{"line_number":1133,"context_line":"            self.newest \u003d newest"},{"line_number":1134,"context_line":""},{"line_number":1135,"context_line":"        # populated when finding source"},{"line_number":1136,"context_line":"        self.statuses \u003d []"}],"source_content_type":"text/x-python","patch_set":8,"id":"eb54ba9e_f58ca03e","line":1133,"updated":"2023-06-27 02:12:43.000000000","message":"i like how this clarifies that newest is a replicated-only option!","commit_id":"e290d47c435627082b3825b67e27ea3a3c99f01f"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9fa2b90d0c631ebba528e4a942c03c869d6733e3","unresolved":true,"context_lines":[{"line_number":2613,"context_line":"        self.backend_headers[\u0027Range\u0027] \u003d ("},{"line_number":2614,"context_line":"            \"bytes\u003d\" + (\",\".join(\"%s-%s\" % (s if s is not None else \u0027\u0027,"},{"line_number":2615,"context_line":"                                            e if e is not None else \u0027\u0027)"},{"line_number":2616,"context_line":"                                 for s, e in new_ranges)))"},{"line_number":2617,"context_line":""},{"line_number":2618,"context_line":"    def response_parts_iter(self, req):"},{"line_number":2619,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"d0012814_b33ac741","side":"PARENT","line":2616,"updated":"2023-06-21 18:17:16.000000000","message":"fast_forward, pop_range, learn_size\n\n... the diff reads like this should all be inherited exactly as is from the Getter base class.","commit_id":"2343521f751388ba2e4158194fb8c2aabc28d08c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":2613,"context_line":"        self.backend_headers[\u0027Range\u0027] \u003d ("},{"line_number":2614,"context_line":"            \"bytes\u003d\" + (\",\".join(\"%s-%s\" % (s if s is not None else \u0027\u0027,"},{"line_number":2615,"context_line":"                                            e if e is not None else \u0027\u0027)"},{"line_number":2616,"context_line":"                                 for s, e in new_ranges)))"},{"line_number":2617,"context_line":""},{"line_number":2618,"context_line":"    def response_parts_iter(self, req):"},{"line_number":2619,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"4ef66f68_050d4842","side":"PARENT","line":2616,"in_reply_to":"d0012814_b33ac741","updated":"2023-06-26 23:00:41.000000000","message":"Done","commit_id":"2343521f751388ba2e4158194fb8c2aabc28d08c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26b58d1f3a95f4884afb60c853ee35bb76a9714b","unresolved":true,"context_lines":[{"line_number":2509,"context_line":"        self.source \u003d self.node \u003d None"},{"line_number":2510,"context_line":"        self.logger_thread_locals \u003d logger_thread_locals"},{"line_number":2511,"context_line":"        self.logger \u003d logger"},{"line_number":2512,"context_line":"        self.client_chunk_size \u003d client_chunk_size or self.app.client_chunk_size"},{"line_number":2513,"context_line":""},{"line_number":2514,"context_line":"    def response_parts_iter(self, req):"},{"line_number":2515,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"d3dd2ade_864a6f87","line":2512,"range":{"start_line":2512,"start_character":8,"end_line":2512,"end_character":30},"updated":"2023-06-22 13:30:49.000000000","message":"I wouldn\u0027t usually expect a concrete subclass to gain attributes as a result of extracting a superclass - I don\u0027t think this class uses self.client_chunk_size. However, we need self.client_chunk_size for the inherited shared implementation of learn_size_from_content_range.\n\nChanging this to:\n\n  `self.client_chunk_size \u003d self.fragment_size`\n  \nfixes the test failures\n\nIronically, we only recently renamed client_chunk_size to fragment_size here https://review.opendev.org/c/openstack/swift/+/881547 and now it probably makes sense to rename it back i.e. revert this change https://review.opendev.org/c/openstack/swift/+/881547/1/swift/proxy/controllers/obj.py#b2500","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":2509,"context_line":"        self.source \u003d self.node \u003d None"},{"line_number":2510,"context_line":"        self.logger_thread_locals \u003d logger_thread_locals"},{"line_number":2511,"context_line":"        self.logger \u003d logger"},{"line_number":2512,"context_line":"        self.client_chunk_size \u003d client_chunk_size or self.app.client_chunk_size"},{"line_number":2513,"context_line":""},{"line_number":2514,"context_line":"    def response_parts_iter(self, req):"},{"line_number":2515,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"4d8e5540_0c7ba189","line":2512,"range":{"start_line":2512,"start_character":8,"end_line":2512,"end_character":30},"in_reply_to":"d3dd2ade_864a6f87","updated":"2023-06-26 23:00:41.000000000","message":"Ack","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7233c58c8701b7ce02d0665a025b1c67b4ffd73a","unresolved":false,"context_lines":[{"line_number":2509,"context_line":"        self.source \u003d self.node \u003d None"},{"line_number":2510,"context_line":"        self.logger_thread_locals \u003d logger_thread_locals"},{"line_number":2511,"context_line":"        self.logger \u003d logger"},{"line_number":2512,"context_line":"        self.client_chunk_size \u003d client_chunk_size or self.app.client_chunk_size"},{"line_number":2513,"context_line":""},{"line_number":2514,"context_line":"    def response_parts_iter(self, req):"},{"line_number":2515,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"06794a8a_cd3acea6","line":2512,"range":{"start_line":2512,"start_character":8,"end_line":2512,"end_character":30},"in_reply_to":"d3dd2ade_864a6f87","updated":"2023-06-26 12:08:35.000000000","message":"Done","commit_id":"d30f3bad26333e6bbd587d58cfa3f91f10fed76b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"def95fe88df7a21939ad9b6d9a44732c8c285996","unresolved":true,"context_lines":[{"line_number":2507,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":2508,"context_line":"        self.source \u003d self.node \u003d None"},{"line_number":2509,"context_line":"        self.logger_thread_locals \u003d logger_thread_locals"},{"line_number":2510,"context_line":"        self.client_chunk_size \u003d self.fragment_size"},{"line_number":2511,"context_line":""},{"line_number":2512,"context_line":"    def response_parts_iter(self, req):"},{"line_number":2513,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"f02f70aa_e362adf5","line":2510,"updated":"2023-06-23 13:40:05.000000000","message":"ok, this works around the test failure but isn\u0027t great, and it turns out that GetOrHeadHandler doesn\u0027t need client_chunk_size at all. So my suggestion is:\n\n* remove this line\n* revert learn_size_from_content_range back into each subclass\n\nThen we can consider eliminating client_chunk_size and unifying learn_size_from_content_range in a follow-on patch","commit_id":"b8dc7b3d353462adb16911f757918bf55ab99277"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"482f39b5f42c68992f19be1e9da062ebfecfd81f","unresolved":false,"context_lines":[{"line_number":2507,"context_line":"        self.bytes_used_from_backend \u003d 0"},{"line_number":2508,"context_line":"        self.source \u003d self.node \u003d None"},{"line_number":2509,"context_line":"        self.logger_thread_locals \u003d logger_thread_locals"},{"line_number":2510,"context_line":"        self.client_chunk_size \u003d self.fragment_size"},{"line_number":2511,"context_line":""},{"line_number":2512,"context_line":"    def response_parts_iter(self, req):"},{"line_number":2513,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7adfd579_c39130f5","line":2510,"in_reply_to":"f02f70aa_e362adf5","updated":"2023-06-26 23:00:41.000000000","message":"Ack","commit_id":"b8dc7b3d353462adb16911f757918bf55ab99277"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"24153800539e19e89a7f1ea98b31eaa67f94139a","unresolved":true,"context_lines":[{"line_number":2755,"context_line":"                    ip, port, node[\u0027device\u0027],"},{"line_number":2756,"context_line":"                    self.partition, \u0027GET\u0027, self.path,"},{"line_number":2757,"context_line":"                    headers\u003dreq_headers,"},{"line_number":2758,"context_line":"                    query_string\u003dself.req.query_string)"},{"line_number":2759,"context_line":"            self.app.set_node_timing(node, time.time() - start_node_timing)"},{"line_number":2760,"context_line":""},{"line_number":2761,"context_line":"            with Timeout(node_timeout):"}],"source_content_type":"text/x-python","patch_set":8,"id":"229fa8cd_ccd3959a","line":2758,"updated":"2023-06-27 02:12:43.000000000","message":"i guess self.policy.fragment_size might be reaosnbale too if don\u0027t want to mess with all those extra named attributes","commit_id":"e290d47c435627082b3825b67e27ea3a3c99f01f"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"65ac77889b4a8bfbdc56d8f5a402a37ff9f156bd","unresolved":false,"context_lines":[{"line_number":2755,"context_line":"                    ip, port, node[\u0027device\u0027],"},{"line_number":2756,"context_line":"                    self.partition, \u0027GET\u0027, self.path,"},{"line_number":2757,"context_line":"                    headers\u003dreq_headers,"},{"line_number":2758,"context_line":"                    query_string\u003dself.req.query_string)"},{"line_number":2759,"context_line":"            self.app.set_node_timing(node, time.time() - start_node_timing)"},{"line_number":2760,"context_line":""},{"line_number":2761,"context_line":"            with Timeout(node_timeout):"}],"source_content_type":"text/x-python","patch_set":8,"id":"8535da4b_ffb87b22","line":2758,"in_reply_to":"229fa8cd_ccd3959a","updated":"2023-08-17 16:15:11.000000000","message":"Ack","commit_id":"e290d47c435627082b3825b67e27ea3a3c99f01f"}]}
