)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"b477cf5a7948f0d59a94511db295e6d31c972650","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The client_chunk_size attribute was introduced into GetOrHeadHandler"},{"line_number":10,"context_line":"for EC support [1]. It was only ever not None for an"},{"line_number":11,"context_line":"ECObjectController. The ECObjectController stopped using"},{"line_number":12,"context_line":"GetOrHeadHandler when the ECFragGetter class was introduced [2], but"},{"line_number":13,"context_line":"the EC specific code was not expunged from GetOrHeadHandler. In [3]"},{"line_number":14,"context_line":"the ECFragGetter client_chunk_size was renamed to fragment_size to"},{"line_number":15,"context_line":"better reflect what it represented."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ad3f4b5d_0045c687","line":12,"range":{"start_line":11,"start_character":24,"end_line":12,"end_character":16},"updated":"2023-07-24 04:02:07.000000000","message":"This isn\u0027t strictly true, it is still used in the ECObjectController, but only for HEADs Because HEADs can get metadata from any fragment we don\u0027t have to worry about all the client_chuck_size, skip_bytes etc code, so yeah it isn\u0027t needed the best I can tell.","commit_id":"5bd21ba912f42ee6893ec5614609344da9e19f95"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cace721111f7342b0aecd0ace59085dd17157370","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The client_chunk_size attribute was introduced into GetOrHeadHandler"},{"line_number":10,"context_line":"for EC support [1]. It was only ever not None for an"},{"line_number":11,"context_line":"ECObjectController. The ECObjectController stopped using"},{"line_number":12,"context_line":"GetOrHeadHandler when the ECFragGetter class was introduced [2], but"},{"line_number":13,"context_line":"the EC specific code was not expunged from GetOrHeadHandler. In [3]"},{"line_number":14,"context_line":"the ECFragGetter client_chunk_size was renamed to fragment_size to"},{"line_number":15,"context_line":"better reflect what it represented."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"61319c5b_b2ea7a75","line":12,"range":{"start_line":11,"start_character":24,"end_line":12,"end_character":16},"in_reply_to":"aa2526da_65f6a593","updated":"2023-07-24 15:37:08.000000000","message":"Thanks guys for GETting my HEAD straight on that 😊","commit_id":"5bd21ba912f42ee6893ec5614609344da9e19f95"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"06c84f8dcb130d22bac1130d9f218139032624ad","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The client_chunk_size attribute was introduced into GetOrHeadHandler"},{"line_number":10,"context_line":"for EC support [1]. It was only ever not None for an"},{"line_number":11,"context_line":"ECObjectController. The ECObjectController stopped using"},{"line_number":12,"context_line":"GetOrHeadHandler when the ECFragGetter class was introduced [2], but"},{"line_number":13,"context_line":"the EC specific code was not expunged from GetOrHeadHandler. In [3]"},{"line_number":14,"context_line":"the ECFragGetter client_chunk_size was renamed to fragment_size to"},{"line_number":15,"context_line":"better reflect what it represented."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"aa2526da_65f6a593","line":12,"range":{"start_line":11,"start_character":24,"end_line":12,"end_character":16},"in_reply_to":"ad3f4b5d_0045c687","updated":"2023-07-24 14:13:17.000000000","message":"that\u0027s an interesting point... \n\nReplicatedObjectController._get_or_head_response is pretty much just a pass through to base.Controller.GETorHEAD_base, which spins up a GetOrHeadHandler(GetterBase)\n\nECObjectController._get_or_head_response OTOH, will dispatch to base.controller.GETorHEAD_base for HEAD requests, but otherwise goes on to spin up a whole pool of _fragment_GET_request\u0027s which *each* spin up a ECFragGetter(GetterBase)\n\nIt\u0027s nuts to think that somehow a GetOrHeadHandler used to be used in both these contexts!?\n\nAt least for EC HEAD requests the concurrency management is at the same as replicated, instead of nested; but I\u0027ll bet we eventually bring EC HEAD handling into the ECObjectController too.","commit_id":"5bd21ba912f42ee6893ec5614609344da9e19f95"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"23af43e45f1b15075f607d8ecfb54bd25886e2a1","unresolved":true,"context_lines":[{"line_number":9,"context_line":"The client_chunk_size attribute was introduced into GetOrHeadHandler"},{"line_number":10,"context_line":"for EC support [1]. It was only ever not None for an"},{"line_number":11,"context_line":"ECObjectController. The ECObjectController stopped using"},{"line_number":12,"context_line":"GetOrHeadHandler for Object GET when the ECFragGetter class was introduced [2], but the EC specific code was not expunged from GetOrHeadHandler. In [3] the ECFragGetter client_chunk_size was renamed to fragment_size to better reflect what it represented."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"The skip_bytes attribute was similarly introduced for EC support. It"},{"line_number":15,"context_line":"is only ever non-zero if client_chunk_size is an int. For EC,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"54785bdc_8195c23e","line":12,"updated":"2023-07-24 14:15:41.000000000","message":"well that looks stupid - thanks gerrit UI!","commit_id":"7417b538092e8212bb21d2470cc9945dae9ce9e5"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"06c84f8dcb130d22bac1130d9f218139032624ad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b2b8db51_299c3492","updated":"2023-07-24 14:13:17.000000000","message":"\u003e The ECObjectController stopped using\nGetOrHeadHandler [for Object GET] when the ECFragGetter class was introduced\n\n... seems like a minor semantic point, but maybe useful to clarify - I think I can edit the commit message and then merge it.  This is great stuff.","commit_id":"5bd21ba912f42ee6893ec5614609344da9e19f95"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"b477cf5a7948f0d59a94511db295e6d31c972650","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"cc0894fd_cc2ae6d4","updated":"2023-07-24 04:02:07.000000000","message":"This looks like a nice clean up. And yes the ECOobhectController doens\u0027t use GetOrHeadHandler, accept for HEADs, so not when we need to actaully deal with fragments and rebuilding.\n\nSo the best I can tell your correct, thanks Al.","commit_id":"5bd21ba912f42ee6893ec5614609344da9e19f95"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bde796187a5b2d9e7317ff5cf725730e5e4dc411","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"a0dd4d97_0d037fa8","updated":"2023-07-24 14:18:29.000000000","message":"I think I managed to clean up the parts I made worse without breaking any of the awesomeness ;)","commit_id":"369a72c4cf48cf8637e508155cbef8471c69a39a"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"06c84f8dcb130d22bac1130d9f218139032624ad","unresolved":true,"context_lines":[{"line_number":1185,"context_line":"            return"},{"line_number":1186,"context_line":""},{"line_number":1187,"context_line":"        if self.client_chunk_size:"},{"line_number":1188,"context_line":"            self.skip_bytes \u003d bytes_to_skip(self.client_chunk_size, start)"},{"line_number":1189,"context_line":""},{"line_number":1190,"context_line":"        if \u0027Range\u0027 in self.backend_headers:"},{"line_number":1191,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"edb6cb92_c4435447","side":"PARENT","line":1188,"updated":"2023-07-24 14:13:17.000000000","message":"this line got moved in-line over in the ECFragGetter where it\u0027s needed in context; which makes it way more obvious.","commit_id":"1b7cf29476a2f77ceab1a082100b0c7e7cb8dc93"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"06c84f8dcb130d22bac1130d9f218139032624ad","unresolved":true,"context_lines":[{"line_number":1282,"context_line":"                    else:"},{"line_number":1283,"context_line":"                        self.skip_bytes -\u003d len(buf)"},{"line_number":1284,"context_line":"                        self.bytes_used_from_backend +\u003d len(buf)"},{"line_number":1285,"context_line":"                        buf \u003d b\u0027\u0027"},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":"                if not chunk:"},{"line_number":1288,"context_line":"                    if buf:"}],"source_content_type":"text/x-python","patch_set":5,"id":"e1c22604_1a8749fb","side":"PARENT","line":1285,"updated":"2023-07-24 14:13:17.000000000","message":"ECFragGetter still has this","commit_id":"1b7cf29476a2f77ceab1a082100b0c7e7cb8dc93"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"06c84f8dcb130d22bac1130d9f218139032624ad","unresolved":true,"context_lines":[{"line_number":1291,"context_line":"                                             ChunkWriteTimeout):"},{"line_number":1292,"context_line":"                            self.bytes_used_from_backend +\u003d len(buf)"},{"line_number":1293,"context_line":"                            yield buf"},{"line_number":1294,"context_line":"                        buf \u003d b\u0027\u0027"},{"line_number":1295,"context_line":"                    break"},{"line_number":1296,"context_line":""},{"line_number":1297,"context_line":"                if self.client_chunk_size is not None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"f8367a39_ceaba870","side":"PARENT","line":1294,"updated":"2023-07-24 14:13:17.000000000","message":"basically the Replicated case doesn\u0027t have to buffer anymore - we can return chunks directly from the backend to the client","commit_id":"1b7cf29476a2f77ceab1a082100b0c7e7cb8dc93"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"06c84f8dcb130d22bac1130d9f218139032624ad","unresolved":true,"context_lines":[{"line_number":1303,"context_line":"                                             ChunkWriteTimeout):"},{"line_number":1304,"context_line":"                            self.bytes_used_from_backend +\u003d \\"},{"line_number":1305,"context_line":"                                len(client_chunk)"},{"line_number":1306,"context_line":"                            yield client_chunk"},{"line_number":1307,"context_line":"                else:"},{"line_number":1308,"context_line":"                    with WatchdogTimeout(self.app.watchdog,"},{"line_number":1309,"context_line":"                                         self.app.client_timeout,"}],"source_content_type":"text/x-python","patch_set":5,"id":"6586f132_f1a04f56","side":"PARENT","line":1306,"updated":"2023-07-24 14:13:17.000000000","message":"this is the only case in ECFragGetter","commit_id":"1b7cf29476a2f77ceab1a082100b0c7e7cb8dc93"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"06c84f8dcb130d22bac1130d9f218139032624ad","unresolved":true,"context_lines":[{"line_number":2184,"context_line":"        handler \u003d GetOrHeadHandler(self.app, req, self.server_type, node_iter,"},{"line_number":2185,"context_line":"                                   partition, path, backend_headers,"},{"line_number":2186,"context_line":"                                   concurrency, policy\u003dpolicy,"},{"line_number":2187,"context_line":"                                   client_chunk_size\u003dclient_chunk_size,"},{"line_number":2188,"context_line":"                                   logger\u003dself.logger)"},{"line_number":2189,"context_line":"        res \u003d handler.get_working_response(req)"},{"line_number":2190,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"977a7d39_6a295a19","side":"PARENT","line":2187,"updated":"2023-07-24 14:13:17.000000000","message":"and it\u0027s reasonable this isn\u0027t needed in the replicated case because we hand clients the chunks from the backend at whatever size they are","commit_id":"1b7cf29476a2f77ceab1a082100b0c7e7cb8dc93"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"06c84f8dcb130d22bac1130d9f218139032624ad","unresolved":true,"context_lines":[{"line_number":1268,"context_line":"                                     self.app.client_timeout,"},{"line_number":1269,"context_line":"                                     ChunkWriteTimeout):"},{"line_number":1270,"context_line":"                    self.bytes_used_from_backend +\u003d len(chunk)"},{"line_number":1271,"context_line":"                    yield chunk"},{"line_number":1272,"context_line":""},{"line_number":1273,"context_line":"    def _get_response_parts_iter(self, req):"},{"line_number":1274,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"c8e02c9d_a007125e","line":1271,"updated":"2023-07-24 14:13:17.000000000","message":"i\u0027m getting deja vu  - I think when the replicated case was removed form the ECFragGetter it was also shockingly simplified; but this is even better.","commit_id":"5bd21ba912f42ee6893ec5614609344da9e19f95"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"06c84f8dcb130d22bac1130d9f218139032624ad","unresolved":true,"context_lines":[{"line_number":2622,"context_line":"                    # skip_bytes compensates for the backend request range"},{"line_number":2623,"context_line":"                    # expansion done in _convert_range"},{"line_number":2624,"context_line":"                    self.skip_bytes \u003d bytes_to_skip("},{"line_number":2625,"context_line":"                        self.fragment_size, start_byte)"},{"line_number":2626,"context_line":"                    self.learn_size_from_content_range("},{"line_number":2627,"context_line":"                        start_byte, end_byte, length)"},{"line_number":2628,"context_line":"                    self.bytes_used_from_backend \u003d 0"}],"source_content_type":"text/x-python","patch_set":5,"id":"f4234e7b_e7b833a5","line":2625,"updated":"2023-07-24 14:13:17.000000000","message":"reasonable as an attribute, skip_bytes is referenced in iter_bytes_from_response_part","commit_id":"5bd21ba912f42ee6893ec5614609344da9e19f95"}]}
