2323#include "../../../disco/metrics/fd_metrics.h"
2424#include "../../../util/pod/fd_pod_format.h"
2525#include "../../../discof/restore/utils/fd_ssmsg.h"
26+ #include "../../../discof/restore/utils/fd_ssctrl.h"
2627#include "../../../discof/tower/fd_tower_tile.h"
2728#include "../../../discof/reasm/fd_reasm.h"
2829#include "../../../discof/replay/fd_exec.h" /* FD_RUNTIME_PUBLIC_ACCOUNT_UPDATE_MSG_MTU */
@@ -38,6 +39,8 @@ static void
3839backtest_topo ( config_t * config ) {
3940 ulong exec_tile_cnt = config -> firedancer .layout .exec_tile_count ;
4041 ulong writer_tile_cnt = config -> firedancer .layout .writer_tile_count ;
42+ ulong snaplt_tile_cnt = config -> firedancer .layout .snaplt_tile_count ;
43+ int snaplt_disabled = config -> development .snapshots .disable_lthash_verification ;
4144
4245 int disable_snap_loader = !config -> gossip .entrypoints_cnt ;
4346 int solcap_enabled = strlen ( config -> capture .solcap_capture )> 0 ;
@@ -100,6 +103,14 @@ backtest_topo( config_t * config ) {
100103 snaprd_tile -> allow_shutdown = 1 ;
101104 snapdc_tile -> allow_shutdown = 1 ;
102105 snapin_tile -> allow_shutdown = 1 ;
106+
107+ if ( FD_LIKELY ( !snaplt_disabled ) ) {
108+ fd_topob_wksp ( topo , "snaplt" );
109+ for ( ulong i = 0UL ; i < snaplt_tile_cnt ; i ++ ) {
110+ fd_topo_tile_t * snaplt_tile = fd_topob_tile ( topo , "snaplt" , "snaplt" , "metric_in" , cpu_idx ++ , 0 , 0 );
111+ snaplt_tile -> allow_shutdown = 1 ;
112+ }
113+ }
103114 } else {
104115 fd_topob_wksp ( topo , "genesi" );
105116 fd_topob_tile ( topo , "genesi" , "genesi" , "metric_in" , cpu_idx ++ , 0 , 0 )-> allow_shutdown = 1 ;
@@ -128,7 +139,11 @@ backtest_topo( config_t * config ) {
128139 fd_topob_wksp ( topo , "snapdc_rd" );
129140 fd_topob_wksp ( topo , "snapin_rd" );
130141 fd_topob_wksp ( topo , "snap_out" );
131- fd_topob_wksp ( topo , "replay_manif" );
142+
143+ if ( FD_LIKELY ( !snaplt_disabled ) ) {
144+ fd_topob_wksp ( topo , "snapin_lt" );
145+ fd_topob_wksp ( topo , "snaplt_out" );
146+ }
132147 /* TODO: Should be depth of 1 or 2, not 4, but it causes backpressure
133148 from the replay tile parsing the manifest, remove when this is
134149 fixed. */
@@ -139,6 +154,11 @@ backtest_topo( config_t * config ) {
139154 fd_topob_link ( topo , "snapdc_rd" , "snapdc_rd" , 128UL , 0UL , 1UL );
140155 fd_topob_link ( topo , "snapin_rd" , "snapin_rd" , 128UL , 0UL , 1UL );
141156
157+ if ( FD_LIKELY ( !snaplt_disabled ) ) {
158+ fd_topob_link ( topo , "snapin_lt" , "snapin_lt" , 128UL , sizeof (fd_snapshot_existing_account_t ), 1UL );
159+ FOR (snaplt_tile_cnt ) fd_topob_link ( topo , "snaplt_out ", " snaplt_out ", 128UL, 2048UL, 1UL );
160+ }
161+
142162 fd_topob_tile_out ( topo , "snaprd" , 0UL , "snap_zstd" , 0UL );
143163 fd_topob_tile_in ( topo , "snapdc" , 0UL , "metric_in" , "snap_zstd" , 0UL , FD_TOPOB_RELIABLE , FD_TOPOB_POLLED );
144164 fd_topob_tile_out ( topo , "snapdc" , 0UL , "snap_stream" , 0UL );
@@ -150,6 +170,13 @@ backtest_topo( config_t * config ) {
150170 fd_topob_tile_out ( topo , "snapdc" , 0UL , "snapdc_rd" , 0UL );
151171 fd_topob_tile_in ( topo , "snaprd" , 0UL , "metric_in" , "snapin_rd" , 0UL , FD_TOPOB_RELIABLE , FD_TOPOB_POLLED );
152172 fd_topob_tile_out ( topo , "snapin" , 0UL , "snapin_rd" , 0UL );
173+
174+ if ( FD_LIKELY ( !snaplt_disabled ) ) {
175+ fd_topob_tile_out ( topo , "snapin" , 0UL , "snapin_lt" , 0UL );
176+ FOR (snaplt_tile_cnt ) fd_topob_tile_in ( topo , "snapin ", 0UL, " metric_in ", " snaplt_out ", i, FD_TOPOB_RELIABLE, FD_TOPOB_POLLED );
177+ FOR (snaplt_tile_cnt ) fd_topob_tile_in ( topo , "snaplt" , i , "metric_in" , "snapin_lt" , 0UL , FD_TOPOB_RELIABLE , FD_TOPOB_POLLED );
178+ FOR (snaplt_tile_cnt ) fd_topob_tile_out ( topo , "snaplt ", i, " snaplt_out ", i );
179+ }
153180 } else {
154181 fd_topob_wksp ( topo , "genesi_out" );
155182 fd_topob_link ( topo , "genesi_out" , "genesi_out" , 2UL , 10UL * 1024UL * 1024UL + 32UL + sizeof (fd_lthash_value_t ), 1UL );
@@ -302,14 +329,7 @@ backtest_topo( config_t * config ) {
302329 }
303330
304331 if ( FD_LIKELY ( !disable_snap_loader ) ) {
305- /* Replay decoded manifest dcache topo obj */
306- fd_topo_obj_t * replay_manifest_dcache = fd_topob_obj ( topo , "dcache" , "replay_manif" );
307- fd_pod_insertf_ulong ( topo -> props , 2UL << 30UL , "obj.%lu.data_sz" , replay_manifest_dcache -> id );
308- fd_pod_insert_ulong ( topo -> props , "manifest_dcache" , replay_manifest_dcache -> id );
309-
310332 fd_topob_tile_uses ( topo , snapin_tile , funk_obj , FD_SHMEM_JOIN_MODE_READ_WRITE );
311- fd_topob_tile_uses ( topo , snapin_tile , replay_manifest_dcache , FD_SHMEM_JOIN_MODE_READ_WRITE );
312- fd_topob_tile_uses ( topo , replay_tile , replay_manifest_dcache , FD_SHMEM_JOIN_MODE_READ_ONLY );
313333 }
314334
315335 for ( ulong i = 0UL ; i < topo -> tile_cnt ; i ++ ) {
@@ -394,23 +414,51 @@ backtest_cmd_fn( args_t * args FD_PARAM_UNUSED,
394414 ulong volatile * const snapdc_metrics = fd_metrics_tile ( snapdc_tile -> metrics );
395415 ulong volatile * const snapin_metrics = fd_metrics_tile ( snapin_tile -> metrics );
396416
417+ ulong volatile * snaplt_metrics [ FD_MAX_SNAPLT_TILES ];
418+ ulong snaplt_tile_cnt = fd_topo_tile_name_cnt ( topo , "snaplt" );
419+
420+ for ( ulong i = 0UL ; i < snaplt_tile_cnt ; i ++ ) {
421+ ulong snaplt_tile_idx = fd_topo_find_tile ( topo , "snaplt" , i );
422+ FD_TEST ( snaplt_tile_idx != ULONG_MAX );
423+ fd_topo_tile_t * snaplt_tile = & topo -> tiles [ snaplt_tile_idx ];
424+ snaplt_metrics [ i ] = fd_metrics_tile ( snaplt_tile -> metrics );
425+ }
426+
397427 ulong total_off_old = 0UL ;
398428 ulong snaprd_backp_old = 0UL ;
399429 ulong snaprd_wait_old = 0UL ;
400430 ulong snapdc_backp_old = 0UL ;
401431 ulong snapdc_wait_old = 0UL ;
402432 ulong snapin_backp_old = 0UL ;
403433 ulong snapin_wait_old = 0UL ;
434+ ulong snaplt_backp_old = 0UL ;
435+ ulong snaplt_wait_old = 0UL ;
404436 ulong acc_cnt_old = 0UL ;
405437 sleep ( 1 );
406- puts ( "-------------backp=(snaprd,snapdc,snapin) busy=(snaprd,snapdc,snapin)---------------" );
438+ puts ( "" );
439+ puts ( "Columns:" );
440+ puts ( "- bw: Uncompressed bandwidth" );
441+ puts ( "- backp: Backpressured by downstream tile" );
442+ puts ( "- stall: Waiting on upstream tile" );
443+ puts ( "- acc: Number of accounts" );
444+ puts ( "" );
445+ puts ( "-------------backp=(snaprd,snapdc,snapin,snaplt) busy=(snaprd,snapdc,snapin,snaplt)---------------" );
407446 long next = start + 1000L * 1000L * 1000L ;
408447 for (;;) {
409448 ulong snaprd_status = FD_VOLATILE_CONST ( snaprd_metrics [ MIDX ( GAUGE , TILE , STATUS ) ] );
410449 ulong snapdc_status = FD_VOLATILE_CONST ( snapdc_metrics [ MIDX ( GAUGE , TILE , STATUS ) ] );
411450 ulong snapin_status = FD_VOLATILE_CONST ( snapin_metrics [ MIDX ( GAUGE , TILE , STATUS ) ] );
451+ ulong snaplt_status = ULONG_MAX ;
452+
453+ ulong snaplt_status_sum = 0UL ;
454+ for ( ulong i = 0UL ; i < snaplt_tile_cnt ; i ++ ) {
455+ ulong snaplt_status = FD_VOLATILE_CONST ( snaplt_metrics [ i ][ MIDX ( GAUGE , TILE , STATUS ) ] );
456+ snaplt_status_sum += snaplt_status ;
457+ }
458+ if ( FD_UNLIKELY ( snaplt_status_sum == 2UL * snaplt_tile_cnt ) ) snaplt_status = 2UL ;
459+ else snaplt_status = snaplt_tile_cnt > 0UL ? 1UL : 2UL ;
412460
413- if ( FD_UNLIKELY ( snaprd_status == 2UL && snapdc_status == 2UL && snapin_status == 2UL ) ) break ;
461+ if ( FD_UNLIKELY ( snaprd_status == 2UL && snapdc_status == 2UL && snapin_status == 2UL && snaplt_status == 2UL ) ) break ;
414462
415463 long cur = fd_log_wallclock ();
416464 if ( FD_UNLIKELY ( cur < next ) ) {
@@ -430,16 +478,31 @@ backtest_cmd_fn( args_t * args FD_PARAM_UNUSED,
430478 ulong snapin_backp = snapin_metrics [ MIDX ( COUNTER , TILE , REGIME_DURATION_NANOS_BACKPRESSURE_PREFRAG ) ];
431479 ulong snapin_wait = snapin_metrics [ MIDX ( COUNTER , TILE , REGIME_DURATION_NANOS_CAUGHT_UP_PREFRAG ) ] +
432480 snapin_metrics [ MIDX ( COUNTER , TILE , REGIME_DURATION_NANOS_CAUGHT_UP_POSTFRAG ) ] + snapin_backp ;
481+ ulong snaplt_backp = 0UL ;
482+ ulong snaplt_wait = 0UL ;
433483
434- ulong acc_cnt = snapin_metrics [ MIDX ( GAUGE , SNAPIN , ACCOUNTS_INSERTED ) ];
435- printf ( "bw=%4.0f MB/s backp=(%3.0f%%,%3.0f%%,%3.0f%%) busy=(%3.0f%%,%3.0f%%,%3.0f%%) acc=%3.1f M/s\n" ,
484+ for ( ulong i = 0UL ; i < snaplt_tile_cnt ; i ++ ) {
485+ snaplt_backp += snaplt_metrics [ i ][ MIDX ( COUNTER , TILE , REGIME_DURATION_NANOS_BACKPRESSURE_PREFRAG ) ];
486+ }
487+ for ( ulong i = 0UL ; i < snaplt_tile_cnt ; i ++ ) {
488+ snaplt_wait += snaplt_metrics [ i ][ MIDX ( COUNTER , TILE , REGIME_DURATION_NANOS_CAUGHT_UP_PREFRAG ) ] +
489+ snaplt_metrics [ i ][ MIDX ( COUNTER , TILE , REGIME_DURATION_NANOS_CAUGHT_UP_POSTFRAG ) ] + snaplt_backp ;
490+ }
491+
492+ double snaplt_backp_val = snaplt_tile_cnt ? ((double )(snaplt_backp - snaplt_backp_old )* ns_per_tick )/1e7 /(double )snaplt_tile_cnt : 0.0 ;
493+ double snaplt_busy_val = snaplt_tile_cnt ? 100 - (((double )(snaplt_wait - snaplt_wait_old )* ns_per_tick )/1e7 /(double )snaplt_tile_cnt ) : 0.0 ;
494+
495+ ulong acc_cnt = snapin_metrics [ MIDX ( GAUGE , SNAPIN , ACCOUNTS_INSERTED ) ];
496+ printf ( "bw=%4.0f MB/s backp=(%3.0f%%,%3.0f%%,%3.0f%%,%3.0f%%) busy=(%3.0f%%,%3.0f%%,%3.0f%%,%3.0f%%) acc=%3.1f M/s\n" ,
436497 (double )( total_off - total_off_old )/1e6 ,
437498 ( (double )( snaprd_backp - snaprd_backp_old )* ns_per_tick )/1e7 ,
438499 ( (double )( snapdc_backp - snapdc_backp_old )* ns_per_tick )/1e7 ,
439500 ( (double )( snapin_backp - snapin_backp_old )* ns_per_tick )/1e7 ,
501+ snaplt_backp_val ,
440502 100 - ( ( (double )( snaprd_wait - snaprd_wait_old )* ns_per_tick )/1e7 ),
441503 100 - ( ( (double )( snapdc_wait - snapdc_wait_old )* ns_per_tick )/1e7 ),
442504 100 - ( ( (double )( snapin_wait - snapin_wait_old )* ns_per_tick )/1e7 ),
505+ snaplt_busy_val ,
443506 (double )( acc_cnt - acc_cnt_old )/1e6 );
444507 fflush ( stdout );
445508 total_off_old = total_off ;
@@ -449,12 +512,13 @@ backtest_cmd_fn( args_t * args FD_PARAM_UNUSED,
449512 snapdc_wait_old = snapdc_wait ;
450513 snapin_backp_old = snapin_backp ;
451514 snapin_wait_old = snapin_wait ;
515+ snaplt_backp_old = snaplt_backp ;
516+ snaplt_wait_old = snaplt_wait ;
452517 acc_cnt_old = acc_cnt ;
453518
454519 next += 1000L * 1000L * 1000L ;
455520 }
456521 }
457-
458522 for (;;) pause ();
459523}
460524
0 commit comments