1
1
# Experimental, this interface and use may change
2
2
from threading import Lock
3
3
4
+
4
5
class Tablet (object ):
5
6
"""
6
7
Represents a single ScyllaDB tablet.
@@ -11,7 +12,7 @@ class Tablet(object):
11
12
last_token = 0
12
13
replicas = None
13
14
14
- def __init__ (self , first_token = 0 , last_token = 0 , replicas = None ):
15
+ def __init__ (self , first_token = 0 , last_token = 0 , replicas = None ):
15
16
self .first_token = first_token
16
17
self .last_token = last_token
17
18
self .replicas = replicas
@@ -28,10 +29,11 @@ def _is_valid_tablet(replicas):
28
29
@staticmethod
29
30
def from_row (first_token , last_token , replicas ):
30
31
if Tablet ._is_valid_tablet (replicas ):
31
- tablet = Tablet (first_token , last_token ,replicas )
32
+ tablet = Tablet (first_token , last_token , replicas )
32
33
return tablet
33
34
return None
34
35
36
+
35
37
# Experimental, this interface and use may change
36
38
class Tablets (object ):
37
39
_lock = None
@@ -43,10 +45,10 @@ def __init__(self, tablets):
43
45
44
46
def get_tablet_for_key (self , keyspace , table , t ):
45
47
tablet = self ._tablets .get ((keyspace , table ), [])
46
- if tablet == [] :
48
+ if not tablet :
47
49
return None
48
50
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 )
50
52
if id < len (tablet ) and t .value > tablet [id ].first_token :
51
53
return tablet [id ]
52
54
return None
@@ -55,13 +57,13 @@ def add_tablet(self, keyspace, table, tablet):
55
57
with self ._lock :
56
58
tablets_for_table = self ._tablets .setdefault ((keyspace , table ), [])
57
59
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 )
60
62
if start > 0 and tablets_for_table [start - 1 ].last_token > tablet .first_token :
61
63
start = start - 1
62
64
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 )
65
67
if end < len (tablets_for_table ) and tablets_for_table [end ].first_token >= tablet .last_token :
66
68
end = end - 1
67
69
@@ -70,6 +72,7 @@ def add_tablet(self, keyspace, table, tablet):
70
72
71
73
tablets_for_table .insert (start , tablet )
72
74
75
+
73
76
# bisect.bisect_left implementation from Python 3.11, needed untill support for
74
77
# Python < 3.10 is dropped, it is needed to use `key` to extract last_token from
75
78
# 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):
97
100
lo = mid + 1
98
101
else :
99
102
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
107
110
return lo
0 commit comments