14
14
from ledger .genesis_txn .genesis_txn_file_util import genesis_txn_path
15
15
from stp_core .common .constants import ZMQ_NETWORK_PROTOCOL
16
16
from stp_core .common .log import getlogger
17
+ from pympler import muppy , summary
17
18
18
19
19
20
def decode_err_handler (error ):
@@ -31,6 +32,7 @@ def decode_err_handler(error):
31
32
INDY_NODE_SERVICE_FILE_PATH = "/etc/systemd/system/indy-node.service"
32
33
NODE_CONTROL_SERVICE_FILE_PATH = "/etc/systemd/system/indy-node-control.service"
33
34
NUMBER_TXNS_FOR_DISPLAY = 10
35
+ LIMIT_OBJECTS_FOR_PROFILER = 10
34
36
35
37
36
38
def none_on_fail (func ):
@@ -65,6 +67,9 @@ def info(self):
65
67
pool_info = self .__pool_info
66
68
protocol_info = self .__protocol_info
67
69
node_info = self .__node_info
70
+ memory_profiler = self .__memory_profiler
71
+ extractions_info = self .__extractions
72
+
68
73
if hardware_info :
69
74
general_info .update (hardware_info )
70
75
if software_info :
@@ -75,17 +80,26 @@ def info(self):
75
80
general_info .update (protocol_info )
76
81
if node_info :
77
82
general_info .update (node_info )
83
+ if memory_profiler :
84
+ general_info .update (memory_profiler )
85
+ if extractions_info :
86
+ general_info .update (extractions_info )
87
+
78
88
return general_info
79
89
90
+ @property
91
+ @none_on_fail
92
+ def __memory_profiler (self ):
93
+ all_objects = muppy .get_objects ()
94
+ stats = summary .summarize (all_objects )
95
+ return {'Memory_profiler' : [l for l in summary .format_ (stats , LIMIT_OBJECTS_FOR_PROFILER )]}
96
+
80
97
@property
81
98
def additional_info (self ):
82
99
additional_info = {}
83
100
config_info = self .__config_info
84
- extractions_info = self .__extractions
85
101
if config_info :
86
102
additional_info .update (config_info )
87
- if extractions_info :
88
- additional_info .update (extractions_info )
89
103
return additional_info
90
104
91
105
def _prepare_for_json (self , item ):
@@ -181,21 +195,32 @@ def __unreachable_list(self):
181
195
def __total_count (self ):
182
196
return len (self ._node .nodestack .remotes ) + 1
183
197
198
+ def _get_folder_size (self , start_path ):
199
+ total_size = 0
200
+ for dirpath , dirnames , filenames in os .walk (start_path ):
201
+ for f in filenames :
202
+ fp = os .path .join (dirpath , f )
203
+ try :
204
+ total_size += os .path .getsize (fp )
205
+ except OSError :
206
+ pass
207
+ return total_size
208
+
184
209
@property
185
210
@none_on_fail
186
211
def __hardware_info (self ):
187
212
hdd = psutil .disk_usage ('/' )
188
213
ram_all = psutil .virtual_memory ()
189
214
current_process = psutil .Process ()
190
215
ram_by_process = current_process .memory_info ()
191
- nodes_data = psutil . disk_usage (self ._node .ledger_dir )
216
+ nodes_data = self . _get_folder_size (self ._node .ledger_dir )
192
217
193
218
return {
194
219
"Hardware" : {
195
220
"HDD_all" : "{} Mbs" .format (int (hdd .used / MBs )),
196
221
"RAM_all_free" : "{} Mbs" .format (int (ram_all .free / MBs )),
197
222
"RAM_used_by_node" : "{} Mbs" .format (int (ram_by_process .vms / MBs )),
198
- "HDD_used_by_node" : "{} MBs" .format (int (nodes_data . used / MBs )),
223
+ "HDD_used_by_node" : "{} MBs" .format (int (nodes_data / MBs )),
199
224
}
200
225
}
201
226
@@ -404,19 +429,28 @@ def __node_info(self):
404
429
waiting_cp = {}
405
430
num_txns_in_catchup = {}
406
431
last_txn_3PC_keys = {}
407
- root_hashes = {}
408
- uncommited_root_hashes = {}
409
- uncommited_txns = {}
432
+ committed_ledger_root_hashes = {}
433
+ uncommited_ledger_root_hashes = {}
434
+ uncommitted_ledger_txns = {}
435
+ committed_state_root_hashes = {}
436
+ uncommitted_state_root_hashes = {}
410
437
for idx , linfo in self ._node .ledgerManager .ledgerRegistry .items ():
411
438
ledger_statuses [idx ] = self ._prepare_for_json (linfo .state .name )
412
439
waiting_cp [idx ] = self ._prepare_for_json (linfo .catchUpTill )
413
440
num_txns_in_catchup [idx ] = self ._prepare_for_json (linfo .num_txns_caught_up )
414
441
last_txn_3PC_keys [idx ] = self ._prepare_for_json (linfo .last_txn_3PC_key )
415
442
if linfo .ledger .uncommittedRootHash :
416
- uncommited_root_hashes [idx ] = self ._prepare_for_json (base58 .b58encode (linfo .ledger .uncommittedRootHash ))
417
- uncommited_txns [idx ] = [self ._prepare_for_json (txn ) for txn in linfo .ledger .uncommittedTxns ]
443
+ uncommited_ledger_root_hashes [idx ] = self ._prepare_for_json (base58 .b58encode (linfo .ledger .uncommittedRootHash ))
444
+ txns = {"Count" : len (linfo .ledger .uncommittedTxns )}
445
+ if len (linfo .ledger .uncommittedTxns ) > 0 :
446
+ txns ["First_txn" ] = self ._prepare_for_json (linfo .ledger .uncommittedTxns [0 ])
447
+ txns ["Last_txn" ] = self ._prepare_for_json (linfo .ledger .uncommittedTxns [- 1 ])
448
+ uncommitted_ledger_txns [idx ] = txns
418
449
if linfo .ledger .tree .root_hash :
419
- root_hashes [idx ] = self ._prepare_for_json (base58 .b58encode (linfo .ledger .tree .root_hash ))
450
+ committed_ledger_root_hashes [idx ] = self ._prepare_for_json (base58 .b58encode (linfo .ledger .tree .root_hash ))
451
+ for l_id , req_handler in self ._node .ledger_to_req_handler .items ():
452
+ committed_state_root_hashes [l_id ] = self ._prepare_for_json (base58 .b58encode (req_handler .state .committedHeadHash ))
453
+ uncommitted_state_root_hashes [l_id ] = self ._prepare_for_json (base58 .b58encode (req_handler .state .headHash ))
420
454
421
455
return {
422
456
"Node_info" : {
@@ -438,12 +472,16 @@ def __node_info(self):
438
472
self .__verkey ),
439
473
"Metrics" : self ._prepare_for_json (
440
474
self ._get_node_metrics ()),
441
- "Root_hashes" : self ._prepare_for_json (
442
- root_hashes ),
443
- "Uncommitted_root_hashes" : self ._prepare_for_json (
444
- uncommited_root_hashes ),
445
- "Uncommitted_txns" : self ._prepare_for_json (
446
- uncommited_txns ),
475
+ "Committed_ledger_root_hashes" : self ._prepare_for_json (
476
+ committed_ledger_root_hashes ),
477
+ "Committed_state_root_hashes" : self ._prepare_for_json (
478
+ committed_state_root_hashes ),
479
+ "Uncommitted_ledger_root_hashes" : self ._prepare_for_json (
480
+ uncommited_ledger_root_hashes ),
481
+ "Uncommitted_ledger_txns" : self ._prepare_for_json (
482
+ uncommitted_ledger_txns ),
483
+ "Uncommitted_state_root_hashes" : self ._prepare_for_json (
484
+ uncommitted_state_root_hashes ),
447
485
"View_change_status" : {
448
486
"View_No" : self ._prepare_for_json (
449
487
self ._node .viewNo ),
0 commit comments