Skip to content

Commit 1519da7

Browse files
committed
runtime: port finalize_account to accdb API
1 parent c2a7d15 commit 1519da7

File tree

4 files changed

+40
-82
lines changed

4 files changed

+40
-82
lines changed

src/flamenco/runtime/fd_runtime.c

Lines changed: 38 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "fd_runtime_stack.h"
1010

1111
#include "fd_executor.h"
12+
#include "fd_txn_account.h"
1213
#include "sysvar/fd_sysvar_cache.h"
1314
#include "sysvar/fd_sysvar_clock.h"
1415
#include "sysvar/fd_sysvar_epoch_schedule.h"
@@ -37,7 +38,6 @@
3738

3839
#include "../../disco/pack/fd_pack.h"
3940
#include "../../disco/pack/fd_pack_tip_prog_blacklist.h"
40-
#include "../../disco/genesis/fd_genesis_cluster.h"
4141

4242
#include <unistd.h>
4343
#include <sys/stat.h>
@@ -1010,56 +1010,31 @@ fd_runtime_pre_execute_check( fd_runtime_t * runtime,
10101010
a writable transaction account back into the accountsdb. */
10111011

10121012
static void
1013-
fd_runtime_finalize_account( fd_funk_t * funk,
1013+
fd_runtime_finalize_account( fd_accdb_user_t * accdb,
10141014
fd_funk_txn_xid_t const * xid,
10151015
fd_pubkey_t const * pubkey,
1016-
fd_account_meta_t * meta,
1017-
fd_funk_rec_t * prev_rec ) {
1018-
1019-
uchar const * record_data = (uchar *)meta;
1020-
ulong record_sz = fd_account_meta_get_record_sz( meta );
1021-
1022-
int err = FD_FUNK_SUCCESS;
1023-
1024-
if( !prev_rec || !fd_funk_txn_xid_eq( prev_rec->pair.xid, xid ) ) {
1025-
1026-
fd_funk_rec_key_t funk_key = fd_funk_acc_key( pubkey );
1027-
fd_funk_rec_prepare_t prepare[1];
1028-
fd_funk_rec_t * rec = fd_funk_rec_prepare( funk, xid, &funk_key, prepare, &err );
1029-
if( FD_UNLIKELY( !rec || err!=FD_FUNK_SUCCESS ) ) {
1030-
FD_LOG_ERR(( "fd_runtime_finalize_account: failed to prepare record (%i-%s)", err, fd_funk_strerror( err ) ));
1031-
}
1032-
1033-
if( FD_UNLIKELY( !fd_funk_val_truncate(
1034-
rec,
1035-
fd_funk_alloc( funk ),
1036-
fd_funk_wksp( funk ),
1037-
0UL,
1038-
record_sz,
1039-
&err ) ) ) {
1040-
FD_LOG_ERR(( "fd_funk_val_truncate(sz=%lu) for account failed (%i-%s)", record_sz, err, fd_funk_strerror( err ) ));
1041-
}
1042-
1043-
fd_memcpy( fd_funk_val( rec, fd_funk_wksp( funk ) ), record_data, record_sz );
1044-
1045-
fd_funk_rec_publish( funk, prepare );
1046-
1047-
} else {
1048-
1049-
if( FD_UNLIKELY( !fd_funk_val_truncate(
1050-
prev_rec,
1051-
fd_funk_alloc( funk ),
1052-
fd_funk_wksp( funk ),
1053-
0UL,
1054-
record_sz,
1055-
&err ) ) ) {
1056-
FD_LOG_ERR(( "fd_funk_val_truncate(sz=%lu) for account failed (%i-%s)", record_sz, err, fd_funk_strerror( err ) ));
1057-
}
1058-
1059-
fd_memcpy( fd_funk_val( prev_rec, fd_funk_wksp( funk ) ), record_data, record_sz );
1060-
1061-
}
1016+
fd_account_meta_t * meta ) {
1017+
/* FIXME if account doesn't change according to LtHash, don't update
1018+
database record */
10621019

1020+
fd_accdb_rw_t rw[1];
1021+
int rw_ok = !!fd_accdb_open_rw(
1022+
accdb,
1023+
rw,
1024+
xid,
1025+
pubkey,
1026+
meta->dlen,
1027+
FD_ACCDB_FLAG_CREATE|FD_ACCDB_FLAG_TRUNCATE );
1028+
if( FD_UNLIKELY( !rw_ok ) ) FD_LOG_CRIT(( "fd_accdb_open_rw failed" ));
1029+
1030+
void const * data = fd_account_data( meta );
1031+
fd_accdb_ref_lamports_set( rw, meta->lamports );
1032+
fd_accdb_ref_owner_set ( rw, meta->owner );
1033+
fd_accdb_ref_exec_bit_set( rw, meta->executable );
1034+
fd_accdb_ref_data_set ( rw, data, meta->dlen );
1035+
fd_accdb_ref_slot_set ( rw, xid->ul[0] );
1036+
1037+
fd_accdb_close_rw( accdb, rw );
10631038
}
10641039

10651040
/* fd_runtime_save_account is a convenience wrapper that looks
@@ -1088,40 +1063,34 @@ fd_runtime_finalize_account( fd_funk_t * funk,
10881063
All non-optional pointers must be valid. */
10891064

10901065
static void
1091-
fd_runtime_save_account( fd_funk_t * funk,
1066+
fd_runtime_save_account( fd_accdb_user_t * accdb,
10921067
fd_funk_txn_xid_t const * xid,
10931068
fd_pubkey_t const * pubkey,
10941069
fd_account_meta_t * meta,
10951070
fd_bank_t * bank,
10961071
fd_capture_ctx_t * capture_ctx ) {
1097-
/* Look up the previous version of the account from Funk */
1098-
int err = FD_ACC_MGR_SUCCESS;
1099-
fd_funk_rec_t * funk_prev_rec = NULL;
1100-
fd_account_meta_t const * prev_meta = fd_funk_get_acc_meta_readonly(
1101-
funk,
1102-
xid,
1103-
pubkey,
1104-
fd_type_pun( &funk_prev_rec ),
1105-
&err,
1106-
NULL );
1107-
uchar const * prev_data = (void const *)( prev_meta+1 );
11081072

1109-
/* Hash the old version of the account */
1073+
/* Update LtHash
1074+
- Query old version of account and hash it
1075+
- Hash new version of account */
11101076
fd_lthash_value_t prev_hash[1];
1111-
fd_lthash_zero( prev_hash );
1112-
if( err != FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT ) {
1077+
fd_accdb_ro_t ro[1];
1078+
if( fd_accdb_open_ro( accdb, ro, xid, pubkey ) ) {
11131079
fd_hashes_account_lthash(
11141080
pubkey,
1115-
prev_meta,
1116-
prev_data,
1081+
ro->meta,
1082+
fd_accdb_ref_data_const( ro ),
11171083
prev_hash );
1084+
fd_accdb_close_ro( accdb, ro );
1085+
} else {
1086+
fd_lthash_zero( prev_hash );
11181087
}
11191088

11201089
/* Mix in the account hash into the bank hash */
11211090
fd_hashes_update_lthash( pubkey, meta, prev_hash, bank, capture_ctx );
11221091

11231092
/* Save the new version of the account to Funk */
1124-
fd_runtime_finalize_account( funk, xid, pubkey, meta, funk_prev_rec );
1093+
fd_runtime_finalize_account( accdb, xid, pubkey, meta );
11251094
}
11261095

11271096
/* fd_runtime_commit_txn is a helper used by the non-tpool transaction
@@ -1155,7 +1124,7 @@ fd_runtime_commit_txn( fd_runtime_t * runtime,
11551124
11561125
We should always rollback the nonce account first. Note that the nonce account may be the fee payer (case 2). */
11571126
if( txn_out->accounts.nonce_idx_in_txn!=ULONG_MAX ) {
1158-
fd_runtime_save_account( runtime->funk,
1127+
fd_runtime_save_account( runtime->accdb,
11591128
&xid,
11601129
&txn_out->accounts.keys[txn_out->accounts.nonce_idx_in_txn],
11611130
txn_out->accounts.rollback_nonce,
@@ -1165,7 +1134,7 @@ fd_runtime_commit_txn( fd_runtime_t * runtime,
11651134

11661135
/* Now, we must only save the fee payer if the nonce account was not the fee payer (because that was already saved above) */
11671136
if( FD_LIKELY( txn_out->accounts.nonce_idx_in_txn!=FD_FEE_PAYER_TXN_IDX ) ) {
1168-
fd_runtime_save_account( runtime->funk,
1137+
fd_runtime_save_account( runtime->accdb,
11691138
&xid,
11701139
&txn_out->accounts.keys[FD_FEE_PAYER_TXN_IDX],
11711140
txn_out->accounts.rollback_fee_payer,
@@ -1204,7 +1173,7 @@ fd_runtime_commit_txn( fd_runtime_t * runtime,
12041173
cache updates have been applied. */
12051174
fd_executor_reclaim_account( txn_out->accounts.metas[i], fd_bank_slot_get( bank ) );
12061175

1207-
fd_runtime_save_account( runtime->funk, &xid, pubkey, meta, bank, runtime->log.capture_ctx );
1176+
fd_runtime_save_account( runtime->accdb, &xid, pubkey, meta, bank, runtime->log.capture_ctx );
12081177
}
12091178

12101179
/* We need to queue any existing program accounts that may have

src/flamenco/runtime/fd_txn_account.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ fd_txn_account_init_from_funk_mutable( fd_txn_account_t * acct,
158158
memset( prepare_out, 0, sizeof(fd_funk_rec_prepare_t) );
159159

160160
fd_accdb_rw_t rw[1];
161-
if( FD_UNLIKELY( !fd_accdb_open_rw( accdb, rw, xid, pubkey->uc, min_data_sz, do_create ) ) ) {
161+
int flags = do_create ? FD_ACCDB_FLAG_CREATE : 0;
162+
if( FD_UNLIKELY( !fd_accdb_open_rw( accdb, rw, xid, pubkey->uc, min_data_sz, flags ) ) ) {
162163
return NULL;
163164
}
164165

@@ -266,12 +267,6 @@ fd_txn_account_get_lamports( fd_txn_account_t const * acct ) {
266267
return acct->meta->lamports;
267268
}
268269

269-
ulong
270-
fd_txn_account_get_rent_epoch( fd_txn_account_t const * acct ) {
271-
(void)acct;
272-
return ULONG_MAX;
273-
}
274-
275270
void
276271
fd_txn_account_set_meta( fd_txn_account_t * acct, fd_account_meta_t * meta ) {
277272
if( FD_UNLIKELY( !acct->is_mutable ) ) {

src/flamenco/runtime/fd_txn_account.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,6 @@ fd_txn_account_is_executable( fd_txn_account_t const * acct );
152152
ulong
153153
fd_txn_account_get_lamports( fd_txn_account_t const * acct );
154154

155-
ulong
156-
fd_txn_account_get_rent_epoch( fd_txn_account_t const * acct );
157-
158155
void
159156
fd_txn_account_set_meta( fd_txn_account_t * acct, fd_account_meta_t * meta );
160157

src/flamenco/runtime/test_txn_account.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ main( int argc, char ** argv ) {
4040
FD_TEST( fd_txn_account_is_readonly( txn_account ) );
4141
FD_TEST( fd_txn_account_get_data_len( txn_account ) == 100UL );
4242
FD_TEST( fd_txn_account_get_lamports( txn_account ) == 0UL );
43-
FD_TEST( fd_txn_account_get_rent_epoch( txn_account ) == ULONG_MAX );
4443
FD_TEST( !memcmp( fd_txn_account_get_owner( txn_account ), null_hash, sizeof(null_hash) ) );
4544
FD_TEST( fd_txn_account_get_meta( txn_account ) == meta );
4645
FD_TEST( fd_txn_account_get_data( txn_account ) == acc_data );
@@ -69,8 +68,6 @@ main( int argc, char ** argv ) {
6968
fd_txn_account_set_lamports( txn_account, 1000UL );
7069
FD_TEST( fd_txn_account_get_lamports( txn_account ) == 1000UL );
7170

72-
FD_TEST( fd_txn_account_get_rent_epoch( txn_account ) == ULONG_MAX );
73-
7471
fd_txn_account_set_data_len( txn_account, 102UL );
7572
FD_TEST( fd_txn_account_get_data_len( txn_account ) == 102UL );
7673
FD_TEST( fd_txn_account_delete( fd_txn_account_leave( txn_account ) ) );

0 commit comments

Comments
 (0)