Skip to content

Commit 2b0de31

Browse files
committed
adding try/catch to split strage and cleanup
1 parent e545e03 commit 2b0de31

2 files changed

Lines changed: 283 additions & 195 deletions

File tree

splitio/storage/pluggable.py

Lines changed: 175 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@
1010
class PluggableSplitStorage(SplitStorage):
1111
"""InMemory implementation of a split storage."""
1212

13+
_SPLIT_NAME_LENGTH = 12
14+
1315
def __init__(self, pluggable_adapter, prefix=None):
1416
"""Constructor."""
1517
self._pluggable_adapter = pluggable_adapter
16-
self._prefix = "SPLITIO.split."
17-
self._traffic_type_prefix = "SPLITIO.trafficType."
18+
self._prefix = "SPLITIO.split.{split_name}"
19+
self._traffic_type_prefix = "SPLITIO.trafficType.{traffic_type_name}"
1820
self._split_till_prefix = "SPLITIO.splits.till"
1921
if prefix is not None:
2022
self._prefix = prefix + "." + self._prefix
@@ -30,10 +32,15 @@ def get(self, split_name):
3032
3133
:rtype: splitio.models.splits.Split
3234
"""
33-
split = self._pluggable_adapter.get(self._prefix + split_name)
34-
if not split:
35+
try:
36+
split = self._pluggable_adapter.get(self._prefix.format(split_name=split_name))
37+
if not split:
38+
return None
39+
return splits.from_raw(split)
40+
except Exception:
41+
_LOGGER.error('Error getting split from storage')
42+
_LOGGER.debug('Error: ', exc_info=True)
3543
return None
36-
return splits.from_raw(split)
3744

3845
def fetch_many(self, split_names):
3946
"""
@@ -45,19 +52,29 @@ def fetch_many(self, split_names):
4552
:return: A dict with split objects parsed from queue.
4653
:rtype: dict(split_name, splitio.models.splits.Split)
4754
"""
48-
prefix_added = [self._prefix + split for split in split_names]
49-
return {split['name']: splits.from_raw(split) for split in self._pluggable_adapter.get_many(prefix_added)}
50-
51-
def put_many(self, splits, change_number):
52-
"""
53-
Store a split.
55+
try:
56+
prefix_added = [self._prefix.format(split_name=split_name) for split_name in split_names]
57+
return {split['name']: splits.from_raw(split) for split in self._pluggable_adapter.get_many(prefix_added)}
58+
except Exception:
59+
_LOGGER.error('Error getting split from storage')
60+
_LOGGER.debug('Error: ', exc_info=True)
61+
return None
5462

55-
:param split: Split object.
56-
:type split: splitio.models.split.Split
57-
"""
58-
for split in splits:
59-
self.put(split)
60-
self._pluggable_adapter.set(self._split_till_prefix, change_number)
63+
# TODO: To be added when producer mode is aupported
64+
# def put_many(self, splits, change_number):
65+
# """
66+
# Store multiple splits.
67+
#
68+
# :param split: array of Split objects.
69+
# :type split: splitio.models.split.Split[]
70+
# """
71+
# try:
72+
# for split in splits:
73+
# self.put(split)
74+
# self._pluggable_adapter.set(self._split_till_prefix, change_number)
75+
# except Exception:
76+
# _LOGGER.error('Error storing splits in storage')
77+
# _LOGGER.debug('Error: ', exc_info=True)
6178

6279
def remove(self, split_name):
6380
"""
@@ -69,22 +86,33 @@ def remove(self, split_name):
6986
:return: True if the split was found and removed. False otherwise.
7087
:rtype: bool
7188
"""
72-
split = self.get(split_name)
73-
if not split:
74-
_LOGGER.warning("Tried to delete nonexistant split %s. Skipping", split_name)
75-
return False
76-
77-
self._pluggable_adapter.delete(self._prefix + split_name)
78-
self._decrease_traffic_type_count(split.traffic_type_name)
79-
return True
89+
pass
90+
# TODO: To be added when producer mode is aupported
91+
# try:
92+
# split = self.get(split_name)
93+
# if not split:
94+
# _LOGGER.warning("Tried to delete nonexistant split %s. Skipping", split_name)
95+
# return False
96+
# self._pluggable_adapter.delete(self._prefix.format(split_name=split_name))
97+
# self._decrease_traffic_type_count(split.traffic_type_name)
98+
# return True
99+
# except Exception:
100+
# _LOGGER.error('Error removing split from storage')
101+
# _LOGGER.debug('Error: ', exc_info=True)
102+
# return False
80103

