Skip to content

Commit 05d5d10

Browse files
authored
Merge pull request #5762 from gchq/5688-paralise-st
Issue 5688 - Parallelise nightly system tests
2 parents 2b0d938 + 18f6206 commit 05d5d10

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+510
-61
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Current Slow and Expensive test suites
2+
### This looks imbalanced but EKSBulkImportST is a lot slower than others
3+
4+
These tables show which system tests run in which suite. Each suite runs in parallel to the others to speed up the time
5+
it takes to complete the nightly system tests.
6+
7+
| Slow1 | Slow2 | Slow3 |
8+
| -------------------------- | -------------------------- | ------------------------------- |
9+
| AutoStopEcsTaskST | EksBulkImportST | CompactionCreationST |
10+
| AutoDeleteS3ObjectsST | CompactionOnEC2ST | MultipleTablesST |
11+
| RedeployOptionalStacksST | | StateStoreCommitterThroughputST |
12+
| EmrPersistentBulkImportST |
13+
| OptionalFeaturesDisabledST |
14+
15+
16+
| Expensive1 | Expensive2 | Expensive3 |
17+
| --------------------------------- | -------------------------- | --------------------- |
18+
| CompactionDataFusionPerformanceST | CompactionPerformanceST | IngestPerformanceST |
19+
| CompactionVeryLargeST | EmrBulkImportPerformanceST | ParallelCompactionsST |

docs/development/system-tests.md

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,27 @@ of that class, and look at the tests in that module for examples.
7676

7777
This test module contains several JUnit test suites:
7878
- QuickSystemTestSuite (the default)
79-
- NightlyFunctionalSystemTestSuite
80-
- NightlyPerformanceSystemTestSuite
79+
- SlowSystemTestSuite1-n
80+
- ExpensiveSystemTestSuite1-n
8181

82-
Tests that are tagged as Slow or Expensive will not be included in the quick suite. The quick suite is intended to run
83-
in around 40 minutes. The nightly functional suite includes tests tagged as Slow, and will take a bit longer. The
84-
nightly performance suite includes all tests, including ones tagged as Expensive. The performance tests work with a
82+
The nightly test runs have been broken down into a number of test suites that each run in parallel.
83+
This is to speed up the time it takes for the nightly system tests to complete. Each suite (Quick, Slow1-n, Expensive1-n)
84+
begins by creating a copy of the Sleeper project and then running specific system tests inside that copy. Results are then
85+
collated once all suites have finished, then uploaded to an s3 bucket. The suite's Sleeper instances are isolated from one
86+
another so that they can run in parallel.
87+
88+
For more information about the nightly system tests see [here](../../scripts/test/nightly/README.md).
89+
90+
Tests that are tagged as Slow(1-n) or Expensive(1-n) will not be included in the quick suite. The quick suite is intended
91+
to run in around 40 minutes. The nightly functional run includes tests tagged as Slow, and will take a bit longer. The
92+
nightly performance run includes all tests, including ones tagged as Expensive. The performance tests work with a
8593
larger bulk of data. They take time to run and can be costly to run frequently.
94+
When adding a new Slow or Expensive System test add either the Slow1-n or Expensive1-n tag.
95+
96+
### Current Slow and Expensive test suites
97+
The current system tests running in each suite can be seen in [system-test-suites](system-test-suites.md).
98+
99+
When adding new slow or expensive system tests ensure this documentation is updated.
86100

87101
### Running tests
88102

