-
Notifications
You must be signed in to change notification settings - Fork 137
Fix Bug#131: 0 rows returns when server return 429 on first page of results. #132
base: master
Are you sure you want to change the base?
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -32,7 +32,7 @@ class RetryOptions(object): | |
| :ivar int MaxWaitTimeInSeconds: | ||
| Max wait time in seconds to wait for a request while the retries are happening. Default value 30 seconds. | ||
| """ | ||
| def __init__(self, max_retry_attempt_count = 9, fixed_retry_interval_in_milliseconds = None, max_wait_time_in_seconds = 30): | ||
| def __init__(self, max_retry_attempt_count = 17, fixed_retry_interval_in_milliseconds = None, max_wait_time_in_seconds = 60): | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Increasing the default number of retries, and time allowed, to reflect the fact that users may have inadvertently been relying on large numbers of retries. |
||
| self._max_retry_attempt_count = max_retry_attempt_count | ||
| self._fixed_retry_interval_in_milliseconds = fixed_retry_interval_in_milliseconds | ||
| self._max_wait_time_in_seconds = max_wait_time_in_seconds | ||
|
|
@@ -47,4 +47,4 @@ def FixedRetryIntervalInMilliseconds(self): | |
|
|
||
| @property | ||
| def MaxWaitTimeInSeconds(self): | ||
| return self._max_wait_time_in_seconds | ||
| return self._max_wait_time_in_seconds | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,4 +1,4 @@ | ||
| #The MIT License (MIT) | ||
| #The MIT License (MIT) | ||
| #Copyright (c) 2014 Microsoft Corporation | ||
|
|
||
| #Permission is hereby granted, free of charge, to any person obtaining a copy | ||
|
|
@@ -221,7 +221,7 @@ def test_default_retry_policy_for_query(self): | |
| result_docs = list(docs) | ||
| self.assertEqual(result_docs[0]['id'], 'doc1') | ||
| self.assertEqual(result_docs[1]['id'], 'doc2') | ||
| self.assertEqual(self.counter, 12) | ||
| self.assertEqual(self.counter, 6) | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This test counts how many retries were done. Before the fix, 12 http requests were generated. Now 6 are. This is by-design. Updating test to match. |
||
|
|
||
| self.counter = 0; | ||
| retry_utility._ExecuteFunction = self.OriginalExecuteFunction | ||
|
|
@@ -275,6 +275,38 @@ def test_default_retry_policy_for_create(self): | |
|
|
||
| retry_utility._ExecuteFunction = self.OriginalExecuteFunction | ||
|
|
||
| def test_429_on_first_page(self): | ||
| client = document_client.DocumentClient(Test_retry_policy_tests.host, {'masterKey': Test_retry_policy_tests.masterKey}) | ||
|
|
||
| document_definition = { 'id': 'doc429', | ||
| 'name': 'sample document', | ||
| 'key': 'value'} | ||
|
|
||
| created_document = client.CreateDocument(self.created_collection['_self'], document_definition) | ||
|
|
||
| # Mock an overloaded server which always returns 429 Too Many | ||
| # Requests, by hooking the client's POST method. | ||
| original_post_function = client._DocumentClient__Post | ||
| client._DocumentClient__Post = self._MockPost429 | ||
|
|
||
| # Test: query for the document. Expect the mock overloaded server | ||
| # to raise a 429 exception. | ||
| try: | ||
| query = client.QueryDocuments(self.created_collection['_self'], "SELECT * FROM c") | ||
| docs = list(query) # force execution now | ||
| self.assertFalse(True, 'function should raise HTTPFailure.') | ||
|
|
||
| except errors.HTTPFailure as ex: | ||
| self.assertEqual(ex.status_code, StatusCodes.TOO_MANY_REQUESTS) | ||
|
|
||
| client._DocumentClient__Post = original_post_function | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Mocking out the server returning 429 error by overriding the clients |
||
| client.DeleteDocument(created_document['_self']) | ||
|
|
||
| def _MockPost429(self, url, path, body, headers): | ||
| raise errors.HTTPFailure(StatusCodes.TOO_MANY_REQUESTS, | ||
| "Request rate is too large", | ||
| {HttpHeaders.RetryAfterInMilliseconds: 500}) | ||
|
|
||
| def _MockExecuteFunction(self, function, *args, **kwargs): | ||
| raise errors.HTTPFailure(StatusCodes.TOO_MANY_REQUESTS, "Request rate is too large", {HttpHeaders.RetryAfterInMilliseconds: self.retry_after_in_milliseconds}) | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Strategy: this is the outermost level of retries, which is being removed.