81104
def get_change_number(self):
82105
"""
83106
Retrieve latest split change number.
84107
85108
:rtype: int
86109
"""
87-
return self._pluggable_adapter.get(self._split_till_prefix)
110+
try:
111+
return self._pluggable_adapter.get(self._split_till_prefix)
112+
except Exception:
113+
_LOGGER.error('Error getting change number in split storage')
114+
_LOGGER.debug('Error: ', exc_info=True)
115+
return None
88116

89117
def set_change_number(self, new_change_number):
90118
"""
@@ -93,7 +121,14 @@ def set_change_number(self, new_change_number):
93121
:param new_change_number: New change number.
94122
:type new_change_number: int
95123
"""
96-
self._pluggable_adapter.set(self._split_till_prefix, new_change_number)
124+
pass
125+
# TODO: To be added when producer mode is aupported
126+
# try:
127+
# self._pluggable_adapter.set(self._split_till_prefix, new_change_number)
128+
# except Exception:
129+
# _LOGGER.error('Error setting change number in split storage')
130+
# _LOGGER.debug('Error: ', exc_info=True)
131+
# return None
97132

98133
def get_split_names(self):
99134
"""
@@ -102,7 +137,12 @@ def get_split_names(self):
102137
:return: List of split names.
103138
:rtype: list(str)
104139
"""
105-
return [split.name for split in self.get_all()]
140+
try:
141+
return [split.name for split in self.get_all()]
142+
except Exception:
143+
_LOGGER.error('Error getting split names from storage')
144+
_LOGGER.debug('Error: ', exc_info=True)
145+
return None
106146

107147
def get_all(self):
108148
"""
@@ -111,7 +151,12 @@ def get_all(self):
111151
:return: List of all the splits.
112152
:rtype: list
113153
"""
114-
return [splits.from_raw(self._pluggable_adapter.get(key)) for key in self._pluggable_adapter.get_keys_by_prefix(self._prefix)]
154+
try:
155+
return [splits.from_raw(self._pluggable_adapter.get(key)) for key in self._pluggable_adapter.get_keys_by_prefix(self._prefix[:-self._SPLIT_NAME_LENGTH])]
156+
except Exception:
157+
_LOGGER.error('Error getting split keys from storage')
158+
_LOGGER.debug('Error: ', exc_info=True)
159+
return None
115160

116161
def traffic_type_exists(self, traffic_type_name):
117162
"""
@@ -123,7 +168,12 @@ def traffic_type_exists(self, traffic_type_name):
123168
:return: True if the traffic type is valid. False otherwise.
124169
:rtype: bool
125170
"""
126-
return self._pluggable_adapter.get(self._traffic_type_prefix + traffic_type_name) != None
171+
try:
172+
return self._pluggable_adapter.get(self._traffic_type_prefix.format(traffic_type_name=traffic_type_name)) != None
173+
except Exception:
174+
_LOGGER.error('Error getting split info from storage')
175+
_LOGGER.debug('Error: ', exc_info=True)
176+
return None
127177

