1
1
import _thread
2
2
import binascii
3
- import cProfile
4
3
import decimal
5
4
import logging
6
5
import multiprocessing
7
6
import os
8
- import pstats
9
7
import threading
10
8
import time
11
9
20
18
)
21
19
from counterpartycore .lib .api import apiserver as api_v2
22
20
from counterpartycore .lib .api import apiv1 , dbbuilder
21
+ from counterpartycore .lib .backend import rsfetcher
23
22
from counterpartycore .lib .cli import bootstrap , log
24
23
from counterpartycore .lib .ledger .backendheight import BackendHeight
25
24
from counterpartycore .lib .ledger .currentstate import CurrentState
26
- from counterpartycore .lib .monitors import slack
25
+ from counterpartycore .lib .monitors import profiler , slack
27
26
from counterpartycore .lib .parser import blocks , check , follow
28
27
from counterpartycore .lib .utils import database , helpers
29
28
@@ -87,7 +86,7 @@ def __init__(self, args, log_stream=None, stop_when_ready=False):
87
86
self .api_stop_event = None
88
87
self .backend_height_thread = None
89
88
self .log_stream = log_stream
90
- self .profiler = None
89
+ self .periodic_profiler = None
91
90
self .stop_when_ready = stop_when_ready
92
91
self .stopped = False
93
92
@@ -174,14 +173,12 @@ def run_server(self):
174
173
175
174
# Catch Up
176
175
if config .PROFILE :
177
- logger .info ("Starting profiler before catchup..." )
178
- self .profiler = cProfile .Profile ()
179
- self .profiler .enable ()
180
- blocks .catch_up (self .db )
181
- logger .info ("Stopping profiler after catchup..." )
182
- self .profiler .disable ()
183
- else :
184
- blocks .catch_up (self .db )
176
+ self .periodic_profiler = profiler .PeriodicProfilerThread (
177
+ interval_minutes = config .PROFILE_INTERVAL_MINUTES
178
+ )
179
+ self .periodic_profiler .start ()
180
+
181
+ blocks .catch_up (self .db )
185
182
186
183
if self .stop_when_ready :
187
184
slack .trigger_webhook ()
@@ -206,8 +203,9 @@ def stop(self):
206
203
if self .stopped :
207
204
return
208
205
logger .info ("Shutting down..." )
209
- if self .db :
210
- CurrentState ().set_ledger_state (self .db , "Stopping" )
206
+
207
+ CurrentState ().set_stopping ()
208
+ rsfetcher .RSFetcher ().stop ()
211
209
212
210
# Ensure all threads are stopped
213
211
if self .follower_daemon :
@@ -225,19 +223,9 @@ def stop(self):
225
223
if self .apiserver_v2 :
226
224
self .apiserver_v2 .stop ()
227
225
228
- # Dump profiling data
229
- if config .PROFILE and self .profiler :
230
- logger .info ("Dumping profiling data..." )
231
- profile_path = os .path .join (config .CACHE_DIR , "catchup.prof" )
232
- try :
233
- self .profiler .dump_stats (profile_path )
234
- stats = pstats .Stats (self .profiler ).sort_stats ("cumtime" )
235
- stats .print_stats (20 )
236
- stats = pstats .Stats (self .profiler ).sort_stats ("tottime" )
237
- stats .print_stats (20 )
238
- except Exception as e : # pylint: disable=broad-except
239
- logger .error ("Error dumping profiler stats: %s" , e )
240
- self .profiler = None
226
+ if self .periodic_profiler :
227
+ logger .info ("Stopping periodic profiler..." )
228
+ self .periodic_profiler .stop ()
241
229
242
230
self .stopped = True
243
231
logger .info ("Shutdown complete." )
0 commit comments