X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/25af384efacda9f3c552eebfee42e14b785e9a16..209d83a0ce0bd22669a39f49daddca432babeae7:/sdk/python/tests/test_keep_client.py diff --git a/sdk/python/tests/test_keep_client.py b/sdk/python/tests/test_keep_client.py index ed17c739ba..90468924a6 100644 --- a/sdk/python/tests/test_keep_client.py +++ b/sdk/python/tests/test_keep_client.py @@ -443,6 +443,39 @@ class KeepClientRendezvousTestCase(unittest.TestCase, tutil.ApiClientMock): for resp in mock.responses] self.assertEqual(self.expected_order[i]*2, got_order) + def test_put_probe_order_multiple_copies(self): + for copies in range(2, 4): + for i in range(len(self.blocks)): + with tutil.mock_keep_responses('', *[500 for _ in range(self.services*3)]) as mock, \ + self.assertRaises(arvados.errors.KeepWriteError): + self.keep_client.put(self.blocks[i], num_retries=2, copies=copies) + got_order = [ + re.search(r'//\[?keep0x([0-9a-f]+)', resp.getopt(pycurl.URL)).group(1) + for resp in mock.responses] + # With T threads racing to make requests, the position + # of a given server in the sequence of HTTP requests + # (got_order) cannot be more than T-1 positions + # earlier than that server's position in the reference + # probe sequence (expected_order). + # + # Loop invariant: we have accounted for +pos+ expected + # probes, either by seeing them in +got_order+ or by + # putting them in +pending+ in the hope of seeing them + # later. As long as +len(pending)