Skip to content

Commit 102adbc

Browse files
committed
Update to sync query tests
Changes ======= * Better handling of timeout errors * Update sync tests to handle various forms (normal, lazy, cancellable)
1 parent d198f88 commit 102adbc

3 files changed

Lines changed: 254 additions & 48 deletions

File tree

couchbase_analytics/common/errors.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ class TimeoutError(AnalyticsError):
124124
Indicates that a request was unable to complete prior to reaching the deadline specified for the reqest.
125125
"""
126126

127-
def __init__(self, base: Optional[Exception] = None, message: Optional[str] = None) -> None:
128-
super().__init__(base, message)
127+
def __init__(self, cause: Optional[Exception] = None, message: Optional[str] = None) -> None:
128+
super().__init__(cause, message)
129129

130130
def __repr__(self) -> str:
131131
return super().__repr__()

couchbase_analytics/protocol/streaming.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
from httpx import Response as HttpCoreResponse
3333

3434
# TODO: errors?
35-
from couchbase_analytics.common.errors import AnalyticsError, InternalSDKError
35+
from couchbase_analytics.common.errors import AnalyticsError, InternalSDKError, TimeoutError
3636
from couchbase_analytics.common.core import (JsonStreamConfig,
3737
ParsedResult,
3838
ParsedResultType)
@@ -69,7 +69,7 @@ def wrapped_fn(self: HttpStreamingResponse) -> None:
6969
if self._request_context.request_error is not None:
7070
raise self._request_context.request_error from None
7171
if self._request_context.timed_out:
72-
raise TimeoutError() from None
72+
raise TimeoutError(message='Request timeout.') from None
7373
if self._request_context.cancelled:
7474
raise CancelledError('Request was cancelled.') from None
7575
raise InternalSDKError(ex) from None
@@ -112,6 +112,17 @@ def _finish_processing_stream(self) -> None:
112112
while not self._json_stream.token_stream_exhausted:
113113
self._json_stream.continue_parsing()
114114

115+
def _handle_iteration_abort(self) -> None:
116+
self.close()
117+
if self._request_context.cancelled:
118+
print('Request was cancelled, closing stream.')
119+
raise StopIteration
120+
elif self._request_context.timed_out:
121+
print('Request timed out, closing stream.')
122+
raise TimeoutError(message='Request timeout.')
123+
else:
124+
raise StopIteration
125+
115126
def _maybe_continue_to_process_stream(self) -> None:
116127
if not self._request_context.has_stage_completed:
117128
return
@@ -190,17 +201,17 @@ def get_next_row(self) -> Any:
190201
if not (hasattr(self, '_core_response')
191202
and self._core_response is not None
192203
and self._request_context.okay_to_iterate):
193-
self.close()
194-
raise StopIteration
204+
self._handle_iteration_abort()
195205

196206
self._maybe_continue_to_process_stream()
207+
check_state = False
197208
while True:
198-
if self._request_context.cancelled:
199-
self.close()
200-
raise StopIteration
201-
# TODO: handle timeout
209+
if check_state and not self._request_context.okay_to_iterate:
210+
self._handle_iteration_abort()
211+
202212
raw_response = self._json_stream.get_result(self._stream_config.queue_timeout)
203213
if raw_response is None:
214+
check_state = True
204215
continue
205216
if raw_response.result_type == ParsedResultType.ROW:
206217
if raw_response.value is None:

0 commit comments

Comments
 (0)