@@ -241,17 +241,13 @@ public Map<Capabilities, Collection<SessionFactory>> getSessionFactories(
241241              + "Issues related to parallel testing with Internet Explored won't be accepted." );
242242      LOG .warning ("Double check if enabling 'override-max-sessions' is really needed" );
243243    }
244-     // Use node max-sessions for initial driver discovery 
245-     int  nodeMaxSessions  = config .getInt (NODE_SECTION , "max-sessions" ).orElse (DEFAULT_MAX_SESSIONS );
246- 
247-     Map <WebDriverInfo , Collection <SessionFactory >> allDrivers  =
248-         discoverDrivers (nodeMaxSessions , factoryFactory );
244+     Map <WebDriverInfo , Collection <SessionFactory >> allDrivers  = discoverDrivers (factoryFactory );
249245
250246    ImmutableMultimap .Builder <Capabilities , SessionFactory > sessionFactories  =
251247        ImmutableMultimap .builder ();
252248
253249    addDriverFactoriesFromConfig (sessionFactories );
254-     addDriverConfigs (factoryFactory , sessionFactories ,  nodeMaxSessions );
250+     addDriverConfigs (factoryFactory , sessionFactories );
255251    addSpecificDrivers (allDrivers , sessionFactories );
256252    addDetectedDrivers (allDrivers , sessionFactories );
257253
@@ -272,7 +268,7 @@ public int getMaxSessions() {
272268        config .getBool (NODE_SECTION , "override-max-sessions" ).orElse (OVERRIDE_MAX_SESSIONS );
273269
274270    // Always calculate sum of actual driver sessions for consistency 
275-     int  totalActualSessions  = calculateTotalMaxSessionsFromAllDrivers (maxSessions );
271+     int  totalActualSessions  = calculateTotalMaxSessionsFromAllDrivers ();
276272
277273    if  (overrideMaxSessions ) {
278274      return  totalActualSessions ;
@@ -367,33 +363,32 @@ private Map<String, Integer> calculateActualMaxSessionsPerDriverConfig() {
367363            result .put (displayName , driverMaxSessions );
368364          }
369365        } else  {
370-           // When override-max-sessions = false, use CPU-based distribution with explicit overrides 
371-           final  int  sessionsPerDriverConfig ;
372-           if  (configList .size () > DEFAULT_MAX_SESSIONS ) {
373-             sessionsPerDriverConfig  = 1 ;
374-           } else  {
375-             sessionsPerDriverConfig  = DEFAULT_MAX_SESSIONS  / configList .size ();
376-           }
366+           // When override-max-sessions = false, use optimized CPU distribution 
367+           List <String > driverNames  =
368+               configList .stream ()
369+                   .map (config  -> config .get ("display-name" ))
370+                   .collect (Collectors .toList ());
371+           Map <String , Integer > sessionsPerDriver  = calculateOptimizedCpuDistribution (driverNames );
377372
378373          for  (Map <String , String > configMap  : configList ) {
379374            String  displayName  = configMap .get ("display-name" );
380-             int  driverMaxSessions  = sessionsPerDriverConfig ;
375+             int  driverMaxSessions  = sessionsPerDriver . getOrDefault ( displayName ,  1 ) ;
381376
382377            // Check if driver config has explicit max-sessions within allowed range 
383378            if  (configMap .containsKey ("max-sessions" )) {
384379              int  explicitMaxSessions  =
385380                  parseMaxSessionsSafely (
386381                      configMap .get ("max-sessions" ),
387-                       sessionsPerDriverConfig ,
382+                       driverMaxSessions ,
388383                      "driver config '"  + displayName  + "' explicit max-sessions" );
389-               if  (explicitMaxSessions  >= 1  && explicitMaxSessions  <= sessionsPerDriverConfig ) {
384+               if  (explicitMaxSessions  >= 1  && explicitMaxSessions  <= driverMaxSessions ) {
390385                driverMaxSessions  = explicitMaxSessions ;
391386              }
392387            } else  {
393388              // Only apply node max-sessions override if driver config doesn't have explicit 
394389              // max-sessions 
395390              if  (nodeMaxSessions  != DEFAULT_MAX_SESSIONS ) {
396-                 if  (nodeMaxSessions  >= 1  && nodeMaxSessions  <= sessionsPerDriverConfig ) {
391+                 if  (nodeMaxSessions  >= 1  && nodeMaxSessions  <= driverMaxSessions ) {
397392                  driverMaxSessions  = nodeMaxSessions ;
398393                }
399394              }
@@ -423,22 +418,25 @@ private Map<String, Integer> calculateActualMaxSessionsPerDriverConfig() {
423418          }
424419        } else  {
425420          // When override-max-sessions = false, use optimized CPU distribution 
426-           Map <WebDriverInfo , Integer > sessionsPerDriver  =
427-               calculateOptimizedCpuDistribution (detectedDrivers );
421+           List <String > driverNames  =
422+               detectedDrivers .stream ()
423+                   .map (WebDriverInfo ::getDisplayName )
424+                   .collect (Collectors .toList ());
425+           Map <String , Integer > sessionsPerDriver  = calculateOptimizedCpuDistribution (driverNames );
428426
429427          // Check if node max-sessions is explicitly set and within allowed range 
430428          if  (nodeMaxSessions  != DEFAULT_MAX_SESSIONS ) {
431429            for  (WebDriverInfo  info  : detectedDrivers ) {
432-               int  calculatedSessions  = sessionsPerDriver .get (info );
430+               int  calculatedSessions  = sessionsPerDriver .get (info . getDisplayName () );
433431              if  (nodeMaxSessions  >= 1  && nodeMaxSessions  <= calculatedSessions ) {
434432                result .put (info .getDisplayName (), nodeMaxSessions );
435433              } else  {
436434                result .put (info .getDisplayName (), calculatedSessions );
437435              }
438436            }
439437          } else  {
440-             for  (Map .Entry <WebDriverInfo , Integer > entry  : sessionsPerDriver .entrySet ()) {
441-               result .put (entry .getKey (). getDisplayName () , entry .getValue ());
438+             for  (Map .Entry <String , Integer > entry  : sessionsPerDriver .entrySet ()) {
439+               result .put (entry .getKey (), entry .getValue ());
442440            }
443441          }
444442        }
@@ -448,65 +446,51 @@ private Map<String, Integer> calculateActualMaxSessionsPerDriverConfig() {
448446    return  result ;
449447  }
450448
451-   private  Map <WebDriverInfo , Integer > calculateOptimizedCpuDistribution (List <WebDriverInfo >  infos ) {
452-     Map <WebDriverInfo , Integer > sessionsPerDriver  = new  HashMap <>();
449+   private  Map <String , Integer > calculateOptimizedCpuDistribution (List <String >  driverNames ) {
450+     Map <String , Integer > sessionsPerDriver  = new  HashMap <>();
453451
454452    // First, allocate sessions for constrained drivers (like Safari) 
455453    int  remainingCores  = DEFAULT_MAX_SESSIONS ;
456-     List <WebDriverInfo > constrainedDrivers  = new  ArrayList <>();
457-     List <WebDriverInfo > flexibleDrivers  = new  ArrayList <>();
454+     List <String > flexibleDrivers  = new  ArrayList <>();
458455
459-     for  (WebDriverInfo  info  : infos ) {
460-       if  (info .getMaximumSimultaneousSessions () == 1 
461-           && SINGLE_SESSION_DRIVERS .contains (info .getDisplayName ().toLowerCase (Locale .ENGLISH ))) {
462-         constrainedDrivers .add (info );
463-         sessionsPerDriver .put (info , 1 );
456+     for  (String  driverName  : driverNames ) {
457+       if  (SINGLE_SESSION_DRIVERS .contains (driverName .toLowerCase (Locale .ENGLISH ))) {
458+         // Constrained drivers get exactly 1 session 
459+         sessionsPerDriver .put (driverName , 1 );
464460        remainingCores --;
465461      } else  {
466-         flexibleDrivers .add (info );
462+         flexibleDrivers .add (driverName );
467463      }
468464    }
469465
470466    // Then distribute remaining cores among flexible drivers 
471-     if  (flexibleDrivers .size () >  0  && remainingCores  > 0 ) {
467+     if  (! flexibleDrivers .isEmpty ()  && remainingCores  > 0 ) {
472468      int  sessionsPerFlexibleDriver  = Math .max (1 , remainingCores  / flexibleDrivers .size ());
473469      int  remainderCores  = remainingCores  % flexibleDrivers .size ();
474470
475471      // Distribute base sessions to all flexible drivers 
476472      for  (int  i  = 0 ; i  < flexibleDrivers .size (); i ++) {
477-         WebDriverInfo   info  = flexibleDrivers .get (i );
473+         String   driverName  = flexibleDrivers .get (i );
478474        int  sessions  = sessionsPerFlexibleDriver ;
479475
480476        // Distribute remainder cores to the first 'remainderCores' drivers 
481477        if  (i  < remainderCores ) {
482478          sessions ++;
483479        }
484480
485-         sessionsPerDriver .put (info , sessions );
481+         sessionsPerDriver .put (driverName , sessions );
486482      }
487- 
488-       LOG .log (
489-           Level .FINE ,
490-           "Distributed {0} cores among {1} flexible drivers: {2} base sessions each, " 
491-               + "{3} drivers get +1 extra session" ,
492-           new  Object [] {
493-             remainingCores , flexibleDrivers .size (), sessionsPerFlexibleDriver , remainderCores 
494-           });
495-     } else  if  (flexibleDrivers .size () > 0 ) {
483+     } else  if  (!flexibleDrivers .isEmpty ()) {
496484      // No remaining cores, give each flexible driver 1 session 
497-       for  (WebDriverInfo   info  : flexibleDrivers ) {
498-         sessionsPerDriver .put (info , 1 );
485+       for  (String   driverName  : flexibleDrivers ) {
486+         sessionsPerDriver .put (driverName , 1 );
499487      }
500-       LOG .log (
501-           Level .FINE ,
502-           "No remaining cores available, assigning 1 session to each of {0} flexible drivers" ,
503-           flexibleDrivers .size ());
504488    }
505489
506490    return  sessionsPerDriver ;
507491  }
508492
509-   private  int  calculateTotalMaxSessionsFromAllDrivers (int   nodeMaxSessions ) {
493+   private  int  calculateTotalMaxSessionsFromAllDrivers () {
510494    Map <String , Integer > actualMaxSessions  = calculateActualMaxSessionsPerDriverConfig ();
511495    return  actualMaxSessions .values ().stream ().mapToInt (Integer ::intValue ).sum ();
512496  }
@@ -650,8 +634,7 @@ private SessionFactory createSessionFactory(String clazz, Capabilities stereotyp
650634
651635  private  void  addDriverConfigs (
652636      Function <ImmutableCapabilities , Collection <SessionFactory >> factoryFactory ,
653-       ImmutableMultimap .Builder <Capabilities , SessionFactory > sessionFactories ,
654-       int  maxSessions ) {
637+       ImmutableMultimap .Builder <Capabilities , SessionFactory > sessionFactories ) {
655638
656639    Multimap <WebDriverInfo , SessionFactory > driverConfigs  = HashMultimap .create ();
657640
@@ -721,10 +704,6 @@ private void addDriverConfigs(
721704              // Get actual max-sessions per driver config from centralized calculation 
722705              Map <String , Integer > actualMaxSessionsPerConfig  =
723706                  calculateActualMaxSessionsPerDriverConfig ();
724-               boolean  overrideMaxSessions  =
725-                   config 
726-                       .getBool (NODE_SECTION , "override-max-sessions" )
727-                       .orElse (OVERRIDE_MAX_SESSIONS );
728707
729708              // iterate over driver configs 
730709              configList .forEach (
@@ -888,7 +867,7 @@ private void addSpecificDrivers(
888867  }
889868
890869  private  Map <WebDriverInfo , Collection <SessionFactory >> discoverDrivers (
891-       int   maxSessions ,  Function <ImmutableCapabilities , Collection <SessionFactory >> factoryFactory ) {
870+       Function <ImmutableCapabilities , Collection <SessionFactory >> factoryFactory ) {
892871
893872    if  (!config .getBool (NODE_SECTION , "detect-drivers" ).orElse (DEFAULT_DETECT_DRIVERS )) {
894873      return  ImmutableMap .of ();
0 commit comments