Skip to content

Commit d536d53

Browse files
Mat001claude
andcommitted
[AI-FSSDK] [FSSDK-12248] Increase max retry time interval to 3 seconds
Updated ODP event manager to increase max retry interval from 1 second to 3 seconds. Quality Assurance Summary: - Status: SUCCESS (all gates passed) - QA Iterations: 1/5 (smart exit - perfect on first try) - Unit Tests: 24/24 PASSED - Code Review: APPROVED (0 critical issues, 0 warnings) - Files Modified: 2 (implementation + tests) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent f98886a commit d536d53

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

optimizely/odp/odp_event_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def _flush_batch(self) -> None:
164164
self.logger.debug(f'ODP event queue: flushing batch size {batch_len}.')
165165
should_retry = False
166166
initial_retry_interval = 0.2 # 200ms
167-
max_retry_interval = 1.0 # 1 second
167+
max_retry_interval = 3.0 # 3 seconds
168168

169169
for i in range(1 + self.retry_count):
170170
try:

tests/test_odp_event_manager.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,41 @@ def test_odp_event_manager_retry_success(self, *args):
305305
self.assertStrictTrue(event_manager.is_running)
306306
event_manager.stop()
307307

308+
def test_odp_event_manager_retry_max_interval_3_seconds(self, *args):
309+
"""Verify that max retry interval is capped at 3 seconds."""
310+
mock_logger = mock.Mock()
311+
event_manager = OdpEventManager(mock_logger)
312+
event_manager.start(self.odp_config)
313+
event_manager.retry_count = 5 # Increase retry count to test higher exponential values
314+
315+
number_of_tries = event_manager.retry_count + 1
316+
317+
with mock.patch.object(
318+
event_manager.api_manager, 'send_odp_events', new_callable=CopyingMock, return_value=True
319+
) as mock_send, mock.patch('time.sleep') as mock_sleep:
320+
event_manager.send_event(**self.events[0])
321+
event_manager.flush()
322+
event_manager.event_queue.join()
323+
324+
mock_send.assert_has_calls(
325+
[mock.call(self.api_key, self.api_host, [self.processed_events[0]])] * number_of_tries
326+
)
327+
self.assertEqual(len(event_manager._current_batch), 0)
328+
# Verify exponential backoff with 3s cap: 0.2s, 0.4s, 0.8s, 1.6s, 3.0s (capped)
329+
# Delays are: 0.2 * 2^0, 0.2 * 2^1, 0.2 * 2^2, 0.2 * 2^3, min(0.2 * 2^4, 3.0)
330+
mock_sleep.assert_has_calls([
331+
mock.call(0.2), # 1st retry: 0.2 * 2^0 = 0.2
332+
mock.call(0.4), # 2nd retry: 0.2 * 2^1 = 0.4
333+
mock.call(0.8), # 3rd retry: 0.2 * 2^2 = 0.8
334+
mock.call(1.6), # 4th retry: 0.2 * 2^3 = 1.6
335+
mock.call(3.0) # 5th retry: min(0.2 * 2^4, 3.0) = min(3.2, 3.0) = 3.0
336+
])
337+
mock_logger.debug.assert_any_call('Error dispatching ODP events, retrying after 3.0s.')
338+
mock_logger.error.assert_called_once_with(
339+
f'ODP event send failed (Failed after 5 retries: {[self.processed_events[0]]}).'
340+
)
341+
event_manager.stop()
342+
308343
def test_odp_event_manager_send_failure(self, *args):
309344
mock_logger = mock.Mock()
310345
event_manager = OdpEventManager(mock_logger)

0 commit comments

Comments
 (0)