Skip to content

Commit 4f8999d

Browse files
author
Dan Richelson
committed
Initial changes to initialization
1 parent 4ed7a03 commit 4f8999d

File tree

3 files changed

+25
-12
lines changed

3 files changed

+25
-12
lines changed

ldclient/client.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ class Config(object):
3535
def __init__(self,
3636
base_uri='https://app.launchdarkly.com',
3737
events_uri='https://events.launchdarkly.com',
38-
connect_timeout=2,
39-
read_timeout=10,
38+
connect_timeout=10,
39+
read_timeout=15,
4040
events_upload_max_batch_size=100,
4141
events_max_pending=10000,
4242
stream_uri='https://stream.launchdarkly.com',
@@ -149,10 +149,11 @@ def __init__(self, sdk_key, config=None, start_wait=5):
149149
log.info("Waiting up to " + str(start_wait) + " seconds for LaunchDarkly client to initialize...")
150150
update_processor_ready.wait(start_wait)
151151

152-
if self._update_processor.initialized:
152+
if self._update_processor.initialized() is True:
153153
log.info("Started LaunchDarkly Client: OK")
154154
else:
155-
log.info("Initialization timeout exceeded for LaunchDarkly Client. Feature Flags may not yet be available.")
155+
log.warn("Initialization timeout exceeded for LaunchDarkly Client or an error occurred. "
156+
"Feature Flags may not yet be available.")
156157

157158
@property
158159
def sdk_key(self):
@@ -215,7 +216,7 @@ def send_event(value, version=None):
215216
'user': user, 'value': value, 'default': default, 'version': version})
216217

217218
if not self.is_initialized():
218-
log.warn("Feature Flag evaluation attempted before client has finished initializing! Returning default: "
219+
log.warn("Feature Flag evaluation attempted before client has initialized! Returning default: "
219220
+ str(default) + " for feature key: " + key)
220221
send_event(default)
221222
return default

ldclient/polling.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ def run(self):
2323
while self._running:
2424
start_time = time.time()
2525
self._store.init(self._requester.get_all())
26-
if not self._ready.is_set() and self._store.initialized:
26+
if not self._ready.is_set() is True and self._store.initialized is True:
2727
log.info("PollingUpdateProcessor initialized ok")
2828
self._ready.set()
2929
elapsed = time.time() - start_time
3030
if elapsed < self._config.poll_interval:
3131
time.sleep(self._config.poll_interval - elapsed)
3232

3333
def initialized(self):
34-
return self._running and self._ready.is_set() and self._store.initialized
34+
return self._running and self._ready.is_set() is True and self._store.initialized is True
3535

3636
def stop(self):
3737
log.info("Stopping PollingUpdateProcessor")

ldclient/streaming.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
from __future__ import absolute_import
2+
13
import json
24
from threading import Thread
35

46
import time
5-
from sseclient import SSEClient
67

8+
from requests import HTTPError
9+
from sseclient import SSEClient
710
from ldclient.interfaces import UpdateProcessor
811
from ldclient.util import _stream_headers, log
912

@@ -30,8 +33,17 @@ def run(self):
3033
for msg in messages:
3134
if not self._running:
3235
break
33-
if self.process_message(self._store, self._requester, msg, self._ready) is True:
36+
message_ok = self.process_message(self._store, self._requester, msg, self._ready)
37+
if message_ok is True and self._ready.is_set() is False:
3438
self._ready.set()
39+
except HTTPError as e:
40+
if e.response is not None and e.response.status_code is not None:
41+
if 400 <= e.response.status_code < 500:
42+
log.error("StreamingUpdateProcessor response: " + str(e) + ". Retries will not be attempted.")
43+
if self._ready.is_set() is False:
44+
self._ready.set()
45+
self._running = False
46+
return
3547
except Exception as e:
3648
log.error("Could not connect to LaunchDarkly stream: " + str(e.message) +
3749
" waiting 1 second before trying again.")
@@ -42,15 +54,15 @@ def stop(self):
4254
self._running = False
4355

4456
def initialized(self):
45-
return self._running and self._ready.is_set() and self._store.initialized
57+
return self._running and self._ready.is_set() is True and self._store.initialized is True
4658

4759
@staticmethod
4860
def process_message(store, requester, msg, ready):
4961
log.debug("Received stream event {} with data: {}".format(msg.event, msg.data))
5062
if msg.event == 'put':
5163
payload = json.loads(msg.data)
5264
store.init(payload)
53-
if not ready.is_set() and store.initialized:
65+
if not ready.is_set() is True and store.initialized is True:
5466
log.info("StreamingUpdateProcessor initialized ok")
5567
return True
5668
elif msg.event == 'patch':
@@ -63,7 +75,7 @@ def process_message(store, requester, msg, ready):
6375
store.upsert(key, requester.get_one(key))
6476
elif msg.event == "indirect/put":
6577
store.init(requester.get_all())
66-
if not ready.is_set() and store.initialized:
78+
if not ready.is_set() is True and store.initialized is True:
6779
log.info("StreamingUpdateProcessor initialized ok")
6880
return True
6981
elif msg.event == 'delete':

0 commit comments

Comments
 (0)