diff --git a/book/api/metrics-generated.md b/book/api/metrics-generated.md
index 34ab16797b2..10e5885ea53 100644
--- a/book/api/metrics-generated.md
+++ b/book/api/metrics-generated.md
@@ -542,6 +542,7 @@
| replay_accdb_reverted | counter | Number of account database records reverted |
| replay_accdb_rooted | counter | Number of account database entries rooted |
| replay_accdb_gc_root | counter | Number of account database entries garbage collected |
+| replay_accdb_reclaimed | counter | Number of account database entries reclaimed (deletion rooted) |
diff --git a/src/disco/metrics/generated/fd_metrics_replay.c b/src/disco/metrics/generated/fd_metrics_replay.c
index e3373c7b36a..09469392ec3 100644
--- a/src/disco/metrics/generated/fd_metrics_replay.c
+++ b/src/disco/metrics/generated/fd_metrics_replay.c
@@ -31,4 +31,5 @@ const fd_metrics_meta_t FD_METRICS_REPLAY[FD_METRICS_REPLAY_TOTAL] = {
DECLARE_METRIC( REPLAY_ACCDB_REVERTED, COUNTER ),
DECLARE_METRIC( REPLAY_ACCDB_ROOTED, COUNTER ),
DECLARE_METRIC( REPLAY_ACCDB_GC_ROOT, COUNTER ),
+ DECLARE_METRIC( REPLAY_ACCDB_RECLAIMED, COUNTER ),
};
diff --git a/src/disco/metrics/generated/fd_metrics_replay.h b/src/disco/metrics/generated/fd_metrics_replay.h
index 2a682e6c4b0..453f38b0ebf 100644
--- a/src/disco/metrics/generated/fd_metrics_replay.h
+++ b/src/disco/metrics/generated/fd_metrics_replay.h
@@ -192,7 +192,13 @@
#define FD_METRICS_COUNTER_REPLAY_ACCDB_GC_ROOT_DESC "Number of account database entries garbage collected"
#define FD_METRICS_COUNTER_REPLAY_ACCDB_GC_ROOT_CVT (FD_METRICS_CONVERTER_NONE)
-#define FD_METRICS_REPLAY_TOTAL (29UL)
+#define FD_METRICS_COUNTER_REPLAY_ACCDB_RECLAIMED_OFF (141UL)
+#define FD_METRICS_COUNTER_REPLAY_ACCDB_RECLAIMED_NAME "replay_accdb_reclaimed"
+#define FD_METRICS_COUNTER_REPLAY_ACCDB_RECLAIMED_TYPE (FD_METRICS_TYPE_COUNTER)
+#define FD_METRICS_COUNTER_REPLAY_ACCDB_RECLAIMED_DESC "Number of account database entries reclaimed (deletion rooted)"
+#define FD_METRICS_COUNTER_REPLAY_ACCDB_RECLAIMED_CVT (FD_METRICS_CONVERTER_NONE)
+
+#define FD_METRICS_REPLAY_TOTAL (30UL)
extern const fd_metrics_meta_t FD_METRICS_REPLAY[FD_METRICS_REPLAY_TOTAL];
#endif /* HEADER_fd_src_disco_metrics_generated_fd_metrics_replay_h */
diff --git a/src/disco/metrics/metrics.xml b/src/disco/metrics/metrics.xml
index ed293dbba30..c54a3a07012 100644
--- a/src/disco/metrics/metrics.xml
+++ b/src/disco/metrics/metrics.xml
@@ -814,6 +814,7 @@ metric introduced.
+
diff --git a/src/discof/replay/fd_replay_tile.c b/src/discof/replay/fd_replay_tile.c
index 4365a0cb40e..7fea63fbccf 100644
--- a/src/discof/replay/fd_replay_tile.c
+++ b/src/discof/replay/fd_replay_tile.c
@@ -498,10 +498,11 @@ metrics_write( fd_replay_tile_t * ctx ) {
FD_MCNT_SET( REPLAY, PROGCACHE_ROOTED, ctx->progcache_admin->metrics.root_cnt );
FD_MCNT_SET( REPLAY, PROGCACHE_GC_ROOT, ctx->progcache_admin->metrics.gc_root_cnt );
- FD_MCNT_SET( REPLAY, ACCDB_CREATED, ctx->accdb->base.created_cnt );
- FD_MCNT_SET( REPLAY, ACCDB_REVERTED, ctx->accdb_admin->metrics.revert_cnt );
- FD_MCNT_SET( REPLAY, ACCDB_ROOTED, ctx->accdb_admin->metrics.root_cnt );
- FD_MCNT_SET( REPLAY, ACCDB_GC_ROOT, ctx->accdb_admin->metrics.gc_root_cnt );
+ FD_MCNT_SET( REPLAY, ACCDB_CREATED, ctx->accdb->base.created_cnt );
+ FD_MCNT_SET( REPLAY, ACCDB_REVERTED, ctx->accdb_admin->metrics.revert_cnt );
+ FD_MCNT_SET( REPLAY, ACCDB_ROOTED, ctx->accdb_admin->metrics.root_cnt );
+ FD_MCNT_SET( REPLAY, ACCDB_GC_ROOT, ctx->accdb_admin->metrics.gc_root_cnt );
+ FD_MCNT_SET( REPLAY, ACCDB_RECLAIMED, ctx->accdb_admin->metrics.reclaim_cnt );
}
static inline ulong
diff --git a/src/flamenco/accdb/fd_accdb_admin.c b/src/flamenco/accdb/fd_accdb_admin.c
index faed5426182..79ddb1ba66d 100644
--- a/src/flamenco/accdb/fd_accdb_admin.c
+++ b/src/flamenco/accdb/fd_accdb_admin.c
@@ -1,4 +1,5 @@
#include "fd_accdb_admin.h"
+#include "../fd_flamenco_base.h"
fd_accdb_admin_t *
fd_accdb_admin_join( fd_accdb_admin_t * ljoin,
@@ -214,6 +215,36 @@ fd_accdb_cancel( fd_accdb_admin_t * accdb,
fd_accdb_txn_cancel_tree( accdb, txn );
}
+/* fd_accdb_chain_reclaim "reclaims" a zero-lamport account by removing
+ its underlying record. */
+
+static void
+fd_accdb_chain_reclaim( fd_accdb_admin_t * accdb,
+ fd_funk_rec_t * rec ) {
+ fd_funk_t * funk = accdb->funk;
+
+ /* Phase 1: Remove record from map */
+
+ fd_funk_xid_key_pair_t pair = rec->pair;
+ fd_funk_rec_query_t query[1];
+ int rm_err = fd_funk_rec_map_remove( funk->rec_map, &pair, NULL, query, FD_MAP_FLAG_BLOCKING );
+ if( FD_UNLIKELY( rm_err!=FD_MAP_SUCCESS ) ) FD_LOG_CRIT(( "fd_funk_rec_map_remove failed (%i-%s)", rm_err, fd_map_strerror( rm_err ) ));
+ FD_COMPILER_MFENCE();
+
+ /* Phase 2: Invalidate record */
+
+ fd_funk_rec_t * old_rec = query->ele;
+ memset( &old_rec->pair, 0, sizeof(fd_funk_xid_key_pair_t) );
+ FD_COMPILER_MFENCE();
+
+ /* Phase 3: Free record */
+
+ old_rec->map_next = FD_FUNK_REC_IDX_NULL;
+ fd_funk_val_flush( old_rec, funk->alloc, funk->wksp );
+ fd_funk_rec_pool_release( funk->rec_pool, old_rec, 1 );
+ accdb->metrics.reclaim_cnt++;
+}
+
/* fd_accdb_chain_gc_root cleans up a stale "rooted" version of a
record. */
@@ -227,7 +258,8 @@ fd_accdb_chain_gc_root( fd_accdb_admin_t * accdb,
fd_funk_rec_query_t query[1];
int rm_err = fd_funk_rec_map_remove( funk->rec_map, pair, NULL, query, FD_MAP_FLAG_BLOCKING );
if( rm_err==FD_MAP_ERR_KEY ) return;
- if( FD_UNLIKELY( rm_err!=FD_MAP_SUCCESS ) ) FD_LOG_CRIT(( "fd_funk_rec_map_remove failed: %i-%s", rm_err, fd_map_strerror( rm_err ) ));
+ if( FD_UNLIKELY( rm_err!=FD_MAP_SUCCESS ) ) FD_LOG_CRIT(( "fd_funk_rec_map_remove failed (%i-%s)", rm_err, fd_map_strerror( rm_err ) ));
+ FD_COMPILER_MFENCE();
/* Phase 2: Invalidate record */
@@ -257,6 +289,7 @@ fd_accdb_publish_recs( fd_accdb_admin_t * accdb,
uint head = txn->rec_head_idx;
txn->rec_head_idx = FD_FUNK_REC_IDX_NULL;
txn->rec_tail_idx = FD_FUNK_REC_IDX_NULL;
+ fd_wksp_t * funk_wksp = accdb->funk->wksp;
while( !fd_funk_rec_idx_is_null( head ) ) {
fd_funk_rec_t * rec = &accdb->funk->rec_pool->ele[ head ];
@@ -266,13 +299,21 @@ fd_accdb_publish_recs( fd_accdb_admin_t * accdb,
fd_funk_txn_xid_set_root( pair->xid );
fd_accdb_chain_gc_root( accdb, pair );
- /* Migrate record to root */
+ /* Root or reclaim record */
uint next = rec->next_idx;
- rec->prev_idx = FD_FUNK_REC_IDX_NULL;
- rec->next_idx = FD_FUNK_REC_IDX_NULL;
- fd_funk_txn_xid_t const root = { .ul = { ULONG_MAX, ULONG_MAX } };
- fd_funk_txn_xid_st_atomic( rec->pair.xid, &root );
- accdb->metrics.root_cnt++;
+ fd_account_meta_t const * meta = fd_funk_val( rec, funk_wksp );
+ FD_CRIT( meta && rec->val_sz>=sizeof(fd_account_meta_t), "invalid funk record value" );
+ if( FD_LIKELY( meta->lamports ) ) {
+ /* Migrate record to root */
+ rec->prev_idx = FD_FUNK_REC_IDX_NULL;
+ rec->next_idx = FD_FUNK_REC_IDX_NULL;
+ fd_funk_txn_xid_t const root = { .ul = { ULONG_MAX, ULONG_MAX } };
+ fd_funk_txn_xid_st_atomic( rec->pair.xid, &root );
+ accdb->metrics.root_cnt++;
+ } else {
+ /* Remove record */
+ fd_accdb_chain_reclaim( accdb, rec );
+ }
head = next; /* next record */
}
diff --git a/src/flamenco/accdb/fd_accdb_admin.h b/src/flamenco/accdb/fd_accdb_admin.h
index 24fe44891bf..37adf1365c4 100644
--- a/src/flamenco/accdb/fd_accdb_admin.h
+++ b/src/flamenco/accdb/fd_accdb_admin.h
@@ -7,9 +7,10 @@ struct fd_accdb_admin {
fd_funk_t funk[1];
struct {
- ulong root_cnt;
- ulong gc_root_cnt;
- ulong revert_cnt;
+ ulong root_cnt; /* moved to database root */
+ ulong reclaim_cnt; /* 0 lamport account removed while rooting */
+ ulong gc_root_cnt; /* stale rooted revisions removed while rooting */
+ ulong revert_cnt; /* abandoned by consensus */
} metrics;
};
diff --git a/src/flamenco/accdb/fd_accdb_ref.h b/src/flamenco/accdb/fd_accdb_ref.h
index c2865c7ff8e..a1fe53b26ea 100644
--- a/src/flamenco/accdb/fd_accdb_ref.h
+++ b/src/flamenco/accdb/fd_accdb_ref.h
@@ -170,26 +170,6 @@ fd_accdb_ref_slot_set( fd_accdb_rw_t * rw,
FD_PROTOTYPES_END
-/* fd_accdb_guardr_t tracks a rwlock being held as read-only.
- Destroying this guard object detaches the caller's thread from the
- rwlock. */
-
-struct fd_accbd_guardr {
- fd_rwlock_t * rwlock;
-};
-
-typedef struct fd_accdb_guardr fd_accdb_guardr_t;
-
-/* fd_accdb_guardw_t tracks an rwlock being held exclusively.
- Destroying this guard object detaches the caller's thread from the
- lock. */
-
-struct fd_accdb_guardw {
- fd_rwlock_t * rwlock;
-};
-
-typedef struct fd_accdb_guardw fd_accdb_guardw_t;
-
/* fd_accdb_spec_t tracks a speculative access to a shared resource.
Destroying this guard object marks the end of a speculative access. */
diff --git a/src/flamenco/progcache/fd_prog_load.c b/src/flamenco/progcache/fd_prog_load.c
index 04e8f599f06..79652006271 100644
--- a/src/flamenco/progcache/fd_prog_load.c
+++ b/src/flamenco/progcache/fd_prog_load.c
@@ -63,7 +63,7 @@ fd_get_executable_program_content_for_upgradeable_loader( fd_funk_t const *
fd_pubkey_t * programdata_address = &program_account_state->inner.program.programdata_address;
fd_account_meta_t const * meta = fd_funk_get_acc_meta_readonly(
- funk, xid, programdata_address, NULL, NULL, out_xid );
+ funk, xid, programdata_address, out_xid );
if( FD_UNLIKELY( !meta ) ) return NULL;
fd_txn_account_t _rec[1];
fd_txn_account_t * programdata_acc = fd_txn_account_join( fd_txn_account_new( _rec, programdata_address, (void *)meta, 0 ) );
@@ -114,7 +114,7 @@ fd_prog_load_elf( fd_accdb_user_t * accdb,
fd_funk_txn_xid_t _out_xid;
if( !out_xid ) out_xid = &_out_xid;
fd_account_meta_t const * meta = fd_funk_get_acc_meta_readonly(
- funk, xid, &prog_addr, NULL, NULL, out_xid );
+ funk, xid, &prog_addr, out_xid );
if( FD_UNLIKELY( !meta ) ) return NULL;
fd_txn_account_t _rec[1];
fd_txn_account_t * rec = fd_txn_account_join( fd_txn_account_new( _rec, &prog_addr, (void *)meta, 0 ) );
diff --git a/src/flamenco/progcache/fd_progcache_admin.c b/src/flamenco/progcache/fd_progcache_admin.c
index 9b154fcca51..f5b2d2e92d8 100644
--- a/src/flamenco/progcache/fd_progcache_admin.c
+++ b/src/flamenco/progcache/fd_progcache_admin.c
@@ -220,6 +220,7 @@ fd_progcache_gc_root( fd_progcache_admin_t * cache,
int rm_err = fd_funk_rec_map_remove( funk->rec_map, pair, NULL, query, FD_MAP_FLAG_BLOCKING );
if( rm_err==FD_MAP_ERR_KEY ) return;
if( FD_UNLIKELY( rm_err!=FD_MAP_SUCCESS ) ) FD_LOG_CRIT(( "fd_funk_rec_map_remove failed: %i-%s", rm_err, fd_map_strerror( rm_err ) ));
+ FD_COMPILER_MFENCE();
/* Phase 2: Invalidate record */
diff --git a/src/flamenco/runtime/fd_acc_mgr.c b/src/flamenco/runtime/fd_acc_mgr.c
index d5eb5f4205f..1c9d9009850 100644
--- a/src/flamenco/runtime/fd_acc_mgr.c
+++ b/src/flamenco/runtime/fd_acc_mgr.c
@@ -5,8 +5,6 @@ fd_account_meta_t const *
fd_funk_get_acc_meta_readonly( fd_funk_t const * funk,
fd_funk_txn_xid_t const * xid,
fd_pubkey_t const * pubkey,
- fd_funk_rec_t const ** orec,
- int * opt_err,
fd_funk_txn_xid_t * out_xid ) {
fd_funk_rec_key_t id = fd_funk_acc_key( pubkey );
@@ -14,43 +12,32 @@ fd_funk_get_acc_meta_readonly( fd_funk_t const * funk,
nothing else will change that account. If the account is writable in the solana txn,
then we copy the data. If the account is read-only, we do not. This is safe because of
the read-write locks that the solana transaction holds on the account. */
- for( ; ; ) {
+
+ for(;;) {
+
+ /* Locate the account record */
fd_funk_rec_query_t query[1];
fd_funk_rec_t const * rec = fd_funk_rec_query_try_global( funk, xid, &id, out_xid, query );
-
if( FD_UNLIKELY( !rec ) ) {
- fd_int_store_if( !!opt_err, opt_err, FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT );
return NULL;
}
- if( NULL != orec )
- *orec = rec;
- void const * raw = fd_funk_val( rec, fd_funk_wksp( funk ) );
+ /* Read account balance */
+ void const * raw = fd_funk_val( rec, fd_funk_wksp( funk ) );
fd_account_meta_t const * metadata = fd_type_pun_const( raw );
- if( FD_UNLIKELY( metadata->lamports==0UL ) ) {
- fd_int_store_if( !!opt_err, opt_err, FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT );
- if( NULL != orec ) *orec = NULL;
+ ulong const lamports = metadata->lamports;
+ if( FD_UNLIKELY( !lamports ) ) {
+ /* This account is awaiting deletion */
return NULL;
}
- fd_int_store_if( !!opt_err, opt_err, FD_ACC_MGR_SUCCESS );
- return metadata;
- }
+ /* Recover from overruns (e.g. account rooted) */
- /* unreachable */
- return NULL;
-}
+ if( FD_LIKELY( fd_funk_rec_map_query_test( query )==FD_MAP_SUCCESS ) ) {
+ return metadata;
+ }
-FD_FN_CONST char const *
-fd_acc_mgr_strerror( int err ) {
- switch( err ) {
- case FD_ACC_MGR_SUCCESS:
- return "success";
- case FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT:
- return "unknown account";
- default:
- return "unknown";
}
}
diff --git a/src/flamenco/runtime/fd_acc_mgr.h b/src/flamenco/runtime/fd_acc_mgr.h
index c9bf9e41574..541e315d724 100644
--- a/src/flamenco/runtime/fd_acc_mgr.h
+++ b/src/flamenco/runtime/fd_acc_mgr.h
@@ -112,9 +112,6 @@ fd_funk_acc_key( fd_pubkey_t const * pubkey ) {
On success:
- loads the account data into in-memory cache
- returns a pointer to it in the caller's local address space
- - if out_rec!=NULL, sets *out_rec to a pointer to the funk rec.
- This handle is suitable as opt_con_rec for fd_funk_get_acc_meta_readonly.
- - notably, leaves *opt_err untouched, even if opt_err!=NULL
First byte of returned pointer is first byte of fd_account_meta_t.
To find data region of account, add sizeof(fd_account_meta_t).
@@ -122,12 +119,7 @@ fd_funk_acc_key( fd_pubkey_t const * pubkey ) {
Lifetime of returned fd_funk_rec_t and account record pointers ends
when user calls modify_data for same account, or tranasction ends.
- On failure, returns NULL, and sets *opt_err if opt_err!=NULL.
- Reasons for error include
- - account not found
- - internal database or user error (out of memory, attempting to view
- record which has an active modify_data handle, etc.)
- - the account is a tombstone (0 lamports)
+ If the account was not found, returns NULL.
It is always wrong to cast return value to a non-const pointer.
Instead, use fd_funk_get_acc_meta_mutable to acquire a mutable handle.
@@ -142,18 +134,8 @@ fd_account_meta_t const *
fd_funk_get_acc_meta_readonly( fd_funk_t const * funk,
fd_funk_txn_xid_t const * xid,
fd_pubkey_t const * pubkey,
- fd_funk_rec_t const ** orec,
- int * opt_err,
fd_funk_txn_xid_t * xid_out );
-/* fd_acc_mgr_strerror converts an fd_acc_mgr error code into a human
- readable cstr. The lifetime of the returned pointer is infinite and
- the call itself is thread safe. The returned pointer is always to a
- non-NULL cstr. */
-
-FD_FN_CONST char const *
-fd_acc_mgr_strerror( int err );
-
FD_PROTOTYPES_END
#endif /* HEADER_fd_src_flamenco_runtime_fd_acc_mgr_h */
diff --git a/src/flamenco/runtime/fd_core_bpf_migration.c b/src/flamenco/runtime/fd_core_bpf_migration.c
index cea0cf4f5d3..0ffd23bdb16 100644
--- a/src/flamenco/runtime/fd_core_bpf_migration.c
+++ b/src/flamenco/runtime/fd_core_bpf_migration.c
@@ -33,18 +33,12 @@ tmp_account_read( fd_tmp_account_t * acc,
fd_funk_t * funk,
fd_funk_txn_xid_t const * xid,
fd_pubkey_t const * addr ) {
- int opt_err = 0;
fd_account_meta_t const * meta = fd_funk_get_acc_meta_readonly(
funk,
xid,
addr,
- NULL,
- &opt_err,
NULL );
- if( FD_UNLIKELY( opt_err!=FD_ACC_MGR_SUCCESS ) ) {
- if( FD_LIKELY( opt_err==FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT ) ) return NULL;
- FD_LOG_CRIT(( "fd_funk_get_acc_meta_readonly failed (%d)", opt_err ));
- }
+ if( FD_LIKELY( !meta ) ) return NULL;
tmp_account_new( acc, meta->dlen );
acc->meta = *meta;
acc->addr = *addr;
@@ -136,19 +130,14 @@ target_builtin_new_checked( target_builtin_t * target_builtin,
break;
case FD_CORE_BPF_MIGRATION_TARGET_STATELESS: {
/* Program account should not exist */
- int opt_err = 0;
- fd_funk_get_acc_meta_readonly(
+ int progdata_exists = !!fd_funk_get_acc_meta_readonly(
funk,
xid,
program_address,
- NULL,
- &opt_err,
NULL );
- if( opt_err==FD_ACC_MGR_SUCCESS ) {
+ if( progdata_exists ) {
/* CoreBpfMigrationError::AccountAlreadyExists(*program_address) */
return NULL;
- } else if( opt_err!=FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT ) {
- FD_LOG_ERR(( "database error: %d", opt_err ));
}
break;
}
@@ -164,19 +153,14 @@ target_builtin_new_checked( target_builtin_t * target_builtin,
do {
/* Program data account should not exist */
- int opt_err = 0;
- fd_funk_get_acc_meta_readonly(
+ int progdata_exists = !!fd_funk_get_acc_meta_readonly(
funk,
xid,
&program_data_address,
- NULL,
- &opt_err,
NULL );
- if( opt_err==FD_ACC_MGR_SUCCESS ) {
+ if( progdata_exists ) {
/* CoreBpfMigrationError::AccountAlreadyExists(*program_address) */
return NULL;
- } else if( opt_err!=FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT ) {
- FD_LOG_ERR(( "database error: %d", opt_err ));
}
} while(0);
diff --git a/src/flamenco/runtime/fd_executor.c b/src/flamenco/runtime/fd_executor.c
index a764085d112..1493c5c5360 100644
--- a/src/flamenco/runtime/fd_executor.c
+++ b/src/flamenco/runtime/fd_executor.c
@@ -606,8 +606,8 @@ fd_executor_load_transaction_accounts_old( fd_runtime_t * runtime,
https://github.com/anza-xyz/agave/blob/v2.2.0/svm/src/account_loader.rs#L496-L517 */
fd_pubkey_t const * owner_pubkey = (fd_pubkey_t const *)program_meta->owner;
- fd_account_meta_t const * owner_account = fd_funk_get_acc_meta_readonly( runtime->funk, &xid, owner_pubkey, NULL, &err, NULL );
- if( FD_UNLIKELY( err!=FD_ACC_MGR_SUCCESS ) ) {
+ fd_account_meta_t const * owner_account = fd_funk_get_acc_meta_readonly( runtime->funk, &xid, owner_pubkey, NULL );
+ if( FD_UNLIKELY( !owner_account ) ) {
/* https://github.com/anza-xyz/agave/blob/v2.2.0/svm/src/account_loader.rs#L520 */
return FD_RUNTIME_TXN_ERR_PROGRAM_ACCOUNT_NOT_FOUND;
}
@@ -717,11 +717,9 @@ fd_collect_loaded_account( fd_runtime_t * runtime,
runtime->funk,
&xid,
&loader_state->inner.program.programdata_address,
- NULL,
- &err,
NULL );
- if( FD_UNLIKELY( err!=FD_ACC_MGR_SUCCESS ) ) {
+ if( FD_UNLIKELY( !programdata_meta ) ) {
return FD_RUNTIME_EXECUTE_SUCCESS;
}
@@ -975,15 +973,12 @@ fd_executor_create_rollback_fee_payer_account( fd_runtime_t * runtime,
}
}
- int err = FD_ACC_MGR_SUCCESS;
if( !meta ) {
fd_funk_txn_xid_t xid = { .ul = { fd_bank_slot_get( bank ), bank->idx } };
meta = fd_funk_get_acc_meta_readonly(
runtime->funk,
&xid,
fee_payer_key,
- NULL,
- &err,
NULL );
if( FD_UNLIKELY( !meta ) ) FD_LOG_CRIT(( "fd_funk_get_acc_meta_readonly failed" ));
}
@@ -1444,22 +1439,14 @@ fd_executor_setup_txn_account( fd_runtime_t * runtime,
}
}
- int err = FD_ACC_MGR_SUCCESS;
if( FD_LIKELY( !meta ) ) {
fd_funk_txn_xid_t xid = { .ul = { fd_bank_slot_get( bank ), bank->idx } };
meta = fd_funk_get_acc_meta_readonly(
runtime->funk,
&xid,
acc,
- NULL,
- &err,
NULL );
}
- /* If there is an error with a read from the accounts database, it is
- unexpected unless the account does not exist. */
- if( FD_UNLIKELY( err!=FD_ACC_MGR_SUCCESS && err!=FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT ) ) {
- FD_LOG_CRIT(( "fd_txn_account_init_from_funk_readonly err=%d", err ));
- }
fd_account_meta_t * account_meta = NULL;
@@ -1488,7 +1475,7 @@ fd_executor_setup_txn_account( fd_runtime_t * runtime,
if the account does not exist, we need to initialize a new
metadata. */
- if( FD_LIKELY( err==FD_ACC_MGR_SUCCESS ) ) {
+ if( FD_LIKELY( meta ) ) {
account_meta = (fd_account_meta_t *)meta;
} else if( fd_pubkey_eq( acc, &fd_sysvar_instructions_id ) ) {
account_meta = fd_type_pun( runtime->accounts.sysvar_instructions_mem );
@@ -1530,10 +1517,8 @@ fd_executor_setup_executable_account( fd_runtime_t * runtime,
runtime->funk,
&xid,
programdata_acc,
- NULL,
- &err,
NULL );
- if( FD_LIKELY( err==FD_ACC_MGR_SUCCESS ) ) {
+ if( FD_LIKELY( meta ) ) {
runtime->accounts.executable_pubkeys[*executable_idx] = *programdata_acc;
runtime->accounts.executables_meta[*executable_idx] = (fd_account_meta_t *)meta;
(*executable_idx)++;
diff --git a/src/flamenco/runtime/program/fd_system_program_nonce.c b/src/flamenco/runtime/program/fd_system_program_nonce.c
index 6698c185353..939dff04fb2 100644
--- a/src/flamenco/runtime/program/fd_system_program_nonce.c
+++ b/src/flamenco/runtime/program/fd_system_program_nonce.c
@@ -1019,12 +1019,10 @@ fd_check_transaction_age( fd_runtime_t * runtime,
runtime->funk,
&xid,
&txn_out->accounts.keys[ instr_accts[ 0UL ] ],
- NULL,
- &err,
NULL );
ulong acc_data_len = meta->dlen;
- if( FD_UNLIKELY( err!=FD_ACC_MGR_SUCCESS ) ) {
+ if( FD_UNLIKELY( !meta ) ) {
return FD_RUNTIME_TXN_ERR_BLOCKHASH_FAIL_ADVANCE_NONCE_INSTR;
}
diff --git a/src/flamenco/runtime/test_deprecate_rent_exemption_threshold.c b/src/flamenco/runtime/test_deprecate_rent_exemption_threshold.c
index 2b0e0df76bc..a689e61cc0c 100644
--- a/src/flamenco/runtime/test_deprecate_rent_exemption_threshold.c
+++ b/src/flamenco/runtime/test_deprecate_rent_exemption_threshold.c
@@ -221,14 +221,9 @@ verify_rent_values( test_env_t * env,
static int
rent_was_modified_in_txn( test_env_t * env,
fd_funk_txn_xid_t const * xid ) {
- fd_funk_t * funk = fd_accdb_user_v1_funk( env->accdb );
- fd_funk_rec_key_t key;
- fd_memcpy( key.uc, fd_sysvar_rent_id.key, FD_PUBKEY_FOOTPRINT );
- fd_funk_txn_xid_t xid_out;
- fd_funk_rec_query_t query[1];
-
- fd_funk_rec_query_try_global( funk, xid, &key, &xid_out, query );
- return fd_funk_txn_xid_eq( &xid_out, xid );
+ fd_accdb_peek_t peek[1];
+ FD_TEST( fd_accdb_peek( env->accdb, peek, xid, &fd_sysvar_rent_id ) );
+ return fd_funk_txn_xid_eq( peek->acc->rec->pair.xid, xid );
}
static int
diff --git a/src/flamenco/runtime/tests/fd_harness_common.c b/src/flamenco/runtime/tests/fd_harness_common.c
index 24896316237..83e6852597e 100644
--- a/src/flamenco/runtime/tests/fd_harness_common.c
+++ b/src/flamenco/runtime/tests/fd_harness_common.c
@@ -25,7 +25,7 @@ fd_solfuzz_pb_load_account( fd_runtime_t * runtime,
/* Account must not yet exist */
fd_funk_t * funk = fd_accdb_user_v1_funk( accdb );
- if( FD_UNLIKELY( fd_funk_get_acc_meta_readonly( funk, xid, pubkey, NULL, NULL, NULL) ) ) {
+ if( FD_UNLIKELY( fd_funk_get_acc_meta_readonly( funk, xid, pubkey, NULL ) ) ) {
return 0;
}
diff --git a/src/flamenco/stakes/fd_stake_delegations.c b/src/flamenco/stakes/fd_stake_delegations.c
index a3977d3f325..8efc63b46e8 100644
--- a/src/flamenco/stakes/fd_stake_delegations.c
+++ b/src/flamenco/stakes/fd_stake_delegations.c
@@ -356,16 +356,15 @@ fd_stake_delegations_refresh( fd_stake_delegations_t * stake_delegations,
continue;
}
- int err = 0;
- fd_account_meta_t const * meta = fd_funk_get_acc_meta_readonly( funk, xid, &stake_delegation->stake_account, NULL, &err, NULL );
- if( FD_UNLIKELY( err ) ) {
+ fd_account_meta_t const * meta = fd_funk_get_acc_meta_readonly( funk, xid, &stake_delegation->stake_account, NULL );
+ if( FD_UNLIKELY( !meta ) ) {
fd_stake_delegation_map_idx_remove( stake_delegation_map, &stake_delegation->stake_account, ULONG_MAX, stake_delegation_pool );
fd_stake_delegation_pool_idx_release( stake_delegation_pool, i );
continue;
}
fd_stake_state_v2_t stake_state;
- err = fd_stake_get_state( meta, &stake_state );
+ int err = fd_stake_get_state( meta, &stake_state );
if( FD_UNLIKELY( err ) ) {
fd_stake_delegation_map_idx_remove( stake_delegation_map, &stake_delegation->stake_account, ULONG_MAX, stake_delegation_pool );
fd_stake_delegation_pool_idx_release( stake_delegation_pool, i );
diff --git a/src/funk/fd_funk_rec.h b/src/funk/fd_funk_rec.h
index 115056a5bfb..68580f81efb 100644
--- a/src/funk/fd_funk_rec.h
+++ b/src/funk/fd_funk_rec.h
@@ -107,32 +107,7 @@ FD_FN_CONST static inline int fd_funk_rec_idx_is_null( uint idx ) { return idx==
/* Accessors */
-/* fd_funk_rec_query_try queries the in-preparation transaction pointed to
- by txn for the record whose key matches the key pointed to by key.
- If txn is NULL, the query will be done for the funk's last published
- transaction. Returns a pointer to current record on success and NULL
- on failure. Reasons for failure include txn is neither NULL nor a
- pointer to a in-preparation transaction, key is NULL or not a record
- in the given transaction.
-
- The returned pointer is in the caller's address space if the
- return value is non-NULL.
-
- Assumes funk is a current local join (NULL returns NULL), txn is NULL
- or points to an in-preparation transaction in the caller's address
- space, key points to a record key in the caller's address space (NULL
- returns NULL), and no concurrent operations on funk, txn or key.
- funk retains no interest in key. The funk retains ownership of any
- returned record.
-
- The query argument remembers the query for later validity testing.
-
- This is reasonably fast O(1).
-
- Important safety tip! This function can encounter records
- that have the ERASE flag set (i.e. are tombstones of erased
- records). fd_funk_rec_query_try will still return the record in this
- case, and the application should check for the flag. */
+/* FIXME deprecate */
fd_funk_rec_t *
fd_funk_rec_query_try( fd_funk_t * funk,