)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b1c048b1c6644a25169b386d91dd538a99f28d11","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"178ed940_cadbbe31","updated":"2021-11-23 16:05:47.000000000","message":"need to clean up those pep8 warnings","commit_id":"17137ccdf91e61bf5608299b7740ff5ac6e1e31e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87c5b88a052330b533b1221f72322a847259b4d0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"1daf13a0_4c1d65df","updated":"2021-11-24 12:01:30.000000000","message":"This is going to be useful!\n\n-1 for the unnecessary (I think) new exception type, and lack of coverage for force_metadata_checks which is a substantive change.","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"89dd971c2434f36ac972a65d9b65f78fc6e76019","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e9a977f2_19309ea2","updated":"2021-11-29 12:28:48.000000000","message":"I\u0027ve tried pretty hard to write a test that exercises force_metadata_check True [1] but cannot force an exception from that path. I\u0027m reluctant to merge a new feature, with conf option, without any test. We should at least have a test verifies that the option is passed to the lib, but ideally that the option has effect in the lib.\n\nTo make some progress, how about breaking the logging change out from the new option and arg passed to pyeclib? Then we can separately figure out how to test the pyeclib arg.\n\n[1] https://paste.openstack.org/show/811328/","commit_id":"ebdd3ad9d778c0e7e39e89cc881f6709f9d7cb1e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fa123463e7cf35880cd021f5a5c1ac209d23db6f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"d0df0166_34664e24","updated":"2021-11-28 21:59:24.000000000","message":"recheck","commit_id":"ebdd3ad9d778c0e7e39e89cc881f6709f9d7cb1e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ac3281ef10794cd40abbc50957d186df3246adad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"820ee0f3_2f12fb57","updated":"2021-12-02 10:41:40.000000000","message":"Thanks for splitting the patch up.\n\nI did figure out how [1] to capture the frag lengths, to address the TODO in the test. But I\u0027m not sure it is necessary given that same assumptions are made elsewhere in the tests. Perhaps the TODO can just be deleted? (Or squash in the follow up [1].)\n\nEither way, my preference would be not to merge with a TODO.\n\n[1] https://review.opendev.org/c/openstack/swift/+/820142","commit_id":"bbd92309fbfcef9b8b2337a2780b0d7c270234f7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1573fa27ea208938dd0b651ccc0b041567ad124f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"e18e2b1a_c4e10fd0","updated":"2021-12-03 22:12:57.000000000","message":"recheck","commit_id":"9acc44b15c3158e3996954ec4258fb4c91ff5a99"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b1c048b1c6644a25169b386d91dd538a99f28d11","unresolved":true,"context_lines":[{"line_number":1455,"context_line":"                        \"Lengths: [%s]: %s\" % ("},{"line_number":1456,"context_line":"                            quote(self.path), segments_decoded,"},{"line_number":1457,"context_line":"                            \u0027, \u0027.join(map(str, map(len, fragments))),"},{"line_number":1458,"context_line":"                            str(err)))"},{"line_number":1459,"context_line":"                    raise"},{"line_number":1460,"context_line":""},{"line_number":1461,"context_line":"                segments_decoded +\u003d 1"}],"source_content_type":"text/x-python","patch_set":3,"id":"80bf7aa1_185f33f5","line":1458,"updated":"2021-11-23 16:05:47.000000000","message":"i think this covers everything we were hoping to get","commit_id":"17137ccdf91e61bf5608299b7740ff5ac6e1e31e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87c5b88a052330b533b1221f72322a847259b4d0","unresolved":true,"context_lines":[{"line_number":1447,"context_line":"                    break"},{"line_number":1448,"context_line":"                try:"},{"line_number":1449,"context_line":"                    segment \u003d self.policy.pyeclib_driver.decode("},{"line_number":1450,"context_line":"                        fragments, force_metadata_checks\u003dTrue)"},{"line_number":1451,"context_line":"                except (ECDriverError, ECInvalidFragmentMetadata) as err:"},{"line_number":1452,"context_line":"                    self.logger.error("},{"line_number":1453,"context_line":"                        \"Error decoding fragments for %r. \""}],"source_content_type":"text/x-python","patch_set":5,"id":"2ae1e421_9a059cff","line":1450,"range":{"start_line":1450,"start_character":35,"end_line":1450,"end_character":61},"updated":"2021-11-24 12:01:30.000000000","message":"1. nothing in test_obj.py fails if I revert this (i.e. force_metadata_checks\u003dFalse) which is a little worrying in case we might be provoking a new exception type due to EINSUFFFRAGS. I *think* it is ok because ECInsufficientFragments subclasses ECDriverError, but it would be good to actually test the forced metadata checking.\n\n2. do we have any idea of the relative cpu cost of computing the header crc\u0027s?","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"b75d98299f517df2a52f4d991e9d5fc3542b3c1e","unresolved":true,"context_lines":[{"line_number":1447,"context_line":"                    break"},{"line_number":1448,"context_line":"                try:"},{"line_number":1449,"context_line":"                    segment \u003d self.policy.pyeclib_driver.decode("},{"line_number":1450,"context_line":"                        fragments, force_metadata_checks\u003dTrue)"},{"line_number":1451,"context_line":"                except (ECDriverError, ECInvalidFragmentMetadata) as err:"},{"line_number":1452,"context_line":"                    self.logger.error("},{"line_number":1453,"context_line":"                        \"Error decoding fragments for %r. \""}],"source_content_type":"text/x-python","patch_set":5,"id":"f6b52a4b_d05d1dea","line":1450,"range":{"start_line":1450,"start_character":35,"end_line":1450,"end_character":61},"in_reply_to":"1348c6fb_c6a13e04","updated":"2021-11-26 04:15:11.000000000","message":"opp I mean object server (obviously been looking at the reconstructor changes before this) :P","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a18e37a185ceb23d2dcbfb5b2d86c4019c21187a","unresolved":true,"context_lines":[{"line_number":1447,"context_line":"                    break"},{"line_number":1448,"context_line":"                try:"},{"line_number":1449,"context_line":"                    segment \u003d self.policy.pyeclib_driver.decode("},{"line_number":1450,"context_line":"                        fragments, force_metadata_checks\u003dTrue)"},{"line_number":1451,"context_line":"                except (ECDriverError, ECInvalidFragmentMetadata) as err:"},{"line_number":1452,"context_line":"                    self.logger.error("},{"line_number":1453,"context_line":"                        \"Error decoding fragments for %r. \""}],"source_content_type":"text/x-python","patch_set":5,"id":"cca5b1fe_f1f74619","line":1450,"range":{"start_line":1450,"start_character":35,"end_line":1450,"end_character":61},"in_reply_to":"2ae1e421_9a059cff","updated":"2021-11-26 04:02:28.000000000","message":"This really just gets liberasurecode to do more checks, and so the difference ends up being more info in the logs for liberasurecode (so we don\u0027t really see it directly). But gives us failure info when things like the fragment metadata (headers) don\u0027t match etc.","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"cff514bf981886b5b02f4132faa986502f8d020f","unresolved":true,"context_lines":[{"line_number":1447,"context_line":"                    break"},{"line_number":1448,"context_line":"                try:"},{"line_number":1449,"context_line":"                    segment \u003d self.policy.pyeclib_driver.decode("},{"line_number":1450,"context_line":"                        fragments, force_metadata_checks\u003dTrue)"},{"line_number":1451,"context_line":"                except (ECDriverError, ECInvalidFragmentMetadata) as err:"},{"line_number":1452,"context_line":"                    self.logger.error("},{"line_number":1453,"context_line":"                        \"Error decoding fragments for %r. \""}],"source_content_type":"text/x-python","patch_set":5,"id":"1348c6fb_c6a13e04","line":1450,"range":{"start_line":1450,"start_character":35,"end_line":1450,"end_character":61},"in_reply_to":"cca5b1fe_f1f74619","updated":"2021-11-26 04:13:55.000000000","message":"How about if I pass in an option to reconstructor to enable us to turn on or off this checking.. so can had a kill switch if it does cause issues.","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7aa46f0692ef17dec37176299eb5ca21a2c3c302","unresolved":true,"context_lines":[{"line_number":1447,"context_line":"                    break"},{"line_number":1448,"context_line":"                try:"},{"line_number":1449,"context_line":"                    segment \u003d self.policy.pyeclib_driver.decode("},{"line_number":1450,"context_line":"                        fragments, force_metadata_checks\u003dTrue)"},{"line_number":1451,"context_line":"                except (ECDriverError, ECInvalidFragmentMetadata) as err:"},{"line_number":1452,"context_line":"                    self.logger.error("},{"line_number":1453,"context_line":"                        \"Error decoding fragments for %r. \""}],"source_content_type":"text/x-python","patch_set":5,"id":"5ed624bd_b3a88031","line":1450,"range":{"start_line":1450,"start_character":35,"end_line":1450,"end_character":61},"in_reply_to":"f6b52a4b_d05d1dea","updated":"2021-11-26 06:06:55.000000000","message":"d\u0027oh object controller.. brain doesn\u0027t seem to be working today :P Anyway. I have a new version to push up.","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87c5b88a052330b533b1221f72322a847259b4d0","unresolved":true,"context_lines":[{"line_number":1448,"context_line":"                try:"},{"line_number":1449,"context_line":"                    segment \u003d self.policy.pyeclib_driver.decode("},{"line_number":1450,"context_line":"                        fragments, force_metadata_checks\u003dTrue)"},{"line_number":1451,"context_line":"                except (ECDriverError, ECInvalidFragmentMetadata) as err:"},{"line_number":1452,"context_line":"                    self.logger.error("},{"line_number":1453,"context_line":"                        \"Error decoding fragments for %r. \""},{"line_number":1454,"context_line":"                        \"Segments decoded: %d \""}],"source_content_type":"text/x-python","patch_set":5,"id":"7623e33b_702efc88","line":1451,"range":{"start_line":1451,"start_character":39,"end_line":1451,"end_character":64},"updated":"2021-11-24 12:01:30.000000000","message":"ECInvalidFragmentMetadata is a subclass of ECDriverError so I don\u0027t think this change adds anything","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a18e37a185ceb23d2dcbfb5b2d86c4019c21187a","unresolved":true,"context_lines":[{"line_number":1448,"context_line":"                try:"},{"line_number":1449,"context_line":"                    segment \u003d self.policy.pyeclib_driver.decode("},{"line_number":1450,"context_line":"                        fragments, force_metadata_checks\u003dTrue)"},{"line_number":1451,"context_line":"                except (ECDriverError, ECInvalidFragmentMetadata) as err:"},{"line_number":1452,"context_line":"                    self.logger.error("},{"line_number":1453,"context_line":"                        \"Error decoding fragments for %r. \""},{"line_number":1454,"context_line":"                        \"Segments decoded: %d \""}],"source_content_type":"text/x-python","patch_set":5,"id":"49ecd6b0_c93e0f4c","line":1451,"range":{"start_line":1451,"start_character":39,"end_line":1451,"end_character":64},"in_reply_to":"7623e33b_702efc88","updated":"2021-11-26 04:02:28.000000000","message":"Oh maybe.. I did see it get thrown though, but turns out if there is an exception thrown during decoding the stream, it\u0027ll always be rerasied.. so you may be correct. Let me check.","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87c5b88a052330b533b1221f72322a847259b4d0","unresolved":true,"context_lines":[{"line_number":1452,"context_line":"                    self.logger.error("},{"line_number":1453,"context_line":"                        \"Error decoding fragments for %r. \""},{"line_number":1454,"context_line":"                        \"Segments decoded: %d \""},{"line_number":1455,"context_line":"                        \"Lengths: [%s]: %s\" % ("},{"line_number":1456,"context_line":"                            quote(self.path), segments_decoded,"},{"line_number":1457,"context_line":"                            \u0027, \u0027.join(map(str, map(len, fragments))),"},{"line_number":1458,"context_line":"                            str(err)))"}],"source_content_type":"text/x-python","patch_set":5,"id":"4bf97e23_0daf96ab","line":1455,"updated":"2021-11-24 12:01:30.000000000","message":"nit: could we have a comma between \"Segments decoded: %d\" and \" Lengths:\"","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a18e37a185ceb23d2dcbfb5b2d86c4019c21187a","unresolved":false,"context_lines":[{"line_number":1452,"context_line":"                    self.logger.error("},{"line_number":1453,"context_line":"                        \"Error decoding fragments for %r. \""},{"line_number":1454,"context_line":"                        \"Segments decoded: %d \""},{"line_number":1455,"context_line":"                        \"Lengths: [%s]: %s\" % ("},{"line_number":1456,"context_line":"                            quote(self.path), segments_decoded,"},{"line_number":1457,"context_line":"                            \u0027, \u0027.join(map(str, map(len, fragments))),"},{"line_number":1458,"context_line":"                            str(err)))"}],"source_content_type":"text/x-python","patch_set":5,"id":"8cce94af_d978eadc","line":1455,"in_reply_to":"4bf97e23_0daf96ab","updated":"2021-11-26 04:02:28.000000000","message":"Ack","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"}],"swift/proxy/server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"89dd971c2434f36ac972a65d9b65f78fc6e76019","unresolved":true,"context_lines":[{"line_number":296,"context_line":"            for name in swift_owner_headers.split(\u0027,\u0027) if name.strip()]"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        self.pyeclib_force_metadata_checks \u003d config_true_value("},{"line_number":299,"context_line":"            conf.get(\u0027pyeclib_force_metadata_check\u0027, False))"},{"line_number":300,"context_line":"        # When upgrading from liberasurecode\u003c\u003d1.5.0, you may want to continue"},{"line_number":301,"context_line":"        # writing legacy CRCs until all nodes are upgraded and capabale of"},{"line_number":302,"context_line":"        # reading fragments with zlib CRCs."}],"source_content_type":"text/x-python","patch_set":6,"id":"2d26ffeb_a0d39a03","line":299,"updated":"2021-11-29 12:28:48.000000000","message":"I can\u0027t see this being set True in any test","commit_id":"ebdd3ad9d778c0e7e39e89cc881f6709f9d7cb1e"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b1c048b1c6644a25169b386d91dd538a99f28d11","unresolved":true,"context_lines":[{"line_number":4726,"context_line":"        self.assertIn(\u0027Error decoding fragments\u0027, msg)"},{"line_number":4727,"context_line":"        self.assertIn(\u0027/a/c/o\u0027, msg)"},{"line_number":4728,"context_line":"        self.assertIn(\u0027Segments decoded: 3\u0027, msg)"},{"line_number":4729,"context_line":"        self.assertIn(\"[%s]\" % \", \".join(mixed_lengths), msg)"},{"line_number":4730,"context_line":"        self.assertIn(\"Invalid fragment payload in ECPyECLibDriver.decode\","},{"line_number":4731,"context_line":"                      msg)"},{"line_number":4732,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"287a3d9d_b2b174f2","line":4729,"updated":"2021-11-23 16:05:47.000000000","message":"it\u0027d be nice if one of these tests show\u0027d the literal [458, 458, ..., 490] or however it turns out looking","commit_id":"17137ccdf91e61bf5608299b7740ff5ac6e1e31e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0b2833a91838dda4572ab839a3e6050e47b7b05d","unresolved":true,"context_lines":[{"line_number":4726,"context_line":"        self.assertIn(\u0027Error decoding fragments\u0027, msg)"},{"line_number":4727,"context_line":"        self.assertIn(\u0027/a/c/o\u0027, msg)"},{"line_number":4728,"context_line":"        self.assertIn(\u0027Segments decoded: 3\u0027, msg)"},{"line_number":4729,"context_line":"        self.assertIn(\"[%s]\" % \", \".join(mixed_lengths), msg)"},{"line_number":4730,"context_line":"        self.assertIn(\"Invalid fragment payload in ECPyECLibDriver.decode\","},{"line_number":4731,"context_line":"                      msg)"},{"line_number":4732,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"f0c897e6_2e0e0f8e","line":4729,"in_reply_to":"287a3d9d_b2b174f2","updated":"2021-11-23 22:47:14.000000000","message":"Yeah, Had to build it dynamically because the test is randomly picking a a fragment to swap. But will add full log line to one of the others so we can see an expected log at a glance.. just might not be as interesting as this one :P","commit_id":"17137ccdf91e61bf5608299b7740ff5ac6e1e31e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87c5b88a052330b533b1221f72322a847259b4d0","unresolved":true,"context_lines":[{"line_number":4705,"context_line":"        mixed_responses[mix_index] \u003d responses2[mix_index]"},{"line_number":4706,"context_line":"        # TODO(mattoliverau): find out how to get these numbers dynamically"},{"line_number":4707,"context_line":"        #  cause who know\u0027s they may vary based on arch or even python"},{"line_number":4708,"context_line":"        #  verions :shrug:"},{"line_number":4709,"context_line":"        mixed_lengths \u003d [\"458\" for _ in responses1[:self.policy.ec_ndata]]"},{"line_number":4710,"context_line":"        mixed_lengths[mix_index] \u003d \u0027490\u0027"},{"line_number":4711,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fe939590_c4a12dae","line":4708,"updated":"2021-11-24 12:01:30.000000000","message":"are you planning to address this TODO before the patch merges?","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7aa46f0692ef17dec37176299eb5ca21a2c3c302","unresolved":true,"context_lines":[{"line_number":4705,"context_line":"        mixed_responses[mix_index] \u003d responses2[mix_index]"},{"line_number":4706,"context_line":"        # TODO(mattoliverau): find out how to get these numbers dynamically"},{"line_number":4707,"context_line":"        #  cause who know\u0027s they may vary based on arch or even python"},{"line_number":4708,"context_line":"        #  verions :shrug:"},{"line_number":4709,"context_line":"        mixed_lengths \u003d [\"458\" for _ in responses1[:self.policy.ec_ndata]]"},{"line_number":4710,"context_line":"        mixed_lengths[mix_index] \u003d \u0027490\u0027"},{"line_number":4711,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"dde2536c_4e0260f5","line":4708,"in_reply_to":"fe939590_c4a12dae","updated":"2021-11-26 06:06:55.000000000","message":"hmm, still haven\u0027t figured out how.. so shall I just remove the TODO and we can come back it later?","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9597b64a5e2efc40ae5cd22de2edf08e20591c4e","unresolved":true,"context_lines":[{"line_number":5023,"context_line":"        expected_log_line \u003d ("},{"line_number":5024,"context_line":"            \"Error decoding fragments for \u0027/a/c/o\u0027. \""},{"line_number":5025,"context_line":"            \"Segments decoded: 0 Lengths: \""},{"line_number":5026,"context_line":"            \"[490, 490, 490, 490, 490, 490, 490, 490, 490, 490]: \""},{"line_number":5027,"context_line":"            \"pyeclib_c_decode ERROR: Fragment integrity check failed. \""},{"line_number":5028,"context_line":"            \"Please inspect syslog for liberasurecode error report.\")"},{"line_number":5029,"context_line":"        self.assertEqual(expected_log_line, error_lines[0])"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fbc0d10_8669dbd5","line":5026,"updated":"2021-11-24 01:44:59.000000000","message":"nice!","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"87c5b88a052330b533b1221f72322a847259b4d0","unresolved":true,"context_lines":[{"line_number":5026,"context_line":"            \"[490, 490, 490, 490, 490, 490, 490, 490, 490, 490]: \""},{"line_number":5027,"context_line":"            \"pyeclib_c_decode ERROR: Fragment integrity check failed. \""},{"line_number":5028,"context_line":"            \"Please inspect syslog for liberasurecode error report.\")"},{"line_number":5029,"context_line":"        self.assertEqual(expected_log_line, error_lines[0])"},{"line_number":5030,"context_line":""},{"line_number":5031,"context_line":"    def test_GET_read_timeout_resume_mixed_etag(self):"},{"line_number":5032,"context_line":"        segment_size \u003d self.policy.ec_segment_size"}],"source_content_type":"text/x-python","patch_set":5,"id":"8e755081_dc58e09a","line":5029,"updated":"2021-11-24 12:01:30.000000000","message":"test is good, but I see this traceback from it:\n\n  proxy-server ERROR: ERROR Unhandled exception in request: \nTraceback (most recent call last):\n  File \"/Users/acoles/0dev/openstack/swift/swift/proxy/server.py\", line 592, in handle_request\n    return handler(req)\n  File \"/Users/acoles/0dev/openstack/swift/swift/proxy/controllers/base.py\", line 384, in wrapped\n    return func(*a, **kw)\n  File \"/Users/acoles/0dev/openstack/swift/swift/proxy/controllers/obj.py\", line 267, in GET\n    return self.GETorHEAD(req)\n  File \"/Users/acoles/0dev/openstack/swift/swift/proxy/controllers/obj.py\", line 255, in GETorHEAD\n    resp \u003d self._get_or_head_response(req, node_iter, partition, policy)\n  File \"/Users/acoles/0dev/openstack/swift/swift/proxy/controllers/obj.py\", line 3036, in _get_or_head_response\n    app_iter.kickoff(req, resp)\n  File \"/Users/acoles/0dev/openstack/swift/swift/proxy/controllers/obj.py\", line 1084, in kickoff\n    self.stashed_iter \u003d reiterate(self._real_iter(req, resp.headers))\n  File \"/Users/acoles/0dev/openstack/swift/swift/common/utils.py\", line 4151, in reiterate\n    chunk \u003d next(iterator)\n  File \"/Users/acoles/0dev/openstack/swift/swift/common/utils.py\", line 4857, in string_along\n    for x in useful_iter:\n  File \"/Users/acoles/0dev/openstack/swift/swift/proxy/controllers/obj.py\", line 1370, in _iter_one_range\n    for i, next_seg in enumerate(segment_iter):\n  File \"/Users/acoles/0dev/openstack/swift/swift/proxy/controllers/obj.py\", line 1450, in _decode_segments_from_fragments\n    fragments, force_metadata_checks\u003dFalse)\n  File \"/Users/acoles/0dev/openstack/pyeclib/pyeclib/ec_iface.py\", line 292, in decode\n    force_metadata_checks)\n  File \"/Users/acoles/0dev/openstack/pyeclib/pyeclib/core.py\", line 92, in decode\n    fragment_len, ranges, force_metadata_checks)\npyeclib.ec_iface.ECInvalidFragmentMetadata: pyeclib_c_decode ERROR: Fragment integrity check failed. Please inspect syslog for liberasurecode error report. (txn: txa887fcfa1cf2472d9d489-00619e2806)\n\n...because the EcDriverError is re-raised. Do we *want* it to be handled that way, or raise a HTTPServerError instead (where the ECDriverError is caught)?","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a18e37a185ceb23d2dcbfb5b2d86c4019c21187a","unresolved":true,"context_lines":[{"line_number":5026,"context_line":"            \"[490, 490, 490, 490, 490, 490, 490, 490, 490, 490]: \""},{"line_number":5027,"context_line":"            \"pyeclib_c_decode ERROR: Fragment integrity check failed. \""},{"line_number":5028,"context_line":"            \"Please inspect syslog for liberasurecode error report.\")"},{"line_number":5029,"context_line":"        self.assertEqual(expected_log_line, error_lines[0])"},{"line_number":5030,"context_line":""},{"line_number":5031,"context_line":"    def test_GET_read_timeout_resume_mixed_etag(self):"},{"line_number":5032,"context_line":"        segment_size \u003d self.policy.ec_segment_size"}],"source_content_type":"text/x-python","patch_set":5,"id":"87706645_d31df148","line":5029,"in_reply_to":"8e755081_dc58e09a","updated":"2021-11-26 04:02:28.000000000","message":"yeah, I did wonder about that. Because it happens during decoding (so after we send the response) but while reading the output iter, we seem to just reraise an expcetion.. I guess to break the connection there. So it might be too late to return a server error. We could just break the connection I guess.. and the client wont get all the data and fail with a bad etag or something.","commit_id":"164693575d389d1849048d20570b80e1fe9478d2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ac3281ef10794cd40abbc50957d186df3246adad","unresolved":true,"context_lines":[{"line_number":4704,"context_line":"        mixed_responses[mix_index] \u003d responses2[mix_index]"},{"line_number":4705,"context_line":"        # TODO(mattoliverau): find out how to get these numbers dynamically"},{"line_number":4706,"context_line":"        #  cause who know\u0027s they may vary based on arch or even python"},{"line_number":4707,"context_line":"        #  verions :shrug:"},{"line_number":4708,"context_line":"        mixed_lengths \u003d [\"458\" for _ in responses1[:self.policy.ec_ndata]]"},{"line_number":4709,"context_line":"        mixed_lengths[mix_index] \u003d \u0027490\u0027"},{"line_number":4710,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"27f7915b_4bf3f880","line":4707,"updated":"2021-12-02 10:41:40.000000000","message":"we seem to use 490 and 458 throughout the tests, so is this TODO necessary? and if so, does the same not apply to the new test added later?\n\nor is there something more subtle I am missing that makes this test more prone to fail based on arch/py version?","commit_id":"bbd92309fbfcef9b8b2337a2780b0d7c270234f7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ac3281ef10794cd40abbc50957d186df3246adad","unresolved":true,"context_lines":[{"line_number":5022,"context_line":"        expected_log_line \u003d ("},{"line_number":5023,"context_line":"            \"Error decoding fragments for \u0027/a/c/o\u0027. \""},{"line_number":5024,"context_line":"            \"Segments decoded: 0, Lengths: \""},{"line_number":5025,"context_line":"            \"[490, 490, 490, 490, 490, 490, 490, 490, 490, 490]: \""},{"line_number":5026,"context_line":"            \"pyeclib_c_decode ERROR: Fragment integrity check failed. \""},{"line_number":5027,"context_line":"            \"Please inspect syslog for liberasurecode error report.\")"},{"line_number":5028,"context_line":"        self.assertEqual(expected_log_line, error_lines[0])"}],"source_content_type":"text/x-python","patch_set":7,"id":"839b05d6_8264dce8","line":5025,"updated":"2021-12-02 10:41:40.000000000","message":"frag length is hard-coded here but no TODO","commit_id":"bbd92309fbfcef9b8b2337a2780b0d7c270234f7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"52775298eaa86444106838207bb5df96d22d2639","unresolved":true,"context_lines":[{"line_number":5022,"context_line":"        expected_log_line \u003d ("},{"line_number":5023,"context_line":"            \"Error decoding fragments for \u0027/a/c/o\u0027. \""},{"line_number":5024,"context_line":"            \"Segments decoded: 0, Lengths: \""},{"line_number":5025,"context_line":"            \"[490, 490, 490, 490, 490, 490, 490, 490, 490, 490]: \""},{"line_number":5026,"context_line":"            \"pyeclib_c_decode ERROR: Fragment integrity check failed. \""},{"line_number":5027,"context_line":"            \"Please inspect syslog for liberasurecode error report.\")"},{"line_number":5028,"context_line":"        self.assertEqual(expected_log_line, error_lines[0])"}],"source_content_type":"text/x-python","patch_set":7,"id":"aa630c42_a41ba90a","line":5025,"in_reply_to":"839b05d6_8264dce8","updated":"2021-12-03 05:26:18.000000000","message":"Yeah, clay thought it might be nice to see an example of what a full log line looked like.","commit_id":"bbd92309fbfcef9b8b2337a2780b0d7c270234f7"}]}