128178
def kill_locally(self, split_name, default_treatment, change_number):
129179
"""
@@ -136,39 +186,57 @@ def kill_locally(self, split_name, default_treatment, change_number):
136186
:param change_number: change_number
137187
:type change_number: int
138188
"""
139-
split = self.get(split_name)
140-
if not split:
141-
return
142-
if self.get_change_number() > change_number:
143-
return
144-
split.local_kill(default_treatment, change_number)
145-
self._pluggable_adapter.set(self._prefix + split_name, split.to_json())
146-
147-
def _increase_traffic_type_count(self, traffic_type_name):
148-
"""
149-
Increase by one the count for a specific traffic type name.
150-
151-
:param traffic_type_name: Traffic type to increase the count.
152-
:type traffic_type_name: str
153-
154-
:return: existing count of traffic type
155-
:rtype: int
156-
"""
157-
return self._pluggable_adapter.increment(self._traffic_type_prefix + traffic_type_name, 1)
158-
159-
def _decrease_traffic_type_count(self, traffic_type_name):
160-
"""
161-
Decrease by one the count for a specific traffic type name.
189+
pass
190+
# TODO: To be added when producer mode is aupported
191+
# try:
192+
# split = self.get(split_name)
193+
# if not split:
194+
# return
195+
# if self.get_change_number() > change_number:
196+
# return
197+
# split.local_kill(default_treatment, change_number)
198+
# self._pluggable_adapter.set(self._prefix.format(split_name=split_name), split.to_json())
199+
# except Exception:
200+
# _LOGGER.error('Error updating split in storage')
201+
# _LOGGER.debug('Error: ', exc_info=True)
162202

163-
:param traffic_type_name: Traffic type to decrease the count.
164-
:type traffic_type_name: str
203+
# TODO: To be added when producer mode is aupported
204+
# def _increase_traffic_type_count(self, traffic_type_name):
205+
# """
206+
# Increase by one the count for a specific traffic type name.
207+
#
208+
# :param traffic_type_name: Traffic type to increase the count.
209+
# :type traffic_type_name: str
210+
#
211+
# :return: existing count of traffic type
212+
# :rtype: int
213+
# """
214+
# try:
215+
# return self._pluggable_adapter.increment(self._traffic_type_prefix.format(traffic_type_name=traffic_type_name), 1)
216+
# except Exception:
217+
# _LOGGER.error('Error updating traffic type count in split storage')
218+
# _LOGGER.debug('Error: ', exc_info=True)
219+
# return None
165220

166-
:return: existing count of traffic type
167-
:rtype: int
168-
"""
169-
return_count = self._pluggable_adapter.decrement(self._traffic_type_prefix + traffic_type_name, 1)
170-
if return_count == 0:
171-
self._pluggable_adapter.delete(self._traffic_type_prefix + traffic_type_name)
221+
# TODO: To be added when producer mode is aupported
222+
# def _decrease_traffic_type_count(self, traffic_type_name):
223+
# """
224+
# Decrease by one the count for a specific traffic type name.
225+
#
226+
# :param traffic_type_name: Traffic type to decrease the count.
227+
# :type traffic_type_name: str
228+
#
229+
# :return: existing count of traffic type
230+
# :rtype: int
231+
# """
232+
# try:
233+
# return_count = self._pluggable_adapter.decrement(self._traffic_type_prefix.format(traffic_type_name=traffic_type_name), 1)
234+
# if return_count == 0:
235+
# self._pluggable_adapter.delete(self._traffic_type_prefix.format(traffic_type_name=traffic_type_name))
236+
# except Exception:
237+
# _LOGGER.error('Error updating traffic type count in split storage')
238+
# _LOGGER.debug('Error: ', exc_info=True)
239+
# return None
172240

173241
def get_all_splits(self):
174242
"""
@@ -177,7 +245,12 @@ def get_all_splits(self):
177245
:return: List of all the splits.
178246
:rtype: list
179247
"""
180-
return self.get_all()
248+
try:
249+
return self.get_all()
250+
except Exception:
251+
_LOGGER.error('Error fetching splits from storage')
252+
_LOGGER.debug('Error: ', exc_info=True)
253+
return None
181254

182255
def is_valid_traffic_type(self, traffic_type_name):
183256
"""
@@ -189,7 +262,12 @@ def is_valid_traffic_type(self, traffic_type_name):
189262
:return: True if the traffic type is valid. False otherwise.
190263
:rtype: bool
191264
"""
192-
return self.traffic_type_exists(traffic_type_name)
265+
try:
266+
return self.traffic_type_exists(traffic_type_name)
267+
except Exception:
268+
_LOGGER.error('Error getting split info from storage')
269+
_LOGGER.debug('Error: ', exc_info=True)
270+
return None
193271

