)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"042fe6934f3333e53786d42a4d1b17390a9c2145","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4bfea909_133e8f73","updated":"2025-06-05 23:15:16.000000000","message":"I\u0027d be tempted to read from a file or something, but if sleep works, then okay.","commit_id":"3b3c76f67b1517419bd190a16b3595b68e70257f"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b4cf59dde0df2f112491053622c7eca4e240ad24","unresolved":true,"context_lines":[{"line_number":2547,"context_line":"            self.assertEqual(b\u0027\u0027, sock.recv(1024))"},{"line_number":2548,"context_line":"            # ... but we ARE disconnected"},{"line_number":2549,"context_line":"            with self.assertRaises(socket.error) as caught:"},{"line_number":2550,"context_line":"                time.sleep(0.001)"},{"line_number":2551,"context_line":"                sock.send(b\u0027test\u0027)"},{"line_number":2552,"context_line":"            self.assertIn(caught.exception.errno,"},{"line_number":2553,"context_line":"                          (errno.EPIPE, errno.ECONNRESET))"}],"source_content_type":"text/x-python","patch_set":1,"id":"8c531ecf_08838789","line":2550,"updated":"2025-06-06 09:05:02.000000000","message":"I still see this fail intermittently on my MAC, but it\u0027s pretty reliable with a sleep of 0.01","commit_id":"3b3c76f67b1517419bd190a16b3595b68e70257f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"14e679755d77f76f3907a72e20de484aa7b38a12","unresolved":true,"context_lines":[{"line_number":2547,"context_line":"            self.assertEqual(b\u0027\u0027, sock.recv(1024))"},{"line_number":2548,"context_line":"            # ... but we ARE disconnected"},{"line_number":2549,"context_line":"            with self.assertRaises(socket.error) as caught:"},{"line_number":2550,"context_line":"                time.sleep(0.001)"},{"line_number":2551,"context_line":"                sock.send(b\u0027test\u0027)"},{"line_number":2552,"context_line":"            self.assertIn(caught.exception.errno,"},{"line_number":2553,"context_line":"                          (errno.EPIPE, errno.ECONNRESET))"}],"source_content_type":"text/x-python","patch_set":1,"id":"f3af8cac_473dc09b","line":2550,"in_reply_to":"1a05ab0e_088eff27","updated":"2025-06-09 17:41:22.000000000","message":"OMM with patchset 1 I don\u0027t get to 10!\n\n```\n(swift-3.8.15) (acoles) ~/0dev/openstack/swift{review/tim_burke/osx-patch1} % for i in {1..100}; do echo $i \u0026\u0026 pytest -qq --disable-warnings test/unit/proxy/test_server.py -k test_GET_pipeline -x || break; done\n1\n...                                                                                                                                [100%]\n3 passed, 374 deselected, 2 warnings in 1.76s\n2\n...                                                                                                                                [100%]\n3 passed, 374 deselected, 2 warnings in 1.67s\n3\n...                                                                                                                                [100%]\n3 passed, 374 deselected, 2 warnings in 1.69s\n4\n...                                                                                                                                [100%]\n3 passed, 374 deselected, 2 warnings in 1.68s\n5\n...                                                                                                                                [100%]\n3 passed, 374 deselected, 2 warnings in 1.67s\n6\n...                                                                                                                                [100%]\n3 passed, 374 deselected, 2 warnings in 1.72s\n7\n...                                                                                                                                [100%]\n3 passed, 374 deselected, 2 warnings in 1.70s\n8\n..F                                                                                                                                [100%]\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d FAILURES \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n__________________________________________ TestECDuplicationObjectController.test_GET_pipeline ___________________________________________\n\nself \u003d \u003ctest.unit.proxy.test_server.TestECDuplicationObjectController testMethod\u003dtest_GET_pipeline\u003e\n\n    @unpatch_policies\n    def test_GET_pipeline(self):\n        conf \u003d _test_context[\u0027conf\u0027]\n        conf[\u0027client_timeout\u0027] \u003d 0.1\n        prosrv \u003d proxy_server.Application(conf, logger\u003ddebug_logger(\u0027proxy\u0027))\n        with in_process_proxy(\n                prosrv, socket_timeout\u003dconf[\u0027client_timeout\u0027]) as prolis:\n            self.put_container(self.policy.name, self.policy.name,\n                               prolis\u003dprolis)\n\n            obj \u003d b\u00270123456\u0027 * 11 * 17\n\n            sock \u003d connect_tcp((\u0027localhost\u0027, prolis.getsockname()[1]))\n            fd \u003d sock.makefile(\u0027rwb\u0027)\n            fd.write((\u0027PUT /v1/a/%s/go-get-it HTTP/1.1\\r\\n\u0027\n                      \u0027Host: localhost\\r\\n\u0027\n                      \u0027Content-Length: %d\\r\\n\u0027\n                      \u0027X-Storage-Token: t\\r\\n\u0027\n                      \u0027X-Object-Meta-Color: chartreuse\\r\\n\u0027\n                      \u0027Content-Type: application/octet-stream\\r\\n\u0027\n                      \u0027\\r\\n\u0027 % (\n                          self.policy.name,\n                          len(obj),\n                      )).encode(\u0027ascii\u0027))\n            fd.write(obj)\n            fd.flush()\n            headers \u003d readuntil2crlfs(fd)\n            exp \u003d b\u0027HTTP/1.1 201\u0027\n            self.assertEqual(headers[:len(exp)], exp)\n\n            fd.write((\u0027GET /v1/a/%s/go-get-it HTTP/1.1\\r\\n\u0027\n                      \u0027Host: localhost\\r\\n\u0027\n                      \u0027X-Storage-Token: t\\r\\n\u0027\n                      \u0027\\r\\n\u0027 % self.policy.name).encode(\u0027ascii\u0027))\n            fd.flush()\n            headers \u003d readuntil2crlfs(fd)\n            exp \u003d b\u0027HTTP/1.1 200\u0027\n            self.assertEqual(headers[:len(exp)], exp)\n            for line in headers.splitlines():\n                if b\u0027Content-Length\u0027 in line:\n                    h, v \u003d line.split()\n                    content_length \u003d int(v.strip())\n                    break\n            else:\n                self.fail(\"Didn\u0027t find content-length in %r\" % (headers,))\n\n            gotten_obj \u003d fd.read(content_length)\n            self.assertEqual(gotten_obj, obj)\n\n            sleep(0.3)  # client_timeout should kick us off\n\n            fd.write((\u0027GET /v1/a/%s/go-get-it HTTP/1.1\\r\\n\u0027\n                      \u0027Host: localhost\\r\\n\u0027\n                      \u0027X-Storage-Token: t\\r\\n\u0027\n                      \u0027\\r\\n\u0027 % self.policy.name).encode(\u0027ascii\u0027))\n            fd.flush()\n            # makefile is a little weird, but this is disconnected\n            self.assertEqual(b\u0027\u0027, fd.read())\n            # I expected this to raise a socket error\n            self.assertEqual(b\u0027\u0027, sock.recv(1024))\n            # ... but we ARE disconnected\n            with self.assertRaises(socket.error) as caught:\n                time.sleep(0.001)\n\u003e               sock.send(b\u0027test\u0027)\nE               AssertionError: OSError not raised\n\ntest/unit/proxy/test_server.py:2551: AssertionError\n---------------------------------------------------------- Captured stdout call ----------------------------------------------------------\nproxy DEBUG: Loaded override config for (default): ProxyOverrideOptions({}, {\u0027sorting_method\u0027: \u0027shuffle\u0027, \u0027read_affinity\u0027: \u0027\u0027, \u0027write_affinity\u0027: \u0027\u0027, \u0027write_affinity_node_count\u0027: \u00272 * replicas\u0027, \u0027write_affinity_handoff_delete_count\u0027: None, \u0027rebalance_missing_suppression_count\u0027: 1, \u0027concurrent_gets\u0027: False, \u0027concurrency_timeout\u0027: 0.5, \u0027concurrent_ec_extra_requests\u0027: 0}, app)\nproxy INFO: (77162) wsgi starting up on http://127.0.0.1:59855\nproxy DEBUG: (77162) accepted (\u0027127.0.0.1\u0027, 59856)\nacct2 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"HEAD /sdb1/0/a\" 204 - \"HEAD http://localhost/v1/a?format\u003djson\" \"tx71561dbe299640a7be639-0068471a82\" \"proxy-server 77162\" 0.0033 \"-\" 77162 -\nacct1 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sda1/0/a/ec-dup\" 201 - \"PUT http://127.0.0.1:59781/sda1/2/a/ec-dup\" \"tx71561dbe299640a7be639-0068471a82\" \"container-server 77162\" 0.0009 \"-\" 77162 4\ncont1 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sda1/2/a/ec-dup\" 201 - \"PUT http://localhost/v1/a/ec-dup\" \"tx71561dbe299640a7be639-0068471a82\" \"proxy-server 77162\" 0.0124 \"-\" 77162 4\nacct2 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sdb1/0/a/ec-dup\" 201 - \"PUT http://127.0.0.1:59782/sdb1/2/a/ec-dup\" \"tx71561dbe299640a7be639-0068471a82\" \"container-server 77162\" 0.0014 \"-\" 77162 4\ncont2 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sdb1/2/a/ec-dup\" 201 - \"PUT http://localhost/v1/a/ec-dup\" \"tx71561dbe299640a7be639-0068471a82\" \"proxy-server 77162\" 0.0090 \"-\" 77162 4\nproxy INFO: 127.0.0.1 - - [09/Jun/2025 18:31:46] \"PUT /v1/a/ec-dup HTTP/1.1\" 201 174 0.021046 (txn: tx71561dbe299640a7be639-0068471a82)\nproxy DEBUG: (77162) accepted (\u0027127.0.0.1\u0027, 59862)\nacct1 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"HEAD /sda1/0/a\" 204 - \"HEAD http://localhost/v1/a?format\u003djson\" \"txc0110e99e2fe47cc84174-0068471a82\" \"proxy-server 77162\" 0.0034 \"-\" 77162 -\ncont1 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"HEAD /sda1/2/a/ec-dup\" 204 - \"HEAD http://localhost/v1/a/ec-dup\" \"tx039f4514aa99466da0e34-0068471a82\" \"proxy-server 77162\" 0.0008 \"-\" 77162 4\nobj2 DEBUG: open(/var/folders/5n/jty8zbg15rjfj5gqbkm3fkv00000gp/T/tmpe1apzrae/tmp_test_proxy_server_chunked/sdh1/objects-4/1/d16/7d012cc93160129094dfa351c4238d16, O_TMPFILE | O_WRONLY) failed: Is a directory                            Falling back to using mkstemp() (txn: tx0b31ca056fac437cb05c7-0068471a82)\nobj1 DEBUG: open(/var/folders/5n/jty8zbg15rjfj5gqbkm3fkv00000gp/T/tmpe1apzrae/tmp_test_proxy_server_chunked/sdg1/objects-4/1/d16/7d012cc93160129094dfa351c4238d16, O_TMPFILE | O_WRONLY) failed: Is a directory                            Falling back to using mkstemp() (txn: tx0b31ca056fac437cb05c7-0068471a82)\nobj3 DEBUG: open(/var/folders/5n/jty8zbg15rjfj5gqbkm3fkv00000gp/T/tmpe1apzrae/tmp_test_proxy_server_chunked/sdi1/objects-4/1/d16/7d012cc93160129094dfa351c4238d16, O_TMPFILE | O_WRONLY) failed: Is a directory                            Falling back to using mkstemp() (txn: tx0b31ca056fac437cb05c7-0068471a82)\nobj6 DEBUG: open(/var/folders/5n/jty8zbg15rjfj5gqbkm3fkv00000gp/T/tmpe1apzrae/tmp_test_proxy_server_chunked/sdl1/objects-4/1/d16/7d012cc93160129094dfa351c4238d16, O_TMPFILE | O_WRONLY) failed: Is a directory                            Falling back to using mkstemp() (txn: tx0b31ca056fac437cb05c7-0068471a82)\nobj4 DEBUG: open(/var/folders/5n/jty8zbg15rjfj5gqbkm3fkv00000gp/T/tmpe1apzrae/tmp_test_proxy_server_chunked/sdj1/objects-4/1/d16/7d012cc93160129094dfa351c4238d16, O_TMPFILE | O_WRONLY) failed: Is a directory                            Falling back to using mkstemp() (txn: tx0b31ca056fac437cb05c7-0068471a82)\nobj5 DEBUG: open(/var/folders/5n/jty8zbg15rjfj5gqbkm3fkv00000gp/T/tmpe1apzrae/tmp_test_proxy_server_chunked/sdk1/objects-4/1/d16/7d012cc93160129094dfa351c4238d16, O_TMPFILE | O_WRONLY) failed: Is a directory                            Falling back to using mkstemp() (txn: tx0b31ca056fac437cb05c7-0068471a82)\nobj3 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sdi1/1/a/ec-dup/go-get-it\" 201 - \"PUT http://localhost/v1/a/ec-dup/go-get-it\" \"tx0b31ca056fac437cb05c7-0068471a82\" \"proxy-server 77162\" 0.0170 \"-\" 77162 4\nobj6 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sdl1/1/a/ec-dup/go-get-it\" 201 - \"PUT http://localhost/v1/a/ec-dup/go-get-it\" \"tx0b31ca056fac437cb05c7-0068471a82\" \"proxy-server 77162\" 0.0171 \"-\" 77162 4\nobj4 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sdj1/1/a/ec-dup/go-get-it\" 201 - \"PUT http://localhost/v1/a/ec-dup/go-get-it\" \"tx0b31ca056fac437cb05c7-0068471a82\" \"proxy-server 77162\" 0.0171 \"-\" 77162 4\nobj5 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sdk1/1/a/ec-dup/go-get-it\" 201 - \"PUT http://localhost/v1/a/ec-dup/go-get-it\" \"tx0b31ca056fac437cb05c7-0068471a82\" \"proxy-server 77162\" 0.0168 \"-\" 77162 4\ncont1 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sda1/2/a/ec-dup/go-get-it\" 201 - \"PUT http://localhost/sdh1/1/a/ec-dup/go-get-it\" \"tx0b31ca056fac437cb05c7-0068471a82\" \"object-server 77162\" 0.0007 \"-\" 77162 4\ncont2 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sdb1/2/a/ec-dup/go-get-it\" 201 - \"PUT http://localhost/sdg1/1/a/ec-dup/go-get-it\" \"tx0b31ca056fac437cb05c7-0068471a82\" \"object-server 77162\" 0.0006 \"-\" 77162 4\nobj2 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sdh1/1/a/ec-dup/go-get-it\" 201 - \"PUT http://localhost/v1/a/ec-dup/go-get-it\" \"tx0b31ca056fac437cb05c7-0068471a82\" \"proxy-server 77162\" 0.0216 \"-\" 77162 4\nobj1 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"PUT /sdg1/1/a/ec-dup/go-get-it\" 201 - \"PUT http://localhost/v1/a/ec-dup/go-get-it\" \"tx0b31ca056fac437cb05c7-0068471a82\" \"proxy-server 77162\" 0.0215 \"-\" 77162 4\nproxy INFO: 127.0.0.1 - - [09/Jun/2025 18:31:46] \"PUT /v1/a/ec-dup/go-get-it HTTP/1.1\" 201 206 0.032195 (txn: tx0b31ca056fac437cb05c7-0068471a82)\nacct1 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"HEAD /sda1/0/a\" 204 - \"HEAD http://localhost/v1/a?format\u003djson\" \"tx77bf051f50c348e694293-0068471a82\" \"proxy-server 77162\" 0.0015 \"-\" 77162 -\ncont1 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"HEAD /sda1/2/a/ec-dup\" 204 - \"HEAD http://localhost/v1/a/ec-dup\" \"tx454d2ef75f594d03b4e9d-0068471a82\" \"proxy-server 77162\" 0.0037 \"-\" 77162 4\nobj5 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"GET /sdk1/1/a/ec-dup/go-get-it\" 200 736 \"GET http://localhost/v1/a/ec-dup/go-get-it\" \"txa15133da27054807804b8-0068471a82\" \"proxy-server 77162\" 0.0012 \"-\" 77162 4\nobj1 INFO: 127.0.0.1 - - [09/Jun/2025:17:31:46 +0000] \"GET /sdg1/1/a/ec-dup/go-get-it\" 200 736 \"GET http://localhost/v1/a/ec-dup/go-get-it\" \"txa15133da27054807804b8-0068471a82\" \"proxy-server 77162\" 0.0009 \"-\" 77162 4\nproxy INFO: 127.0.0.1 - - [09/Jun/2025 18:31:46] \"GET /v1/a/ec-dup/go-get-it HTTP/1.1\" 200 1777 0.012603 (txn: txa15133da27054807804b8-0068471a82)\nproxy DEBUG: (77162) timed out (\u0027127.0.0.1\u0027, 59862) (txn: txa15133da27054807804b8-0068471a82)\nproxy INFO: (77162) wsgi exited, is_accepting\u003dTrue\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d short test summary info \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nFAILED test/unit/proxy/test_server.py::TestECDuplicationObjectController::test_GET_pipeline - AssertionError: OSError not raised\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! stopping after 1 failures !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n1 failed, 2 passed, 374 deselected, 2 warnings in 1.92s\n```\n\n\nBut with patchset 2 I get to 100 (and beyond...)\n\n```\n100\n...                                                                                                                                [100%]\n3 passed, 374 deselected, 2 warnings in 2.13s\n```","commit_id":"3b3c76f67b1517419bd190a16b3595b68e70257f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"56801e7dd4d46503b2cdabc52a5b0e4b5cb79be6","unresolved":true,"context_lines":[{"line_number":2547,"context_line":"            self.assertEqual(b\u0027\u0027, sock.recv(1024))"},{"line_number":2548,"context_line":"            # ... but we ARE disconnected"},{"line_number":2549,"context_line":"            with self.assertRaises(socket.error) as caught:"},{"line_number":2550,"context_line":"                time.sleep(0.001)"},{"line_number":2551,"context_line":"                sock.send(b\u0027test\u0027)"},{"line_number":2552,"context_line":"            self.assertIn(caught.exception.errno,"},{"line_number":2553,"context_line":"                          (errno.EPIPE, errno.ECONNRESET))"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a05ab0e_088eff27","line":2550,"in_reply_to":"8c531ecf_08838789","updated":"2025-06-08 21:53:37.000000000","message":"Huh -- so I\u0027ve run this more than a thousand times (factoring in what I did before coming up with this:)\n```\nfor _ in {1..1000}; do pytest -qq --disable-warnings test/unit/proxy/test_server.py test/unit/proxy/test_mem_server.py -k test_GET_pipeline ; done\n```\nand I got exactly *two* failures with the 1ms sleep... how much worse was it for you? Eh, I suppose 10ms still isn\u0027t *so* much...","commit_id":"3b3c76f67b1517419bd190a16b3595b68e70257f"}]}
