Skip to content

Commit ed3eac9

Browse files
committed
Use LRU cache
1 parent 71cb65c commit ed3eac9

File tree

2 files changed

+22
-44
lines changed

2 files changed

+22
-44
lines changed

sentry_sdk/_lru_cache.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@
6262
6363
"""
6464

65+
from copy import copy
66+
6567
SENTINEL = object()
6668

6769

@@ -89,6 +91,13 @@ def __init__(self, max_size):
8991

9092
self.hits = self.misses = 0
9193

94+
def __copy__(self):
95+
cache = LRUCache(self.max_size)
96+
cache.full = self.full
97+
cache.cache = copy(self.cache)
98+
cache.root = copy(self.root)
99+
return cache
100+
92101
def set(self, key, value):
93102
link = self.cache.get(key, SENTINEL)
94103

@@ -154,3 +163,11 @@ def get(self, key, default=None):
154163
self.hits += 1
155164

156165
return link[VALUE]
166+
167+
def get_all(self):
168+
nodes = []
169+
node = self.root[NEXT]
170+
while node is not self.root:
171+
nodes.append((node[KEY], node[VALUE]))
172+
node = node[NEXT]
173+
return nodes

sentry_sdk/flag_utils.py

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from copy import copy
22
from typing import TYPE_CHECKING
33

4-
import itertools
4+
from sentry_sdk._lru_cache import LRUCache
55

66
if TYPE_CHECKING:
77
from typing import TypedDict
@@ -13,62 +13,23 @@ class FlagBuffer:
1313

1414
def __init__(self, capacity):
1515
# type: (int) -> None
16-
self.buffer = [] # type: list[Flag]
16+
self.buffer = LRUCache(capacity)
1717
self.capacity = capacity
18-
self.ip = 0
19-
20-
@property
21-
def index(self):
22-
# type: () -> int
23-
return self.ip % self.capacity
2418

2519
def clear(self):
2620
# type: () -> None
27-
self.buffer = []
28-
self.ip = 0
21+
self.buffer = LRUCache(self.capacity)
2922

3023
def __copy__(self):
3124
# type: () -> FlagBuffer
3225
buffer = FlagBuffer(capacity=self.capacity)
3326
buffer.buffer = copy(self.buffer)
34-
buffer.ip = self.ip
3527
return buffer
3628

3729
def get(self):
3830
# type: () -> list[FlagData]
39-
if self.ip >= self.capacity:
40-
iterator = itertools.chain(
41-
range(self.index, self.capacity), range(0, self.index)
42-
)
43-
return [self.buffer[i].asdict for i in iterator]
44-
else:
45-
return [flag.asdict for flag in self.buffer]
31+
return [{"flag": key, "result": value} for key, value in self.buffer.get_all()]
4632

4733
def set(self, flag, result):
4834
# type: (str, bool) -> None
49-
flag_ = Flag(flag, result)
50-
51-
if self.ip >= self.capacity:
52-
self.buffer[self.index] = flag_
53-
else:
54-
self.buffer.append(flag_)
55-
56-
self.ip += 1
57-
58-
59-
class Flag:
60-
__slots__ = ("flag", "result")
61-
62-
def __init__(self, flag, result):
63-
# type: (str, bool) -> None
64-
self.flag = flag
65-
self.result = result
66-
67-
def __copy__(self):
68-
# type: () -> Flag
69-
return Flag(self.flag, self.result)
70-
71-
@property
72-
def asdict(self):
73-
# type: () -> FlagData
74-
return {"flag": self.flag, "result": self.result}
35+
self.buffer.set(flag, result)

0 commit comments

Comments
 (0)