@@ -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