java/cdk-environment/src/main/java/sleeper/environment/cdk/buildec2/BuildEC2Deployment.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public BuildEC2Deployment(Construct scope, IVpc vpc, NightlyTestDeployment night
5858
.vpc(vpc)
5959
.securityGroup(createSecurityGroup(scope))
6060
.machineImage(image.machineImage())
61-
.instanceType(InstanceType.of(InstanceClass.T3, InstanceSize.LARGE))
61+
.instanceType(InstanceType.of(InstanceClass.T3, InstanceSize.XLARGE2))
6262
.vpcSubnets(SubnetSelection.builder().subnetType(SubnetType.PRIVATE_WITH_EGRESS).build())
6363
.userData(UserData.custom(LoadUserDataUtil.userData(params)))
6464
.userDataCausesReplacement(true)

java/cdk-environment/src/main/java/sleeper/environment/cdk/config/AppParameters.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ private AppParameters() {
3232
public static final StringParameter BUILD_IMAGE_OWNER = StringParameter.keyAndDefault("buildImageOwner", "099720109477");
3333
public static final StringParameter BUILD_IMAGE_LOGIN_USER = StringParameter.keyAndDefault("buildImageLoginUser", "ubuntu");
3434
public static final StringParameter BUILD_IMAGE_ROOT_DEVICE_NAME = StringParameter.keyAndDefault("buildImageRootDeviceName", "/dev/sda1");
35-
public static final IntParameter BUILD_ROOT_VOLUME_SIZE_GIB = IntParameter.keyAndDefault("buildRootVolumeSizeGiB", 200);
35+
public static final IntParameter BUILD_ROOT_VOLUME_SIZE_GIB = IntParameter.keyAndDefault("buildRootVolumeSizeGiB", 350);
3636

3737
public static final OptionalStringParameter LOG_RETENTION_DAYS = OptionalStringParameter.key("logRetentionDays");
3838
public static final OptionalStringParameter BUILD_UPTIME_LAMBDA_JAR = OptionalStringParameter.key("buildUptimeLambdaJar");

java/cdk-environment/src/test/java/sleeper/environment/cdk/config/IntParameterTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class IntParameterTest {
2626
@Test
2727
public void useDefaultValueWhenUnset() {
2828
AppContext context = AppContext.empty();
29-
assertThat(context.get(BUILD_ROOT_VOLUME_SIZE_GIB)).isEqualTo(200);
29+
assertThat(context.get(BUILD_ROOT_VOLUME_SIZE_GIB)).isEqualTo(350);
3030
}
3131

3232
@Test

java/clients/src/main/java/sleeper/clients/deploy/DeployExistingInstance.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public class DeployExistingInstance {
5353
private final EcrClient ecr;
5454
private final boolean deployPaused;
5555
private final CommandPipelineRunner runCommand;
56+
private final boolean createMultiPlatformBuilder;
5657

5758
private DeployExistingInstance(Builder builder) {
5859
scriptsDirectory = builder.scriptsDirectory;
@@ -62,6 +63,7 @@ private DeployExistingInstance(Builder builder) {
6263
ecr = builder.ecr;
6364
deployPaused = builder.deployPaused;
6465
runCommand = builder.runCommand;
66+
createMultiPlatformBuilder = builder.createMultiPlatformBuilder;
6567
}
6668

6769
public static Builder builder() {
@@ -97,6 +99,7 @@ public void update() throws IOException, InterruptedException {
9799
.scriptsDirectory(scriptsDirectory)
98100
.deployConfig(DeployConfiguration.fromScriptsDirectory(scriptsDirectory))
99101
.commandRunner(runCommand)
102+
.createMultiplatformBuilder(createMultiPlatformBuilder)
100103
.build(),
101104
CheckVersionExistsInEcr.withEcrClient(ecr)),
102105
DeployInstance.WriteLocalProperties.underScriptsDirectory(scriptsDirectory),
@@ -120,6 +123,7 @@ public static final class Builder {
120123
private EcrClient ecr;
121124
private boolean deployPaused;
122125
private CommandPipelineRunner runCommand = CommandUtils::runCommandInheritIO;
126+
private boolean createMultiPlatformBuilder = true;
123127

124128
private Builder() {
125129
}
@@ -164,6 +168,11 @@ public Builder runCommand(CommandPipelineRunner runCommand) {
164168
return this;
165169
}
166170

171+
public Builder createMultiPlatformBuilder(boolean createMultiPlatformBuilder) {
172+
this.createMultiPlatformBuilder = createMultiPlatformBuilder;
173+
return this;
174+
}
175+
167176
public Builder loadPropertiesFromS3(S3Client s3Client, DynamoDbClient dynamoCient) {
168177
properties = S3InstanceProperties.loadGivenInstanceId(s3Client, instanceId);
169178
tablePropertiesList = S3TableProperties.createStore(properties, s3Client, dynamoCient)

java/clients/src/main/java/sleeper/clients/deploy/DeployNewInstance.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public class DeployNewInstance {
6161
private final InvokeCdk.Type instanceType;
6262
private final CommandPipelineRunner runCommand;
6363
private final boolean deployPaused;
64+
private final boolean createMultiPlatformBuilder;
6465

6566
private DeployNewInstance(Builder builder) {
6667
s3Client = builder.s3Client;
@@ -72,6 +73,7 @@ private DeployNewInstance(Builder builder) {
7273
instanceType = builder.instanceType;
7374
runCommand = builder.runCommand;
7475
deployPaused = builder.deployPaused;
76+
createMultiPlatformBuilder = builder.createMultiPlatformBuilder;
7577
}
7678

7779
public static Builder builder() {
@@ -108,14 +110,14 @@ public void deploy() throws IOException, InterruptedException {
108110
LOGGER.info("Running Deployment");
109111
LOGGER.info("-------------------------------------------------------");
110112
deployInstanceConfiguration.validate();
111-
112113
DeployInstance deployInstance = new DeployInstance(
113114
SyncJars.fromScriptsDirectory(s3Client, scriptsDirectory),
114115
new UploadDockerImagesToEcr(
115116
UploadDockerImages.builder()
116117
.scriptsDirectory(scriptsDirectory)
117118
.deployConfig(DeployConfiguration.fromScriptsDirectory(scriptsDirectory))
118119
.commandRunner(runCommand)
120+
.createMultiplatformBuilder(createMultiPlatformBuilder)
119121
.build(),
120122
CheckVersionExistsInEcr.withEcrClient(ecrClient)),
121123
DeployInstance.WriteLocalProperties.underScriptsDirectory(scriptsDirectory),
@@ -149,6 +151,7 @@ public static final class Builder {
149151
private InvokeCdk.Type instanceType;
150152
private CommandPipelineRunner runCommand = CommandUtils::runCommandInheritIO;
151153
private boolean deployPaused;
154+
private boolean createMultiPlatformBuilder = true;
152155

153156
private Builder() {
154157
}
@@ -198,6 +201,11 @@ public Builder deployPaused(boolean deployPaused) {
198201
return this;
199202
}
200203

204+
public Builder createMultiPlatformBuilder(boolean createMultiPlatformBuilder) {
205+
this.createMultiPlatformBuilder = createMultiPlatformBuilder;
206+
return this;
207+
}
208+
201209
public DeployNewInstance build() {
202210
return new DeployNewInstance(this);
203211
}

java/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@
241241
<sleeper.system.test.force.redeploy>false</sleeper.system.test.force.redeploy>
242242
<sleeper.system.test.instances.force.redeploy>false</sleeper.system.test.instances.force.redeploy>
243243
<sleeper.system.test.force.statestore.classname />
244+
<sleeper.system.test.create.multi.platform.builder>true</sleeper.system.test.create.multi.platform.builder>
244245
<sleeper.system.test.standalone.properties.template />
245246
<sleeper.system.test.instance.properties.overrides />
246247
<!-- Maven plugins -->
@@ -1944,6 +1945,10 @@
19441945
<name>sleeper.system.test.force.statestore.classname</name>
19451946
<value>${sleeper.system.test.force.statestore.classname}</value>
19461947
</property>
1948+
<property>
1949+
<name>sleeper.system.test.create.multi.platform.builder</name>
1950+
<value>${sleeper.system.test.create.multi.platform.builder}</value>
1951+
</property>
19471952
<property>
19481953
<name>sleeper.system.test.standalone.properties.template</name>
19491954
<value>${sleeper.system.test.standalone.properties.template}</value>

java/system-test/system-test-drivers/src/main/java/sleeper/systemtest/drivers/instance/AwsSleeperInstanceDriver.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public boolean deployInstanceIfNotPresent(String instanceId, SleeperInstanceConf
9494
.deployInstanceConfiguration(deployConfig)
9595
.instanceType(InvokeCdk.Type.STANDARD)
9696
.runCommand(CommandUtils::runCommandLogOutput)
97+
.createMultiPlatformBuilder(parameters.isCreateMultiPlatformBuilder())
9798
.deployWithClients(s3, dynamoDB, ecr);
9899
} catch (InterruptedException e) {
99100
Thread.currentThread().interrupt();
@@ -128,6 +129,7 @@ public void redeploy(InstanceProperties instanceProperties, List<TableProperties
128129
.tablePropertiesList(tableProperties)
129130
.scriptsDirectory(parameters.getScriptsDirectory())
130131
.runCommand(CommandUtils::runCommandLogOutput)
132+
.createMultiPlatformBuilder(parameters.isCreateMultiPlatformBuilder())
131133
.build().update();
132134
} catch (InterruptedException e) {
133135
Thread.currentThread().interrupt();

java/system-test/system-test-dsl/src/main/java/sleeper/systemtest/dsl/instance/SystemTestParameters.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public class SystemTestParameters {
6363
private final boolean forceRedeploySystemTest;
6464
private final boolean forceRedeployInstances;
6565
private final String forceStateStoreClassname;
66+
private final boolean createMultiPlatformBuilder;
6667
private final SystemTestStandaloneProperties standalonePropertiesTemplate;
6768
private final InstanceProperties instancePropertiesOverrides;
6869

@@ -79,6 +80,7 @@ private SystemTestParameters(Builder builder) {
7980
forceRedeploySystemTest = builder.forceRedeploySystemTest;
8081
forceRedeployInstances = builder.forceRedeployInstances;
8182
forceStateStoreClassname = builder.forceStateStoreClassname;
83+
createMultiPlatformBuilder = builder.createMultiPlatformBuilder;
8284
standalonePropertiesTemplate = Objects.requireNonNull(builder.standalonePropertiesTemplate, "standalonePropertiesTemplate must not be null");
8385
instancePropertiesOverrides = Objects.requireNonNull(builder.instancePropertiesOverrides, "instancePropertiesOverrides must not be null");
8486
// Combines with SystemTestInstanceConfiguration.shortName and a hyphen to create an instance ID within maximum length
@@ -155,6 +157,10 @@ public boolean isForceRedeployInstances() {
155157
return forceRedeployInstances;
156158
}
157159

160+
public boolean isCreateMultiPlatformBuilder() {
161+
return createMultiPlatformBuilder;
162+
}
163+
158164
public TableProperties createTableProperties(InstanceProperties instanceProperties, Schema schema) {
159165
TableProperties tableProperties = new TableProperties(instanceProperties);
160166
tableProperties.setSchema(schema);
@@ -244,6 +250,7 @@ public static final class Builder {
244250
private boolean forceRedeploySystemTest;
245251
private boolean forceRedeployInstances;
246252
private String forceStateStoreClassname;
253+
private boolean createMultiPlatformBuilder = true;
247254
private SystemTestStandaloneProperties standalonePropertiesTemplate;
248255
private InstanceProperties instancePropertiesOverrides;
249256

@@ -310,6 +317,11 @@ public Builder forceStateStoreClassname(String forceStateStoreClassname) {
310317
return this;
311318
}
312319

320+
public Builder createMultiPlatformBuilder(boolean createMultiPlatformBuilder) {
321+
this.createMultiPlatformBuilder = createMultiPlatformBuilder;
322+
return this;
323+
}
324+
313325
public Builder systemTestStandalonePropertiesTemplate(SystemTestStandaloneProperties standalonePropertiesTemplate) {
314326
this.standalonePropertiesTemplate = standalonePropertiesTemplate;
315327
return this;
@@ -332,6 +344,7 @@ public Builder loadFromSystemProperties() {
332344
.forceRedeploySystemTest(getBooleanProperty("sleeper.system.test.force.redeploy", false))
333345
.forceRedeployInstances(getBooleanProperty("sleeper.system.test.instances.force.redeploy", false))
334346
.forceStateStoreClassname(getOptionalProperty("sleeper.system.test.force.statestore.classname").orElse(null))
347+
.createMultiPlatformBuilder(getBooleanProperty("sleeper.system.test.create.multi.platform.builder", true))
335348
.systemTestStandalonePropertiesTemplate(getOptionalProperty("sleeper.system.test.standalone.properties.template")
336349
.map(Paths::get)
337350
.map(SystemTestStandaloneProperties::fromFile)

0 commit comments

Comments
 (0)