Skip to content

Commit 29ce6af

Browse files
committed
Organize bindings flags better
1 parent 5008373 commit 29ce6af

File tree

4 files changed

+239
-112
lines changed

4 files changed

+239
-112
lines changed

core/src/banking_stage/consume_worker.rs

Lines changed: 115 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,9 @@ pub(crate) mod external {
185185
},
186186
agave_scheduler_bindings::{
187187
pack_message_flags,
188-
worker_message_types::{not_included_reasons, ExecutionResponse, Resolved},
188+
worker_message_types::{
189+
not_included_reasons, resolve_flags, CheckResponse, ExecutionResponse,
190+
},
189191
PackToWorkerMessage, SharablePubkeys, TransactionResponseRegion, WorkerToPackMessage,
190192
MAX_TRANSACTIONS_PER_MESSAGE,
191193
},
@@ -303,18 +305,23 @@ pub(crate) mod external {
303305
should_drain_executes: bool,
304306
) -> Result<bool, ExternalConsumeWorkerError> {
305307
if !Self::validate_message(message) {
306-
return self.return_invalid_message(message).map(|()| false);
308+
return self
309+
.return_unprocessed_message(
310+
message,
311+
agave_scheduler_bindings::processed_codes::INVALID_MESSAGE,
312+
)
313+
.map(|()| false);
307314
}
308315

309316
self.metrics
310317
.count_metrics
311318
.num_messages_processed
312319
.fetch_add(1, Ordering::Relaxed);
313320

314-
match message.flags {
315-
pack_message_flags::NONE => self.execute_batch(message, should_drain_executes),
316-
pack_message_flags::RESOLVE => self.resolve_batch(message).map(|()| false),
317-
_ => unreachable!("flags verified earlier"),
321+
if message.flags & agave_scheduler_bindings::pack_message_flags::EXECUTE == 1 {
322+
self.execute_batch(message, should_drain_executes)
323+
} else {
324+
self.resolve_batch(message).map(|()| false)
318325
}
319326
}
320327

@@ -353,11 +360,11 @@ pub(crate) mod external {
353360
let bank = leader_state
354361
.working_bank()
355362
.expect("active_leader_state_with_timeout should only return an active bank");
356-
if bank.slot() > message.max_execution_slot {
363+
if bank.slot() > message.max_working_slot {
357364
return self
358-
.return_not_included_with_reason(
365+
.return_unprocessed_message(
359366
message,
360-
not_included_reasons::SLOT_MISMATCH,
367+
agave_scheduler_bindings::processed_codes::MAX_WORKING_SLOT_EXCEEDED,
361368
)
362369
.map(|()| false);
363370
}
@@ -388,7 +395,7 @@ pub(crate) mod external {
388395
else {
389396
// If already ON the last possible execution slot,
390397
// immediately give up instead of trying on next slot.
391-
if bank.slot() == message.max_execution_slot {
398+
if bank.slot() == message.max_working_slot {
392399
break;
393400
}
394401
continue; // recording failed, try again on next slot if possible.
@@ -406,7 +413,7 @@ pub(crate) mod external {
406413
.ok_or(ExternalConsumeWorkerError::AllocationFailure)?;
407414
let response = WorkerToPackMessage {
408415
batch: message.batch,
409-
processed: agave_scheduler_bindings::PROCESSED,
416+
processed_code: agave_scheduler_bindings::processed_codes::MESSAGE_PROCESSED,
410417
responses,
411418
};
412419

@@ -449,7 +456,7 @@ pub(crate) mod external {
449456

450457
let response = WorkerToPackMessage {
451458
batch: message.batch,
452-
processed: agave_scheduler_bindings::PROCESSED,
459+
processed_code: agave_scheduler_bindings::processed_codes::MESSAGE_PROCESSED,
453460
responses,
454461
};
455462

@@ -499,7 +506,8 @@ pub(crate) mod external {
499506
&self,
500507
batch: TransactionPtrBatch,
501508
bank: &Bank,
502-
) -> Result<impl ExactSizeIterator<Item = Resolved>, ExternalConsumeWorkerError> {
509+
) -> Result<impl ExactSizeIterator<Item = CheckResponse>, ExternalConsumeWorkerError>
510+
{
503511
let enable_static_instruction_limit = bank
504512
.feature_set
505513
.is_active(&agave_feature_set::static_instruction_limit::ID);
@@ -594,7 +602,7 @@ pub(crate) mod external {
594602

595603
let response_message = WorkerToPackMessage {
596604
batch: message.batch,
597-
processed: agave_scheduler_bindings::PROCESSED,
605+
processed_code: agave_scheduler_bindings::processed_codes::MESSAGE_PROCESSED,
598606
responses: response_region,
599607
};
600608

@@ -611,13 +619,18 @@ pub(crate) mod external {
611619
Ok(())
612620
}
613621

614-
fn return_invalid_message(
622+
fn return_unprocessed_message(
615623
&mut self,
616624
message: &PackToWorkerMessage,
625+
processed_code: u8,
617626
) -> Result<(), ExternalConsumeWorkerError> {
618-
let invalid_message = WorkerToPackMessage {
627+
assert_ne!(
628+
processed_code,
629+
agave_scheduler_bindings::processed_codes::MESSAGE_PROCESSED
630+
);
631+
let response = WorkerToPackMessage {
619632
batch: message.batch,
620-
processed: agave_scheduler_bindings::NOT_PROCESSED,
633+
processed_code,
621634
responses: TransactionResponseRegion {
622635
tag: 0,
623636
num_transaction_responses: 0,
@@ -632,7 +645,7 @@ pub(crate) mod external {
632645

633646
// SAFETY: `reserve` guarantees a properly aligned space
634647
// for a `WorkerToPackMessage`
635-
unsafe { send_ptr.write(invalid_message) };
648+
unsafe { send_ptr.write(response) };
636649

637650
Ok(())
638651
}
@@ -696,27 +709,45 @@ pub(crate) mod external {
696709
fn resolved_pubkeys_to_response(
697710
resolving_result: Result<Option<(SharablePubkeys, u64)>, ()>,
698711
slot: Slot,
699-
) -> Resolved {
712+
) -> CheckResponse {
713+
let resolve_flags = resolve_flags::REQUESTED | resolve_flags::PERFORMED;
714+
700715
match resolving_result {
701-
Ok(Some((resolved_pubkeys, min_alt_deactivation_slot))) => Resolved {
702-
success: agave_scheduler_bindings::worker_message_types::RESOLVE_SUCCESS,
703-
slot,
716+
Ok(Some((resolved_pubkeys, min_alt_deactivation_slot))) => CheckResponse {
717+
parsing_and_sanitization_flags: 0,
718+
status_check_flags: 0,
719+
fee_payer_balance_flags: 0,
720+
resolve_flags,
721+
included_slot: 0,
722+
balance_slot: 0,
723+
fee_payer_balance: 0,
724+
resolution_slot: slot,
704725
min_alt_deactivation_slot,
705726
resolved_pubkeys,
706727
},
707-
_ => Resolved {
708-
success: if resolving_result.is_ok() {
709-
agave_scheduler_bindings::worker_message_types::RESOLVE_SUCCESS
728+
729+
_ => {
730+
let resolve_flags = if resolving_result.is_err() {
731+
resolve_flags | resolve_flags::FAILED
710732
} else {
711-
agave_scheduler_bindings::worker_message_types::RESOLVE_FAILURE
712-
},
713-
slot,
714-
min_alt_deactivation_slot: u64::MAX,
715-
resolved_pubkeys: SharablePubkeys {
716-
offset: 0,
717-
num_pubkeys: 0,
718-
},
719-
},
733+
resolve_flags
734+
};
735+
CheckResponse {
736+
parsing_and_sanitization_flags: 0,
737+
status_check_flags: 0,
738+
fee_payer_balance_flags: 0,
739+
resolve_flags,
740+
included_slot: 0,
741+
balance_slot: 0,
742+
fee_payer_balance: 0,
743+
resolution_slot: slot,
744+
min_alt_deactivation_slot: 0,
745+
resolved_pubkeys: SharablePubkeys {
746+
offset: 0,
747+
num_pubkeys: 0,
748+
},
749+
}
750+
}
720751
}
721752
}
722753

@@ -744,7 +775,10 @@ pub(crate) mod external {
744775
}
745776

746777
fn validate_message_flags(flags: u16) -> bool {
747-
flags == pack_message_flags::NONE || flags == pack_message_flags::RESOLVE
778+
flags == pack_message_flags::EXECUTE
779+
|| (flags
780+
== (pack_message_flags::CHECK
781+
| pack_message_flags::check_flags::RESOLVE_PUBKEYS))
748782
}
749783

750784
fn response_from_commit_details(
@@ -791,13 +825,16 @@ pub(crate) mod external {
791825

792826
#[cfg(test)]
793827
mod tests {
794-
use {super::*, solana_system_transaction::transfer, solana_transaction::TransactionError};
828+
use {
829+
super::*, agave_scheduler_bindings::worker_message_types::resolve_flags,
830+
solana_system_transaction::transfer, solana_transaction::TransactionError,
831+
};
795832

796833
#[test]
797834
fn test_validate_message() {
798835
let mut message = PackToWorkerMessage {
799-
flags: agave_scheduler_bindings::pack_message_flags::NONE,
800-
max_execution_slot: u64::MAX,
836+
flags: agave_scheduler_bindings::pack_message_flags::EXECUTE,
837+
max_working_slot: u64::MAX,
801838
batch: agave_scheduler_bindings::SharableTransactionBatchRegion {
802839
num_transactions: 0,
803840
transactions_offset: 0,
@@ -816,20 +853,21 @@ pub(crate) mod external {
816853
message.flags = u16::MAX;
817854
assert!(!ExternalWorker::validate_message(&message));
818855

819-
message.flags = pack_message_flags::NONE;
856+
message.flags = pack_message_flags::EXECUTE;
820857
assert!(ExternalWorker::validate_message(&message));
821858
}
822859

823860
#[test]
824861
fn test_validate_message_flags() {
825862
assert!(ExternalWorker::validate_message_flags(
826-
pack_message_flags::NONE
863+
pack_message_flags::EXECUTE
827864
));
828865
assert!(ExternalWorker::validate_message_flags(
829-
pack_message_flags::RESOLVE
866+
pack_message_flags::CHECK
867+
| agave_scheduler_bindings::pack_message_flags::check_flags::RESOLVE_PUBKEYS
830868
));
831869
assert!(!ExternalWorker::validate_message_flags(
832-
pack_message_flags::RESOLVE + 1
870+
pack_message_flags::CHECK
833871
))
834872
}
835873

@@ -921,28 +959,44 @@ pub(crate) mod external {
921959
const TEST_SLOT: Slot = 7;
922960
assert_eq!(
923961
ExternalWorker::resolved_pubkeys_to_response(Err(()), TEST_SLOT),
924-
Resolved {
925-
success: agave_scheduler_bindings::worker_message_types::RESOLVE_FAILURE,
926-
slot: TEST_SLOT,
927-
min_alt_deactivation_slot: u64::MAX,
962+
CheckResponse {
963+
parsing_and_sanitization_flags: 0,
964+
status_check_flags: 0,
965+
fee_payer_balance_flags: 0,
966+
resolve_flags: resolve_flags::REQUESTED
967+
| resolve_flags::PERFORMED
968+
| resolve_flags::FAILED,
969+
included_slot: 0,
970+
balance_slot: 0,
971+
fee_payer_balance: 0,
972+
resolution_slot: TEST_SLOT,
973+
min_alt_deactivation_slot: 0,
928974
resolved_pubkeys: SharablePubkeys {
929975
offset: 0,
930976
num_pubkeys: 0
931977
}
932978
}
933979
);
980+
934981
assert_eq!(
935982
ExternalWorker::resolved_pubkeys_to_response(Ok(None), TEST_SLOT),
936-
Resolved {
937-
success: agave_scheduler_bindings::worker_message_types::RESOLVE_SUCCESS,
938-
slot: TEST_SLOT,
939-
min_alt_deactivation_slot: u64::MAX,
983+
CheckResponse {
984+
parsing_and_sanitization_flags: 0,
985+
status_check_flags: 0,
986+
fee_payer_balance_flags: 0,
987+
resolve_flags: resolve_flags::REQUESTED | resolve_flags::PERFORMED,
988+
included_slot: 0,
989+
balance_slot: 0,
990+
fee_payer_balance: 0,
991+
resolution_slot: TEST_SLOT,
992+
min_alt_deactivation_slot: 0,
940993
resolved_pubkeys: SharablePubkeys {
941994
offset: 0,
942995
num_pubkeys: 0
943996
}
944-
}
997+
},
945998
);
999+
9461000
let resolved_pubkeys = SharablePubkeys {
9471001
offset: 256,
9481002
num_pubkeys: 21,
@@ -952,12 +1006,18 @@ pub(crate) mod external {
9521006
Ok(Some((resolved_pubkeys, 120))),
9531007
TEST_SLOT
9541008
),
955-
Resolved {
956-
success: agave_scheduler_bindings::worker_message_types::RESOLVE_SUCCESS,
957-
slot: TEST_SLOT,
1009+
CheckResponse {
1010+
parsing_and_sanitization_flags: 0,
1011+
status_check_flags: 0,
1012+
fee_payer_balance_flags: 0,
1013+
resolve_flags: resolve_flags::REQUESTED | resolve_flags::PERFORMED,
1014+
included_slot: 0,
1015+
balance_slot: 0,
1016+
fee_payer_balance: 0,
1017+
resolution_slot: TEST_SLOT,
9581018
min_alt_deactivation_slot: 120,
9591019
resolved_pubkeys
960-
}
1020+
},
9611021
);
9621022
}
9631023

0 commit comments

Comments
 (0)