Skip to content

Commit 8070ab4

Browse files
cleanup cleanup
1 parent 34ad731 commit 8070ab4

File tree

6 files changed

+29
-36
lines changed

6 files changed

+29
-36
lines changed

src/discof/bank/fd_bank_tile.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,12 @@ handle_microblock( fd_bank_ctx_t * ctx,
179179
txn->flags &= ~FD_TXN_P_FLAGS_EXECUTE_SUCCESS;
180180

181181
txn_ctx->exec_err = fd_runtime_prepare_and_execute_txn( ctx->banks, ctx->_bank_idx, txn_ctx, txn, NULL, &ctx->exec_stack, NULL, NULL );
182+
int to_pack = txn_ctx->exec_err==FD_RUNTIME_EXECUTE_SUCCESS || txn_ctx->exec_err==FD_RUNTIME_TXN_ERR_INSTRUCTION_ERROR || txn_ctx->is_fees_only;
182183

183184
/* Stash the result in the flags value so that pack can inspect it. */
184185
txn->flags = (txn->flags & 0x00FFFFFFU) | ((uint)(-txn_ctx->exec_err)<<24);
185186

186-
if( FD_UNLIKELY( !(txn_ctx->flags & FD_TXN_P_FLAGS_SANITIZE_SUCCESS ) ) ) {
187+
if( FD_UNLIKELY( !to_pack ) ) {
187188
fd_pack_rebate_sum_add_txn( ctx->rebater, txn, NULL, 1UL );
188189
ctx->metrics.txn_result[ fd_bank_err_from_runtime_err( txn_ctx->exec_err ) ]++;
189190
continue;
@@ -192,7 +193,6 @@ handle_microblock( fd_bank_ctx_t * ctx,
192193
/* TXN_P_FLAGS_EXECUTE_SUCCESS means that it should be included in
193194
the block. It's a bit of a misnomer now that there are fee-only
194195
transactions. */
195-
FD_TEST( txn_ctx->flags & FD_TXN_P_FLAGS_EXECUTE_SUCCESS );
196196
txn->flags |= FD_TXN_P_FLAGS_EXECUTE_SUCCESS | FD_TXN_P_FLAGS_SANITIZE_SUCCESS;
197197

198198
ctx->metrics.txn_result[ fd_bank_err_from_runtime_err( txn_ctx->exec_err ) ]++;
@@ -211,7 +211,7 @@ handle_microblock( fd_bank_ctx_t * ctx,
211211
in finalize anyway. */
212212
fd_runtime_finalize_txn( ctx->txn_ctx->funk, ctx->txn_ctx->progcache, txn_ctx->status_cache, txn_ctx->xid, txn_ctx, bank, NULL, &tips );
213213

214-
if( FD_UNLIKELY( !txn_ctx->flags ) ) {
214+
if( FD_UNLIKELY( !txn_ctx->exec_err ) ) {
215215
/* If the transaction failed to fit into the block, we need to
216216
updated the transaction flag with the error code. */
217217
txn->flags = (txn->flags & 0x00FFFFFFU) | ((uint)(-txn_ctx->exec_err)<<24);
@@ -356,7 +356,7 @@ handle_bundle( fd_bank_ctx_t * ctx,
356356

357357
txn_ctx->exec_err = fd_runtime_prepare_and_execute_txn( ctx->banks, ctx->_bank_idx, txn_ctx, txn, NULL, &ctx->exec_stack_bundle[ i ], NULL, NULL );
358358
txn->flags = (txn->flags & 0x00FFFFFFU) | ((uint)(-txn_ctx->exec_err)<<24);
359-
if( FD_UNLIKELY( !(txn_ctx->flags & FD_TXN_P_FLAGS_SANITIZE_SUCCESS ) || txn_ctx->exec_err ) ) {
359+
if( FD_UNLIKELY( txn_ctx->exec_err ) ) {
360360
execution_success = 0;
361361
continue;
362362
}
@@ -377,7 +377,10 @@ handle_bundle( fd_bank_ctx_t * ctx,
377377

378378
txns[ i ].flags |= FD_TXN_P_FLAGS_EXECUTE_SUCCESS | FD_TXN_P_FLAGS_SANITIZE_SUCCESS;
379379
fd_runtime_finalize_txn( txn_ctx->funk, txn_ctx->progcache, txn_ctx->status_cache, txn_ctx->xid, txn_ctx, bank, NULL, &tips[ i ] );
380-
if( FD_UNLIKELY( !txn_ctx->flags ) ) {
380+
if( FD_UNLIKELY( txn_ctx->exec_err==FD_RUNTIME_TXN_ERR_WOULD_EXCEED_MAX_BLOCK_COST_LIMIT ||
381+
txn_ctx->exec_err==FD_RUNTIME_TXN_ERR_WOULD_EXCEED_MAX_VOTE_COST_LIMIT ||
382+
txn_ctx->exec_err==FD_RUNTIME_TXN_ERR_WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT ||
383+
txn_ctx->exec_err==FD_RUNTIME_TXN_ERR_WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT ) ) {
381384
txns[ i ].flags = (txns[ i ].flags & 0x00FFFFFFU) | ((uint)(-txn_ctx->exec_err)<<24);
382385
fd_cost_tracker_t * cost_tracker = fd_bank_cost_tracker_locking_modify( bank );
383386
int res = fd_cost_tracker_calculate_cost_and_add( cost_tracker, txn_ctx );
@@ -390,6 +393,7 @@ handle_bundle( fd_bank_ctx_t * ctx,
390393
cost_tracker->block_cost_limit, cost_tracker->vote_cost_limit,
391394
cost_tracker->account_cost_limit ));
392395
}
396+
FD_TEST( txn_ctx->exec_err==FD_RUNTIME_EXECUTE_SUCCESS );
393397

394398
uint actual_execution_cus = (uint)(txn_ctx->compute_budget_details.compute_unit_limit - txn_ctx->compute_budget_details.compute_meter);
395399
uint actual_acct_data_cus = (uint)(txn_ctx->loaded_accounts_data_size_cost);

src/discof/exec/fd_exec_tile.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,9 @@ returnable_frag( fd_exec_tile_ctx_t * ctx,
138138

139139
/* Commit. */
140140
fd_bank_t * bank = fd_banks_bank_query( ctx->banks, msg->bank_idx );
141-
if( FD_LIKELY( ctx->txn_ctx->flags & FD_TXN_P_FLAGS_EXECUTE_SUCCESS ) ) {
141+
if( FD_LIKELY( ctx->txn_ctx->exec_err==FD_RUNTIME_EXECUTE_SUCCESS ||
142+
ctx->txn_ctx->exec_err==FD_RUNTIME_TXN_ERR_INSTRUCTION_ERROR ||
143+
ctx->txn_ctx->is_fees_only ) ) {
142144
fd_funk_txn_xid_t xid = (fd_funk_txn_xid_t){ .ul = { fd_bank_slot_get( bank ), bank->idx } };
143145
fd_runtime_finalize_txn( ctx->funk, ctx->progcache, ctx->txncache, &xid, ctx->txn_ctx, bank, ctx->capture_ctx, NULL );
144146
}
@@ -383,7 +385,7 @@ publish_txn_finalized_msg( fd_exec_tile_ctx_t * ctx,
383385
fd_exec_task_done_msg_t * msg = fd_chunk_to_laddr( ctx->exec_replay_out->mem, ctx->exec_replay_out->chunk );
384386
msg->bank_idx = ctx->txn_ctx->bank_idx;
385387
msg->txn_exec->txn_idx = ctx->txn_idx;
386-
msg->txn_exec->err = !(ctx->txn_ctx->flags&FD_TXN_P_FLAGS_EXECUTE_SUCCESS);
388+
msg->txn_exec->err = ctx->txn_ctx->exec_err!=FD_RUNTIME_EXECUTE_SUCCESS && ctx->txn_ctx->exec_err!=FD_RUNTIME_TXN_ERR_INSTRUCTION_ERROR;
387389
if( FD_UNLIKELY( msg->txn_exec->err ) ) {
388390
FD_LOG_WARNING(( "txn failed to execute, bad block detected err=%d", ctx->txn_ctx->exec_err ));
389391
}

src/flamenco/runtime/context/fd_exec_txn_ctx.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ struct fd_exec_txn_ctx {
4646
could be refactored even further. Currently these fields are not
4747
all valid local joins within the scope of txn execution. */
4848

49-
uint flags;
50-
5149
fd_bank_t * bank;
5250

5351
fd_exec_stack_t * exec_stack;
@@ -72,7 +70,6 @@ struct fd_exec_txn_ctx {
7270
ulong paid_fees;
7371
ulong loaded_accounts_data_size; /* The actual transaction loaded data size */
7472
ulong loaded_accounts_data_size_cost; /* The cost of the loaded accounts data size in CUs */
75-
uint custom_err; /* When a custom error is returned, this is where the numeric value gets stashed */
7673
uchar instr_stack_sz; /* Current depth of the instruction execution stack. */
7774
fd_exec_instr_ctx_t instr_stack[FD_MAX_INSTRUCTION_STACK_DEPTH]; /* Instruction execution stack. */
7875
fd_exec_instr_ctx_t * failed_instr;
@@ -149,6 +146,8 @@ struct fd_exec_txn_ctx {
149146
/* Execution error and type, to match Agave. */
150147
int exec_err;
151148
int exec_err_kind;
149+
uint custom_err;
150+
int is_fees_only;
152151

153152
/* The current instruction index being executed */
154153
int current_instr_idx;

src/flamenco/runtime/fd_runtime.c

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -616,14 +616,12 @@ fd_runtime_pre_execute_check( fd_exec_txn_ctx_t * txn_ctx ) {
616616
the compute budget instructions. */
617617
err = fd_executor_verify_transaction( txn_ctx );
618618
if( FD_UNLIKELY( err!=FD_RUNTIME_EXECUTE_SUCCESS ) ) {
619-
txn_ctx->flags = 0U;
620619
return err;
621620
}
622621

623622
/* Resolve and verify ALUT-referenced account keys, if applicable */
624623
err = fd_executor_setup_txn_alut_account_keys( txn_ctx );
625624
if( FD_UNLIKELY( err!=FD_RUNTIME_EXECUTE_SUCCESS ) ) {
626-
txn_ctx->flags = 0U;
627625
return err;
628626
}
629627

@@ -636,15 +634,13 @@ fd_runtime_pre_execute_check( fd_exec_txn_ctx_t * txn_ctx ) {
636634
https://github.com/anza-xyz/agave/blob/838c1952595809a31520ff1603a13f2c9123aa51/accounts-db/src/account_locks.rs#L118 */
637635
err = fd_executor_validate_account_locks( txn_ctx );
638636
if( FD_UNLIKELY( err!=FD_RUNTIME_EXECUTE_SUCCESS ) ) {
639-
txn_ctx->flags = 0U;
640637
return err;
641638
}
642639

643640
/* load_and_execute_transactions() -> check_transactions()
644641
https://github.com/anza-xyz/agave/blob/ced98f1ebe73f7e9691308afa757323003ff744f/runtime/src/bank.rs#L3667-L3672 */
645642
err = fd_executor_check_transactions( txn_ctx );
646643
if( FD_UNLIKELY( err!=FD_RUNTIME_EXECUTE_SUCCESS ) ) {
647-
txn_ctx->flags = 0U;
648644
return err;
649645
}
650646

@@ -653,7 +649,6 @@ fd_runtime_pre_execute_check( fd_exec_txn_ctx_t * txn_ctx ) {
653649
https://github.com/anza-xyz/agave/blob/ced98f1ebe73f7e9691308afa757323003ff744f/svm/src/transaction_processor.rs#L236-L249 */
654650
err = fd_executor_validate_transaction_fee_payer( txn_ctx );
655651
if( FD_UNLIKELY( err!=FD_RUNTIME_EXECUTE_SUCCESS ) ) {
656-
txn_ctx->flags = 0U;
657652
return err;
658653
}
659654

@@ -663,7 +658,7 @@ fd_runtime_pre_execute_check( fd_exec_txn_ctx_t * txn_ctx ) {
663658
/* Regardless of whether transaction accounts were loaded successfully, the transaction is
664659
included in the block and transaction fees are collected.
665660
https://github.com/anza-xyz/agave/blob/v2.1.6/svm/src/transaction_processor.rs#L341-L357 */
666-
txn_ctx->flags |= FD_TXN_P_FLAGS_FEES_ONLY;
661+
txn_ctx->is_fees_only = 1;
667662

668663
/* If the transaction fails to load, the "rollback" accounts will include one of the following:
669664
1. Nonce account only
@@ -1007,10 +1002,11 @@ fd_runtime_finalize_txn( fd_funk_t * funk,
10071002
/* Update the cost tracker */
10081003
fd_cost_tracker_t * cost_tracker = fd_bank_cost_tracker_locking_modify( bank );
10091004
int res = fd_cost_tracker_calculate_cost_and_add( cost_tracker, txn_ctx );
1005+
fd_bank_cost_tracker_end_locking_modify( bank );
10101006
if( FD_UNLIKELY( res!=FD_COST_TRACKER_SUCCESS ) ) {
1011-
txn_ctx->flags = 0U;
1007+
txn_ctx->exec_err = fd_cost_tracker_err_to_runtime_err( res );
1008+
return;
10121009
}
1013-
fd_bank_cost_tracker_end_locking_modify( bank );
10141010

10151011
txn_ctx->loaded_accounts_data_size_cost = fd_cost_tracker_calculate_loaded_accounts_data_size_cost( txn_ctx );
10161012

@@ -1055,9 +1051,9 @@ fd_runtime_prepare_and_execute_txn( fd_banks_t * banks,
10551051
txn_ctx->exec_stack = exec_stack;
10561052
txn_ctx->dumping_mem = dumping_mem;
10571053
txn_ctx->tracing_mem = tracing_mem;
1058-
txn_ctx->flags = FD_TXN_P_FLAGS_SANITIZE_SUCCESS;
10591054
fd_exec_txn_ctx_setup_basic( txn_ctx );
10601055
txn_ctx->capture_ctx = capture_ctx;
1056+
txn_ctx->is_fees_only = 0;
10611057

10621058
/* Set up the core account keys. These are the account keys directly
10631059
passed in via the serialized transaction, represented as an array.
@@ -1067,18 +1063,13 @@ fd_runtime_prepare_and_execute_txn( fd_banks_t * banks,
10671063

10681064
/* Pre-execution checks */
10691065
exec_res = fd_runtime_pre_execute_check( txn_ctx );
1070-
if( FD_UNLIKELY( !( txn_ctx->flags & FD_TXN_P_FLAGS_SANITIZE_SUCCESS ) ) ) {
1066+
if( FD_UNLIKELY( exec_res!=FD_RUNTIME_EXECUTE_SUCCESS ) ) {
10711067
return exec_res;
10721068
}
10731069

10741070
/* Execute the transaction. Note that fees-only transactions are still
10751071
marked as "executed". */
1076-
txn_ctx->flags |= FD_TXN_P_FLAGS_EXECUTE_SUCCESS;
1077-
if( FD_LIKELY( !( txn_ctx->flags & FD_TXN_P_FLAGS_FEES_ONLY ) ) ) {
1078-
exec_res = fd_execute_txn( txn_ctx );
1079-
}
1080-
1081-
return exec_res;
1072+
return fd_execute_txn( txn_ctx );
10821073
}
10831074

10841075
/* fd_executor_txn_verify and fd_runtime_pre_execute_check are responisble

src/flamenco/runtime/tests/fd_block_harness.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ fd_solfuzz_block_ctx_exec( fd_solfuzz_runner_t * runner,
473473
fd_exec_txn_ctx_t * txn_ctx = fd_solfuzz_txn_ctx_exec( runner, xid, txn, &res );
474474
txn_ctx->exec_err = res;
475475

476-
if( FD_UNLIKELY( !(txn_ctx->flags & FD_TXN_P_FLAGS_EXECUTE_SUCCESS) ) ) {
476+
if( FD_UNLIKELY( res!=FD_RUNTIME_EXECUTE_SUCCESS && res!=FD_RUNTIME_TXN_ERR_INSTRUCTION_ERROR && !txn_ctx->is_fees_only ) ) {
477477
break;
478478
}
479479

@@ -488,11 +488,9 @@ fd_solfuzz_block_ctx_exec( fd_solfuzz_runner_t * runner,
488488
capture_ctx,
489489
NULL );
490490

491-
if( FD_UNLIKELY( !(txn_ctx->flags & FD_TXN_P_FLAGS_EXECUTE_SUCCESS) ) ) {
492-
break;
493-
}
494491

495-
res = FD_RUNTIME_EXECUTE_SUCCESS;
492+
493+
res = txn_ctx->exec_err;
496494
}
497495

498496
/* Finalize the block */

src/flamenco/runtime/tests/fd_txn_harness.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,6 @@ fd_solfuzz_txn_ctx_exec( fd_solfuzz_runner_t * runner,
342342
/* Setup the spad for account allocation */
343343
uchar * txn_ctx_mem = fd_spad_alloc_check( runner->spad, FD_EXEC_TXN_CTX_ALIGN, FD_EXEC_TXN_CTX_FOOTPRINT );
344344
fd_exec_txn_ctx_t * txn_ctx = fd_exec_txn_ctx_join( fd_exec_txn_ctx_new( txn_ctx_mem ) );
345-
txn_ctx->flags = FD_TXN_P_FLAGS_SANITIZE_SUCCESS;
346345
if( FD_UNLIKELY( !fd_funk_join( txn_ctx->funk, runner->accdb->funk->shmem ) ) ) {
347346
FD_LOG_CRIT(( "fd_funk_join failed" ));
348347
}
@@ -417,8 +416,8 @@ fd_solfuzz_pb_txn_run( fd_solfuzz_runner_t * runner,
417416
}
418417

419418
/* Capture basic results fields */
420-
txn_result->executed = txn_ctx->flags & FD_TXN_P_FLAGS_EXECUTE_SUCCESS;
421-
txn_result->sanitization_error = !(txn_ctx->flags & FD_TXN_P_FLAGS_SANITIZE_SUCCESS);
419+
txn_result->executed = exec_res==FD_RUNTIME_EXECUTE_SUCCESS || exec_res==FD_RUNTIME_TXN_ERR_INSTRUCTION_ERROR;
420+
txn_result->sanitization_error = exec_res!=FD_RUNTIME_EXECUTE_SUCCESS && exec_res!=FD_RUNTIME_TXN_ERR_INSTRUCTION_ERROR;
422421
txn_result->has_resulting_state = false;
423422
txn_result->resulting_state.acct_states_count = 0;
424423
txn_result->is_ok = !exec_res;
@@ -431,7 +430,7 @@ fd_solfuzz_pb_txn_run( fd_solfuzz_runner_t * runner,
431430

432431
if( txn_result->sanitization_error ) {
433432
/* Collect fees for transactions that failed to load */
434-
if( txn_ctx->flags & FD_TXN_P_FLAGS_FEES_ONLY ) {
433+
if( txn_ctx->is_fees_only ) {
435434
txn_result->has_fee_details = true;
436435
txn_result->fee_details.prioritization_fee = txn_ctx->priority_fee;
437436
txn_result->fee_details.transaction_fee = txn_ctx->execution_fee;
@@ -502,7 +501,7 @@ fd_solfuzz_pb_txn_run( fd_solfuzz_runner_t * runner,
502501
/* If the transaction is a fees-only transaction, we have to create rollback accounts to iterate over and save. */
503502
fd_txn_account_t * accounts_to_save = txn_ctx->accounts;
504503
ulong accounts_cnt = txn_ctx->accounts_cnt;
505-
if( txn_ctx->flags & FD_TXN_P_FLAGS_FEES_ONLY ) {
504+
if( txn_ctx->is_fees_only ) {
506505
accounts_to_save = fd_spad_alloc( runner->spad, alignof(fd_txn_account_t), sizeof(fd_txn_account_t) * 2 );
507506
accounts_cnt = 0UL;
508507

0 commit comments

Comments
 (0)