Skip to content

Commit f824d0d

Browse files
author
Matias Melograno
committed
improvements
1 parent c3ac11b commit f824d0d

File tree

5 files changed

+47
-48
lines changed

5 files changed

+47
-48
lines changed

splitio/client/factory.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ def _build_redis_factory(api_key, cfg):
354354
'telemetry': RedisTelemetryStorage(redis_adapter, sdk_metadata)
355355
}
356356
recorder = PipelinedRecorder(
357-
redis_adapter,
357+
redis_adapter.pipeline(),
358358
ImpressionsManager(cfg['impressionsMode'], False,
359359
_wrap_impression_listener(cfg['impressionListener'], sdk_metadata)),
360360
storages['telemetry'],

splitio/recorder/recorder.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,12 @@ def record_track_stats(self, event):
9191
class PipelinedRecorder(StatsRecorder):
9292
"""PipelinedRecorder class."""
9393

94-
def __init__(self, redis, impressions_manager, telemetry_storage, event_storage, impression_storage):
94+
def __init__(self, pipe, impressions_manager, telemetry_storage, event_storage, impression_storage):
9595
"""
9696
Class constructor.
9797
98-
:param redis: redis client instance
99-
:type redis: splitio.storage.adapters.redis.RedisAdapter
98+
:param pipe: redis pipeline
99+
:type pipe: splitio.storage.adapters.redis.RedisPipelineAdapter
100100
:param impressions_manager: impression manager instance
101101
:type impressions_manager: splitio.engine.impressions.Manager
102102
:param telemetry_storage: telemetry storage instance
@@ -106,7 +106,7 @@ def __init__(self, redis, impressions_manager, telemetry_storage, event_storage,
106106
:param impression_storage: impression storage instance
107107
:type impression_storage: splitio.storage.redis.RedisImpressionsStorage
108108
"""
109-
self._redis = redis
109+
self._pipe = pipe
110110
self._impressions_manager = impressions_manager
111111
self._telemetry_storage = telemetry_storage
112112
self._event_sotrage = event_storage
@@ -125,10 +125,9 @@ def record_treatment_stats(self, impressions, latency, operation):
125125
"""
126126
try:
127127
impressions = self._impressions_manager.process_impressions(impressions)
128-
pipe = self._redis.pipeline()
129-
self._impression_storage.add_impressions_to_pipe(impressions, pipe)
130-
self._telemetry_storage.add_latency_to_pipe(operation, latency, pipe)
131-
result = pipe.execute()
128+
self._impression_storage.add_impressions_to_pipe(impressions, self._pipe)
129+
self._telemetry_storage.add_latency_to_pipe(operation, latency, self._pipe)
130+
result = self._pipe.execute()
132131
if len(result) == 2:
133132
self._impression_storage.expire_key(result[0], len(impressions))
134133
except Exception: # pylint: disable=broad-except

splitio/storage/adapters/redis.py

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ class SentinelConfigurationException(Exception):
5353
pass
5454

5555

56-
class PrefixTrait(object):
57-
"""Prefix generator."""
56+
class PrefixHelper(object):
57+
"""PrefixHelper generator."""
5858

5959
def __init__(self, prefix=None):
6060
"""
@@ -137,7 +137,7 @@ def __init__(self, decorated, prefix=None):
137137
:param prefix: User prefix to add.
138138
"""
139139
self._decorated = decorated
140-
self._prefix_trait = PrefixTrait(prefix)
140+
self._prefix_helper = PrefixHelper(prefix)
141141

142142
# Below starts a list of methods that implement the interface of a standard
143143
# redis client.
@@ -147,7 +147,7 @@ def keys(self, pattern):
147147
try:
148148
return [
149149
_bytes_to_string(key)
150-
for key in self._prefix_trait.remove_prefix(self._decorated.keys(self._prefix_trait.add_prefix(pattern)))
150+
for key in self._prefix_helper.remove_prefix(self._decorated.keys(self._prefix_helper.add_prefix(pattern)))
151151
]
152152
except RedisError as exc:
153153
raise_from(RedisAdapterException('Failed to execute keys operation'), exc)
@@ -156,43 +156,43 @@ def set(self, name, value, *args, **kwargs):
156156
"""Mimic original redis function but using user custom prefix."""
157157
try:
158158
return self._decorated.set(
159-
self._prefix_trait.add_prefix(name), value, *args, **kwargs
159+
self._prefix_helper.add_prefix(name), value, *args, **kwargs
160160
)
161161
except RedisError as exc:
162-
raise RedisAdapterException('Failed to execute set operation', exc)
162+
raise_from(RedisAdapterException('Failed to execute set operation'), exc)
163163

164164
def get(self, name):
165165
"""Mimic original redis function but using user custom prefix."""
166166
try:
167-
return _bytes_to_string(self._decorated.get(self._prefix_trait.add_prefix(name)))
167+
return _bytes_to_string(self._decorated.get(self._prefix_helper.add_prefix(name)))
168168
except RedisError as exc:
169-
raise RedisAdapterException('Error executing get operation', exc)
169+
raise_from(RedisAdapterException('Error executing get operation'), exc)
170170

171171
def setex(self, name, time, value):
172172
"""Mimic original redis function but using user custom prefix."""
173173
try:
174-
return self._decorated.setex(self._prefix_trait.add_prefix(name), time, value)
174+
return self._decorated.setex(self._prefix_helper.add_prefix(name), time, value)
175175
except RedisError as exc:
176-
raise RedisAdapterException('Error executing setex operation', exc)
176+
raise_from(RedisAdapterException('Error executing setex operation'), exc)
177177

178178
def delete(self, *names):
179179
"""Mimic original redis function but using user custom prefix."""
180180
try:
181-
return self._decorated.delete(*self._prefix_trait.add_prefix(list(names)))
181+
return self._decorated.delete(*self._prefix_helper.add_prefix(list(names)))
182182
except RedisError as exc:
183183
raise_from(RedisAdapterException('Error executing delete operation'), exc)
184184

185185
def exists(self, name):
186186
"""Mimic original redis function but using user custom prefix."""
187187
try:
188-
return self._decorated.exists(self._prefix_trait.add_prefix(name))
188+
return self._decorated.exists(self._prefix_helper.add_prefix(name))
189189
except RedisError as exc:
190190
raise_from(RedisAdapterException('Error executing exists operation'), exc)
191191

192192
def lrange(self, key, start, end):
193193
"""Mimic original redis function but using user custom prefix."""
194194
try:
195-
return self._decorated.lrange(self._prefix_trait.add_prefix(key), start, end)
195+
return self._decorated.lrange(self._prefix_helper.add_prefix(key), start, end)
196196
except RedisError as exc:
197197
raise_from(RedisAdapterException('Error executing exists operation'), exc)
198198

@@ -201,7 +201,7 @@ def mget(self, names):
201201
try:
202202
return [
203203
_bytes_to_string(item)
204-
for item in self._decorated.mget(self._prefix_trait.add_prefix(names))
204+
for item in self._decorated.mget(self._prefix_helper.add_prefix(names))
205205
]
206206
except RedisError as exc:
207207
raise_from(RedisAdapterException('Error executing mget operation'), exc)
@@ -211,106 +211,106 @@ def smembers(self, name):
211211
try:
212212
return [
213213
_bytes_to_string(item)
214-
for item in self._decorated.smembers(self._prefix_trait.add_prefix(name))
214+
for item in self._decorated.smembers(self._prefix_helper.add_prefix(name))
215215
]
216216
except RedisError as exc:
217217
raise_from(RedisAdapterException('Error executing smembers operation'), exc)
218218

219219
def sadd(self, name, *values):
220220
"""Mimic original redis function but using user custom prefix."""
221221
try:
222-
return self._decorated.sadd(self._prefix_trait.add_prefix(name), *values)
222+
return self._decorated.sadd(self._prefix_helper.add_prefix(name), *values)
223223
except RedisError as exc:
224224
raise_from(RedisAdapterException('Error executing sadd operation'), exc)
225225

226226
def srem(self, name, *values):
227227
"""Mimic original redis function but using user custom prefix."""
228228
try:
229-
return self._decorated.srem(self._prefix_trait.add_prefix(name), *values)
229+
return self._decorated.srem(self._prefix_helper.add_prefix(name), *values)
230230
except RedisError as exc:
231231
raise_from(RedisAdapterException('Error executing srem operation'), exc)
232232

233233
def sismember(self, name, value):
234234
"""Mimic original redis function but using user custom prefix."""
235235
try:
236-
return self._decorated.sismember(self._prefix_trait.add_prefix(name), value)
236+
return self._decorated.sismember(self._prefix_helper.add_prefix(name), value)
237237
except RedisError as exc:
238238
raise_from(RedisAdapterException('Error executing sismember operation'), exc)
239239

240240
def eval(self, script, number_of_keys, *keys):
241241
"""Mimic original redis function but using user custom prefix."""
242242
try:
243-
return self._decorated.eval(script, number_of_keys, *self._prefix_trait.add_prefix(list(keys)))
243+
return self._decorated.eval(script, number_of_keys, *self._prefix_helper.add_prefix(list(keys)))
244244
except RedisError as exc:
245245
raise_from(RedisAdapterException('Error executing eval operation'), exc)
246246

247247
def hset(self, name, key, value):
248248
"""Mimic original redis function but using user custom prefix."""
249249
try:
250-
return self._decorated.hset(self._prefix_trait.add_prefix(name), key, value)
250+
return self._decorated.hset(self._prefix_helper.add_prefix(name), key, value)
251251
except RedisError as exc:
252252
raise_from(RedisAdapterException('Error executing hset operation'), exc)
253253

254254
def hget(self, name, key):
255255
"""Mimic original redis function but using user custom prefix."""
256256
try:
257-
return _bytes_to_string(self._decorated.hget(self._prefix_trait.add_prefix(name), key))
257+
return _bytes_to_string(self._decorated.hget(self._prefix_helper.add_prefix(name), key))
258258
except RedisError as exc:
259259
raise_from(RedisAdapterException('Error executing hget operation'), exc)
260260

261261
def incr(self, name, amount=1):
262262
"""Mimic original redis function but using user custom prefix."""
263263
try:
264-
return self._decorated.incr(self._prefix_trait.add_prefix(name), amount)
264+
return self._decorated.incr(self._prefix_helper.add_prefix(name), amount)
265265
except RedisError as exc:
266266
raise_from(RedisAdapterException('Error executing incr operation'), exc)
267267

268268
def getset(self, name, value):
269269
"""Mimic original redis function but using user custom prefix."""
270270
try:
271-
return _bytes_to_string(self._decorated.getset(self._prefix_trait.add_prefix(name), value))
271+
return _bytes_to_string(self._decorated.getset(self._prefix_helper.add_prefix(name), value))
272272
except RedisError as exc:
273273
raise_from(RedisAdapterException('Error executing getset operation'), exc)
274274

275275
def rpush(self, key, *values):
276276
"""Mimic original redis function but using user custom prefix."""
277277
try:
278-
return self._decorated.rpush(self._prefix_trait.add_prefix(key), *values)
278+
return self._decorated.rpush(self._prefix_helper.add_prefix(key), *values)
279279
except RedisError as exc:
280280
raise_from(RedisAdapterException('Error executing rpush operation'), exc)
281281

282282
def expire(self, key, value):
283283
"""Mimic original redis function but using user custom prefix."""
284284
try:
285-
return self._decorated.expire(self._prefix_trait.add_prefix(key), value)
285+
return self._decorated.expire(self._prefix_helper.add_prefix(key), value)
286286
except RedisError as exc:
287287
raise_from(RedisAdapterException('Error executing expire operation'), exc)
288288

289289
def rpop(self, key):
290290
"""Mimic original redis function but using user custom prefix."""
291291
try:
292-
return _bytes_to_string(self._decorated.rpop(self._prefix_trait.add_prefix(key)))
292+
return _bytes_to_string(self._decorated.rpop(self._prefix_helper.add_prefix(key)))
293293
except RedisError as exc:
294294
raise_from(RedisAdapterException('Error executing rpop operation'), exc)
295295

296296
def ttl(self, key):
297297
"""Mimic original redis function but using user custom prefix."""
298298
try:
299-
return self._decorated.ttl(self._prefix_trait.add_prefix(key))
299+
return self._decorated.ttl(self._prefix_helper.add_prefix(key))
300300
except RedisError as exc:
301301
raise_from(RedisAdapterException('Error executing ttl operation'), exc)
302302

303303
def lpop(self, key):
304304
"""Mimic original redis function but using user custom prefix."""
305305
try:
306-
return self._decorated.lpop(self._prefix_trait.add_prefix(key))
306+
return self._decorated.lpop(self._prefix_helper.add_prefix(key))
307307
except RedisError as exc:
308308
raise_from(RedisAdapterException('Error executing lpop operation'), exc)
309309

310310
def pipeline(self):
311311
"""Mimic original redis pipeline."""
312312
try:
313-
return RedisPipelineAdapter(self._decorated, self._prefix_trait)
313+
return RedisPipelineAdapter(self._decorated, self._prefix_helper)
314314
except RedisError as exc:
315315
raise_from(RedisAdapterException('Error executing ttl operation'), exc)
316316

@@ -322,23 +322,23 @@ class RedisPipelineAdapter(object):
322322
Adds an extra layer handling addition/removal of user prefix when handling
323323
keys
324324
"""
325-
def __init__(self, decorated, prefix_trait):
325+
def __init__(self, decorated, prefix_helper):
326326
"""
327327
Store the user prefix and the redis client instance.
328328
329329
:param decorated: Instance of redis cache client to decorate.
330-
:param prefix_trait: Prefix Trait utility
330+
:param _prefix_helper: PrefixHelper utility
331331
"""
332-
self._prefix_trait = prefix_trait
332+
self._prefix_helper = prefix_helper
333333
self._pipe = decorated.pipeline()
334334

335335
def rpush(self, key, *values):
336336
"""Mimic original redis function but using user custom prefix."""
337-
self._pipe.rpush(self._prefix_trait.add_prefix(key), *values)
337+
self._pipe.rpush(self._prefix_helper.add_prefix(key), *values)
338338

339339
def incr(self, name, amount=1):
340340
"""Mimic original redis function but using user custom prefix."""
341-
self._pipe.incr(self._prefix_trait.add_prefix(name), amount)
341+
self._pipe.incr(self._prefix_helper.add_prefix(name), amount)
342342

343343
def execute(self):
344344
"""Mimic original redis function but using user custom prefix."""

tests/client/test_factory.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from splitio.sync.split import SplitSynchronizer
2121
from splitio.sync.segment import SegmentSynchronizer
2222
from splitio.recorder.recorder import PipelinedRecorder, StandardRecorder
23-
from splitio.storage.adapters.redis import RedisAdapter
23+
from splitio.storage.adapters.redis import RedisAdapter, RedisPipelineAdapter
2424

2525

2626
class SplitFactoryTests(object):
@@ -130,11 +130,11 @@ def test_redis_client_creation(self, mocker):
130130
ssl_cert_reqs='some_cert_req',
131131
ssl_ca_certs='some_ca_cert',
132132
max_connections=999
133-
)]
133+
), mocker.call().pipeline()]
134134
assert factory._labels_enabled is False
135135
assert isinstance(factory._recorder, PipelinedRecorder)
136136
assert isinstance(factory._recorder._impressions_manager, ImpressionsManager)
137-
assert isinstance(factory._recorder._redis, RedisAdapter)
137+
assert isinstance(factory._recorder._pipe, RedisPipelineAdapter)
138138
assert isinstance(factory._recorder._telemetry_storage, redis.RedisTelemetryStorage)
139139
assert isinstance(factory._recorder._event_sotrage, redis.RedisEventsStorage)
140140
assert isinstance(factory._recorder._impression_storage, redis.RedisImpressionsStorage)

tests/storage/adapters/test_redis_adapter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ def test_forwarding(self, mocker):
189189
redis_mock = mocker.Mock(StrictRedis)
190190
redis_mock_2 = mocker.Mock(Redis)
191191
redis_mock.pipeline.return_value = redis_mock_2
192-
prefix_trait = redis.PrefixTrait('some_prefix')
193-
adapter = redis.RedisPipelineAdapter(redis_mock, prefix_trait)
192+
prefix_helper = redis.PrefixHelper('some_prefix')
193+
adapter = redis.RedisPipelineAdapter(redis_mock, prefix_helper)
194194

195195
adapter.rpush('key1', 'value1', 'value2')
196196
assert redis_mock_2.rpush.mock_calls[0] == mocker.call('some_prefix.key1', 'value1', 'value2')

0 commit comments

Comments
 (0)