Skip to content

Commit e927ac4

Browse files
committed
gui: fix est slot duration
1 parent fcc6db2 commit e927ac4

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

src/disco/gui/fd_gui.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ fd_gui_new( void * shmem,
144144
for( ulong i=0UL; i < (FD_GUI_REPAIR_SLOT_HISTORY_SZ+1UL); i++ ) gui->summary.slots_max_repair[ i ].slot = ULONG_MAX;
145145
for( ulong i=0UL; i < (FD_GUI_TURBINE_SLOT_HISTORY_SZ+1UL); i++ ) gui->summary.slots_max_turbine[ i ].slot = ULONG_MAX;
146146

147+
for( ulong i=0UL; i < FD_GUI_TURBINE_RECV_TIMESTAMPS; i++ ) gui->turbine_slots[ i ].slot = ULONG_MAX;
148+
147149
gui->summary.estimated_tps_history_idx = 0UL;
148150
memset( gui->summary.estimated_tps_history, 0, sizeof(gui->summary.estimated_tps_history) );
149151

@@ -1848,6 +1850,28 @@ fd_gui_handle_shred( fd_gui_t * gui,
18481850
fd_gui_printf_turbine_slot( gui );
18491851
fd_http_server_ws_broadcast( gui->http );
18501852

1853+
gui->turbine_slots[ slot % FD_GUI_TURBINE_RECV_TIMESTAMPS ].slot = slot;
1854+
gui->turbine_slots[ slot % FD_GUI_TURBINE_RECV_TIMESTAMPS ].timestamp = tsorig;
1855+
1856+
ulong duration_sum = 0UL;
1857+
ulong slot_cnt = 0UL;
1858+
1859+
for( ulong i=0UL; i<FD_GUI_TURBINE_RECV_TIMESTAMPS; i++ ) {
1860+
fd_gui_turbine_slot_t * cur = &gui->turbine_slots[ i ];
1861+
fd_gui_turbine_slot_t * prev = &gui->turbine_slots[ (i+FD_GUI_TURBINE_RECV_TIMESTAMPS-1UL) % FD_GUI_TURBINE_RECV_TIMESTAMPS ];
1862+
if( FD_UNLIKELY( cur->slot==ULONG_MAX || prev->slot==ULONG_MAX || cur->slot!=prev->slot+1UL ) ) continue;
1863+
1864+
long slot_duration = cur->timestamp - prev->timestamp;
1865+
duration_sum += (ulong)fd_long_max( slot_duration, 0UL );
1866+
slot_cnt++;
1867+
}
1868+
1869+
if( FD_LIKELY( slot_cnt>0 ) ) {
1870+
gui->summary.estimated_slot_duration_nanos = (ulong)(duration_sum / slot_cnt);
1871+
fd_gui_printf_estimated_slot_duration_nanos( gui );
1872+
fd_http_server_ws_broadcast( gui->http );
1873+
}
1874+
18511875
if( FD_UNLIKELY( gui->summary.slot_caught_up==ULONG_MAX ) ) fd_gui_try_insert_catch_up_slot( gui->summary.catch_up_turbine, FD_GUI_TURBINE_CATCH_UP_HISTORY_SZ, &gui->summary.catch_up_turbine_sz, slot );
18521876
}
18531877

@@ -2037,7 +2061,7 @@ fd_gui_handle_reset_slot_legacy( fd_gui_t * gui,
20372061
}
20382062
}
20392063

2040-
if( FD_LIKELY( slot_cnt>0 )) {
2064+
if( FD_LIKELY( slot_cnt>0 ) ) {
20412065
gui->summary.estimated_slot_duration_nanos = (ulong)(duration_sum / slot_cnt);
20422066
fd_gui_printf_estimated_slot_duration_nanos( gui );
20432067
fd_http_server_ws_broadcast( gui->http );

src/disco/gui/fd_gui.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ struct fd_gui_validator_info {
135135
#define FD_GUI_TXN_FLAGS_FROM_BUNDLE ( 8U)
136136
#define FD_GUI_TXN_FLAGS_LANDED_IN_BLOCK (16U)
137137

138+
#define FD_GUI_TURBINE_RECV_TIMESTAMPS (750UL)
139+
138140
/* One use case for tracking ingress shred slot is to estimate when we
139141
have caught up to the tip of the blockchain. A naive approach would
140142
be to track the maximum seen slot.
@@ -324,6 +326,13 @@ struct fd_gui_leader_slot {
324326

325327
typedef struct fd_gui_leader_slot fd_gui_leader_slot_t;
326328

329+
struct fd_gui_turbine_slot {
330+
ulong slot;
331+
long timestamp;
332+
};
333+
334+
typedef struct fd_gui_turbine_slot fd_gui_turbine_slot_t;
335+
327336
struct fd_gui_slot_completed {
328337
ulong slot;
329338
long completed_time;
@@ -675,6 +684,9 @@ struct fd_gui {
675684

676685
fd_gui_slot_t slots[ FD_GUI_SLOTS_CNT ][ 1 ];
677686

687+
/* used for estimating slot duration */
688+
fd_gui_turbine_slot_t turbine_slots[ FD_GUI_TURBINE_RECV_TIMESTAMPS ];
689+
678690
fd_gui_leader_slot_t leader_slots[ FD_GUI_LEADER_CNT ][ 1 ];
679691
ulong leader_slots_cnt;
680692

0 commit comments

Comments
 (0)