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