From 63aa0d810d321b9db5ccf6efe709b2b33882ba76 Mon Sep 17 00:00:00 2001 From: venu Date: Wed, 8 May 2024 16:40:44 +0530 Subject: [PATCH 1/2] Fix range_end calculation --- src/etcetra/client.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/etcetra/client.py b/src/etcetra/client.py index e63bc40..c0b3f66 100644 --- a/src/etcetra/client.py +++ b/src/etcetra/client.py @@ -362,10 +362,7 @@ def get_prefix( encoding='utf-8', ): encoded_key = key.encode(encoding) - if key[-1] == '/' and len(key) >= 2: - range_end = encoded_key[:-2] + bytes([encoded_key[-2] + 1]) + b'/' - else: - range_end = encoded_key[:-1] + bytes([encoded_key[-1] + 1]) + range_end = increment_last_byte(encoded_key, encoding) return rpc_pb2.RangeRequest( key=encoded_key, range_end=range_end, @@ -408,10 +405,7 @@ def delete_prefix( ): # TODO: Implement prev_kv response encoded_key = key.encode(encoding) - if key[-1] == '/' and len(key) >= 2: - range_end = encoded_key[:-2] + bytes([encoded_key[-2] + 1]) + b'/' - else: - range_end = encoded_key[:-1] + bytes([encoded_key[-1] + 1]) + range_end = increment_last_byte(encoded_key, encoding) return rpc_pb2.DeleteRangeRequest( key=encoded_key, range_end=range_end, @@ -461,10 +455,7 @@ def keys_prefix( encoding='utf-8', ): encoded_key = key.encode(encoding) - if key[-1] == '/' and len(key) >= 2: - range_end = encoded_key[:-2] + bytes([encoded_key[-2] + 1]) + b'/' - else: - range_end = encoded_key[:-1] + bytes([encoded_key[-1] + 1]) + range_end = increment_last_byte(encoded_key, encoding) return rpc_pb2.RangeRequest( key=encoded_key, range_end=range_end, @@ -1309,10 +1300,7 @@ def watch_prefix( encoding = self.encoding encoded_key = key.encode(encoding) - if key[-1] == '/' and len(key) >= 2: - range_end = encoded_key[:-2] + bytes([encoded_key[-2] + 1]) + b'/' - else: - range_end = encoded_key[:-1] + bytes([encoded_key[-1] + 1]) + range_end = increment_last_byte(encoded_key, encoding) return self._watch_impl( key.encode(encoding), encoding, ready_event=ready_event, filters=filters, prev_kv=prev_kv, @@ -1671,3 +1659,18 @@ async def __aexit__(self, exc_type, exc, tb) -> Optional[bool]: self._lock_id = None self._lease_id = None return False + + +def increment_last_byte(key, encoding="utf-8"): + if type(key) is str: + byte_string = key.encode(encoding) + else: + byte_string = key + + s = bytearray(byte_string) + for i in range(len(s) - 1, -1, -1): + if s[i] < 0xff: + s[i] += 1 + return bytes(s[:i + 1]) + else: + return b'\x00' From f70ad0d69113a789962194170c016eb6908e9184 Mon Sep 17 00:00:00 2001 From: venu Date: Thu, 9 May 2024 11:07:28 +0530 Subject: [PATCH 2/2] Handle only bytes in increment_last_byte --- src/etcetra/client.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/etcetra/client.py b/src/etcetra/client.py index c0b3f66..c975790 100644 --- a/src/etcetra/client.py +++ b/src/etcetra/client.py @@ -362,7 +362,7 @@ def get_prefix( encoding='utf-8', ): encoded_key = key.encode(encoding) - range_end = increment_last_byte(encoded_key, encoding) + range_end = increment_last_byte(encoded_key) return rpc_pb2.RangeRequest( key=encoded_key, range_end=range_end, @@ -405,7 +405,7 @@ def delete_prefix( ): # TODO: Implement prev_kv response encoded_key = key.encode(encoding) - range_end = increment_last_byte(encoded_key, encoding) + range_end = increment_last_byte(encoded_key) return rpc_pb2.DeleteRangeRequest( key=encoded_key, range_end=range_end, @@ -455,7 +455,7 @@ def keys_prefix( encoding='utf-8', ): encoded_key = key.encode(encoding) - range_end = increment_last_byte(encoded_key, encoding) + range_end = increment_last_byte(encoded_key) return rpc_pb2.RangeRequest( key=encoded_key, range_end=range_end, @@ -1300,7 +1300,7 @@ def watch_prefix( encoding = self.encoding encoded_key = key.encode(encoding) - range_end = increment_last_byte(encoded_key, encoding) + range_end = increment_last_byte(encoded_key) return self._watch_impl( key.encode(encoding), encoding, ready_event=ready_event, filters=filters, prev_kv=prev_kv, @@ -1661,13 +1661,8 @@ async def __aexit__(self, exc_type, exc, tb) -> Optional[bool]: return False -def increment_last_byte(key, encoding="utf-8"): - if type(key) is str: - byte_string = key.encode(encoding) - else: - byte_string = key - - s = bytearray(byte_string) +def increment_last_byte(encoded_key): + s = bytearray(encoded_key) for i in range(len(s) - 1, -1, -1): if s[i] < 0xff: s[i] += 1