@@ -232,23 +232,25 @@ impl<K: Kind> VerificationQueue<K> {
232232 let scale_verifiers = config. verifier_settings . scale_verifiers ;
233233
234234 let num_cpus = :: num_cpus:: get ( ) ;
235- let cli_max_verifiers = cmp:: max ( 1 , config. verifier_settings . num_verifiers ) ;
235+
236+ let max_verifiers = cmp:: max ( num_cpus, MAX_VERIFIERS ) ;
237+ let default_amount = cmp:: max ( 1 , cmp:: min ( max_verifiers, config. verifier_settings . num_verifiers ) ) ;
236238
237239 // if `auto-scaling` is enabled spawn up extra threads as they might be needed
238240 // otherwise just spawn the number of threads specified by the config
239- let max_verifiers = if scale_verifiers {
240- cmp :: min ( num_cpus , MAX_VERIFIERS )
241+ let number_of_threads = if scale_verifiers {
242+ max_verifiers
241243 } else {
242- cmp:: min ( cli_max_verifiers , cmp :: min ( num_cpus , MAX_VERIFIERS ) )
244+ cmp:: min ( default_amount , max_verifiers )
243245 } ;
244246
245- let state = Arc :: new ( ( Mutex :: new ( State :: Work ( cli_max_verifiers ) ) , Condvar :: new ( ) ) ) ;
246- let mut verifier_handles = Vec :: with_capacity ( max_verifiers ) ;
247+ let state = Arc :: new ( ( Mutex :: new ( State :: Work ( default_amount ) ) , Condvar :: new ( ) ) ) ;
248+ let mut verifier_handles = Vec :: with_capacity ( number_of_threads ) ;
247249
248- debug ! ( target: "verification" , "Allocating {} verifiers, {} initially active" , max_verifiers , cli_max_verifiers ) ;
250+ debug ! ( target: "verification" , "Allocating {} verifiers, {} initially active" , number_of_threads , default_amount ) ;
249251 debug ! ( target: "verification" , "Verifier auto-scaling {}" , if scale_verifiers { "enabled" } else { "disabled" } ) ;
250252
251- for i in 0 ..max_verifiers {
253+ for i in 0 ..number_of_threads {
252254 debug ! ( target: "verification" , "Adding verification thread #{}" , i) ;
253255
254256 let verification = verification. clone ( ) ;
@@ -885,4 +887,57 @@ mod tests {
885887 queue. collect_garbage ( ) ;
886888 assert_eq ! ( queue. num_verifiers( ) , 1 ) ;
887889 }
890+
891+ #[ test]
892+ fn worker_threads_honor_specified_num_without_scaling ( ) {
893+ let spec = Spec :: new_test ( ) ;
894+ let engine = spec. engine ;
895+ let mut config = Config :: default ( ) ;
896+ config. verifier_settings . num_verifiers = 3 ;
897+ config. verifier_settings . scale_verifiers = false ;
898+
899+ let queue = BlockQueue :: new ( config, engine, IoChannel :: disconnected ( ) , true ) ;
900+
901+ assert_eq ! ( queue. num_verifiers( ) , 3 ) ;
902+ }
903+
904+ #[ test]
905+ fn worker_threads_specifyed_to_zero_should_set_to_one ( ) {
906+ let spec = Spec :: new_test ( ) ;
907+ let engine = spec. engine ;
908+ let mut config = Config :: default ( ) ;
909+ config. verifier_settings . num_verifiers = 1 ;
910+ config. verifier_settings . scale_verifiers = false ;
911+
912+ let queue = BlockQueue :: new ( config, engine, IoChannel :: disconnected ( ) , true ) ;
913+
914+ assert_eq ! ( queue. num_verifiers( ) , 1 ) ;
915+ }
916+
917+ #[ test]
918+ fn worker_threads_should_accept_max_eight ( ) {
919+ let spec = Spec :: new_test ( ) ;
920+ let engine = spec. engine ;
921+ let mut config = Config :: default ( ) ;
922+ config. verifier_settings . num_verifiers = 10000 ;
923+ config. verifier_settings . scale_verifiers = false ;
924+
925+ let queue = BlockQueue :: new ( config, engine, IoChannel :: disconnected ( ) , true ) ;
926+
927+ assert_eq ! ( queue. num_verifiers( ) , 8 ) ;
928+ }
929+
930+ #[ test]
931+ fn worker_threads_scaling_with_specifed_num_of_workers ( ) {
932+ let spec = Spec :: new_test ( ) ;
933+ let engine = spec. engine ;
934+ let mut config = Config :: default ( ) ;
935+ config. verifier_settings . num_verifiers = 5 ;
936+ config. verifier_settings . scale_verifiers = true ;
937+
938+ let queue = BlockQueue :: new ( config, engine, IoChannel :: disconnected ( ) , true ) ;
939+ queue. scale_verifiers ( 8 ) ;
940+
941+ assert_eq ! ( queue. num_verifiers( ) , 8 ) ;
942+ }
888943}
0 commit comments