@@ -454,6 +454,10 @@ private void addDriverConfigs(
454
454
throw new ConfigException ("No driver configs were found!" );
455
455
}
456
456
457
+ // Handle session distribution for detect-drivers = false scenario
458
+ Map <String , Integer > sessionDistribution =
459
+ calculateDriverConfigSessionDistribution (configList , maxSessions );
460
+
457
461
List <DriverService .Builder <?, ?>> builderList = new ArrayList <>();
458
462
ServiceLoader .load (DriverService .Builder .class ).forEach (builderList ::add );
459
463
@@ -506,9 +510,8 @@ private void addDriverConfigs(
506
510
new ConfigException (
507
511
"Unable to find matching driver for %s" , stereotype ));
508
512
509
- int driverMaxSessions =
510
- Integer .parseInt (
511
- thisConfig .getOrDefault ("max-sessions" , String .valueOf (maxSessions )));
513
+ // Use calculated session distribution
514
+ int driverMaxSessions = sessionDistribution .get (configName );
512
515
Require .positive ("Driver max sessions" , driverMaxSessions );
513
516
514
517
WebDriverInfo driverInfoConfig =
@@ -521,8 +524,7 @@ private void addDriverConfigs(
521
524
builder -> {
522
525
ImmutableCapabilities immutable =
523
526
new ImmutableCapabilities (stereotype );
524
- int maxDriverSessions = getDriverMaxSessions (info , driverMaxSessions );
525
- for (int i = 0 ; i < maxDriverSessions ; i ++) {
527
+ for (int i = 0 ; i < driverMaxSessions ; i ++) {
526
528
driverConfigs .putAll (
527
529
driverInfoConfig , factoryFactory .apply (immutable ));
528
530
}
@@ -792,6 +794,75 @@ private void report(Map.Entry<WebDriverInfo, Collection<SessionFactory>> entry)
792
794
entry .getValue ().size ()));
793
795
}
794
796
797
+ private Map <String , Integer > calculateDriverConfigSessionDistribution (
798
+ List <Map <String , String >> configList , int nodeMaxSessions ) {
799
+ Map <String , Integer > sessionDistribution = new HashMap <>();
800
+ boolean overrideMaxSessions =
801
+ config .getBool (NODE_SECTION , "override-max-sessions" ).orElse (OVERRIDE_MAX_SESSIONS );
802
+
803
+ // S2.1: No max-sessions given, distribute CPU cores among driver configurations
804
+ if (!config .getInt (NODE_SECTION , "max-sessions" ).isPresent ()) {
805
+ int availableCores = DEFAULT_MAX_SESSIONS ;
806
+ int numDrivers = configList .size ();
807
+
808
+ // Distribute cores evenly, with remainder going to first drivers
809
+ int baseSessions = availableCores / numDrivers ;
810
+ int remainder = availableCores % numDrivers ;
811
+
812
+ for (int i = 0 ; i < configList .size (); i ++) {
813
+ Map <String , String > driverConfig = configList .get (i );
814
+ String displayName = driverConfig .get ("display-name" );
815
+
816
+ // Check if driver has specific max-sessions (S2.3)
817
+ int driverSessions ;
818
+ if (driverConfig .containsKey ("max-sessions" )) {
819
+ int specificMaxSessions = Integer .parseInt (driverConfig .get ("max-sessions" ));
820
+ if (overrideMaxSessions ) {
821
+ driverSessions = specificMaxSessions ;
822
+ } else {
823
+ // Respect CPU core distribution even with specific max-sessions
824
+ driverSessions = Math .min (specificMaxSessions , baseSessions + (i < remainder ? 1 : 0 ));
825
+ }
826
+ } else {
827
+ driverSessions = baseSessions + (i < remainder ? 1 : 0 );
828
+ }
829
+
830
+ sessionDistribution .put (displayName , driverSessions );
831
+ }
832
+ } else {
833
+ // S2.2: Given max-sessions under [node] section
834
+ int configuredMaxSessions = nodeMaxSessions ;
835
+
836
+ for (Map <String , String > driverConfig : configList ) {
837
+ String displayName = driverConfig .get ("display-name" );
838
+
839
+ // Check if driver has specific max-sessions (S2.3)
840
+ int driverSessions ;
841
+ if (driverConfig .containsKey ("max-sessions" )) {
842
+ int specificMaxSessions = Integer .parseInt (driverConfig .get ("max-sessions" ));
843
+ if (overrideMaxSessions ) {
844
+ // S2.4: Unlimited configure max-sessions with override-max-sessions true
845
+ driverSessions = specificMaxSessions ;
846
+ } else {
847
+ // S2.3: Specific driver max-sessions takes precedence but controlled by CPU cores
848
+ driverSessions = Math .min (specificMaxSessions , configuredMaxSessions );
849
+ }
850
+ } else {
851
+ // Use node max-sessions, but respect CPU limits if override is false
852
+ if (overrideMaxSessions ) {
853
+ driverSessions = configuredMaxSessions ;
854
+ } else {
855
+ driverSessions = Math .min (configuredMaxSessions , DEFAULT_MAX_SESSIONS );
856
+ }
857
+ }
858
+
859
+ sessionDistribution .put (displayName , driverSessions );
860
+ }
861
+ }
862
+
863
+ return sessionDistribution ;
864
+ }
865
+
795
866
private String unquote (String input ) {
796
867
int len = input .length ();
797
868
if ((input .charAt (0 ) == '"' ) && (input .charAt (len - 1 ) == '"' )) {
0 commit comments