Skip to content

Commit e4be96f

Browse files
authored
Merge pull request #11 from predict-idlab/10-prevent_infinite_retry
Fix infinite loop in retry logic
2 parents ab69224 + bb77713 commit e4be96f

File tree

3 files changed

+25
-12
lines changed

3 files changed

+25
-12
lines changed

src/obelisk/asynchronous/client.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import httpx
77

8-
from obelisk.exceptions import AuthenticationError
8+
from obelisk.exceptions import AuthenticationError, ObeliskError
99
from obelisk.strategies.retry import RetryStrategy, \
1010
NoRetryStrategy
1111
from obelisk.types import ObeliskKind
@@ -76,9 +76,10 @@ async def _get_token(self):
7676

7777
async with httpx.AsyncClient() as client:
7878
response = None
79+
request = None
7980
last_error = None
8081
retry = self.retry_strategy.make()
81-
while not response or await retry.should_retry():
82+
while not response:
8283
try:
8384
request = await client.post(
8485
self._token_url,
@@ -90,10 +91,13 @@ async def _get_token(self):
9091
except Exception as e:
9192
last_error = e
9293
self.log.error(e)
93-
continue
94+
if await retry.should_retry():
95+
continue
96+
else:
97+
break
9498

95-
if response is None and last_error is not None:
96-
raise last_error
99+
if not response or not request:
100+
raise (last_error if last_error is not None else ObeliskError("No response"))
97101

98102
if request.status_code != 200:
99103
if 'error' in response:
@@ -142,7 +146,7 @@ async def http_post(self, url: str, data: Any = None,
142146
response = None
143147
retry = self.retry_strategy.make()
144148
last_error = None
145-
while not response or await retry.should_retry():
149+
while not response:
146150
if response is not None:
147151
self.log.debug(f"Retrying, last response: {response.status_code}")
148152

@@ -158,7 +162,10 @@ async def http_post(self, url: str, data: Any = None,
158162
except Exception as e:
159163
self.log.error(e)
160164
last_error = e
161-
continue
165+
if await retry.should_retry():
166+
continue
167+
else:
168+
break
162169

163170
if not response and last_error:
164171
raise last_error

src/obelisk/asynchronous/consumer_test.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33

44
pytest_plugins = ('pytest_asyncio',)
55

6+
client_id = "682c6c46604b3b3be35429df"
7+
client_secret = "7136832d-01be-456a-a1fe-25c7f9e130c5"
8+
69
@pytest.mark.asyncio
710
async def test_demo_igent():
8-
consumer = Consumer(client="67c716e616c11421cfe2faf6", secret="08dafe89-0389-45b4-9832-cc565fb8c2eb")
11+
consumer = Consumer(client=client_id, secret=client_secret)
912
result = await consumer.single_chunk(
1013
datasets=["612f6c39cbceda0ea9753d95"],
1114
metrics=["org.dyamand.types.common.Temperature::number"],

src/obelisk/sync/consumer_test.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from .consumer import Consumer
22

3+
client_id = "682c6c46604b3b3be35429df"
4+
client_secret = "7136832d-01be-456a-a1fe-25c7f9e130c5"
5+
36
def test_demo_igent():
4-
consumer = Consumer(client="67c716e616c11421cfe2faf6", secret="08dafe89-0389-45b4-9832-cc565fb8c2eb")
7+
consumer = Consumer(client=client_id,secret=client_secret)
58
result = consumer.single_chunk(
69
datasets=["612f6c39cbceda0ea9753d95"],
710
metrics=["org.dyamand.types.common.Temperature::number"],
@@ -13,16 +16,16 @@ def test_demo_igent():
1316
assert len(result.items) == 2
1417

1518
def test_two_instances():
16-
consumer_one = Consumer(client="67c716e616c11421cfe2faf6", secret="08dafe89-0389-45b4-9832-cc565fb8c2eb")
17-
consumer_two = Consumer(client="67c716e616c11421cfe2faf6", secret="08dafe89-0389-45b4-9832-cc565fb8c2eb")
19+
consumer_one = Consumer(client=client_id,secret=client_secret)
20+
consumer_two = Consumer(client=client_id,secret=client_secret)
1821
result_one = consumer_one.single_chunk(
1922
datasets=["612f6c39cbceda0ea9753d95"],
2023
metrics=["org.dyamand.types.common.Temperature::number"],
2124
from_timestamp=1740924034000,
2225
to_timestamp=1741100614258,
2326
limit=2
2427
)
25-
result_two = consumer_one.single_chunk(
28+
result_two = consumer_two.single_chunk(
2629
datasets=["612f6c39cbceda0ea9753d95"],
2730
metrics=["org.dyamand.types.common.Temperature::number"],
2831
from_timestamp=1740924034000,

0 commit comments

Comments
 (0)