@@ -241,17 +241,13 @@ public Map<Capabilities, Collection<SessionFactory>> getSessionFactories(
241
241
+ "Issues related to parallel testing with Internet Explored won't be accepted." );
242
242
LOG .warning ("Double check if enabling 'override-max-sessions' is really needed" );
243
243
}
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 );
249
245
250
246
ImmutableMultimap .Builder <Capabilities , SessionFactory > sessionFactories =
251
247
ImmutableMultimap .builder ();
252
248
253
249
addDriverFactoriesFromConfig (sessionFactories );
254
- addDriverConfigs (factoryFactory , sessionFactories , nodeMaxSessions );
250
+ addDriverConfigs (factoryFactory , sessionFactories );
255
251
addSpecificDrivers (allDrivers , sessionFactories );
256
252
addDetectedDrivers (allDrivers , sessionFactories );
257
253
@@ -272,7 +268,7 @@ public int getMaxSessions() {
272
268
config .getBool (NODE_SECTION , "override-max-sessions" ).orElse (OVERRIDE_MAX_SESSIONS );
273
269
274
270
// Always calculate sum of actual driver sessions for consistency
275
- int totalActualSessions = calculateTotalMaxSessionsFromAllDrivers (maxSessions );
271
+ int totalActualSessions = calculateTotalMaxSessionsFromAllDrivers ();
276
272
277
273
if (overrideMaxSessions ) {
278
274
return totalActualSessions ;
@@ -367,33 +363,32 @@ private Map<String, Integer> calculateActualMaxSessionsPerDriverConfig() {
367
363
result .put (displayName , driverMaxSessions );
368
364
}
369
365
} 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 );
377
372
378
373
for (Map <String , String > configMap : configList ) {
379
374
String displayName = configMap .get ("display-name" );
380
- int driverMaxSessions = sessionsPerDriverConfig ;
375
+ int driverMaxSessions = sessionsPerDriver . getOrDefault ( displayName , 1 ) ;
381
376
382
377
// Check if driver config has explicit max-sessions within allowed range
383
378
if (configMap .containsKey ("max-sessions" )) {
384
379
int explicitMaxSessions =
385
380
parseMaxSessionsSafely (
386
381
configMap .get ("max-sessions" ),
387
- sessionsPerDriverConfig ,
382
+ driverMaxSessions ,
388
383
"driver config '" + displayName + "' explicit max-sessions" );
389
- if (explicitMaxSessions >= 1 && explicitMaxSessions <= sessionsPerDriverConfig ) {
384
+ if (explicitMaxSessions >= 1 && explicitMaxSessions <= driverMaxSessions ) {
390
385
driverMaxSessions = explicitMaxSessions ;
391
386
}
392
387
} else {
393
388
// Only apply node max-sessions override if driver config doesn't have explicit
394
389
// max-sessions
395
390
if (nodeMaxSessions != DEFAULT_MAX_SESSIONS ) {
396
- if (nodeMaxSessions >= 1 && nodeMaxSessions <= sessionsPerDriverConfig ) {
391
+ if (nodeMaxSessions >= 1 && nodeMaxSessions <= driverMaxSessions ) {
397
392
driverMaxSessions = nodeMaxSessions ;
398
393
}
399
394
}
@@ -423,22 +418,25 @@ private Map<String, Integer> calculateActualMaxSessionsPerDriverConfig() {
423
418
}
424
419
} else {
425
420
// 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 );
428
426
429
427
// Check if node max-sessions is explicitly set and within allowed range
430
428
if (nodeMaxSessions != DEFAULT_MAX_SESSIONS ) {
431
429
for (WebDriverInfo info : detectedDrivers ) {
432
- int calculatedSessions = sessionsPerDriver .get (info );
430
+ int calculatedSessions = sessionsPerDriver .get (info . getDisplayName () );
433
431
if (nodeMaxSessions >= 1 && nodeMaxSessions <= calculatedSessions ) {
434
432
result .put (info .getDisplayName (), nodeMaxSessions );
435
433
} else {
436
434
result .put (info .getDisplayName (), calculatedSessions );
437
435
}
438
436
}
439
437
} 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 ());
442
440
}
443
441
}
444
442
}
@@ -448,65 +446,51 @@ private Map<String, Integer> calculateActualMaxSessionsPerDriverConfig() {
448
446
return result ;
449
447
}
450
448
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 <>();
453
451
454
452
// First, allocate sessions for constrained drivers (like Safari)
455
453
int remainingCores = DEFAULT_MAX_SESSIONS ;
456
- List <WebDriverInfo > constrainedDrivers = new ArrayList <>();
457
- List <WebDriverInfo > flexibleDrivers = new ArrayList <>();
454
+ List <String > flexibleDrivers = new ArrayList <>();
458
455
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 );
464
460
remainingCores --;
465
461
} else {
466
- flexibleDrivers .add (info );
462
+ flexibleDrivers .add (driverName );
467
463
}
468
464
}
469
465
470
466
// Then distribute remaining cores among flexible drivers
471
- if (flexibleDrivers .size () > 0 && remainingCores > 0 ) {
467
+ if (! flexibleDrivers .isEmpty () && remainingCores > 0 ) {
472
468
int sessionsPerFlexibleDriver = Math .max (1 , remainingCores / flexibleDrivers .size ());
473
469
int remainderCores = remainingCores % flexibleDrivers .size ();
474
470
475
471
// Distribute base sessions to all flexible drivers
476
472
for (int i = 0 ; i < flexibleDrivers .size (); i ++) {
477
- WebDriverInfo info = flexibleDrivers .get (i );
473
+ String driverName = flexibleDrivers .get (i );
478
474
int sessions = sessionsPerFlexibleDriver ;
479
475
480
476
// Distribute remainder cores to the first 'remainderCores' drivers
481
477
if (i < remainderCores ) {
482
478
sessions ++;
483
479
}
484
480
485
- sessionsPerDriver .put (info , sessions );
481
+ sessionsPerDriver .put (driverName , sessions );
486
482
}
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 ()) {
496
484
// 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 );
499
487
}
500
- LOG .log (
501
- Level .FINE ,
502
- "No remaining cores available, assigning 1 session to each of {0} flexible drivers" ,
503
- flexibleDrivers .size ());
504
488
}
505
489
506
490
return sessionsPerDriver ;
507
491
}
508
492
509
- private int calculateTotalMaxSessionsFromAllDrivers (int nodeMaxSessions ) {
493
+ private int calculateTotalMaxSessionsFromAllDrivers () {
510
494
Map <String , Integer > actualMaxSessions = calculateActualMaxSessionsPerDriverConfig ();
511
495
return actualMaxSessions .values ().stream ().mapToInt (Integer ::intValue ).sum ();
512
496
}
@@ -650,8 +634,7 @@ private SessionFactory createSessionFactory(String clazz, Capabilities stereotyp
650
634
651
635
private void addDriverConfigs (
652
636
Function <ImmutableCapabilities , Collection <SessionFactory >> factoryFactory ,
653
- ImmutableMultimap .Builder <Capabilities , SessionFactory > sessionFactories ,
654
- int maxSessions ) {
637
+ ImmutableMultimap .Builder <Capabilities , SessionFactory > sessionFactories ) {
655
638
656
639
Multimap <WebDriverInfo , SessionFactory > driverConfigs = HashMultimap .create ();
657
640
@@ -721,10 +704,6 @@ private void addDriverConfigs(
721
704
// Get actual max-sessions per driver config from centralized calculation
722
705
Map <String , Integer > actualMaxSessionsPerConfig =
723
706
calculateActualMaxSessionsPerDriverConfig ();
724
- boolean overrideMaxSessions =
725
- config
726
- .getBool (NODE_SECTION , "override-max-sessions" )
727
- .orElse (OVERRIDE_MAX_SESSIONS );
728
707
729
708
// iterate over driver configs
730
709
configList .forEach (
@@ -888,7 +867,7 @@ private void addSpecificDrivers(
888
867
}
889
868
890
869
private Map <WebDriverInfo , Collection <SessionFactory >> discoverDrivers (
891
- int maxSessions , Function <ImmutableCapabilities , Collection <SessionFactory >> factoryFactory ) {
870
+ Function <ImmutableCapabilities , Collection <SessionFactory >> factoryFactory ) {
892
871
893
872
if (!config .getBool (NODE_SECTION , "detect-drivers" ).orElse (DEFAULT_DETECT_DRIVERS )) {
894
873
return ImmutableMap .of ();
0 commit comments