Line data Source code
1 : #define _GNU_SOURCE
2 : #include "bench/bench.h"
3 : #include "../../shared/commands/configure/configure.h"
4 : #include "../../shared/commands/run/run.h"
5 : #include "../../../disco/topo/fd_topob.h"
6 : #include "../../../util/net/fd_ip4.h"
7 :
8 : #include <unistd.h>
9 :
10 : fd_topo_run_tile_t
11 : fdctl_tile_run( fd_topo_tile_t const * tile );
12 :
13 : void
14 : load_cmd_perm( args_t * args FD_PARAM_UNUSED,
15 : fd_cap_chk_t * chk,
16 0 : config_t const * config ) {
17 0 : args_t configure_args = {
18 0 : .configure.command = CONFIGURE_CMD_INIT,
19 0 : };
20 :
21 0 : for( ulong i=0UL; STAGES[ i ]; i++ ) {
22 0 : if( FD_UNLIKELY( !strcmp( STAGES[ i ]->name, "hugetlbfs" ) ) )
23 0 : configure_args.configure.stages[ 0 ] = STAGES[ i ];
24 0 : }
25 0 : configure_args.configure.stages[ 2 ] = NULL;
26 0 : configure_cmd_perm( &configure_args, chk, config );
27 0 : }
28 :
29 : void
30 : load_cmd_args( int * pargc,
31 : char *** pargv,
32 0 : args_t * args ) {
33 0 : const char * tpu_ip = fd_env_strip_cmdline_cstr ( pargc, pargv, "--tpu-ip", NULL, NULL );
34 0 : const char * rpc_ip = fd_env_strip_cmdline_cstr ( pargc, pargv, "--rpc-ip", NULL, NULL );
35 0 : const char * affinity = fd_env_strip_cmdline_cstr ( pargc, pargv, "--affinity", NULL, NULL );
36 :
37 0 : args->load.tpu_port = fd_env_strip_cmdline_ushort( pargc, pargv, "--tpu-port", NULL, 0 );
38 0 : args->load.rpc_port = fd_env_strip_cmdline_ushort( pargc, pargv, "--rpc-port", NULL, 0 );
39 0 : args->load.benchg = fd_env_strip_cmdline_ulong ( pargc, pargv, "--num-benchg", NULL, 0 );
40 0 : args->load.benchs = fd_env_strip_cmdline_ulong ( pargc, pargv, "--num-benchs", NULL, 0 );
41 0 : args->load.accounts = fd_env_strip_cmdline_ulong ( pargc, pargv, "--num-accounts", NULL, 0 );
42 0 : args->load.connections = fd_env_strip_cmdline_ulong ( pargc, pargv, "--connections", NULL, 0 );
43 0 : args->load.transaction_mode = fd_env_strip_cmdline_int ( pargc, pargv, "--transaction-mode", NULL, 0 );
44 0 : args->load.contending_fraction = fd_env_strip_cmdline_float( pargc, pargv, "--contending-fraction", NULL, 0.0f );
45 0 : args->load.cu_price_spread = fd_env_strip_cmdline_float( pargc, pargv, "--cu-price-spread", NULL, 0.0f );
46 :
47 0 : fd_cstr_fini( fd_cstr_append_cstr_safe( fd_cstr_init( args->load.affinity ), affinity, sizeof( args->load.affinity )-1UL ) );
48 :
49 0 : args->load.tpu_ip = 0;
50 0 : args->load.rpc_ip = 0;
51 0 : if( FD_LIKELY( tpu_ip ) ) {
52 0 : if( FD_UNLIKELY( !fd_cstr_to_ip4_addr( tpu_ip, &args->load.tpu_ip ) ) )
53 0 : FD_LOG_ERR(( "invalid --tpu-ip" ));
54 0 : }
55 0 : if( FD_LIKELY( rpc_ip ) ) {
56 0 : if( FD_UNLIKELY( !fd_cstr_to_ip4_addr( rpc_ip, &args->load.rpc_ip ) ) )
57 0 : FD_LOG_ERR(( "invalid --rpc-ip" ));
58 0 : }
59 :
60 0 : args->load.no_quic = fd_env_strip_cmdline_contains( pargc, pargv, "--no-quic" );
61 :
62 0 : }
63 :
64 : void
65 : load_cmd_fn( args_t * args,
66 0 : config_t * config ) {
67 :
68 : /* set defaults */
69 0 : if( FD_UNLIKELY( !args->load.tpu_ip ) )
70 0 : args->load.tpu_ip = config->net.ip_addr;
71 :
72 0 : if( FD_UNLIKELY( !args->load.rpc_ip ) )
73 0 : args->load.rpc_ip = config->net.ip_addr;
74 :
75 0 : if( FD_UNLIKELY( !args->load.tpu_port ) ) {
76 0 : args->load.tpu_port = fd_ushort_if( args->load.no_quic,
77 0 : config->tiles.quic.regular_transaction_listen_port,
78 0 : config->tiles.quic.quic_transaction_listen_port );
79 0 : }
80 :
81 0 : if( FD_UNLIKELY( !args->load.rpc_port ) ) {
82 0 : if( FD_UNLIKELY( config->is_firedancer ) ) {
83 0 : args->load.rpc_port = config->tiles.rpc.rpc_listen_port;
84 0 : } else {
85 0 : args->load.rpc_port = config->frankendancer.rpc.port;
86 0 : }
87 0 : }
88 0 : if( FD_UNLIKELY( !args->load.rpc_port ) )
89 0 : FD_LOG_ERR(( "Missing --rpc-port" ));
90 :
91 0 : if( FD_UNLIKELY( !strcmp( args->load.affinity, "" ) ) )
92 0 : fd_cstr_append_cstr_safe( args->load.affinity, config->development.bench.affinity, sizeof( args->load.affinity )-1UL );
93 :
94 0 : if( FD_UNLIKELY( !args->load.benchg ) )
95 0 : args->load.benchg = config->development.bench.benchg_tile_count;
96 :
97 0 : if( FD_UNLIKELY( !args->load.benchs ) )
98 0 : args->load.benchs = config->development.bench.benchs_tile_count;
99 :
100 0 : if( FD_UNLIKELY( !args->load.accounts ) )
101 0 : args->load.accounts = config->development.genesis.fund_initial_accounts;
102 :
103 0 : if( FD_UNLIKELY( !args->load.connections ) )
104 0 : args->load.connections = config->layout.quic_tile_count;
105 :
106 0 : fd_topo_t * topo = { fd_topob_new( &config->topo, config->name ) };
107 0 : topo->max_page_size = fd_cstr_to_shmem_page_sz( config->hugetlbfs.max_page_size );
108 0 : add_bench_topo( topo,
109 0 : args->load.affinity,
110 0 : args->load.benchg,
111 0 : args->load.benchs,
112 0 : args->load.accounts,
113 0 : args->load.transaction_mode,
114 0 : args->load.contending_fraction,
115 0 : args->load.cu_price_spread,
116 0 : args->load.connections,
117 0 : args->load.tpu_port,
118 0 : args->load.tpu_ip,
119 0 : args->load.rpc_port,
120 0 : args->load.rpc_ip,
121 0 : args->load.no_quic,
122 0 : 0 );
123 0 : config->topo = *topo;
124 :
125 0 : args_t configure_args = {
126 0 : .configure.command = CONFIGURE_CMD_INIT,
127 0 : };
128 0 : for( ulong i=0UL; STAGES[ i ]; i++ ) {
129 0 : if( FD_LIKELY( STAGES[ i ] ) ) {
130 0 : if( FD_UNLIKELY( !strcmp( STAGES[ i ]->name, "hugetlbfs" ) ) )
131 0 : configure_args.configure.stages[ 0 ] = STAGES[ i ];
132 0 : }
133 0 : }
134 0 : configure_args.configure.stages[ 1 ] = NULL;
135 0 : configure_cmd_fn( &configure_args, config );
136 :
137 0 : initialize_workspaces( config );
138 0 : initialize_stacks( config );
139 :
140 0 : FD_LOG_NOTICE(( "Running" ));
141 0 : FD_LOG_NOTICE(( " --tpu-ip " FD_IP4_ADDR_FMT, FD_IP4_ADDR_FMT_ARGS( args->load.tpu_ip ) ));
142 0 : FD_LOG_NOTICE(( " --tpu-port %d", args->load.tpu_port ));
143 0 : FD_LOG_NOTICE(( " --rpc-ip " FD_IP4_ADDR_FMT, FD_IP4_ADDR_FMT_ARGS( args->load.rpc_ip ) ));
144 0 : FD_LOG_NOTICE(( " --rpc-port %d", args->load.rpc_port ));
145 0 : FD_LOG_NOTICE(( " --affinity %s", args->load.affinity ));
146 0 : FD_LOG_NOTICE(( " --num-benchg %lu", args->load.benchg ));
147 0 : FD_LOG_NOTICE(( " --num-benchs %lu", args->load.benchs ));
148 0 : FD_LOG_NOTICE(( " --num-accounts %lu", args->load.accounts ));
149 0 : FD_LOG_NOTICE(( " --connections %lu", args->load.connections ));
150 0 : FD_LOG_NOTICE(( " --transaction-mode %d", args->load.transaction_mode ));
151 0 : FD_LOG_NOTICE(( " --contending-fraction %g", (double)args->load.contending_fraction ));
152 0 : FD_LOG_NOTICE(( " --cu-price-spread %g", (double)args->load.cu_price_spread ));
153 :
154 : /* FIXME allow running sandboxed/multiprocess */
155 0 : fd_topo_run_single_process( &config->topo, 0, config->uid, config->gid, fdctl_tile_run );
156 :
157 : /* Sleep parent thread forever, Ctrl+C will terminate. */
158 0 : for(;;) pause();
159 0 : }
160 :
161 : action_t fd_action_load = {
162 : .name = "load",
163 : .args = load_cmd_args,
164 : .perm = load_cmd_perm,
165 : .fn = load_cmd_fn,
166 : .description = "Load test an external validator"
167 : };
|