Line data Source code
1 : #include "../platform/fd_config_extract.h"
2 : #include "../platform/fd_config_macros.c"
3 : #include "fd_config_private.h"
4 :
5 : static void
6 : fd_config_check_configf( fd_config_t * config,
7 0 : fd_configf_t * config_f ) {
8 0 : (void)config_f;
9 0 : if( FD_UNLIKELY( strlen( config->paths.snapshots )>PATH_MAX-1UL ) ) {
10 0 : FD_LOG_ERR(( "[config->paths.snapshots] is too long (max %lu)", PATH_MAX-1UL ));
11 0 : }
12 0 : if( FD_UNLIKELY( config->paths.snapshots[ 0 ]!='\0' && config->paths.snapshots[ 0 ]!='/' ) ) {
13 0 : FD_LOG_ERR(( "[config->paths.snapshots] must be an absolute path and hence start with a '/'"));
14 0 : }
15 0 : }
16 :
17 : fd_configh_t *
18 : fd_config_extract_podh( uchar * pod,
19 12 : fd_configh_t * config ) {
20 12 : CFG_POP ( cstr, dynamic_port_range );
21 :
22 12 : CFG_POP ( cstr, reporting.solana_metrics_config );
23 :
24 12 : CFG_POP ( cstr, layout.agave_affinity );
25 12 : CFG_POP ( uint, layout.agave_unified_scheduler_handler_threads );
26 12 : CFG_POP ( uint, layout.resolh_tile_count );
27 12 : CFG_POP ( uint, layout.bank_tile_count );
28 :
29 12 : CFG_POP1 ( cstr, ledger.accounts_path, paths.accounts_path );
30 12 : CFG_POP1_ARRAY( cstr, consensus.authorized_voter_paths, paths.authorized_voter_paths );
31 :
32 12 : CFG_POP ( uint, ledger.limit_size );
33 12 : CFG_POP_ARRAY( cstr, ledger.account_indexes );
34 12 : CFG_POP_ARRAY( cstr, ledger.account_index_include_keys );
35 12 : CFG_POP_ARRAY( cstr, ledger.account_index_exclude_keys );
36 12 : CFG_POP ( bool, ledger.enable_accounts_disk_index );
37 12 : CFG_POP ( cstr, ledger.accounts_index_path );
38 12 : CFG_POP ( cstr, ledger.accounts_hash_cache_path );
39 12 : CFG_POP ( bool, ledger.require_tower );
40 12 : CFG_POP ( cstr, ledger.snapshot_archive_format );
41 :
42 12 : CFG_POP ( bool, gossip.port_check );
43 :
44 12 : CFG_POP ( bool, consensus.snapshot_fetch );
45 12 : CFG_POP ( bool, consensus.genesis_fetch );
46 12 : CFG_POP ( bool, consensus.poh_speed_test );
47 12 : CFG_POP ( uint, consensus.wait_for_supermajority_at_slot );
48 12 : CFG_POP ( cstr, consensus.expected_bank_hash );
49 12 : CFG_POP ( bool, consensus.wait_for_vote_to_start_leader );
50 12 : CFG_POP_ARRAY( uint, consensus.hard_fork_at_slots );
51 12 : CFG_POP_ARRAY( cstr, consensus.known_validators );
52 12 : CFG_POP ( bool, consensus.os_network_limits_test );
53 :
54 12 : CFG_POP ( ushort, rpc.port );
55 12 : CFG_POP ( bool, rpc.extended_tx_metadata_storage );
56 12 : CFG_POP ( bool, rpc.full_api );
57 12 : CFG_POP ( bool, rpc.private );
58 12 : CFG_POP ( cstr, rpc.bind_address );
59 12 : CFG_POP ( cstr, rpc.public_address );
60 12 : CFG_POP ( bool, rpc.transaction_history );
61 12 : CFG_POP ( bool, rpc.only_known );
62 12 : CFG_POP ( bool, rpc.pubsub_enable_block_subscription );
63 12 : CFG_POP ( bool, rpc.pubsub_enable_vote_subscription );
64 12 : CFG_POP ( bool, rpc.bigtable_ledger_storage );
65 :
66 12 : CFG_POP ( bool, snapshots.enabled );
67 12 : CFG_POP ( bool, snapshots.incremental_snapshots );
68 12 : CFG_POP ( uint, snapshots.full_snapshot_interval_slots );
69 12 : CFG_POP ( uint, snapshots.incremental_snapshot_interval_slots );
70 12 : CFG_POP ( uint, snapshots.minimum_snapshot_download_speed );
71 12 : CFG_POP ( uint, snapshots.maximum_snapshot_download_abort );
72 12 : CFG_POP ( uint, snapshots.maximum_full_snapshots_to_retain );
73 12 : CFG_POP ( uint, snapshots.maximum_incremental_snapshots_to_retain);
74 12 : CFG_POP ( cstr, snapshots.path );
75 12 : CFG_POP ( cstr, snapshots.incremental_path );
76 :
77 12 : return config;
78 12 : }
79 :
80 : fd_configf_t *
81 : fd_config_extract_podf( uchar * pod,
82 0 : fd_configf_t * config ) {
83 0 : CFG_POP_ARRAY( cstr, paths.authorized_voter_paths );
84 :
85 0 : CFG_POP ( cstr, gossip.host );
86 :
87 0 : CFG_POP ( uint, layout.execrp_tile_count );
88 0 : CFG_POP ( uint, layout.sign_tile_count );
89 0 : CFG_POP ( uint, layout.resolv_tile_count );
90 0 : CFG_POP ( uint, layout.execle_tile_count );
91 0 : CFG_POP ( uint, layout.gossvf_tile_count );
92 0 : CFG_POP ( uint, layout.snapshot_hash_tile_count );
93 0 : CFG_POP ( uint, layout.snapwr_tile_count );
94 :
95 0 : CFG_POP ( ulong, funk.max_account_records );
96 0 : CFG_POP ( ulong, funk.heap_size_gib );
97 :
98 0 : CFG_POP ( bool, vinyl.enabled );
99 0 : CFG_POP ( ulong, vinyl.max_account_records );
100 0 : CFG_POP ( ulong, vinyl.file_size_gib );
101 0 : CFG_POP ( ulong, vinyl.max_cache_entries );
102 0 : CFG_POP ( ulong, vinyl.cache_size_gib );
103 0 : CFG_POP ( ulong, vinyl.write_delay_slots );
104 0 : CFG_POP ( bool, vinyl.io_uring.enabled );
105 0 : CFG_POP ( uint, vinyl.io_uring.queue_depth );
106 :
107 0 : CFG_POP ( ulong, runtime.max_live_slots );
108 0 : CFG_POP ( ulong, runtime.max_account_cnt );
109 0 : CFG_POP ( ulong, runtime.max_fork_width );
110 :
111 0 : CFG_POP ( ulong, runtime.program_cache.heap_size_mib );
112 0 : CFG_POP ( ulong, runtime.program_cache.mean_cache_entry_size );
113 :
114 0 : CFG_POP ( uint, snapshots.sources.max_local_full_effective_age );
115 0 : CFG_POP ( uint, snapshots.sources.max_local_incremental_age );
116 0 : CFG_POP ( bool, snapshots.sources.gossip.allow_any );
117 0 : CFG_POP_ARRAY( cstr, snapshots.sources.gossip.allow_list );
118 0 : CFG_POP_ARRAY( cstr, snapshots.sources.gossip.block_list );
119 0 : CFG_POP_ARRAY( cstr, snapshots.sources.servers );
120 0 : CFG_POP ( bool, snapshots.incremental_snapshots );
121 0 : CFG_POP ( bool, snapshots.genesis_download );
122 0 : CFG_POP ( uint, snapshots.max_full_snapshots_to_keep );
123 0 : CFG_POP ( uint, snapshots.max_incremental_snapshots_to_keep );
124 0 : CFG_POP ( uint, snapshots.full_effective_age_cancel_threshold );
125 0 : CFG_POP ( uint, snapshots.max_retry_abort );
126 0 : CFG_POP ( uint, snapshots.min_download_speed_mibs );
127 :
128 0 : CFG_POP ( bool, development.hard_fork_fatal );
129 :
130 0 : return config;
131 0 : }
132 :
133 : fd_config_t *
134 : fd_config_extract_pod( uchar * pod,
135 12 : fd_config_t * config ) {
136 12 : CFG_POP ( cstr, name );
137 12 : CFG_POP ( cstr, user );
138 :
139 12 : CFG_POP ( bool, telemetry );
140 :
141 12 : CFG_POP ( cstr, log.path );
142 12 : CFG_POP ( cstr, log.colorize );
143 12 : CFG_POP ( cstr, log.level_logfile );
144 12 : CFG_POP ( cstr, log.level_stderr );
145 12 : CFG_POP ( cstr, log.level_flush );
146 :
147 12 : if( FD_UNLIKELY( config->is_firedancer ) ) {
148 0 : CFG_POP ( cstr, paths.base );
149 0 : CFG_POP ( cstr, paths.identity_key );
150 0 : CFG_POP ( cstr, paths.vote_account );
151 0 : CFG_POP ( cstr, paths.snapshots );
152 0 : CFG_POP ( cstr, paths.genesis );
153 0 : CFG_POP ( cstr, paths.accounts );
154 12 : } else {
155 12 : CFG_POP1 ( cstr, scratch_directory, paths.base );
156 12 : CFG_POP1 ( cstr, ledger.path, frankendancer.paths.ledger );
157 12 : CFG_POP1 ( cstr, consensus.identity_path, paths.identity_key );
158 12 : CFG_POP1 ( cstr, consensus.vote_account_path, paths.vote_account );
159 12 : }
160 :
161 12 : CFG_POP_ARRAY( cstr, gossip.entrypoints );
162 12 : CFG_POP ( ushort, gossip.port );
163 :
164 12 : CFG_POP ( ushort, consensus.expected_shred_version );
165 12 : CFG_POP ( cstr, consensus.expected_genesis_hash );
166 12 : CFG_POP ( bool, consensus.wait_for_vote_to_start_leader );
167 :
168 12 : CFG_POP ( cstr, layout.affinity );
169 12 : CFG_POP ( cstr, layout.blocklist_cores );
170 12 : CFG_POP ( uint, layout.net_tile_count );
171 12 : CFG_POP ( uint, layout.quic_tile_count );
172 12 : CFG_POP ( uint, layout.verify_tile_count );
173 12 : CFG_POP ( uint, layout.shred_tile_count );
174 :
175 12 : CFG_POP ( cstr, hugetlbfs.mount_path );
176 12 : CFG_POP ( cstr, hugetlbfs.max_page_size );
177 12 : CFG_POP ( ulong, hugetlbfs.gigantic_page_threshold_mib );
178 :
179 12 : CFG_POP ( cstr, net.interface );
180 12 : CFG_POP ( cstr, net.bind_address );
181 12 : CFG_POP ( cstr, net.provider );
182 12 : CFG_POP ( uint, net.ingress_buffer_size );
183 12 : CFG_POP ( cstr, net.xdp.xdp_mode );
184 12 : CFG_POP ( bool, net.xdp.xdp_zero_copy );
185 12 : CFG_POP ( uint, net.xdp.xdp_rx_queue_size );
186 12 : CFG_POP ( uint, net.xdp.xdp_tx_queue_size );
187 12 : CFG_POP ( uint, net.xdp.flush_timeout_micros );
188 12 : CFG_POP ( cstr, net.xdp.rss_queue_mode );
189 12 : CFG_POP ( bool, net.xdp.native_bond );
190 12 : CFG_POP ( uint, net.socket.receive_buffer_size );
191 12 : CFG_POP ( uint, net.socket.send_buffer_size );
192 :
193 12 : CFG_POP ( ulong, tiles.netlink.max_routes );
194 12 : CFG_POP ( ulong, tiles.netlink.max_peer_routes );
195 12 : CFG_POP ( ulong, tiles.netlink.max_neighbors );
196 :
197 12 : CFG_POP ( ulong, tiles.gossip.max_entries );
198 :
199 12 : CFG_POP ( ushort, tiles.quic.regular_transaction_listen_port );
200 12 : CFG_POP ( ushort, tiles.quic.quic_transaction_listen_port );
201 12 : CFG_POP ( uint, tiles.quic.txn_reassembly_count );
202 12 : CFG_POP ( uint, tiles.quic.max_concurrent_connections );
203 12 : CFG_POP ( uint, tiles.quic.max_concurrent_handshakes );
204 12 : CFG_POP ( uint, tiles.quic.idle_timeout_millis );
205 12 : CFG_POP ( uint, tiles.quic.ack_delay_millis );
206 12 : CFG_POP ( bool, tiles.quic.retry );
207 12 : CFG_POP ( cstr, tiles.quic.ssl_key_log_file );
208 :
209 12 : CFG_POP ( uint, tiles.verify.signature_cache_size );
210 12 : CFG_POP ( uint, tiles.verify.receive_buffer_size );
211 12 : CFG_POP ( uint, tiles.verify.mtu );
212 :
213 12 : CFG_POP ( uint, tiles.dedup.signature_cache_size );
214 :
215 12 : CFG_POP ( bool, tiles.bundle.enabled );
216 12 : CFG_POP ( cstr, tiles.bundle.url );
217 12 : CFG_POP ( cstr, tiles.bundle.tls_domain_name );
218 12 : CFG_POP ( cstr, tiles.bundle.tip_distribution_program_addr );
219 12 : CFG_POP ( cstr, tiles.bundle.tip_payment_program_addr );
220 12 : CFG_POP ( cstr, tiles.bundle.tip_distribution_authority );
221 12 : CFG_POP ( uint, tiles.bundle.commission_bps );
222 12 : CFG_POP ( ulong, tiles.bundle.keepalive_interval_millis );
223 12 : CFG_POP ( bool, tiles.bundle.tls_cert_verify );
224 :
225 12 : CFG_POP ( uint, tiles.pack.max_pending_transactions );
226 12 : CFG_POP ( bool, tiles.pack.use_consumed_cus );
227 12 : CFG_POP ( cstr, tiles.pack.schedule_strategy );
228 :
229 12 : CFG_POP ( bool, tiles.pohh.lagged_consecutive_leader_start );
230 :
231 12 : CFG_POP ( uint, tiles.shred.max_pending_shred_sets );
232 12 : CFG_POP ( ushort, tiles.shred.shred_listen_port );
233 12 : CFG_POP_ARRAY( cstr, tiles.shred.additional_shred_destinations_retransmit );
234 12 : CFG_POP_ARRAY( cstr, tiles.shred.additional_shred_destinations_leader );
235 :
236 12 : CFG_POP ( cstr, tiles.metric.prometheus_listen_address );
237 12 : CFG_POP ( ushort, tiles.metric.prometheus_listen_port );
238 :
239 12 : CFG_POP ( cstr, tiles.event.url );
240 :
241 12 : CFG_POP ( bool, tiles.gui.enabled );
242 12 : CFG_POP ( cstr, tiles.gui.gui_listen_address );
243 12 : CFG_POP ( ushort, tiles.gui.gui_listen_port );
244 12 : CFG_POP ( ulong, tiles.gui.max_http_connections );
245 12 : CFG_POP ( ulong, tiles.gui.max_websocket_connections );
246 12 : CFG_POP ( ulong, tiles.gui.max_http_request_length );
247 12 : CFG_POP ( ulong, tiles.gui.send_buffer_size_mb );
248 :
249 12 : CFG_POP ( bool, tiles.rpc.enabled );
250 12 : CFG_POP ( cstr, tiles.rpc.rpc_listen_address );
251 12 : CFG_POP ( ushort, tiles.rpc.rpc_listen_port );
252 12 : CFG_POP ( ulong, tiles.rpc.max_http_connections );
253 12 : CFG_POP ( ulong, tiles.rpc.max_http_request_length );
254 12 : CFG_POP ( ulong, tiles.rpc.send_buffer_size_mb );
255 :
256 12 : CFG_POP ( ushort, tiles.repair.repair_intake_listen_port );
257 12 : CFG_POP ( ushort, tiles.repair.repair_serve_listen_port );
258 12 : CFG_POP ( ulong, tiles.repair.slot_max );
259 :
260 12 : CFG_POP ( ulong, capture.capture_start_slot );
261 12 : CFG_POP ( cstr, capture.solcap_capture );
262 12 : CFG_POP ( bool, capture.recent_only );
263 12 : CFG_POP ( ulong, capture.recent_slots_per_file );
264 12 : CFG_POP ( cstr, capture.dump_proto_dir );
265 12 : CFG_POP ( cstr, capture.dump_syscall_name_filter );
266 12 : CFG_POP ( cstr, capture.dump_instr_program_id_filter );
267 12 : CFG_POP ( bool, capture.dump_elf_to_pb );
268 12 : CFG_POP ( bool, capture.dump_syscall_to_pb );
269 12 : CFG_POP ( bool, capture.dump_instr_to_pb );
270 12 : CFG_POP ( bool, capture.dump_txn_to_pb );
271 12 : CFG_POP ( bool, capture.dump_block_to_pb );
272 :
273 12 : CFG_POP_ARRAY( cstr, tiles.replay.enable_features );
274 :
275 12 : CFG_POP ( ushort, tiles.txsend.txsend_src_port );
276 :
277 12 : CFG_POP ( ulong, tiles.tower.max_vote_lookahead );
278 12 : CFG_POP ( bool, tiles.tower.debug_logging );
279 :
280 12 : CFG_POP ( bool, tiles.archiver.enabled );
281 12 : CFG_POP ( bool, tiles.archiver.ingest_dead_slots );
282 12 : CFG_POP ( ulong, tiles.archiver.end_slot );
283 12 : CFG_POP ( ulong, tiles.archiver.root_distance );
284 12 : CFG_POP ( cstr, tiles.archiver.rocksdb_path );
285 12 : CFG_POP ( cstr, tiles.archiver.shredcap_path );
286 12 : CFG_POP ( cstr, tiles.archiver.ingest_mode );
287 :
288 12 : if( FD_UNLIKELY( config->is_firedancer ) ) {
289 0 : CFG_POP ( bool, tiles.shredcap.enabled );
290 0 : CFG_POP ( cstr, tiles.shredcap.folder_path );
291 0 : CFG_POP ( ulong, tiles.shredcap.write_buffer_size );
292 0 : }
293 :
294 12 : CFG_POP ( bool, development.sandbox );
295 12 : CFG_POP ( bool, development.no_clone );
296 12 : CFG_POP ( cstr, development.core_dump );
297 12 : CFG_POP ( bool, development.no_agave );
298 12 : CFG_POP ( bool, development.bootstrap );
299 :
300 12 : CFG_POP ( bool, development.netns.enabled );
301 12 : CFG_POP ( cstr, development.netns.interface0 );
302 12 : CFG_POP ( cstr, development.netns.interface0_mac );
303 12 : CFG_POP ( cstr, development.netns.interface0_addr );
304 12 : CFG_POP ( cstr, development.netns.interface1 );
305 12 : CFG_POP ( cstr, development.netns.interface1_mac );
306 12 : CFG_POP ( cstr, development.netns.interface1_addr );
307 :
308 12 : CFG_POP ( bool, development.gossip.allow_private_address );
309 :
310 12 : CFG_POP ( ulong, development.genesis.hashes_per_tick );
311 12 : CFG_POP ( ulong, development.genesis.target_tick_duration_micros );
312 12 : CFG_POP ( ulong, development.genesis.ticks_per_slot );
313 12 : CFG_POP ( ulong, development.genesis.fund_initial_accounts );
314 12 : CFG_POP ( ulong, development.genesis.fund_initial_amount_lamports );
315 12 : CFG_POP ( ulong, development.genesis.vote_account_stake_lamports );
316 12 : CFG_POP ( bool, development.genesis.warmup_epochs );
317 :
318 12 : CFG_POP ( uint, development.bench.benchg_tile_count );
319 12 : CFG_POP ( uint, development.bench.benchs_tile_count );
320 12 : CFG_POP ( cstr, development.bench.affinity );
321 12 : CFG_POP ( bool, development.bench.larger_max_cost_per_block );
322 12 : CFG_POP ( bool, development.bench.larger_shred_limits_per_block );
323 12 : CFG_POP ( ulong, development.bench.disable_blockstore_from_slot );
324 12 : CFG_POP ( bool, development.bench.disable_status_cache );
325 :
326 12 : CFG_POP ( cstr, development.bundle.ssl_key_log_file );
327 12 : CFG_POP ( uint, development.bundle.buffer_size_kib );
328 12 : CFG_POP ( uint, development.bundle.ssl_heap_size_mib );
329 :
330 12 : CFG_POP ( bool, development.event.report_shreds );
331 12 : CFG_POP ( bool, development.event.report_transactions );
332 :
333 12 : CFG_POP ( cstr, development.pktgen.affinity );
334 12 : CFG_POP ( cstr, development.pktgen.fake_dst_ip );
335 :
336 12 : CFG_POP ( cstr, development.udpecho.affinity );
337 12 : CFG_POP ( bool, development.snapshots.disable_lthash_verification );
338 :
339 12 : if( FD_UNLIKELY( !config->is_firedancer ) ) {
340 12 : CFG_POP ( bool, development.gui.websocket_compression );
341 12 : }
342 12 : CFG_POP ( cstr, development.gui.frontend_release_channel );
343 :
344 12 : if( FD_UNLIKELY( config->is_firedancer ) ) {
345 0 : if( FD_UNLIKELY( !fd_config_extract_podf( pod, &config->firedancer ) ) ) return NULL;
346 0 : fd_config_check_configf( config, &config->firedancer );
347 12 : } else {
348 12 : if( FD_UNLIKELY( !fd_config_extract_podh( pod, &config->frankendancer ) ) ) return NULL;
349 12 : }
350 :
351 : /* Renamed config options */
352 :
353 12 : # define CFG_RENAMED( old_path, new_path ) \
354 144 : do { \
355 144 : char const * key = #old_path; \
356 144 : fd_pod_info_t info[1]; \
357 144 : if( FD_UNLIKELY( !fd_pod_query( pod, key, info ) ) ) { \
358 0 : FD_LOG_WARNING(( "Config option `%s` was renamed to `%s`. " \
359 0 : "Please update your config file.", \
360 0 : #old_path, #new_path )); \
361 0 : return NULL; \
362 0 : } \
363 144 : (void)config->new_path; /* assert new path exists */ \
364 144 : } while(0)
365 :
366 12 : CFG_RENAMED( tiles.net.interface, net.interface );
367 12 : CFG_RENAMED( tiles.net.bind_address, net.bind_address );
368 12 : CFG_RENAMED( tiles.net.provider, net.provider );
369 12 : CFG_RENAMED( tiles.net.xdp_mode, net.xdp.xdp_mode );
370 12 : CFG_RENAMED( tiles.net.xdp_zero_copy, net.xdp.xdp_zero_copy );
371 12 : CFG_RENAMED( tiles.net.xdp_rx_queue_size, net.xdp.xdp_rx_queue_size );
372 12 : CFG_RENAMED( tiles.net.xdp_tx_queue_size, net.xdp.xdp_tx_queue_size );
373 12 : CFG_RENAMED( tiles.net.flush_timeout_micros, net.xdp.flush_timeout_micros );
374 12 : CFG_RENAMED( tiles.net.send_buffer_size, net.ingress_buffer_size );
375 :
376 12 : CFG_RENAMED( development.net.provider, net.provider );
377 12 : CFG_RENAMED( development.net.sock_receive_buffer_size, net.socket.receive_buffer_size );
378 12 : CFG_RENAMED( development.net.sock_send_buffer_size, net.socket.send_buffer_size );
379 :
380 12 : # undef CFG_RENAMED
381 :
382 12 : if( FD_UNLIKELY( !fdctl_pod_find_leftover( pod ) ) ) return NULL;
383 9 : return config;
384 12 : }
385 :
386 : #undef CFG_POP
387 : #undef CFG_ARRAY
|