)]}'
{"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f9e91da80bac64fe323949f7a6c8b869190bacbc","unresolved":true,"context_lines":[{"line_number":1439,"context_line":"                # break out of the iter so WSGI can tear down the broken"},{"line_number":1440,"context_line":"                # connection."},{"line_number":1441,"context_line":"                if not all(fragments):"},{"line_number":1442,"context_line":"                    num_done \u003d sum([1 for f in fragments if f])"},{"line_number":1443,"context_line":"                    if num_done \u003e 0:"},{"line_number":1444,"context_line":"                        self.logger.warning("},{"line_number":1445,"context_line":"                            \u0027Un-recoverable fragment rebuild. Only received \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"e3a80805_ff6e3ef9","line":1442,"updated":"2021-05-26 14:33:00.000000000","message":"do we really need to iterate fragments twice?","commit_id":"e7dcb5b879dbd039174fccbc2c9ead45ab940d66"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"affe842b704711693cc4ad3a7d5589ee0c6e45f8","unresolved":true,"context_lines":[{"line_number":1439,"context_line":"                # break out of the iter so WSGI can tear down the broken"},{"line_number":1440,"context_line":"                # connection."},{"line_number":1441,"context_line":"                if not all(fragments):"},{"line_number":1442,"context_line":"                    num_done \u003d sum([1 for f in fragments if f])"},{"line_number":1443,"context_line":"                    if num_done \u003e 0:"},{"line_number":1444,"context_line":"                        self.logger.warning("},{"line_number":1445,"context_line":"                            \u0027Un-recoverable fragment rebuild. Only received \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1073d0f5_2cc658da","line":1442,"in_reply_to":"e3a80805_ff6e3ef9","updated":"2021-05-26 23:55:42.000000000","message":"good point 😊","commit_id":"e7dcb5b879dbd039174fccbc2c9ead45ab940d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f9e91da80bac64fe323949f7a6c8b869190bacbc","unresolved":true,"context_lines":[{"line_number":1440,"context_line":"                # connection."},{"line_number":1441,"context_line":"                if not all(fragments):"},{"line_number":1442,"context_line":"                    num_done \u003d sum([1 for f in fragments if f])"},{"line_number":1443,"context_line":"                    if num_done \u003e 0:"},{"line_number":1444,"context_line":"                        self.logger.warning("},{"line_number":1445,"context_line":"                            \u0027Un-recoverable fragment rebuild. Only received \u0027"},{"line_number":1446,"context_line":"                            \u0027%d/%d fragments for %r\u0027, num_done,"}],"source_content_type":"text/x-python","patch_set":1,"id":"03dfe19a_6a5c5022","line":1443,"updated":"2021-05-26 14:33:00.000000000","message":"this block get\u0027s hit by test_GET_read_timeout_fails in test.unit.proxy.controllers.test_obj.TestECObjController\n\n... you might try and build a test off that ...","commit_id":"e7dcb5b879dbd039174fccbc2c9ead45ab940d66"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"affe842b704711693cc4ad3a7d5589ee0c6e45f8","unresolved":true,"context_lines":[{"line_number":1440,"context_line":"                # connection."},{"line_number":1441,"context_line":"                if not all(fragments):"},{"line_number":1442,"context_line":"                    num_done \u003d sum([1 for f in fragments if f])"},{"line_number":1443,"context_line":"                    if num_done \u003e 0:"},{"line_number":1444,"context_line":"                        self.logger.warning("},{"line_number":1445,"context_line":"                            \u0027Un-recoverable fragment rebuild. Only received \u0027"},{"line_number":1446,"context_line":"                            \u0027%d/%d fragments for %r\u0027, num_done,"}],"source_content_type":"text/x-python","patch_set":1,"id":"97b53247_a6da529d","line":1443,"in_reply_to":"03dfe19a_6a5c5022","updated":"2021-05-26 23:55:42.000000000","message":"Thanks! I\u0027ll give that a whirl","commit_id":"e7dcb5b879dbd039174fccbc2c9ead45ab940d66"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f9e91da80bac64fe323949f7a6c8b869190bacbc","unresolved":true,"context_lines":[{"line_number":1444,"context_line":"                        self.logger.warning("},{"line_number":1445,"context_line":"                            \u0027Un-recoverable fragment rebuild. Only received \u0027"},{"line_number":1446,"context_line":"                            \u0027%d/%d fragments for %r\u0027, num_done,"},{"line_number":1447,"context_line":"                            len(fragments) - num_done, quote(self.path))"},{"line_number":1448,"context_line":"                    break"},{"line_number":1449,"context_line":"                try:"},{"line_number":1450,"context_line":"                    segment \u003d self.policy.pyeclib_driver.decode(fragments)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3e1c8cb5_8d586b01","line":1447,"updated":"2021-05-26 14:33:00.000000000","message":"Un-recoverable fragment rebuild. Only received 9/1 fragments for \u0027/a/c/o\u0027\n\nI think you just want num_done / len(fragments)","commit_id":"e7dcb5b879dbd039174fccbc2c9ead45ab940d66"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"affe842b704711693cc4ad3a7d5589ee0c6e45f8","unresolved":true,"context_lines":[{"line_number":1444,"context_line":"                        self.logger.warning("},{"line_number":1445,"context_line":"                            \u0027Un-recoverable fragment rebuild. Only received \u0027"},{"line_number":1446,"context_line":"                            \u0027%d/%d fragments for %r\u0027, num_done,"},{"line_number":1447,"context_line":"                            len(fragments) - num_done, quote(self.path))"},{"line_number":1448,"context_line":"                    break"},{"line_number":1449,"context_line":"                try:"},{"line_number":1450,"context_line":"                    segment \u003d self.policy.pyeclib_driver.decode(fragments)"}],"source_content_type":"text/x-python","patch_set":1,"id":"411b71e8_e1fce3ac","line":1447,"in_reply_to":"3e1c8cb5_8d586b01","updated":"2021-05-26 23:55:42.000000000","message":"Yup just saw that myself and pushed a new patch up.. before seeing your review. So a new patch will be up soon to cover your other thoughts.","commit_id":"e7dcb5b879dbd039174fccbc2c9ead45ab940d66"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"398eaa59645c85d57bcfa29c06b310cf6f40c9d2","unresolved":true,"context_lines":[{"line_number":1439,"context_line":"                # break out of the iter so WSGI can tear down the broken"},{"line_number":1440,"context_line":"                # connection."},{"line_number":1441,"context_line":"                frags_with_data \u003d sum([1 for f in fragments if f])"},{"line_number":1442,"context_line":"                if frags_with_data \u003c len(fragments):"},{"line_number":1443,"context_line":"                    if frags_with_data \u003e 0:"},{"line_number":1444,"context_line":"                        self.logger.warning("},{"line_number":1445,"context_line":"                            \u0027Un-recoverable fragment rebuild. Only received \u0027"},{"line_number":1446,"context_line":"                            \u0027%d/%d fragments for %r\u0027, frags_with_data,"}],"source_content_type":"text/x-python","patch_set":3,"id":"24b5558e_b89441ff","line":1443,"range":{"start_line":1442,"start_character":16,"end_line":1443,"end_character":43},"updated":"2021-06-01 18:27:47.000000000","message":"Maybe just use\n\n if 0 \u003c frags_with_data \u003c len(fragments):\n\n? Oh, but the break... so maybe\n\n if frags_with_data \u003d\u003d 0:\n     # Happy path, hopefully?\n     break\n elif frags_with_data \u003c len(fragments):\n     self.logger.warning(...)\n     break\n # else, have frags and can decode\n\nSomething about the indents just makes it a little hard for me to follow.","commit_id":"09ead690968a221e28d75f0e5c190f74172df67f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c5a0aa050fb10f03e8cf1a93ff3e7708cde73fe2","unresolved":true,"context_lines":[{"line_number":1442,"context_line":"                if frags_with_data \u003c len(fragments):"},{"line_number":1443,"context_line":"                    if frags_with_data \u003e 0:"},{"line_number":1444,"context_line":"                        self.logger.warning("},{"line_number":1445,"context_line":"                            \u0027Un-recoverable fragment rebuild. Only received \u0027"},{"line_number":1446,"context_line":"                            \u0027%d/%d fragments for %r\u0027, frags_with_data,"},{"line_number":1447,"context_line":"                            len(fragments), quote(self.path))"},{"line_number":1448,"context_line":"                    break"},{"line_number":1449,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"f9595355_831fd4d2","line":1446,"range":{"start_line":1445,"start_character":29,"end_line":1446,"end_character":48},"updated":"2021-06-01 10:55:41.000000000","message":"ok. I\u0027m going to need to remember that a \u0027fragment\u0027 is actually a part of what object server\u0027s store i.e. part of a fragment archive: we may have started receiving all *fragment archives* but then a fragment goes missing.","commit_id":"09ead690968a221e28d75f0e5c190f74172df67f"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"398eaa59645c85d57bcfa29c06b310cf6f40c9d2","unresolved":true,"context_lines":[{"line_number":4922,"context_line":"                              headers\u003dheaders), \\"},{"line_number":4923,"context_line":"                mock.patch("},{"line_number":4924,"context_line":"                    \u0027swift.proxy.controllers.obj.ECFragGetter.fast_forward\u0027,"},{"line_number":4925,"context_line":"                    side_effect\u003dValueError()):"},{"line_number":4926,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":4927,"context_line":"            self.assertEqual(resp.status_int, 200)"},{"line_number":4928,"context_line":"            self.assertNotEqual(md5(resp.body).hexdigest(), etag)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3866aeb8_f3bd0e6c","line":4925,"range":{"start_line":4925,"start_character":32,"end_line":4925,"end_character":42},"updated":"2021-06-01 18:27:47.000000000","message":"I\u0027m really confused about why we explicitly handle ValueErrors; I don\u0027t see any obvious way for fast_forward to raise that 😕\n\nOf course, it was pre-existing, though.","commit_id":"09ead690968a221e28d75f0e5c190f74172df67f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c5a0aa050fb10f03e8cf1a93ff3e7708cde73fe2","unresolved":true,"context_lines":[{"line_number":4928,"context_line":"            self.assertNotEqual(md5(resp.body).hexdigest(), etag)"},{"line_number":4929,"context_line":"        error_lines \u003d self.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":4930,"context_line":"        self.assertEqual(2, len(error_lines))"},{"line_number":4931,"context_line":"        self.assertIn(\u0027Unable to fast forward\u0027, error_lines[0])"},{"line_number":4932,"context_line":"        self.assertIn(\u0027Timeout fetching\u0027, error_lines[1])"},{"line_number":4933,"context_line":"        warning_lines \u003d self.logger.get_lines_for_level(\u0027warning\u0027)"},{"line_number":4934,"context_line":"        self.assertEqual(1, len(warning_lines))"},{"line_number":4935,"context_line":"        self.assertIn("}],"source_content_type":"text/x-python","patch_set":3,"id":"983c9133_96092987","line":4932,"range":{"start_line":4931,"start_character":8,"end_line":4932,"end_character":57},"updated":"2021-06-01 10:55:41.000000000","message":"this got me wondering why we\u0027d not already be alerted by the errors from the put_fragments_in_queue method... it turns out there are scenarios that are not logged e.g. when one frag_iter yields less fragments than others, but otherwise good fragments.\n\nI wrote a test for that, which *only* generates the new warning message:\n\nhttps://review.opendev.org/c/openstack/swift/+/793945","commit_id":"09ead690968a221e28d75f0e5c190f74172df67f"}]}