194272
def put(self, split):
195273
"""
@@ -198,15 +276,22 @@ def put(self, split):
198276
:param split: Split object.
199277
:type split: splitio.models.split.Split
200278
"""
201-
existing_split = self.get(split.name)
202-
self._pluggable_adapter.set(self._prefix + split.name, split.to_json())
203-
if existing_split is None:
204-
self._increase_traffic_type_count(split.traffic_type_name)
205-
return
206-
207-
if existing_split is not None and existing_split.traffic_type_name != split.traffic_type_name:
208-
self._increase_traffic_type_count(split.traffic_type_name)
209-
self._decrease_traffic_type_count(existing_split.traffic_type_name)
279+
pass
280+
# TODO: To be added when producer mode is aupported
281+
# try:
282+
# existing_split = self.get(split.name)
283+
# self._pluggable_adapter.set(self._prefix.format(split_name=split.name), split.to_json())
284+
# if existing_split is None:
285+
# self._increase_traffic_type_count(split.traffic_type_name)
286+
# return
287+
#
288+
# if existing_split is not None and existing_split.traffic_type_name != split.traffic_type_name:
289+
# self._increase_traffic_type_count(split.traffic_type_name)
290+
# self._decrease_traffic_type_count(existing_split.traffic_type_name)
291+
# except Exception:
292+
# _LOGGER.error('Error ADDING split to storage')
293+
# _LOGGER.debug('Error: ', exc_info=True)
294+
# return None
210295

211296

212297
class PluggableSegmentStorage(SegmentStorage):
@@ -234,16 +319,18 @@ def update(self, segment_name, to_add, to_remove, change_number=None):
234319
:param to_remove: List of members to remove from the segment.
235320
:type to_remove: Set
236321
"""
237-
try:
238-
if to_add is not None:
239-
self._pluggable_adapter.add_items(self._prefix.format(segment_name=segment_name), to_add)
240-
if to_remove is not None:
241-
self._pluggable_adapter.remove_items(self._prefix.format(segment_name=segment_name), to_remove)
242-
if change_number is not None:
243-
self._pluggable_adapter.set(self._segment_till_prefix.format(segment_name=segment_name), change_number)
244-
except Exception:
245-
_LOGGER.error('Error updating segment storage')
246-
_LOGGER.debug('Error: ', exc_info=True)
322+
pass
323+
# TODO: To be added when producer mode is aupported
324+
# try:
325+
# if to_add is not None:
326+
# self._pluggable_adapter.add_items(self._prefix.format(segment_name=segment_name), to_add)
327+
# if to_remove is not None:
328+
# self._pluggable_adapter.remove_items(self._prefix.format(segment_name=segment_name), to_remove)
329+
# if change_number is not None:
330+
# self._pluggable_adapter.set(self._segment_till_prefix.format(segment_name=segment_name), change_number)
331+
# except Exception:
332+
# _LOGGER.error('Error updating segment storage')
333+
# _LOGGER.debug('Error: ', exc_info=True)
247334

248335
def set_change_number(self, segment_name, change_number):
249336
"""
@@ -361,13 +448,12 @@ def get(self, segment_name):
361448
:rtype: splitio.models.segments.Segment
362449
"""
363450
pass
364-
# TODO: To be added when producer mode is aupported
365-
# try:
366-
# return segments.from_raw({'name': segment_name, 'added': list(self._pluggable_adapter.get(self._prefix.format(segment_name=segment_name))), 'removed': [], 'till': self._pluggable_adapter.get(self._segment_till_prefix.format(segment_name=segment_name))})
367-
# except Exception:
368-
# _LOGGER.error('Error getting segment')
369-
# _LOGGER.debug('Error: ', exc_info=True)
370-
# return None
451+
try:
452+
return segments.from_raw({'name': segment_name, 'added': list(self._pluggable_adapter.get(self._prefix.format(segment_name=segment_name))), 'removed': [], 'till': self._pluggable_adapter.get(self._segment_till_prefix.format(segment_name=segment_name))})
453+
except Exception:
454+
_LOGGER.error('Error getting segment')
455+
_LOGGER.debug('Error: ', exc_info=True)
456+
return None
371457

372458
def put(self, segment):
373459
"""

0 commit comments

Comments
 (0)