@@ -105,17 +105,21 @@ def __init__(self, w3: Web3) -> None:
105
105
self .cur = Cursor (_get_data_folder ().joinpath ("cache.db" ))
106
106
self .cur .execute (f"CREATE TABLE IF NOT EXISTS { self .table_key } (method, params, result)" )
107
107
108
- latest = w3 .eth .get_block ("latest" )
108
+ self .lock = threading .Lock ()
109
+ self .event = threading .Event ()
110
+ self .start ()
111
+
112
+ def start (self ):
113
+ latest = self .w3 .eth .get_block ("latest" )
109
114
self .last_block = latest .hash
110
115
self .last_block_seen = latest .timestamp
111
- self .last_request = 0.0
116
+ self .last_request = time . time ()
112
117
self .block_cache : OrderedDict = OrderedDict ()
113
- self .block_filter = w3 .eth .filter ("latest" )
118
+ self .block_filter = self . w3 .eth .filter ("latest" )
114
119
115
- self .lock = threading .Lock ()
116
- self .event = threading .Event ()
117
120
self .is_killed = False
118
- threading .Thread (target = self .block_filter_loop , daemon = True ).start ()
121
+ self .loop_thread = threading .Thread (target = self .loop_exception_handler , daemon = True )
122
+ self .loop_thread .start ()
119
123
120
124
@classmethod
121
125
def get_layer (cls , w3 : Web3 , network_type : str ) -> Optional [int ]:
@@ -138,6 +142,13 @@ def get_layer(cls, w3: Web3, network_type: str) -> Optional[int]:
138
142
def time_since (self ) -> float :
139
143
return time .time () - self .last_request
140
144
145
+ def loop_exception_handler (self ) -> None :
146
+ try :
147
+ self .block_filter_loop ()
148
+ except Exception :
149
+ self .block_cache .clear ()
150
+ self .is_killed = True
151
+
141
152
def block_filter_loop (self ) -> None :
142
153
while not self .is_killed :
143
154
# if the last RPC request was > 60 seconds ago, reduce the rate of updates.
@@ -215,6 +226,9 @@ def process_request(self, make_request: Callable, method: str, params: List) ->
215
226
data = HexBytes (data )
216
227
return {"id" : "cache" , "jsonrpc" : "2.0" , "result" : data }
217
228
229
+ if not self .loop_thread .is_alive ():
230
+ self .start ()
231
+
218
232
with self .lock :
219
233
self .last_request = time .time ()
220
234
self .event .set ()
0 commit comments