Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGES.txt
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
9.6.2 (XXX XX, 2024)
- Fixed an issue when pushing unique keys tracker data to redis if no keys exist, i.e. get_treatment flavors are not called.

9.6.1 (Feb 15, 2024)
- Added redisUsername configuration parameter for Redis connection to set the username for accessing redis when not using the default `root` username

Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@
TESTS_REQUIRES = [
'flake8',
'pytest==7.0.1',
'pytest-mock>=3.5.1',
'pytest-mock==3.12.0',
'coverage==6.2',
'pytest-cov',
'importlib-metadata==4.2',
Expand Down
14 changes: 14 additions & 0 deletions splitio/engine/impressions/adapters.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,6 +40,9 @@ def record_unique_keys(self, uniques):
:param uniques: unique keys disctionary
:type uniques: Dictionary {'feature_flag1': set(), 'feature_flag2': set(), .. }
"""
if len(uniques) == 0:
return

self._telemtry_http_client.record_unique_keys({'keys': self._uniques_formatter(uniques)})

def _uniques_formatter(self, uniques):
Expand DownExpand Up@@ -73,6 +76,9 @@ def record_unique_keys(self, uniques):
:param uniques: unique keys disctionary
:type uniques: Dictionary {'feature_flag1': set(), 'feature_flag2': set(), .. }
"""
if len(uniques) == 0:
return

bulk_mtks = _uniques_formatter(uniques)
try:
inserted = self._redis_client.rpush(_MTK_QUEUE_KEY, *bulk_mtks)
Expand All@@ -90,6 +96,9 @@ def flush_counters(self, to_send):
:param to_send: unique keys disctionary
:type to_send: Dictionary {'feature_flag1': set(), 'feature_flag2': set(), .. }
"""
if len(to_send) == 0:
return

try:
resulted = 0
counted = 0
Expand DownExpand Up@@ -140,6 +149,9 @@ def record_unique_keys(self, uniques):
:param uniques: unique keys disctionary
:type uniques: Dictionary {'feature_flag1': set(), 'feature_flag2': set(), .. }
"""
if len(uniques) == 0:
return

bulk_mtks = _uniques_formatter(uniques)
try:
_LOGGER.debug("record_unique_keys")
Expand All@@ -159,6 +171,8 @@ def flush_counters(self, to_send):
:param to_send: unique keys disctionary
:type to_send: Dictionary {'feature_flag1': set(), 'feature_flag2': set(), .. }
"""
if len(to_send) == 0:
return
try:
resulted = 0
for pf_count in to_send:
Expand Down
2 changes: 1 addition & 1 deletion splitio/version.py
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
__version__ = '9.6.1'
__version__ = '9.6.2'
24 changes: 21 additions & 3 deletions tests/engine/test_send_adapters.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,9 +40,12 @@ def test_record_unique_keys(self, mocker):
telemetry_api = TelemetryAPI(mocker.Mock(), 'some_api_key', mocker.Mock(), mocker.Mock())
sender_adapter = InMemorySenderAdapter(telemetry_api)
sender_adapter.record_unique_keys(uniques)

assert(mocker.called)

mocker.reset_mock()
sender_adapter.record_unique_keys({})
assert(not mocker.called)

class RedisSenderAdapterTests(object):
"""Redis sender adapter test."""

Expand DownExpand Up@@ -70,9 +73,12 @@ def test_record_unique_keys(self, mocker):
redis_client = RedisAdapter(mocker.Mock(), mocker.Mock())
sender_adapter = RedisSenderAdapter(redis_client)
sender_adapter.record_unique_keys(uniques)

assert(mocker.called)

mocker.reset_mock()
sender_adapter.record_unique_keys({})
assert(not mocker.called)

@mock.patch('splitio.storage.adapters.redis.RedisPipelineAdapter.hincrby')
def test_flush_counters(self, mocker):
"""Test sending counters."""
Expand All@@ -84,9 +90,12 @@ def test_flush_counters(self, mocker):
redis_client = RedisAdapter(mocker.Mock(), mocker.Mock())
sender_adapter = RedisSenderAdapter(redis_client)
sender_adapter.flush_counters(counters)

assert(mocker.called)

mocker.reset_mock()
sender_adapter.flush_counters({})
assert(not mocker.called)

@mock.patch('splitio.storage.adapters.redis.RedisAdapter.expire')
def test_expire_keys(self, mocker):
"""Test set expire key."""
Expand DownExpand Up@@ -128,6 +137,10 @@ def test_record_unique_keys(self, mocker):
sender_adapter.record_unique_keys(uniques)
assert(adapter._expire[adapters._MTK_QUEUE_KEY] != -1)

adapter._keys[adapters._MTK_QUEUE_KEY] = {}
sender_adapter.record_unique_keys({})
assert(adapter._keys[adapters._MTK_QUEUE_KEY] == {})

def test_flush_counters(self, mocker):
"""Test sending counters."""
adapter = StorageMockAdapter()
Expand All@@ -144,3 +157,8 @@ def test_flush_counters(self, mocker):
assert(adapter._expire[adapters._IMP_COUNT_QUEUE_KEY + "." + 'f1::123'] == adapters._IMP_COUNT_KEY_DEFAULT_TTL)
sender_adapter.flush_counters(counters)
assert(adapter._expire[adapters._IMP_COUNT_QUEUE_KEY + "." + 'f2::123'] == adapters._IMP_COUNT_KEY_DEFAULT_TTL)

del adapter._keys[adapters._IMP_COUNT_QUEUE_KEY + "." + 'f1::123']
del adapter._keys[adapters._IMP_COUNT_QUEUE_KEY + "." + 'f2::123']
sender_adapter.flush_counters({})
assert(adapter.get_keys_by_prefix(adapters._IMP_COUNT_QUEUE_KEY) == [])