11# Experimental, this interface and use may change
22from threading import Lock
33
4+
45class Tablet (object ):
56 """
67 Represents a single ScyllaDB tablet.
@@ -11,7 +12,7 @@ class Tablet(object):
1112 last_token = 0
1213 replicas = None
1314
14- def __init__ (self , first_token = 0 , last_token = 0 , replicas = None ):
15+ def __init__ (self , first_token = 0 , last_token = 0 , replicas = None ):
1516 self .first_token = first_token
1617 self .last_token = last_token
1718 self .replicas = replicas
@@ -28,10 +29,11 @@ def _is_valid_tablet(replicas):
2829 @staticmethod
2930 def from_row (first_token , last_token , replicas ):
3031 if Tablet ._is_valid_tablet (replicas ):
31- tablet = Tablet (first_token , last_token ,replicas )
32+ tablet = Tablet (first_token , last_token , replicas )
3233 return tablet
3334 return None
3435
36+
3537# Experimental, this interface and use may change
3638class Tablets (object ):
3739 _lock = None
@@ -43,10 +45,10 @@ def __init__(self, tablets):
4345
4446 def get_tablet_for_key (self , keyspace , table , t ):
4547 tablet = self ._tablets .get ((keyspace , table ), [])
46- if tablet == [] :
48+ if not tablet :
4749 return None
4850
49- id = bisect_left (tablet , t .value , key = lambda tablet : tablet .last_token )
51+ id = bisect_left (tablet , t .value , key = lambda tablet : tablet .last_token )
5052 if id < len (tablet ) and t .value > tablet [id ].first_token :
5153 return tablet [id ]
5254 return None
@@ -55,13 +57,13 @@ def add_tablet(self, keyspace, table, tablet):
5557 with self ._lock :
5658 tablets_for_table = self ._tablets .setdefault ((keyspace , table ), [])
5759
58- # find first overlaping range
59- start = bisect_left (tablets_for_table , tablet .first_token , key = lambda t : t .first_token )
60+ # find first overlapping range
61+ start = bisect_left (tablets_for_table , tablet .first_token , key = lambda t : t .first_token )
6062 if start > 0 and tablets_for_table [start - 1 ].last_token > tablet .first_token :
6163 start = start - 1
6264
63- # find last overlaping range
64- end = bisect_left (tablets_for_table , tablet .last_token , key = lambda t : t .last_token )
65+ # find last overlapping range
66+ end = bisect_left (tablets_for_table , tablet .last_token , key = lambda t : t .last_token )
6567 if end < len (tablets_for_table ) and tablets_for_table [end ].first_token >= tablet .last_token :
6668 end = end - 1
6769
@@ -70,6 +72,7 @@ def add_tablet(self, keyspace, table, tablet):
7072
7173 tablets_for_table .insert (start , tablet )
7274
75+
7376# bisect.bisect_left implementation from Python 3.11, needed untill support for
7477# Python < 3.10 is dropped, it is needed to use `key` to extract last_token from
7578# Tablet list - better solution performance-wise than materialize list of last_tokens
@@ -97,11 +100,11 @@ def bisect_left(a, x, lo=0, hi=None, *, key=None):
97100 lo = mid + 1
98101 else :
99102 hi = mid
100- else :
101- while lo < hi :
102- mid = (lo + hi ) // 2
103- if key (a [mid ]) < x :
104- lo = mid + 1
105- else :
106- hi = mid
103+ return
104+ while lo < hi :
105+ mid = (lo + hi ) // 2
106+ if key (a [mid ]) < x :
107+ lo = mid + 1
108+ else :
109+ hi = mid
107110 return lo
0 commit comments