From 5743c381d9d966856dd8b3b979c9eaa8a5ad12e6 Mon Sep 17 00:00:00 2001 From: Richard Patel Date: Mon, 11 Aug 2025 19:49:32 +0000 Subject: [PATCH] Remove valloc --- .../codeql/nightly/SurelyWrongConstPure.ql | 3 +- src/app/ledger/main.c | 24 +- src/choreo/forks/fd_forks.c | 3 +- src/choreo/voter/test_voter.c | 2 - src/discof/backtest/fd_backtest_tile.c | 26 +- src/discof/consensus/test_gossip_echo_vote.c | 609 ------------------ .../runtime/context/fd_exec_slot_ctx.h | 2 - src/flamenco/runtime/fd_rocksdb.c | 18 +- src/flamenco/runtime/fd_rocksdb.h | 12 +- src/flamenco/runtime/fd_runtime.h | 4 +- .../runtime/tests/test_exec_sol_compat.c | 1 - src/flamenco/types/fd_bincode.h | 1 - src/funk/fd_funk_base.h | 1 - src/funk/fd_funk_rec.c | 37 -- src/funk/fd_funk_rec.h | 15 - src/util/alloc/fd_alloc.c | 22 - src/util/alloc/fd_alloc.h | 14 - src/util/fd_util.h | 5 +- src/util/scratch/fd_scratch.c | 22 - src/util/scratch/fd_scratch.h | 16 - src/util/spad/fd_spad.c | 21 - src/util/spad/fd_spad.h | 13 - src/util/valloc/Local.mk | 2 - src/util/valloc/fd_valloc.c | 95 --- src/util/valloc/fd_valloc.h | 75 --- 25 files changed, 27 insertions(+), 1016 deletions(-) delete mode 100644 src/discof/consensus/test_gossip_echo_vote.c delete mode 100644 src/util/valloc/Local.mk delete mode 100644 src/util/valloc/fd_valloc.c delete mode 100644 src/util/valloc/fd_valloc.h diff --git a/contrib/codeql/nightly/SurelyWrongConstPure.ql b/contrib/codeql/nightly/SurelyWrongConstPure.ql index 5a54187c906..e7952c65e88 100644 --- a/contrib/codeql/nightly/SurelyWrongConstPure.ql +++ b/contrib/codeql/nightly/SurelyWrongConstPure.ql @@ -26,7 +26,6 @@ where /* for a nightly query, we only want known non-const/non-pure functions */ f.hasName("fd_log_private_1") or f.hasName("fd_log_private_2") or - f.hasName("fd_log_wallclock()") or - f.getName().matches("fd_valloc_%") + f.hasName("fd_log_wallclock()") ) and r.calls*(f) select r, f + " is called (transitively) by " + r + " which is marked as " + r.getAnAttribute().getName() diff --git a/src/app/ledger/main.c b/src/app/ledger/main.c index 618c04d10b2..4d67d3e4bab 100644 --- a/src/app/ledger/main.c +++ b/src/app/ledger/main.c @@ -17,12 +17,11 @@ struct fd_ledger_args { int copy_txn_status; /* determine if txns should be copied to the blockstore during minify/replay */ ulong trash_hash; /* trash hash to be used for negative cases*/ char const * rocksdb_path; /* path to rocksdb directory */ - fd_valloc_t valloc; /* wksp valloc that should NOT be used for runtime allocations */ }; typedef struct fd_ledger_args fd_ledger_args_t; /***************************** Helpers ****************************************/ -static fd_valloc_t +static void allocator_setup( fd_wksp_t * wksp ) { if( FD_UNLIKELY( !wksp ) ) { @@ -35,20 +34,12 @@ allocator_setup( fd_wksp_t * wksp ) { if( FD_UNLIKELY( !alloc_shalloc ) ) { FD_LOG_ERR( ( "fd_alloc_new failed" ) ); } fd_alloc_t * alloc = fd_alloc_join( alloc_shalloc, 3UL ); if( FD_UNLIKELY( !alloc ) ) { FD_LOG_ERR( ( "fd_alloc_join failed" ) ); } - fd_valloc_t valloc = fd_alloc_virtual( alloc ); - return valloc; - - /* NOTE: Enable this if leak hunting */ - //return fd_backtracing_alloc_virtual( &valloc ); - } void ingest_rocksdb( char const * file, ulong start_slot, - ulong end_slot, - FD_PARAM_UNUSED ulong trash_hash, - fd_valloc_t valloc ) { + ulong end_slot ) { fd_rocksdb_t rocks_db; char * err = fd_rocksdb_init( &rocks_db, file ); @@ -76,7 +67,7 @@ ingest_rocksdb( char const * file, int block_found = -1; while ( block_found!=0 && start_slot<=end_slot ) { - block_found = fd_rocksdb_root_iter_seek( &iter, &rocks_db, start_slot, &slot_meta, valloc ); + block_found = fd_rocksdb_root_iter_seek( &iter, &rocks_db, start_slot, &slot_meta ); if ( block_found!=0 ) { start_slot++; } @@ -108,10 +99,10 @@ ingest_rocksdb( char const * file, memset( &slot_meta, 0, sizeof(fd_slot_meta_t) ); - int ret = fd_rocksdb_root_iter_next( &iter, &slot_meta, valloc ); + int ret = fd_rocksdb_root_iter_next( &iter, &slot_meta ); if( ret < 0 ) { // FD_LOG_WARNING(("Failed for slot %lu", slot + 1)); - ret = fd_rocksdb_get_meta( &rocks_db, slot + 1, &slot_meta, valloc ); + ret = fd_rocksdb_get_meta( &rocks_db, slot + 1, &slot_meta ); if( ret < 0 ) { break; } @@ -173,8 +164,6 @@ minify( fd_ledger_args_t * args ) { FD_LOG_ERR(( "minified rocksdb path is NULL" )); } - args->valloc = allocator_setup( args->wksp ); - fd_rocksdb_t big_rocksdb; char * err = fd_rocksdb_init( &big_rocksdb, args->rocksdb_path ); if( FD_UNLIKELY( err!=NULL ) ) { @@ -215,8 +204,7 @@ minify( fd_ledger_args_t * args ) { // args->start_slot, // args->end_slot, // args->blockstore, - // ULONG_MAX, - // args->valloc ); + // ULONG_MAX ); } else { FD_LOG_NOTICE(( "skipping copying of transaction statuses" )); diff --git a/src/choreo/forks/fd_forks.c b/src/choreo/forks/fd_forks.c index 34824579097..1a8bc1d6e1f 100644 --- a/src/choreo/forks/fd_forks.c +++ b/src/choreo/forks/fd_forks.c @@ -136,8 +136,7 @@ fd_forks_query_const( fd_forks_t const * forks, ulong slot ) { // ulong slot, // fd_funk_t * funk, // fd_blockstore_t * blockstore, -// fd_funk_t * funk, -// fd_valloc_t valloc ) { +// fd_funk_t * funk ) { // // Remove slot ctx from frontier // fd_fork_t * child = fd_fork_frontier_ele_remove( forks->frontier, // &fork->slot, diff --git a/src/choreo/voter/test_voter.c b/src/choreo/voter/test_voter.c index b5420e8ff12..def68e0f9f4 100644 --- a/src/choreo/voter/test_voter.c +++ b/src/choreo/voter/test_voter.c @@ -103,7 +103,6 @@ main( int argc, char ** argv ) { // TEST_VOTE_TXN_MAGIC ); // void * alloc_shalloc = fd_alloc_new( alloc_shmem, TEST_VOTE_TXN_MAGIC ); // FD_PARAM_UNUSED fd_alloc_t * alloc = fd_alloc_join( alloc_shalloc, 0UL ); - // FD_PARAM_UNUSED fd_valloc_t valloc = fd_alloc_virtual( alloc ); // /* create compact_vote_state_update with dummy values */ // fd_compact_vote_state_update_t compact_vote_update = {0}; @@ -126,7 +125,6 @@ main( int argc, char ** argv ) { // fd_compact_vote_state_update_t parsed_vote_update; // FD_TEST( FD_VOTER_OK == fd_vote_txn_parse( txn_buf, // txn_size, - // valloc, // &parsed_recent_blockhash_off, // &parsed_vote_update ) ); // FD_LOG_NOTICE(( "recent blockhash: %s == %s", diff --git a/src/discof/backtest/fd_backtest_tile.c b/src/discof/backtest/fd_backtest_tile.c index f33448f9c40..bf2f5c573c8 100644 --- a/src/discof/backtest/fd_backtest_tile.c +++ b/src/discof/backtest/fd_backtest_tile.c @@ -95,7 +95,6 @@ typedef struct { ulong * published_wmark; /* same as the one in replay tile */ fd_alloc_t * alloc; - fd_valloc_t valloc; long replay_time; ulong slot_cnt; @@ -138,8 +137,8 @@ static fd_shred_t const * rocksdb_get_shred( ctx_t * ctx, ulong * out_sz ) { if( ctx->rocksdb_curr_idx==ctx->rocksdb_end_idx ) { - if( FD_UNLIKELY( fd_rocksdb_root_iter_next( &ctx->rocksdb_root_iter, &ctx->rocksdb_slot_meta, ctx->valloc ) ) ) return NULL; - if( FD_UNLIKELY( fd_rocksdb_get_meta( &ctx->rocksdb, ctx->rocksdb_slot_meta.slot, &ctx->rocksdb_slot_meta, ctx->valloc ) ) ) return NULL; + if( FD_UNLIKELY( fd_rocksdb_root_iter_next( &ctx->rocksdb_root_iter, &ctx->rocksdb_slot_meta ) ) ) return NULL; + if( FD_UNLIKELY( fd_rocksdb_get_meta( &ctx->rocksdb, ctx->rocksdb_slot_meta.slot, &ctx->rocksdb_slot_meta ) ) ) return NULL; ctx->rocksdb_curr_idx = 0; ctx->rocksdb_end_idx = ctx->rocksdb_slot_meta.received; } @@ -230,7 +229,6 @@ unprivileged_init( fd_topo_t * topo, if( FD_UNLIKELY( !ctx->alloc ) ) { FD_LOG_ERR( ( "fd_alloc_join failed" ) ); } - ctx->valloc = fd_alloc_virtual( ctx->alloc ); /* Tower */ ctx->tower = fd_tower_join( fd_tower_new( tower_mem ) ); @@ -238,11 +236,6 @@ unprivileged_init( fd_topo_t * topo, FD_LOG_ERR( ( "fd_tower_join failed" ) ); } - ctx->rocksdb_bank_hash = fd_valloc_malloc( ctx->valloc, fd_frozen_hash_versioned_align(), sizeof(fd_frozen_hash_versioned_t) ); - if( FD_UNLIKELY( NULL==ctx->rocksdb_bank_hash ) ) { - FD_LOG_ERR(( "Failed at allocating memory for rocksdb bank hash" )); - } - fd_topo_link_t * replay_in_link = &topo->links[ tile->in_link_id[ REPLAY_IN_IDX ] ]; ctx->replay_in_mem = topo->workspaces[ topo->objs[ replay_in_link->dcache_obj_id ].wksp_id ].wksp; ctx->replay_in_chunk0 = fd_dcache_compact_chunk0( ctx->replay_in_mem, replay_in_link->dcache ); @@ -356,7 +349,7 @@ after_credit_rocksdb( ctx_t * ctx, ctx->playback_started = 1; fd_rocksdb_root_iter_new( &ctx->rocksdb_root_iter ); - if( FD_UNLIKELY( fd_rocksdb_root_iter_seek( &ctx->rocksdb_root_iter, &ctx->rocksdb, wmark, &ctx->rocksdb_slot_meta, ctx->valloc ) ) ) { + if( FD_UNLIKELY( fd_rocksdb_root_iter_seek( &ctx->rocksdb_root_iter, &ctx->rocksdb, wmark, &ctx->rocksdb_slot_meta ) ) ) { FD_LOG_CRIT(( "Failed at seeking rocksdb root iter for slot=%lu", wmark )); } ctx->rocksdb_iter = rocksdb_create_iterator_cf(ctx->rocksdb.db, ctx->rocksdb.ro, ctx->rocksdb.cf_handles[FD_ROCKSDB_CFIDX_DATA_SHRED]); @@ -545,7 +538,7 @@ after_credit( ctx_t * ctx, switch( ctx->ingest_mode ) { case FD_BACKTEST_ROCKSDB_INGEST: fd_rocksdb_root_iter_new( &ctx->rocksdb_root_iter ); - if( FD_UNLIKELY( fd_rocksdb_root_iter_seek( &ctx->rocksdb_root_iter, &ctx->rocksdb, wmark, &ctx->rocksdb_slot_meta, ctx->valloc ) ) ) { + if( FD_UNLIKELY( fd_rocksdb_root_iter_seek( &ctx->rocksdb_root_iter, &ctx->rocksdb, wmark, &ctx->rocksdb_slot_meta ) ) ) { FD_LOG_CRIT(( "Failed at seeking rocksdb root iter for slot=%lu", wmark )); } ctx->rocksdb_iter = rocksdb_create_iterator_cf(ctx->rocksdb.db, ctx->rocksdb.ro, ctx->rocksdb.cf_handles[FD_ROCKSDB_CFIDX_DATA_SHRED]); @@ -589,16 +582,9 @@ rocksdb_bank_hash_check( ctx_t * ctx, ulong slot, fd_hash_t * bank_hash ) { if( FD_UNLIKELY( err || vallen==0 ) ) { FD_LOG_ERR(( "Failed at reading bank hash for slot%lu from rocksdb", slot )); } - fd_bincode_decode_ctx_t decode = { - .data = res, - .dataend = res + vallen - }; - ulong total_sz = 0UL; - int decode_err = fd_frozen_hash_versioned_decode_footprint( &decode, &total_sz ); - fd_frozen_hash_versioned_t * versioned = fd_frozen_hash_versioned_decode( ctx->rocksdb_bank_hash, &decode ); - if( FD_UNLIKELY( decode_err!=FD_BINCODE_SUCCESS ) || - FD_UNLIKELY( decode.data!=decode.dataend ) || + fd_frozen_hash_versioned_t versioned[1]; + if( FD_UNLIKELY( !fd_bincode_decode_static( frozen_hash_versioned, versioned, res, vallen, NULL ) ) || FD_UNLIKELY( versioned->discriminant!=fd_frozen_hash_versioned_enum_current ) ) { FD_LOG_ERR(( "Failed at decoding bank hash from rocksdb" )); } diff --git a/src/discof/consensus/test_gossip_echo_vote.c b/src/discof/consensus/test_gossip_echo_vote.c deleted file mode 100644 index 2ddd15bd0d3..00000000000 --- a/src/discof/consensus/test_gossip_echo_vote.c +++ /dev/null @@ -1,609 +0,0 @@ -// #define _GNU_SOURCE /* See feature_test_macros(7) */ - -// #include -// #include -// #include -// #include -// #include -// #include -// #include -// #include -// #include -// #include -// #include - -// #include "../keyguard/fd_keyload.h" -// #include "../keyguard/fd_keyguard.h" -// #include "../keyguard/fd_keyguard_client.h" -// #include "../metrics/fd_metrics.h" -// #include "../shred/fd_shred_cap.h" -// #include "../store/fd_store.h" - -// #include "../../util/net/fd_eth.h" -// #include "../../util/net/fd_udp.h" -// #include "../../waltz/aio/fd_aio.h" -// #include "../../waltz/udpsock/fd_udpsock.h" - -// #include "../../choreo/fd_choreo.h" -// #include "../../flamenco/fd_flamenco.h" -// #include "../../flamenco/repair/fd_repair.h" -// #include "../../flamenco/runtime/fd_hashes.h" -// #include "../../flamenco/runtime/fd_system_ids.h" -// #include "../../flamenco/runtime/program/fd_bpf_program_util.h" -// #include "../../flamenco/runtime/program/fd_vote_program.h" -// #include "../../flamenco/runtime/sysvar/fd_sysvar_epoch_schedule.h" -// #include "../../flamenco/types/fd_types.h" -// #include "../../util/fd_util.h" -// #include "../../util/net/fd_eth.h" - -// #define MAX_ADDR_STRLEN 128 -// #define TEST_GOSSIP_VOTE_MAGIC ( 0x7e57UL ) /* test */ - -// uchar metrics_scratch[ FD_METRICS_FOOTPRINT( 0, 0 ) ] __attribute__((aligned(FD_METRICS_ALIGN))); - -// static void -// sign_fun( void * arg, uchar * sig, uchar const * buffer, ulong len, int sign_type ) { -// fd_gossip_config_t * config = (fd_gossip_config_t *)arg; -// fd_sha512_t sha[1]; - -// switch( sign_type ) { - -// case FD_KEYGUARD_SIGN_TYPE_SHA256_ED25519: { -// uchar hash[32]; -// fd_sha256_hash( buffer, len, hash ); -// fd_ed25519_sign( /* sig */ sig, -// /* msg */ hash, -// /* sz */ 32, -// /* public_key */ config->public_key->uc, -// /* private_key */ config->private_key, -// sha ); -// break; -// } - -// case FD_KEYGUARD_SIGN_TYPE_ED25519: -// fd_ed25519_sign( /* sig */ sig, -// /* msg */ buffer, -// /* sz */ len, -// /* public_key */ config->public_key->uc, -// /* private_key */ config->private_key, -// sha ); -// break; - -// default: -// FD_LOG_CRIT(( "Invalid sign type %d", sign_type )); -// } -// } - -// static int -// to_sockaddr( uchar * dst, fd_gossip_peer_addr_t const * src ) { -// fd_memset( dst, 0, sizeof( struct sockaddr_in ) ); -// struct sockaddr_in * t = (struct sockaddr_in *)dst; -// t->sin_family = AF_INET; -// t->sin_addr.s_addr = src->addr; -// t->sin_port = src->port; -// return sizeof( struct sockaddr_in ); -// } - -// /* Convert my style of address from UNIX style */ -// static int -// from_sockaddr( fd_gossip_peer_addr_t * dst, uchar const * src ) { -// FD_STATIC_ASSERT( sizeof( fd_gossip_peer_addr_t ) == sizeof( ulong ), "messed up size" ); -// dst->l = 0; -// const struct sockaddr_in * sa = (const struct sockaddr_in *)src; -// dst->addr = sa->sin_addr.s_addr; -// dst->port = sa->sin_port; -// return 0; -// } - -// static int -// create_socket( fd_gossip_peer_addr_t * addr ) { -// int fd; -// if( ( fd = socket( AF_INET, SOCK_DGRAM, 0 ) ) < 0 ) { -// FD_LOG_ERR(( "socket failed: %s", strerror( errno ) )); -// return -1; -// } -// int optval = 1 << 20; -// if( setsockopt( fd, SOL_SOCKET, SO_RCVBUF, (char *)&optval, sizeof( int ) ) < 0 ) { -// FD_LOG_ERR(( "setsocketopt failed: %s", strerror( errno ) )); -// return -1; -// } - -// if( setsockopt( fd, SOL_SOCKET, SO_SNDBUF, (char *)&optval, sizeof( int ) ) < 0 ) { -// FD_LOG_ERR(( "setsocketopt failed: %s", strerror( errno ) )); -// return -1; -// } - -// uchar saddr[sizeof( struct sockaddr_in6 )]; -// int addrlen = to_sockaddr( saddr, addr ); -// if( addrlen < 0 || bind( fd, (struct sockaddr *)saddr, (uint)addrlen ) < 0 ) { -// char tmp[MAX_ADDR_STRLEN]; -// FD_LOG_ERR(( "bind failed: %s for %s", -// strerror( errno ), -// fd_gossip_addr_str( tmp, sizeof( tmp ), addr ) )); -// return -1; -// } -// if( getsockname( fd, (struct sockaddr *)saddr, (uint *)&addrlen ) < 0 ) { -// FD_LOG_ERR(( "getsockname failed: %s", strerror( errno ) )); -// return -1; -// } -// from_sockaddr( addr, saddr ); - -// return fd; -// } - -// static void -// gossip_send_fun( uchar const * data, -// size_t sz, -// fd_gossip_peer_addr_t const * gossip_peer_addr, -// void * arg ) { -// uchar saddr[sizeof( struct sockaddr_in )]; -// int saddrlen = to_sockaddr( saddr, gossip_peer_addr ); -// char s[MAX_ADDR_STRLEN] = { 0 }; -// fd_gossip_addr_str( s, sizeof( s ), gossip_peer_addr ); -// if( sendto( *(int *)arg, -// data, -// sz, -// MSG_DONTWAIT, -// (const struct sockaddr *)saddr, -// (socklen_t)saddrlen ) < 0 ) { -// FD_LOG_WARNING(( "sendto failed: %s", strerror( errno ) )); -// } -// } - -// void send_udp_pkt( void * pkt, ulong pkt_sz, fd_wksp_t * wksp, uint dst_ip, ushort dst_port ) { -// ulong mtu = 2048UL; -// ulong rx_depth = 1024UL; -// ulong tx_depth = 1024UL; - -// int sock_fd = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); -// if( FD_UNLIKELY( sock_fd<0 ) ) { -// FD_LOG_ERR(( "socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP) failed" )); -// } - -// void * sock_mem = fd_wksp_alloc_laddr( wksp, fd_udpsock_align(), -// fd_udpsock_footprint( mtu, rx_depth, tx_depth ), -// 1UL ); -// if( FD_UNLIKELY( !sock_mem ) ) { -// FD_LOG_WARNING(( "fd_wksp_alloc_laddr() failed" )); -// close( sock_fd ); -// return; -// } - -// fd_udpsock_t * sock = fd_udpsock_join( fd_udpsock_new( sock_mem, mtu, rx_depth, tx_depth ), sock_fd ); -// if( FD_UNLIKELY( !sock ) ) { -// FD_LOG_WARNING(( "fd_udpsock_join() failed" )); -// close( sock_fd ); -// fd_wksp_free_laddr( sock_mem ); -// return; -// } - -// fd_aio_pkt_info_t pkt_info[1]; -// uchar buf[2048]; -// uchar * write_ptr = buf; - -// fd_eth_hdr_t eth_hdr = {.net_type = htons( 0x0800 )}; -// fd_ip4_hdr_t ip_hdr; -// fd_memset( &ip_hdr, 0, sizeof(fd_ip4_hdr_t) ); -// ip_hdr.verihl = sizeof(fd_ip4_hdr_t) / 4; -// fd_memcpy( ip_hdr.daddr_c, &dst_ip, 4) ; -// fd_ip4_hdr_bswap( &ip_hdr ); -// fd_udp_hdr_t udp_hdr; -// fd_memset( &udp_hdr, 0, sizeof(fd_udp_hdr_t) ); -// udp_hdr.net_dport = dst_port; -// fd_udp_hdr_bswap( &udp_hdr ); - -// fd_memcpy( write_ptr, ð_hdr, sizeof(fd_eth_hdr_t) ); -// write_ptr += sizeof( fd_eth_hdr_t ); -// fd_memcpy( write_ptr, &ip_hdr, FD_IP4_GET_LEN(ip_hdr) ); -// write_ptr += sizeof( fd_ip4_hdr_t ); -// fd_memcpy( write_ptr, &udp_hdr, sizeof( fd_udp_hdr_t) ); -// write_ptr += sizeof( fd_udp_hdr_t ); -// fd_memcpy( write_ptr, pkt, pkt_sz ); -// pkt_info->buf = buf; - -// ulong buf_sz = pkt_sz + (ulong)(write_ptr - buf); -// if ( buf_sz <= USHORT_MAX ) { -// pkt_info->buf_sz = (ushort) buf_sz; -// } else { -// FD_LOG_ERR(( "Packet size overflows ushort" )); -// } - -// fd_aio_t const * tx = fd_udpsock_get_tx( sock ); -// int rc = tx->send_func(tx->ctx, pkt_info, 1, NULL, 1); -// if ( rc != FD_AIO_SUCCESS ) { -// FD_LOG_ERR(( "UDP send failed with %d", rc )); -// } else { -// uchar * data = (uchar *)pkt; -// FD_LOG_NOTICE(( "UDP send suceeds\n %lu bytes in total. first 8 bytes: %x %x %x %x %x %x %x %x | last 8 bytes: %x %x %x %x %x %x %x %x\n ", pkt_sz, data[0], data[1], data[2], data[3], -// data[4], data[5], data[6], data[7], data[pkt_sz - 8], data[pkt_sz - 7], data[pkt_sz - 6], data[pkt_sz -5], -// data[pkt_sz - 4], data[pkt_sz - 3], data[pkt_sz - 2], data[pkt_sz - 1] )); -// } -// } - -// struct gossip_deliver_arg { -// fd_wksp_t * wksp; -// fd_valloc_t valloc; -// fd_gossip_t * gossip; -// fd_gossip_config_t * gossip_config; - -// fd_pubkey_t const * vote_acct_addr; -// const uchar * vote_authority_keypair; -// const uchar * validator_identity_keypair; -// }; -// typedef struct gossip_deliver_arg gossip_deliver_arg_t; - -// struct vote_txn_sign_args { -// const uchar * vote_authority_keypair; -// const uchar * validator_identity_keypair; -// }; -// typedef struct vote_txn_sign_args vote_txn_sign_args_t; - -// void -// vote_txn_validator_identity_signer( void * _keys, -// uchar signature[ static 64 ], -// uchar const * buffer, -// ulong len ) { -// fd_sha512_t sha; -// vote_txn_sign_args_t * keys = (vote_txn_sign_args_t *) fd_type_pun( _keys ); -// fd_ed25519_sign( /* sig */ signature, -// /* msg */ buffer, -// /* sz */ len, -// /* public_key */ keys->validator_identity_keypair + 32UL, -// /* private_key */ keys->validator_identity_keypair, -// &sha ); -// } - -// void -// vote_txn_vote_authority_signer( void * _keys, -// uchar signature[ static 64 ], -// uchar const * buffer, -// ulong len ) { -// fd_sha512_t sha; -// vote_txn_sign_args_t * keys = (vote_txn_sign_args_t *) fd_type_pun( _keys ); -// fd_ed25519_sign( /* sig */ signature, -// /* msg */ buffer, -// /* sz */ len, -// /* public_key */ keys->vote_authority_keypair + 32UL, -// /* private_key */ keys->vote_authority_keypair, -// &sha ); -// } - -// static void -// gossip_deliver_fun( fd_crds_data_t * data, void * arg ) { -// gossip_deliver_arg_t * arg_ = (gossip_deliver_arg_t *)arg; -// if( data->discriminant == fd_crds_data_enum_vote ) { -// fd_gossip_vote_t * vote = &data->inner.vote; -// fd_txn_t * parsed_txn = (fd_txn_t *)fd_type_pun( vote->txn.txn ); - -// FD_TEST( parsed_txn ); -// FD_TEST( parsed_txn->instr_cnt == 1); - -// uchar program_id = parsed_txn->instr[0].program_id; -// uchar* account_addr = (vote->txn.raw + parsed_txn->acct_addr_off -// + FD_TXN_ACCT_ADDR_SZ * program_id ); - -// if ( !memcmp( account_addr, fd_solana_vote_program_id.key, sizeof( fd_pubkey_t ) ) ) { -// fd_vote_instruction_t vote_instr = { 0 }; -// ushort instr_data_sz = parsed_txn->instr[0].data_sz; -// uchar * instr_data = vote->txn.raw + parsed_txn->instr[0].data_off; -// fd_bincode_decode_ctx_t decode = { -// .data = instr_data, -// .dataend = instr_data + instr_data_sz, -// .valloc = arg_->valloc -// }; -// int decode_result = fd_vote_instruction_decode( &vote_instr, &decode ); -// if( decode_result == FD_BINCODE_SUCCESS) { -// if( vote_instr.discriminant == fd_vote_instruction_enum_compact_update_vote_state ) { -// /* Replace the timestamp in compact_update_vote_state */ -// /* FIXME What is this random timestamp? */ -// long new_timestamp = 19950128L; -// vote_instr.inner.compact_update_vote_state.has_timestamp = 1; -// vote_instr.inner.compact_update_vote_state.timestamp = new_timestamp; - -// /* Generate the vote transaction */ -// FD_PARAM_UNUSED vote_txn_sign_args_t sign_args = { -// .vote_authority_keypair = arg_->vote_authority_keypair, -// .validator_identity_keypair = arg_->validator_identity_keypair -// }; -// fd_pubkey_t const * vote_authority_pubkey = (fd_pubkey_t const *)fd_type_pun_const( arg_->vote_authority_keypair + 32UL ); -// fd_pubkey_t const * validator_identity_pubkey = (fd_pubkey_t const *)fd_type_pun_const( arg_->validator_identity_keypair + 32UL ); -// fd_voter_t voter = { -// .addr = *arg_->vote_acct_addr, -// .vote_authority = *vote_authority_pubkey, -// .validator_identity = *validator_identity_pubkey -// }; -// fd_crds_data_t echo_data; -// echo_data.discriminant = fd_crds_data_enum_vote; -// echo_data.inner.vote.txn.raw_sz = fd_voter_txn_generate( &voter, -// &vote_instr.inner.compact_update_vote_state, -// (fd_hash_t *)fd_type_pun(vote->txn.raw + parsed_txn->recent_blockhash_off), -// echo_data.inner.vote.txn.txn_buf, -// echo_data.inner.vote.txn.raw ); -// /* echo through gossip */ -// fd_gossip_push_value( arg_->gossip, &echo_data, NULL ); -// static ulong echo_cnt = 0; -// FD_LOG_NOTICE(( "Echo gossip vote#%lu: root=%lu, from=%s, gossip_pubkey=%s, txn_acct_cnt=%u(readonly_s=%u, readonly_us=%u), sign_cnt=%u, sign_off=%u | instruction#0: program=%s", -// echo_cnt++, -// vote_instr.inner.compact_update_vote_state.root, -// FD_BASE58_ENC_32_ALLOCA( &vote->from ), -// FD_BASE58_ENC_32_ALLOCA( arg_->gossip_config->public_key ), -// parsed_txn->acct_addr_cnt, -// parsed_txn->readonly_signed_cnt, -// parsed_txn->readonly_unsigned_cnt, -// parsed_txn->signature_cnt, -// parsed_txn->signature_off, -// FD_BASE58_ENC_32_ALLOCA( account_addr ) )); - -// /* echo through udp */ -// fd_aio_pkt_info_t udp_pkt; -// udp_pkt.buf = echo_data.inner.vote.txn.raw; -// udp_pkt.buf_sz = (ushort)echo_data.inner.vote.txn.raw_sz; -// uint dst_ip = 0x0100007f; /* localhost */ -// ushort dst_port = 1029; /* vote udp port */ -// send_udp_pkt( udp_pkt.buf, udp_pkt.buf_sz, arg_->wksp, dst_ip, dst_port ); -// FD_LOG_NOTICE(( "Sent vote txn to 127.0.0.1:1029 w/ UDP\ntimestamp: %ld\nOld sig1: %s\nOld sig2: %s\nNew sig1: %s\nNew sig2: %s", -// new_timestamp, -// FD_BASE58_ENC_64_ALLOCA( vote->txn.raw + parsed_txn->signature_off ), -// FD_BASE58_ENC_64_ALLOCA( vote->txn.raw + parsed_txn->signature_off + FD_TXN_SIGNATURE_SZ ), -// FD_BASE58_ENC_64_ALLOCA( echo_data.inner.vote.txn.raw + parsed_txn->signature_off ), -// FD_BASE58_ENC_64_ALLOCA( echo_data.inner.vote.txn.raw + parsed_txn->signature_off + FD_TXN_SIGNATURE_SZ ) )); -// FD_LOG_ERR(( "Finish." )); - -// } else { -// FD_LOG_WARNING(( "Gossip receives vote instruction with other discriminant" )); -// } -// } else { -// FD_LOG_ERR(( "Unable to decode the vote instruction in gossip, error=%d", decode_result )); -// } -// } else { -// FD_LOG_ERR(( "Received gossip vote txn targets program %s instead of %s", -// FD_BASE58_ENC_32_ALLOCA( account_addr ), -// FD_BASE58_ENC_32_ALLOCA( fd_solana_vote_program_id.key ) )); -// } -// } -// } - -// /* Convert a host:port string to a repair network address. If host is -// * missing, it assumes the local hostname. */ -// static fd_repair_peer_addr_t * -// resolve_hostport( const char * str /* host:port */, fd_repair_peer_addr_t * res ) { -// fd_memset( res, 0, sizeof( fd_repair_peer_addr_t ) ); - -// /* Find the : and copy out the host */ -// char buf[MAX_ADDR_STRLEN]; -// uint i; -// for( i = 0;; ++i ) { -// if( str[i] == '\0' || i > sizeof( buf ) - 1U ) { -// FD_LOG_ERR(( "missing colon" )); -// return NULL; -// } -// if( str[i] == ':' ) { -// buf[i] = '\0'; -// break; -// } -// buf[i] = str[i]; -// } -// if( i == 0 || strcmp( buf, "localhost" ) == 0 || -// strcmp( buf, "127.0.0.1" ) == 0 ) /* :port means $HOST:port */ -// gethostname( buf, sizeof( buf ) ); - -// struct hostent * host = gethostbyname( buf ); -// if( host == NULL ) { -// FD_LOG_WARNING(( "unable to resolve host %s", buf )); -// return NULL; -// } -// /* Convert result to repair address */ -// res->l = 0; -// res->addr = ( (struct in_addr *)host->h_addr_list[0] )->s_addr; -// int port = atoi( str + i + 1 ); -// if( ( port > 0 && port < 1024 ) || port > (int)USHORT_MAX ) { -// FD_LOG_ERR(( "invalid port number" )); -// return NULL; -// } -// res->port = htons( (ushort)port ); - -// return res; -// } - -// struct gossip_targ { -// int gossip_fd; -// fd_valloc_t valloc; -// fd_gossip_t * gossip; -// }; -// typedef struct gossip_targ gossip_targ_t; - -#define VLEN 32U -#define CLEAR_MSGS \ - fd_memset( msgs, 0, sizeof( msgs ) ); \ - for( uint i = 0; i < VLEN; i++ ) { \ - iovecs[i].iov_base = bufs[i]; \ - iovecs[i].iov_len = FD_ETH_PAYLOAD_MAX; \ - msgs[i].msg_hdr.msg_iov = &iovecs[i]; \ - msgs[i].msg_hdr.msg_iovlen = 1; \ - msgs[i].msg_hdr.msg_name = sockaddrs[i]; \ - msgs[i].msg_hdr.msg_namelen = sizeof( struct sockaddr_in6 ); \ - } - -// void* -// gossip_thread( void* arg ) { -// gossip_targ_t * _arg = (gossip_targ_t *)arg; -// int gossip_fd = _arg->gossip_fd; -// fd_gossip_t * gossip = _arg->gossip; - -// ulong smax = 1UL << 21UL; -// ulong sdepth = 1UL << 5UL; -// void * smem = -// fd_valloc_malloc( _arg->valloc, fd_scratch_smem_align(), fd_scratch_smem_footprint( smax ) ); -// void * fmem = -// fd_valloc_malloc( _arg->valloc, fd_scratch_fmem_align(), fd_scratch_fmem_footprint( sdepth ) ); -// FD_TEST( ( !!smem ) & ( !!fmem ) ); -// fd_scratch_attach( smem, fmem, smax, sdepth ); - -// struct mmsghdr msgs[VLEN]; -// struct iovec iovecs[VLEN]; -// uchar bufs[VLEN][FD_ETH_PAYLOAD_MAX]; -// uchar sockaddrs[VLEN][sizeof( struct sockaddr_in6 )]; /* sockaddr is smaller than sockaddr_in6 */ -// while( FD_LIKELY( 1 /* !fd_tile_shutdown_flag */ ) ) { -// long now = fd_log_wallclock(); -// fd_gossip_settime( gossip, now ); - -// /* Loop gossip */ -// fd_gossip_continue( gossip ); - -// /* Read more packets */ -// CLEAR_MSGS; -// int gossip_rc = recvmmsg( gossip_fd, msgs, VLEN, MSG_DONTWAIT, NULL ); -// if( gossip_rc < 0 ) { -// if( errno == EINTR || errno == EWOULDBLOCK ) continue; -// break; -// } - -// for( uint i = 0; i < (uint)gossip_rc; ++i ) { -// fd_gossip_peer_addr_t from; -// from_sockaddr( &from, msgs[i].msg_hdr.msg_name ); -// fd_gossip_recv_packet( gossip, bufs[i], msgs[i].msg_len, &from ); -// } -// } -// return 0; -// } - -// int -// main( int argc, char ** argv ) { -// fd_boot( &argc, &argv ); -// fd_metrics_register( (ulong *)fd_metrics_new( metrics_scratch, 0UL, 0UL ) ); - -// const char * gossip_peer_addr = -// fd_env_strip_cmdline_cstr( &argc, &argv, "--gossip-peer-addr", NULL, NULL ); -// ushort gossip_port = fd_env_strip_cmdline_ushort( &argc, &argv, "--gossip-port", NULL, 9001 ); -// const char * vote_acct_addr_file = -// fd_env_strip_cmdline_cstr( &argc, &argv, "--vote-acct-addr-file", NULL, NULL ); -// const char * vote_authority_keypair_file = -// fd_env_strip_cmdline_cstr( &argc, &argv, "--vote-auth-keypair-file", NULL, NULL ); -// const char * validator_identity_keypair_file = -// fd_env_strip_cmdline_cstr( &argc, &argv, "--validator-id-keypair-file", NULL, NULL ); -// ushort shred_version = fd_env_strip_cmdline_ushort( &argc, &argv, "--shred-version", NULL, 0 ); - -// FD_TEST( gossip_peer_addr ); -// FD_TEST( vote_authority_keypair_file ); -// FD_TEST( validator_identity_keypair_file ); - -// /**********************************************************************/ -// /* wksp */ -// /**********************************************************************/ - -// char * _page_sz = "gigantic"; -// ulong numa_idx = fd_shmem_numa_idx( 0 ); -// FD_LOG_NOTICE(( "Creating workspace (--page-cnt %lu, --page-sz %s, --numa-idx %lu)", -// 1UL, -// _page_sz, -// numa_idx )); -// fd_wksp_t * wksp = fd_wksp_new_anonymous( -// fd_cstr_to_shmem_page_sz( _page_sz ), 1, fd_shmem_cpu_idx( numa_idx ), "wksp", 0UL ); -// FD_TEST( wksp ); -// FD_LOG_DEBUG(( "Finish setup wksp" )); - -// /**********************************************************************/ -// /* alloc */ -// /**********************************************************************/ - -// void * alloc_shmem = -// fd_wksp_alloc_laddr( wksp, fd_alloc_align(), fd_alloc_footprint(), TEST_GOSSIP_VOTE_MAGIC ); -// void * alloc_shalloc = fd_alloc_new( alloc_shmem, TEST_GOSSIP_VOTE_MAGIC ); -// fd_alloc_t * alloc = fd_alloc_join( alloc_shalloc, 0UL ); -// fd_valloc_t valloc = fd_alloc_virtual( alloc ); - -// /**********************************************************************/ -// /* scratch */ -// /**********************************************************************/ - -// ulong smax = 1UL << 21UL; -// ulong sdepth = 1UL << 5UL; -// void * smem = -// fd_valloc_malloc( valloc, fd_scratch_smem_align(), fd_scratch_smem_footprint( smax ) ); -// void * fmem = -// fd_valloc_malloc( valloc, fd_scratch_fmem_align(), fd_scratch_fmem_footprint( sdepth ) ); -// FD_TEST( ( !!smem ) & ( !!fmem ) ); -// fd_scratch_attach( smem, fmem, smax, sdepth ); - -// /**********************************************************************/ -// /* keys */ -// /**********************************************************************/ - -// uchar private_key[32]; -// FD_TEST( 32UL == getrandom( private_key, 32UL, 0 ) ); -// fd_sha512_t sha[1]; -// fd_pubkey_t public_key; -// FD_TEST( fd_ed25519_public_from_private( public_key.uc, private_key, sha ) ); - -// /**********************************************************************/ -// /* gossip */ -// /**********************************************************************/ - -// void * gossip_shmem = -// fd_wksp_alloc_laddr( wksp, fd_gossip_align(), fd_gossip_footprint(), TEST_GOSSIP_VOTE_MAGIC ); -// fd_gossip_t * gossip = -// fd_gossip_join( fd_gossip_new( gossip_shmem, TEST_GOSSIP_VOTE_MAGIC ) ); - -// fd_gossip_config_t gossip_config; -// char gossip_addr[7] = { 0 }; -// snprintf( gossip_addr, sizeof( gossip_addr ), ":%u", gossip_port ); -// FD_TEST( resolve_hostport( gossip_addr, &gossip_config.my_addr ) ); -// gossip_config.shred_version = shred_version; -// gossip_deliver_arg_t gossip_deliver_arg = { -// .valloc = valloc, -// .gossip_config = &gossip_config, -// .gossip = gossip, -// .wksp = wksp, -// .vote_acct_addr = (fd_pubkey_t const *)fd_type_pun_const( fd_keyload_load( vote_acct_addr_file, 1 ) ), -// .vote_authority_keypair = fd_keyload_load( vote_authority_keypair_file, 0 ), -// .validator_identity_keypair = fd_keyload_load( validator_identity_keypair_file, 0 ) -// }; -// gossip_config.deliver_arg = &gossip_deliver_arg; -// gossip_config.deliver_fun = gossip_deliver_fun; -// gossip_config.send_fun = gossip_send_fun; -// int gossip_sockfd = create_socket( &gossip_config.my_addr ); -// gossip_config.send_arg = &gossip_sockfd; -// gossip_config.public_key = &public_key; -// gossip_config.private_key = private_key; -// gossip_config.sign_fun = sign_fun; -// gossip_config.sign_arg = &gossip_config; -// gossip_config.my_version = (fd_gossip_version_v2_t){ -// .from = public_key, -// .major = 1337U, -// .minor = 1337U, -// .patch = 1337U, -// .commit = 0U, -// .has_commit = 0U, -// .feature_set = 0U, -// }; -// FD_TEST( !fd_gossip_set_config( gossip, &gossip_config ) ); - -// uint entrypoints[16]; -// fd_gossip_peer_addr_t _gossip_peer_addr; -// resolve_hostport( gossip_peer_addr, &_gossip_peer_addr ); -// entrypoints[0] = _gossip_peer_addr.addr; -// ushort port = fd_ushort_bswap(_gossip_peer_addr.port); -// fd_gossip_set_entrypoints( gossip, entrypoints, 1, &port); - -// fd_gossip_update_addr( gossip, &gossip_config.my_addr ); -// fd_gossip_settime( gossip, fd_log_wallclock() ); -// fd_gossip_start( gossip ); - -// /**********************************************************************/ -// /* gossip thread */ -// /**********************************************************************/ - -// gossip_targ_t gossip_targ = { .gossip_fd = gossip_sockfd, .valloc = valloc, .gossip = gossip }; -// pthread_t t; -// pthread_create(&t, NULL, gossip_thread, &gossip_targ); -// while( FD_LIKELY( 1 /* !fd_tile_shutdown_flag */ ) ) { -// /* Allow other threads to add pendings */ -// struct timespec ts = { .tv_sec = 0, .tv_nsec = (long)1e6 }; -// nanosleep( &ts, NULL ); -// } - -// fd_halt(); - -int main( void ) { - return 0; -} diff --git a/src/flamenco/runtime/context/fd_exec_slot_ctx.h b/src/flamenco/runtime/context/fd_exec_slot_ctx.h index 32998bff02f..7db6d441829 100644 --- a/src/flamenco/runtime/context/fd_exec_slot_ctx.h +++ b/src/flamenco/runtime/context/fd_exec_slot_ctx.h @@ -64,8 +64,6 @@ fd_exec_slot_ctx_recover( fd_exec_slot_ctx_t * ctx, /* fd_exec_slot_ctx_recover re-initializes the current slot context's status cache from the provided solana slot deltas. - Assumes objects in slot deltas were allocated using slot ctx valloc - (U.B. otherwise). On return, slot deltas is destroyed. Returns ctx on success. On failure, logs reason for error and returns NULL. */ diff --git a/src/flamenco/runtime/fd_rocksdb.c b/src/flamenco/runtime/fd_rocksdb.c index 60df5d5415a..010a4c8209d 100644 --- a/src/flamenco/runtime/fd_rocksdb.c +++ b/src/flamenco/runtime/fd_rocksdb.c @@ -195,8 +195,7 @@ fd_rocksdb_first_slot( fd_rocksdb_t * db, int fd_rocksdb_get_meta( fd_rocksdb_t * db, ulong slot, - fd_slot_meta_t * m, - fd_valloc_t valloc ) { + fd_slot_meta_t * m ) { ulong ks = fd_ulong_bswap(slot); size_t vallen = 0; @@ -227,11 +226,6 @@ fd_rocksdb_get_meta( fd_rocksdb_t * db, FD_LOG_ERR(( "fd_slot_meta_decode failed" )); } - uchar * mem = fd_valloc_malloc( valloc, fd_slot_meta_align(), total_sz ); - if( NULL == mem ) { - FD_LOG_ERR(( "fd_valloc_malloc failed" )); - } - fd_slot_meta_decode( mem, &ctx ); fd_memcpy( m, mem, sizeof(fd_slot_meta_t) ); @@ -261,8 +255,7 @@ int fd_rocksdb_root_iter_seek( fd_rocksdb_root_iter_t * self, fd_rocksdb_t * db, ulong slot, - fd_slot_meta_t * m, - fd_valloc_t valloc ) { + fd_slot_meta_t * m ) { self->db = db; if( FD_UNLIKELY( !self->iter ) ) @@ -284,7 +277,7 @@ fd_rocksdb_root_iter_seek( fd_rocksdb_root_iter_t * self, return -2; } - return fd_rocksdb_get_meta( self->db, slot, m, valloc ); + return fd_rocksdb_get_meta( self->db, slot, m ); } int @@ -303,8 +296,7 @@ fd_rocksdb_root_iter_slot ( fd_rocksdb_root_iter_t * self, ulong *slot ) { int fd_rocksdb_root_iter_next( fd_rocksdb_root_iter_t * self, - fd_slot_meta_t * m, - fd_valloc_t valloc ) { + fd_slot_meta_t * m ) { if ((NULL == self->db) || (NULL == self->iter)) return -1; @@ -319,7 +311,7 @@ fd_rocksdb_root_iter_next( fd_rocksdb_root_iter_t * self, size_t klen = 0; const char *key = rocksdb_iter_key(self->iter, &klen); // There is no need to free key - return fd_rocksdb_get_meta( self->db, fd_ulong_bswap(*((unsigned long *) key)), m, valloc ); + return fd_rocksdb_get_meta( self->db, fd_ulong_bswap(*((unsigned long *) key)), m ); } void diff --git a/src/flamenco/runtime/fd_rocksdb.h b/src/flamenco/runtime/fd_rocksdb.h index d629b8dc378..61685595444 100644 --- a/src/flamenco/runtime/fd_rocksdb.h +++ b/src/flamenco/runtime/fd_rocksdb.h @@ -104,8 +104,7 @@ int fd_rocksdb_root_iter_seek( fd_rocksdb_root_iter_t * iter, fd_rocksdb_t * db, ulong slot, - fd_slot_meta_t * m, - fd_valloc_t valloc ); + fd_slot_meta_t * m ); /* fd_rocksdb_root_iter_next @@ -117,8 +116,7 @@ fd_rocksdb_root_iter_seek( fd_rocksdb_root_iter_t * iter, int fd_rocksdb_root_iter_next( fd_rocksdb_root_iter_t * iter, - fd_slot_meta_t * m, - fd_valloc_t valloc ); + fd_slot_meta_t * m ); int fd_rocksdb_root_iter_slot( fd_rocksdb_root_iter_t * self, @@ -186,8 +184,7 @@ fd_rocksdb_find_last_slot( fd_rocksdb_t * db, int fd_rocksdb_get_meta( fd_rocksdb_t * db, ulong slot, - fd_slot_meta_t * m, - fd_valloc_t valloc ); + fd_slot_meta_t * m ); /* fd_rocksdb_get_txn_status_raw queries transaction status metadata. slot is the slot number of the block that contains the txn. sig @@ -243,8 +240,7 @@ int fd_rocksdb_import_block_shredcap( fd_rocksdb_t * db, fd_slot_meta_t * metadata, fd_io_buffered_ostream_t * ostream, - fd_io_buffered_ostream_t * bank_hash_ostream, - fd_valloc_t valloc ); + fd_io_buffered_ostream_t * bank_hash_ostream ); FD_PROTOTYPES_END diff --git a/src/flamenco/runtime/fd_runtime.h b/src/flamenco/runtime/fd_runtime.h index dc234b9fef1..25289579abb 100644 --- a/src/flamenco/runtime/fd_runtime.h +++ b/src/flamenco/runtime/fd_runtime.h @@ -139,10 +139,10 @@ FD_STATIC_ASSERT( FD_BPF_ALIGN_OF_U128==FD_ACCOUNT_REC_DATA_ALIGN, input_data_al ((FD_MAX_INSTRUCTION_STACK_DEPTH*FD_RUNTIME_INPUT_REGION_INSN_FOOTPRINT(account_lock_limit, direct_mapping)) + \ ((FD_TXN_MTU-FD_TXN_MIN_SERIALIZED_SZ-account_lock_limit)*8UL)) /* We can have roughly this much duplicate offsets */ -/* Bincode valloc footprint over the execution of a single transaction. +/* Bincode spad footprint over the execution of a single transaction. As well as other footprint specific to each native program type. - N.B. We know that bincode valloc footprint is bounded, because + N.B. We know that bincode spad footprint is bounded, because whenever we alloc something, we advance our pointer into the binary buffer, so eventually we are gonna reach the end of the buffer. This buffer is usually backed by and ultimately bounded in size by diff --git a/src/flamenco/runtime/tests/test_exec_sol_compat.c b/src/flamenco/runtime/tests/test_exec_sol_compat.c index fe8e56d4ca8..5a16fe214c3 100644 --- a/src/flamenco/runtime/tests/test_exec_sol_compat.c +++ b/src/flamenco/runtime/tests/test_exec_sol_compat.c @@ -92,7 +92,6 @@ main( int argc, sol_compat_check_wksp_usage(); } - /* TODO: verify that there are no leaked libc allocs and vallocs */ sol_compat_fini(); fd_halt(); return fail_cnt>0UL; diff --git a/src/flamenco/types/fd_bincode.h b/src/flamenco/types/fd_bincode.h index 660be8646f5..4c034454d7d 100644 --- a/src/flamenco/types/fd_bincode.h +++ b/src/flamenco/types/fd_bincode.h @@ -2,7 +2,6 @@ #define HEADER_fd_src_util_encoders_fd_bincode_h #include "../../util/fd_util.h" -#include "../../util/valloc/fd_valloc.h" typedef void (* fd_types_walk_fn_t)( void * self, diff --git a/src/funk/fd_funk_base.h b/src/funk/fd_funk_base.h index 5eaf0df5adb..ba4ed8926b6 100644 --- a/src/funk/fd_funk_base.h +++ b/src/funk/fd_funk_base.h @@ -43,7 +43,6 @@ in preparation (if they are not frozen). */ #include "../util/fd_util.h" -#include "../util/valloc/fd_valloc.h" /* FD_FUNK_SUCCESS is used by various APIs to indicate the operation successfully completed. This will be 0. FD_FUNK_ERR_* gives a diff --git a/src/funk/fd_funk_rec.c b/src/funk/fd_funk_rec.c index 690b353cc4e..75ab28d42bd 100644 --- a/src/funk/fd_funk_rec.c +++ b/src/funk/fd_funk_rec.c @@ -165,43 +165,6 @@ fd_funk_rec_query_try_global( fd_funk_t const * funk, return NULL; } -fd_funk_rec_t const * -fd_funk_rec_query_copy( fd_funk_t * funk, - fd_funk_txn_t const * txn, - fd_funk_rec_key_t const * key, - fd_valloc_t valloc, - ulong * sz_out ) { - *sz_out = ULONG_MAX; - fd_funk_xid_key_pair_t pair[1]; - fd_funk_rec_key_set_pair( pair, txn, key ); - - void * last_copy = NULL; - ulong last_copy_sz = 0; - for(;;) { - fd_funk_rec_query_t query[1]; - int err = fd_funk_rec_map_query_try( funk->rec_map, pair, NULL, query, 0 ); - if( err == FD_MAP_ERR_KEY ) { - if( last_copy ) fd_valloc_free( valloc, last_copy ); - return NULL; - } - if( err == FD_MAP_ERR_AGAIN ) continue; - if( err != FD_MAP_SUCCESS ) FD_LOG_CRIT(( "query returned err %d", err )); - fd_funk_rec_t const * rec = fd_funk_rec_map_query_ele_const( query ); - ulong sz = fd_funk_val_sz( rec ); - void * copy; - if( sz <= last_copy_sz ) { - copy = last_copy; - } else { - if( last_copy ) fd_valloc_free( valloc, last_copy ); - copy = last_copy = fd_valloc_malloc( valloc, 1, sz ); - last_copy_sz = sz; - } - memcpy( copy, fd_funk_val( rec, fd_funk_wksp( funk ) ), sz ); - *sz_out = sz; - if( !fd_funk_rec_query_test( query ) ) return copy; - } -} - int fd_funk_rec_query_test( fd_funk_rec_query_t * query ) { return fd_funk_rec_map_query_test( query ); diff --git a/src/funk/fd_funk_rec.h b/src/funk/fd_funk_rec.h index 699561a47f3..3e96ca301b0 100644 --- a/src/funk/fd_funk_rec.h +++ b/src/funk/fd_funk_rec.h @@ -253,21 +253,6 @@ fd_funk_rec_query_try_global( fd_funk_t const * funk, fd_funk_txn_t const ** txn_out, fd_funk_rec_query_t * query ); -/* fd_funk_rec_query_copy queries the in-preparation transaction pointed to - by txn for the record whose key matches the key pointed to by key. - - The contents of the record are safely copied into space allocated - with the valloc, and a pointer to that space is returned. If there - is an error, NULL is returned. The size of the record is returned - in sz_out. */ - -fd_funk_rec_t const * -fd_funk_rec_query_copy( fd_funk_t * funk, - fd_funk_txn_t const * txn, - fd_funk_rec_key_t const * key, - fd_valloc_t valloc, - ulong * sz_out ); - /* fd_funk_rec_{pair,xid,key} returns a pointer in the local address space of the {(transaction id,record key) pair,transaction id,record key} of a live record. Assumes rec points to a live record in the diff --git a/src/util/alloc/fd_alloc.c b/src/util/alloc/fd_alloc.c index 5dd9b8a61d0..c97da4a8aa3 100644 --- a/src/util/alloc/fd_alloc.c +++ b/src/util/alloc/fd_alloc.c @@ -1521,26 +1521,4 @@ fd_alloc_fprintf( fd_alloc_t * join, return cnt; } -/* Virtual function table - TODO type pun functions instead of using virtual wrappers? */ - -static void * -fd_alloc_malloc_virtual( void * self, - ulong align, - ulong sz ) { - return fd_alloc_malloc( (fd_alloc_t *)self, align, sz ); -} - -static void -fd_alloc_free_virtual( void * self, - void * addr ) { - fd_alloc_free( (fd_alloc_t *)self, addr ); -} - -const fd_valloc_vtable_t -fd_alloc_vtable = { - .malloc = fd_alloc_malloc_virtual, - .free = fd_alloc_free_virtual -}; - #undef TRAP diff --git a/src/util/alloc/fd_alloc.h b/src/util/alloc/fd_alloc.h index 06b01e4bcb0..6b5669d59b8 100644 --- a/src/util/alloc/fd_alloc.h +++ b/src/util/alloc/fd_alloc.h @@ -615,20 +615,6 @@ fd_alloc_max_expand( ulong max, return fd_ulong_max( fd_ulong_max( t0, t1 ), needed ); } -/* fd_alloc_vtable is the virtual function table implementing fd_valloc - for fd_alloc. */ - -extern const fd_valloc_vtable_t fd_alloc_vtable; - -/* fd_alloc_virtual returns an abstract handle to the fd_alloc join. - Valid for lifetime of join. */ - -FD_FN_CONST static inline fd_valloc_t -fd_alloc_virtual( fd_alloc_t * alloc ) { - fd_valloc_t valloc = { alloc, &fd_alloc_vtable }; - return valloc; -} - FD_PROTOTYPES_END #endif /* HEADER_fd_src_util_alloc_fd_alloc_h */ diff --git a/src/util/fd_util.h b/src/util/fd_util.h index d1420d61df8..c83bed1333f 100644 --- a/src/util/fd_util.h +++ b/src/util/fd_util.h @@ -3,18 +3,17 @@ //#include "fd_util_base.h" /* includes stdalign.h string.h limits.h float.h */ //#include "sanitize/fd_sanitize.h" /* includes fd_util_base.h (fd_asan.h fd_msan.h) */ -//#include "valloc/fd_valloc.h" /* includes fd_util_base.h */ /* FIXME: deprecate? */ //#include "bits/fd_bits.h" /* includes sanitize/fd_sanitize.h (fd_bits_find_lsb.h fd_bits_find_msb.h fd_bits_tg.h) */ //#include "io/fd_io.h" /* includes bits/fd_bits.h */ //#include "cstr/fd_cstr.h" /* includes bits/fd_bits.h */ #include "rng/fd_rng.h" /* includes bits/fd_bits.h */ -#include "spad/fd_spad.h" /* includes bits/fd_bits.h valloc/fd_valloc.h */ +#include "spad/fd_spad.h" /* includes bits/fd_bits.h */ //#include "env/fd_env.h" /* includes cstr/fd_cstr.h */ //#include "log/fd_log.h" /* includes env/fd_env.h io/fd_io.h */ //#include "checkpt/fd_checkpt.h" /* includes log/fd_log.h */ //#include "shmem/fd_shmem.h" /* includes log/fd_log.h */ //#include "tile/fd_tile.h" /* includes shmem/fd_shmem.h */ -//#include "scratch/fd_scratch.h" /* includes tile/fd_tile.h valloc/fd_valloc.h */ /* FIXME: deprecate non alloca parts? */ +//#include "scratch/fd_scratch.h" /* includes tile/fd_tile.h */ /* FIXME: deprecate non alloca parts? */ //#include "tpool/fd_tpool.h" /* includes scratch/fd_scratch.h */ //#include "wksp/fd_wksp.h" /* includes tpool/fd_tpool.h checkpt/fd_checkpt.h */ #include "alloc/fd_alloc.h" /* includes wksp/fd_wksp.h */ diff --git a/src/util/scratch/fd_scratch.c b/src/util/scratch/fd_scratch.c index f74e010cac3..7f152db20e1 100644 --- a/src/util/scratch/fd_scratch.c +++ b/src/util/scratch/fd_scratch.c @@ -13,25 +13,3 @@ FD_TL ulong fd_scratch_private_frame_max; /* 0UL on thread start */ #if FD_HAS_ALLOCA FD_TL ulong fd_alloca_check_private_sz; #endif - -/* fd_valloc virtual function table */ - -static void * -fd_scratch_malloc_virtual( void * _self, - ulong align, - ulong sz ) { - (void)_self; - return fd_scratch_alloc( align, sz ); -} - -static void -fd_scratch_free_virtual( void * _self, - void * _addr ) { - (void)_self; (void)_addr; -} - -const fd_valloc_vtable_t -fd_scratch_vtable = { - .malloc = fd_scratch_malloc_virtual, - .free = fd_scratch_free_virtual -}; diff --git a/src/util/scratch/fd_scratch.h b/src/util/scratch/fd_scratch.h index 2ffe361f2d7..e588dc29a70 100644 --- a/src/util/scratch/fd_scratch.h +++ b/src/util/scratch/fd_scratch.h @@ -10,7 +10,6 @@ temporary memory usage. */ #include "../tile/fd_tile.h" -#include "../valloc/fd_valloc.h" /* FD_SCRATCH_USE_HANDHOLDING: Define this to non-zero at compile time to turn on additional run-time checks. */ @@ -683,21 +682,6 @@ fd_scratch_trim_is_safe( void * _end ) { return 1; } -/* fd_scratch_vtable is the virtual function table implementing - fd_valloc for fd_scratch. */ - -extern const fd_valloc_vtable_t fd_scratch_vtable; - -/* fd_scratch_virtual returns an abstract handle to the fd_scratch join. - Valid for lifetime of scratch frame. fd_valloc_t must be dropped - before scratch frame changes or scratch detaches. */ - -FD_FN_CONST static inline fd_valloc_t -fd_scratch_virtual( void ) { - fd_valloc_t valloc = { NULL, &fd_scratch_vtable }; - return valloc; -} - /* FD_SCRATCH_SCOPE_{BEGIN,END} create a `do { ... } while(0);` scope in which a temporary scratch frame is available. Nested scopes are permitted. This scratch frame is automatically destroyed when diff --git a/src/util/spad/fd_spad.c b/src/util/spad/fd_spad.c index 257bc36d2e5..fb34ad1ebe0 100644 --- a/src/util/spad/fd_spad.c +++ b/src/util/spad/fd_spad.c @@ -293,24 +293,3 @@ fd_spad_publish_sanitizer_impl( fd_spad_t * spad, fd_asan_unpoison( (void*)buf, sz ); fd_msan_unpoison( (void*)buf, sz ); } - -/* fd_valloc virtual function table for spad */ -static void * -fd_spad_valloc_malloc( void * _self, - ulong align, - ulong sz ) { - fd_spad_t * spad = _self; - return fd_spad_alloc( spad, align, sz ); -} - -static void -fd_spad_valloc_free( void * _self, - void * _addr ) { - (void)_self; (void)_addr; -} - -const fd_valloc_vtable_t -fd_spad_vtable = { - .malloc = fd_spad_valloc_malloc, - .free = fd_spad_valloc_free -}; diff --git a/src/util/spad/fd_spad.h b/src/util/spad/fd_spad.h index 6750107d291..20e868f583f 100644 --- a/src/util/spad/fd_spad.h +++ b/src/util/spad/fd_spad.h @@ -29,7 +29,6 @@ sanitization. */ #include "../bits/fd_bits.h" -#include "../valloc/fd_valloc.h" // For valloc wrapper interface /* FD_SPAD_{ALIGN,FOOTPRINT} give the alignment and footprint of a fd_spad_t. ALIGN is an integer power of 2. FOOTPRINT is a multiple @@ -517,18 +516,6 @@ void * fd_spad_prepare_sanitizer_impl ( fd_spad_t * spad, ulong align, u void fd_spad_cancel_sanitizer_impl ( fd_spad_t * spad ); void fd_spad_publish_sanitizer_impl ( fd_spad_t * spad, ulong sz ); -/* fd_valloc virtual function table for spad */ -extern const fd_valloc_vtable_t fd_spad_vtable; - -/* Returns an fd_valloc handle to the fd_spad join. - Valid for lifetime of the current spad frame. Handle invalid if spad - frame changes or spad detaches. */ -FD_FN_PURE static inline fd_valloc_t -fd_spad_virtual( fd_spad_t * spad ) { - fd_valloc_t valloc = { spad, &fd_spad_vtable }; - return valloc; -} - /* fn implementations */ static inline void fd_spad_reset_impl( fd_spad_t * spad ) { diff --git a/src/util/valloc/Local.mk b/src/util/valloc/Local.mk deleted file mode 100644 index 8e81b1c0b6a..00000000000 --- a/src/util/valloc/Local.mk +++ /dev/null @@ -1,2 +0,0 @@ -$(call add-hdrs,fd_valloc.h) -$(call add-objs,fd_valloc,fd_util) diff --git a/src/util/valloc/fd_valloc.c b/src/util/valloc/fd_valloc.c deleted file mode 100644 index c6214e81701..00000000000 --- a/src/util/valloc/fd_valloc.c +++ /dev/null @@ -1,95 +0,0 @@ -#include "fd_valloc.h" -#include "../bits/fd_bits.h" -#include "../log/fd_log.h" -#include -#include -#include -#include - -static void * -fd_libc_malloc_virtual( void * _self FD_PARAM_UNUSED, - ulong align, - ulong sz ) { - return aligned_alloc( align, fd_ulong_align_up( sz, align ) ); -} - -static void -fd_libc_free_virtual( void * _self FD_PARAM_UNUSED, - void * _addr ) { - free( _addr ); -} - -#if FD_HAS_HOSTED -static volatile ushort backtracing_lock = 0; - -static void * -fd_backtracing_malloc_virtual( void * self, - ulong align, - ulong sz ) { - for(;;) { - if( FD_LIKELY( !backtracing_lock ) ) { - if( FD_LIKELY( !FD_ATOMIC_CAS( &backtracing_lock, 0, 0xFFFF ) ) ) break; - } - FD_SPIN_PAUSE(); - } - FD_COMPILER_MFENCE(); - - void * addr = fd_valloc_malloc( *(fd_valloc_t *)self, align, sz ); - void * btrace[128]; - int btrace_cnt = backtrace( btrace, 128 ); - - char buf[1024]; - int len = sprintf(buf,"+++ ALLOC:%d:0x%016lx:%lu:%lu\n", btrace_cnt, (ulong)addr, align, sz ); - if( write( STDOUT_FILENO, buf, (ulong)len )<0 ) { - FD_LOG_ERR(( "cannot write to stdout" )); - } - backtrace_symbols_fd( btrace, btrace_cnt, STDOUT_FILENO ); - if( write( STDOUT_FILENO, "---\n", 4UL )<0 ) { - FD_LOG_ERR(( "cannot write to stdout" )); - } - FD_COMPILER_MFENCE(); - backtracing_lock = 0; - return addr; -} - -static void -fd_backtracing_free_virtual( void * self, - void * addr ) { - for(;;) { - if( FD_LIKELY( !backtracing_lock ) ) { - if( FD_LIKELY( !FD_ATOMIC_CAS( &backtracing_lock, 0, 0xFFFF ) ) ) break; - } - FD_SPIN_PAUSE(); - } - FD_COMPILER_MFENCE(); - fd_valloc_free( *(fd_valloc_t *)self, addr ); - void * btrace[128]; - int btrace_cnt = backtrace( btrace, 128 ); - char buf[1024]; - int len = sprintf(buf, "+++ FREE:%d:0x%016lx\n", btrace_cnt, (ulong)addr ); - if( write( STDOUT_FILENO, buf, (ulong)len )<0 ) { - FD_LOG_ERR(( "cannot write to stdout" )); - } - backtrace_symbols_fd( btrace, btrace_cnt, STDOUT_FILENO ); - - if( write( STDOUT_FILENO, "---\n", 4UL )<0 ) { - FD_LOG_ERR(( "cannot write to stdout" )); - } - FD_COMPILER_MFENCE(); - backtracing_lock = 0; -} -#endif - -const fd_valloc_vtable_t -fd_libc_vtable = { - .malloc = fd_libc_malloc_virtual, - .free = fd_libc_free_virtual -}; - -#if FD_HAS_HOSTED -const fd_valloc_vtable_t -fd_backtracing_vtable = { - .malloc = fd_backtracing_malloc_virtual, - .free = fd_backtracing_free_virtual -}; -#endif diff --git a/src/util/valloc/fd_valloc.h b/src/util/valloc/fd_valloc.h deleted file mode 100644 index 45984dc1c4d..00000000000 --- a/src/util/valloc/fd_valloc.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef HEADER_fd_src_util_valloc_fd_valloc_h -#define HEADER_fd_src_util_valloc_fd_valloc_h - -#include "../fd_util_base.h" - -/* APIs to abstract memory allocators. */ - -typedef void * (* fd_valloc_malloc_fn_t)( void * allocator, ulong align, ulong sz ); -typedef void (* fd_valloc_free_fn_t )( void * allocator, void * ptr ); - -struct fd_valloc_vtable { - fd_valloc_malloc_fn_t malloc; - fd_valloc_free_fn_t free; -}; - -typedef struct fd_valloc_vtable fd_valloc_vtable_t; - -struct fd_valloc { - void * self; - fd_valloc_vtable_t const * vt; -}; - -typedef struct fd_valloc fd_valloc_t; - -FD_PROTOTYPES_BEGIN - -extern const fd_valloc_vtable_t fd_libc_vtable; -#if FD_HAS_HOSTED -extern const fd_valloc_vtable_t fd_backtracing_vtable; -#endif - -static inline FD_FN_CONST fd_valloc_t -fd_libc_alloc_virtual( void ) { - fd_valloc_t valloc = { NULL, &fd_libc_vtable }; - return valloc; -} - -static inline FD_FN_CONST fd_valloc_t -fd_null_alloc_virtual( void ) { - fd_valloc_t valloc = { NULL, NULL }; - return valloc; -} - -static inline FD_FN_CONST int -fd_is_null_alloc_virtual( fd_valloc_t valloc ) { - return (int)(valloc.vt == NULL); -} - -#if FD_HAS_HOSTED -/* The backtracing valloc is a debugging tool for tracking memory leaks in - applications using vallocs. It can be used in combination with - contrib/tool/leak-detector.py to find potential memory leaks. */ -static inline FD_FN_CONST fd_valloc_t -fd_backtracing_alloc_virtual( fd_valloc_t * inner_valloc ) { - fd_valloc_t valloc = { inner_valloc, &fd_backtracing_vtable }; - return valloc; -} -#endif - -static inline void * -fd_valloc_malloc( fd_valloc_t valloc, - ulong align, - ulong sz ) { - return valloc.vt->malloc( valloc.self, align, sz ); -} - -static inline void -fd_valloc_free( fd_valloc_t valloc, - void * ptr ) { - valloc.vt->free( valloc.self, ptr ); -} - -FD_PROTOTYPES_END - -#endif /* HEADER_fd_src_util_valloc_fd_valloc_h */