)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ad90761c0448dc5f6eff37aa9923223c166bb092","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"1531e620_d79a129c","updated":"2025-08-15 09:27:01.000000000","message":"recheck\n\njob timed out, unrelated","commit_id":"5b2e4e00c142536998d7f1e5bfaa0b76ff9f43b1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f71943442b94ac706aa06acaa72d5b035bcc7cbc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"69ea2673_22f9778d","updated":"2025-08-14 15:18:11.000000000","message":"the existing sleep(0.001) should be many many trampolines, this worked on master OMM:\n\n```\nfor i in {1..100}; do pytest swift/test/unit/obj/test_ssync.py::TestSsyncECReconstructorSyncJob::test_sync_reconstructor_exception_during_rebuild; if [ $? -ne 0 ]; then break; fi; done\n```\n\nI blame arm - but this is still better.","commit_id":"5b2e4e00c142536998d7f1e5bfaa0b76ff9f43b1"}],"test/unit/obj/test_ssync.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f71943442b94ac706aa06acaa72d5b035bcc7cbc","unresolved":true,"context_lines":[{"line_number":65,"context_line":"        self.rx_server_pool \u003d eventlet.GreenPool(size\u003d1)"},{"line_number":66,"context_line":"        self.rx_server \u003d eventlet.spawn("},{"line_number":67,"context_line":"            eventlet.wsgi.server, sock, self.rx_controller, log\u003dself.rx_logger,"},{"line_number":68,"context_line":"            custom_pool\u003dself.rx_server_pool)"},{"line_number":69,"context_line":"        self.rx_port \u003d sock.getsockname()[1]"},{"line_number":70,"context_line":"        self.rx_node \u003d {\u0027replication_ip\u0027: self.rx_ip,"},{"line_number":71,"context_line":"                        \u0027replication_port\u0027: self.rx_port,"}],"source_content_type":"text/x-python","patch_set":1,"id":"081ffadd_9e1719ff","line":68,"updated":"2025-08-14 15:18:11.000000000","message":"I\u0027ve confirmed the self.rx_controller doesn\u0027t have any back-ref to the eventlet.wsgi.server nor does the greenthread returned from spawn have any forward reference.  There\u0027s no obvious way to ask the server to \"finish requests and shutdown\" that I can find.\n\nUsing a custom_pool so that we can wait on the server\u0027s *requests* is really clever actually.","commit_id":"5b2e4e00c142536998d7f1e5bfaa0b76ff9f43b1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f71943442b94ac706aa06acaa72d5b035bcc7cbc","unresolved":true,"context_lines":[{"line_number":83,"context_line":"                seconds\u003d1,"},{"line_number":84,"context_line":"                exception\u003dAssertionError("},{"line_number":85,"context_line":"                    \u0027timed out waiting for ssync receiver thread\u0027)):"},{"line_number":86,"context_line":"            self.rx_server_pool.waitall()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def make_connect_wrapper(self, sender):"},{"line_number":89,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"bae7d356_aac9b96e","line":86,"updated":"2025-08-14 15:18:11.000000000","message":"probably we could have increased the \"eventlet.sleep(0.001)\" by 1-10x - but this is much tighter - KUDOS.","commit_id":"5b2e4e00c142536998d7f1e5bfaa0b76ff9f43b1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f71943442b94ac706aa06acaa72d5b035bcc7cbc","unresolved":true,"context_lines":[{"line_number":1092,"context_line":"        self.assertIn(\u0027Sent data length does not match content-length\u0027,"},{"line_number":1093,"context_line":"                      tx_error_log_lines[1])"},{"line_number":1094,"context_line":"        self.assertFalse(tx_error_log_lines[2:])"},{"line_number":1095,"context_line":"        self._wait_for_rx_server()"},{"line_number":1096,"context_line":"        rx_warning_log_lines \u003d self.rx_logger.get_lines_for_level(\u0027warning\u0027)"},{"line_number":1097,"context_line":"        self.assertIn(\u0027ssync subrequest failed with 499\u0027,"},{"line_number":1098,"context_line":"                      rx_warning_log_lines[0])"}],"source_content_type":"text/x-python","patch_set":1,"id":"2ac4529f_c4b9be26","line":1095,"updated":"2025-08-14 15:18:11.000000000","message":"with broken ssync:\n\n```\n(vagrant-swift-all-in-one) cgerrard@NVStation:~/Workspace/vagrant-swift-all-in-one/swift$ git diff\ndiff --git a/swift/obj/ssync_receiver.py b/swift/obj/ssync_receiver.py\nindex 6415d9fd4..410ea8a5d 100644\n--- a/swift/obj/ssync_receiver.py\n+++ b/swift/obj/ssync_receiver.py\n@@ -25,6 +25,7 @@ from swift.common import swob\n from swift.common import utils\n from swift.common import request_helpers\n from swift.common.utils import Timestamp\n+import random\n \n \n class SsyncClientDisconnected(Exception):\n@@ -132,6 +133,7 @@ class SsyncInputProxy:\n \n         :param context: string to annotate any exception raised\n         \"\"\"\n+        eventlet.sleep(random.random() * 0.3)\n         if self.exception:\n             raise self.exception\n         try:\n\n```\n\nsometimes this test fails:\n\n```\nFAILED swift/test/unit/obj/test_ssync.py::TestSsyncECReconstructorSyncJob::test_sync_reconstructor_exception_during_rebuild - AssertionError: timed out waiting for ssync receiver thread\n```","commit_id":"5b2e4e00c142536998d7f1e5bfaa0b76ff9f43b1"}]}
