)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6d4a651e114e4eb1b889f136e38fda17fb2536ce","unresolved":true,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2023-02-21 18:20:29 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"test for ssync meta offset bug"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: If0259de60e09ab9f6013b119cfda9ab9698c1aa8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"d331c50e_ed7d89e5","line":8,"updated":"2023-02-22 11:09:28.000000000","message":"add Related-Change? or shall we squash?","commit_id":"9142727bd181298db2bceac6adb4b18b6dcfeddd"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"93053fde5ac47e1d7c29755ebdfcd43fff1e467b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"428f1cf4_312e2c50","updated":"2023-02-20 11:49:45.000000000","message":"thanks for starting on a probe test!","commit_id":"9220910bba48a2473918171b14fde4fd97052834"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6d4a651e114e4eb1b889f136e38fda17fb2536ce","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"701115be_f227bef2","updated":"2023-02-22 11:09:28.000000000","message":"Super! thanks.\n\nThis fails when I revert the fix in parent patch:\n  E           AssertionError: DirectClientException not raised\n\n  test/probe/test_object_versioning.py:306: AssertionError\n  \nand in logs I see:\n\n  Feb 22 05:31:08 vagrant object-6020: 127.0.0.1 - - [22/Feb/2023:10:31:08 +0000] \"SSYNC /sdb2/868\" 200 - \"-\" \"-\" \"-\" 0.0000 \"-\" 116009 1\nFeb 22 05:31:08 vagrant object-6020: - - - [22/Feb/2023:10:31:08 +0000] \"POST /sdb2/868/AUTH_test/container-88e12039-7167-47ba-83ce-6c458ad7ae95/object-cdf7d82e-d6c9-4f26-8d0a-ad5\na78fa06cc\" 409 95 \"-\" \"-\" \"-\" 0.0002 \"-\" 116009 1\nFeb 22 05:31:08 vagrant object-6020: ssync subrequest failed with 409: POST /sdb2/868/AUTH_test/container-88e12039-7167-47ba-83ce-6c458ad7ae95/object-cdf7d82e-d6c9-4f26-8d0a-ad5a7\n8fa06cc (b\u0027\u003chtml\u003e\u003ch1\u003eConflict\u003c/h1\u003e\u003cp\u003eThere was a conflict when trying to complete your request.\u003c/p\u003e\u003c/html\u003e\u0027)\nFeb 22 05:31:08 vagrant object-6040: 127.0.0.2:6020/sdb2/868 Unexpected response: \":ERROR: 500 b\u0027ERROR: With :UPDATES: 1 failures to 0 successes\u0027\"","commit_id":"9142727bd181298db2bceac6adb4b18b6dcfeddd"}],"test/probe/test_object_versioning.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe48f09a8f1e0263f6f6191539e8afd126a81195","unresolved":true,"context_lines":[{"line_number":262,"context_line":"                           self.object_name, headers\u003dheaders_post)"},{"line_number":263,"context_line":"        # let consistency engine repair"},{"line_number":264,"context_line":"        self.revive_drive(failed_primary_device_path)"},{"line_number":265,"context_line":"        import pdb"},{"line_number":266,"context_line":"        pdb.set_trace()"},{"line_number":267,"context_line":"        self.reconstructor.once()"},{"line_number":268,"context_line":"        # validate object in all locations"},{"line_number":269,"context_line":"        etags \u003d set()"}],"source_content_type":"text/x-python","patch_set":1,"id":"8b7319db_3e917384","line":266,"range":{"start_line":265,"start_character":0,"end_line":266,"end_character":23},"updated":"2023-02-18 00:26:38.000000000","message":"heh","commit_id":"9220910bba48a2473918171b14fde4fd97052834"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"93053fde5ac47e1d7c29755ebdfcd43fff1e467b","unresolved":true,"context_lines":[{"line_number":264,"context_line":"        self.revive_drive(failed_primary_device_path)"},{"line_number":265,"context_line":"        import pdb"},{"line_number":266,"context_line":"        pdb.set_trace()"},{"line_number":267,"context_line":"        self.reconstructor.once()"},{"line_number":268,"context_line":"        # validate object in all locations"},{"line_number":269,"context_line":"        etags \u003d set()"},{"line_number":270,"context_line":"        metadata \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"ad5e58b0_5289681e","line":267,"updated":"2023-02-20 11:49:45.000000000","message":"The bug manifests when the object has data with offset timestamp, meta file and *is in sync* but included in the scope a reconstructor job. So for the test, we need to somehow force the partition to need ssync\u0027ing while the \u0027culprit\u0027 object is in sync....e.g. another out-of-sync object in the same partition, or mess with the on disk hashes file?","commit_id":"9220910bba48a2473918171b14fde4fd97052834"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6d4a651e114e4eb1b889f136e38fda17fb2536ce","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        self.revive_drive(failed_primary_device_path)"},{"line_number":265,"context_line":"        import pdb"},{"line_number":266,"context_line":"        pdb.set_trace()"},{"line_number":267,"context_line":"        self.reconstructor.once()"},{"line_number":268,"context_line":"        # validate object in all locations"},{"line_number":269,"context_line":"        etags \u003d set()"},{"line_number":270,"context_line":"        metadata \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"8a81f145_b2240eae","line":267,"in_reply_to":"ad5e58b0_5289681e","updated":"2023-02-22 11:09:28.000000000","message":"Done","commit_id":"9220910bba48a2473918171b14fde4fd97052834"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe48f09a8f1e0263f6f6191539e8afd126a81195","unresolved":true,"context_lines":[{"line_number":273,"context_line":"            etags.add(etag)"},{"line_number":274,"context_line":"            metadata.append(headers[\u0027X-Object-Meta-Bar\u0027])"},{"line_number":275,"context_line":"        self.assertEqual(1, len(etags))"},{"line_number":276,"context_line":"        self.assertEqual([\u0027meta-bar\u0027] * len(self.nodes), metadata)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"6fee2d30_9ce0d340","line":276,"updated":"2023-02-18 00:26:38.000000000","message":"We want some similar assertions to show that handoffs got cleared. As it is, this test passes even without the fix in the parent patch.","commit_id":"9220910bba48a2473918171b14fde4fd97052834"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6d4a651e114e4eb1b889f136e38fda17fb2536ce","unresolved":true,"context_lines":[{"line_number":238,"context_line":"    def setUp(self):"},{"line_number":239,"context_line":"        super(TestECObjectVersioning, self).setUp()"},{"line_number":240,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"},{"line_number":241,"context_line":"        self.object_name \u003d \u0027object-%s\u0027 % uuid.uuid4()"},{"line_number":242,"context_line":"        self.policy.load_ring(\u0027/etc/swift\u0027)"},{"line_number":243,"context_line":"        self.ring \u003d self.policy.object_ring"},{"line_number":244,"context_line":"        self.part, self.nodes \u003d self.ring.get_nodes("}],"source_content_type":"text/x-python","patch_set":2,"id":"adc4986b_e5145a3b","line":241,"updated":"2023-02-22 11:09:28.000000000","message":"the superclass already has container_name and object_name","commit_id":"9142727bd181298db2bceac6adb4b18b6dcfeddd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6d4a651e114e4eb1b889f136e38fda17fb2536ce","unresolved":true,"context_lines":[{"line_number":240,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"},{"line_number":241,"context_line":"        self.object_name \u003d \u0027object-%s\u0027 % uuid.uuid4()"},{"line_number":242,"context_line":"        self.policy.load_ring(\u0027/etc/swift\u0027)"},{"line_number":243,"context_line":"        self.ring \u003d self.policy.object_ring"},{"line_number":244,"context_line":"        self.part, self.nodes \u003d self.ring.get_nodes("},{"line_number":245,"context_line":"            self.account, self.container_name, self.object_name)"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"d5f73aa1_98b76c39","line":243,"updated":"2023-02-22 11:09:28.000000000","message":"the super-superclass already has self.object_ring (but seems to jump through hoops to get it rather than pluck the attribute from policy?)","commit_id":"9142727bd181298db2bceac6adb4b18b6dcfeddd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6d4a651e114e4eb1b889f136e38fda17fb2536ce","unresolved":true,"context_lines":[{"line_number":296,"context_line":"        metadata \u003d []"},{"line_number":297,"context_line":"        for node in self.nodes:"},{"line_number":298,"context_line":"            headers, etag \u003d self.direct_get(node, self.part)"},{"line_number":299,"context_line":"            etags.add(etag)"},{"line_number":300,"context_line":"            metadata.append(headers[\u0027X-Object-Meta-Bar\u0027])"},{"line_number":301,"context_line":"        self.assertEqual(1, len(etags))"},{"line_number":302,"context_line":"        self.assertEqual([\u0027meta-bar\u0027] * len(self.nodes), metadata)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fee8e213_7a5f9199","line":299,"range":{"start_line":299,"start_character":22,"end_line":299,"end_character":26},"updated":"2023-02-22 11:09:28.000000000","message":"From the backend obj server, this is the hash of the EC encoded frag (which for a versioning symlink just happens be the same for every *empty* frag).\n\nThere\u0027s nothing wrong with making that assertion, but I tried the test with the ssync fix reverted and versioning disabled (expecting to see it pass) and of course it fails because there are now different etags for each non-empty EC frag.\n\nThis passes with and without versioning enabled, with the ssync fix:\n\n  diff --git a/test/probe/test_object_versioning.py \n  b/test/probe/test_object_versioning.py\n  index ecedcd5f1..80206bf3f 100644\n  --- a/test/probe/test_object_versioning.py\n  +++ b/test/probe/test_object_versioning.py\n  @@ -296,9 +296,9 @@ class TestECObjectVersioning(ECProbeTest):\n           metadata \u003d []\n           for node in self.nodes:\n               headers, etag \u003d self.direct_get(node, self.part)\n  -            etags.add(etag)\n  +            etags.add(headers[\u0027X-Object-Sysmeta-Ec-Etag\u0027])\n               metadata.append(headers[\u0027X-Object-Meta-Bar\u0027])\n  -        self.assertEqual(1, len(etags))\n  +        self.assertEqual(1, len(etags), etags)\n           self.assertEqual([\u0027meta-bar\u0027] * len(self.nodes), metadata)\n           # process revert\n           self.reconstructor.once(number\u003dhandoff_config)\n \nbut still fails in the target scenario i.e. with versioning enabled and the ssync bug fix reverted.","commit_id":"9142727bd181298db2bceac6adb4b18b6dcfeddd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6d4a651e114e4eb1b889f136e38fda17fb2536ce","unresolved":true,"context_lines":[{"line_number":304,"context_line":"        self.reconstructor.once(number\u003dhandoff_config)"},{"line_number":305,"context_line":"        with self.assertRaises(direct_client.DirectClientException) as ctx:"},{"line_number":306,"context_line":"            headers, etag \u003d self.direct_get(handoff, self.part)"},{"line_number":307,"context_line":"        self.assertEqual(ctx.exception.http_status, 404)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1cfeb57a_6597a969","line":307,"updated":"2023-02-22 11:09:28.000000000","message":"nit: we could repeat the direct get assertions","commit_id":"9142727bd181298db2bceac6adb4b18b6dcfeddd"}]}
