From ec8601ce885c3c43c7ae949c2cc574f610279ff3 Mon Sep 17 00:00:00 2001
From: Sarthak Deshpande <60317842+cheesecake100201@users.noreply.github.com>
Date: Sun, 12 Jan 2025 11:34:34 +0530
Subject: [PATCH] Replaced zrangebylex method in the range method (#521)
# What does this PR do?
In short, provide a summary of what this PR does and why. Usually, the
relevant context should be present in a linked issue.
- [Currently redis as a kvstore is bugged, as the range method uses
zrangebylex method. zrangebylex method is used when it is a sorted set
but we are storing the value using .set method in the redis. This causes
an error. Another issue is that zrangebylex method takes 3 args but only
2 are mentioned in the range method. This causes a runtime error. That
method has been replaced with the current implementation in the PR ]
Addresses issue (#520 )
## Test Plan
Please describe:
- tests you ran to verify your changes with result summaries.
- provide instructions so it can be reproduced.
`python llama_stack/apis/agents/client.py localhost 8001 tools_llama_3_1
meta-llama/Llama-3.1-70B-Instruct`
Have used redis in the run.yaml file as well for the persistence_store.
Also enable_session_persistence turned to True for this test.
Have also tested this in a jupyter notebook to make sure the current
flow does not work through multiple turns in the same session.
## Sources
Please link relevant resources if necessary.
## Before submitting
- [ ] This PR fixes a typo or improves the docs (you can dismiss the
other checks if that's the case).
- [x] Ran pre-commit to handle lint / formatting issues.
- [x] Read the [contributor
guideline](https://github.com/meta-llama/llama-stack/blob/main/CONTRIBUTING.md),
Pull Request section?
- [ ] Updated relevant documentation.
- [ ] Wrote necessary unit or integration tests.
---
.../providers/utils/kvstore/redis/redis.py | 24 ++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/llama_stack/providers/utils/kvstore/redis/redis.py b/llama_stack/providers/utils/kvstore/redis/redis.py
index 8a7f3464b..ca34f0fad 100644
--- a/llama_stack/providers/utils/kvstore/redis/redis.py
+++ b/llama_stack/providers/utils/kvstore/redis/redis.py
@@ -48,5 +48,27 @@ class RedisKVStoreImpl(KVStore):
async def range(self, start_key: str, end_key: str) -> List[str]:
start_key = self._namespaced_key(start_key)
end_key = self._namespaced_key(end_key)
+ cursor = 0
+ pattern = start_key + "*" # Match all keys starting with start_key prefix
+ matching_keys = []
+ while True:
+ cursor, keys = await self.redis.scan(cursor, match=pattern, count=1000)
- return await self.redis.zrangebylex(start_key, end_key)
+ for key in keys:
+ key_str = key.decode("utf-8") if isinstance(key, bytes) else key
+ if start_key <= key_str <= end_key:
+ matching_keys.append(key)
+
+ if cursor == 0:
+ break
+
+ # Then fetch all values in a single MGET call
+ if matching_keys:
+ values = await self.redis.mget(matching_keys)
+ return [
+ value.decode("utf-8") if isinstance(value, bytes) else value
+ for value in values
+ if value is not None
+ ]
+
+ return []