diff --git a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformancePostgreSqlTest.java b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformancePostgreSqlTest.java index e8cb8ae8a..e7acae079 100644 --- a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformancePostgreSqlTest.java +++ b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformancePostgreSqlTest.java @@ -1,12 +1,12 @@ /* * Copyright 2015 Robert von Burg - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -44,11 +44,16 @@ public class PerformancePostgreSqlTest extends PerformanceTest { @Test public void runPerformanceTestCached() { - runPerformanceTest("cached"); + runPerformanceTest("cached", 1); + } + + @Test + public void runPerformanceTestBulk() { + runPerformanceTest("cached", 20); } @Test public void runParallelPerformanceTest() { - runParallelPerformanceTest("cached"); + runParallelPerformanceTest("cached", 1); } } diff --git a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformancePostgreVersioningSqlTest.java b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformancePostgreVersioningSqlTest.java index c1d77285a..78996d148 100644 --- a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformancePostgreVersioningSqlTest.java +++ b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformancePostgreVersioningSqlTest.java @@ -1,12 +1,12 @@ /* * Copyright 2015 Robert von Burg - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -45,12 +45,17 @@ public class PerformancePostgreVersioningSqlTest extends PerformanceTest { @Test public void runPerformanceTestCached() { - runPerformanceTest("cached"); + runPerformanceTest("cached", 1); + } + + @Test + public void runPerformanceTestBulk() { + runPerformanceTest("cached", 20); } @Test @Ignore public void runParallelPerformanceTest() { - runParallelPerformanceTest("cached"); + runParallelPerformanceTest("cached", 1); } } diff --git a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTest.java b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTest.java index 41546ae15..5bc7205d0 100644 --- a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTest.java +++ b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTest.java @@ -31,8 +31,10 @@ public abstract class PerformanceTest { return runtimeMock; } - protected PerformanceTestArgument argInstance() { - return new PerformanceTestArgument(); + protected PerformanceTestArgument argInstance(int nrOfElements) { + PerformanceTestArgument arg = new PerformanceTestArgument(); + arg.nrOfElements = nrOfElements; + return arg; } public static void buildRuntime(String sourcePath, String targetPath) { @@ -73,13 +75,16 @@ public abstract class PerformanceTest { Driver.deregister(); } - protected void runPerformanceTest(String username) { + protected void runPerformanceTest(String username, int nrOfElements) { Certificate certificate = runtime().getPrivilegeHandler().authenticate(username, username.toCharArray()); ServiceHandler svcHandler = runtime().getServiceHandler(); - svcHandler.doService(certificate, new PerformanceTestService(), argInstance()); + PerformanceTestResult svcResult = svcHandler + .doService(certificate, new PerformanceTestService(), argInstance(nrOfElements)); + if (svcResult.isNok()) + throw new IllegalStateException("Performance test failed", svcResult.getThrowable()); } - protected void runParallelPerformanceTest(String username) { + protected void runParallelPerformanceTest(String username, int nrOfElements) { int nrOfTasks = 5; @@ -88,7 +93,7 @@ public abstract class PerformanceTest { long start = System.currentTimeMillis(); List> tasks = new ArrayList<>(); for (int i = 0; i < nrOfTasks; i++) { - PerformanceTask task = new PerformanceTask(username); + PerformanceTask task = new PerformanceTask(username, nrOfElements); tasks.add(task); commonPool.execute(task); } @@ -113,15 +118,20 @@ public abstract class PerformanceTest { public class PerformanceTask extends ForkJoinTask { private String username; - private long nrOfTxs; + private int nrOfElements; + private PerformanceTestResult svcResult; - public PerformanceTask(String username) { + public PerformanceTask(String username, int nrOfElements) { this.username = username; + this.nrOfElements = nrOfElements; } @Override public Long getRawResult() { - return this.nrOfTxs; + if (this.svcResult == null) + return 0L; + else + return this.svcResult.getNrOfTxs(); } @Override @@ -135,11 +145,11 @@ public abstract class PerformanceTest { Certificate certificate = runtime().getPrivilegeHandler() .authenticate(username, this.username.toCharArray()); ServiceHandler svcHandler = runtime().getServiceHandler(); - PerformanceTestResult svcResult = svcHandler - .doService(certificate, new PerformanceTestService(), new PerformanceTestArgument()); + this.svcResult = svcHandler.doService(certificate, new PerformanceTestService(), argInstance(nrOfElements)); runtime().getPrivilegeHandler().invalidate(certificate); - this.nrOfTxs = svcResult.getNrOfTxs(); + if (this.svcResult.isNok()) + throw new IllegalStateException("Task failed!", this.svcResult.getThrowable()); return true; } diff --git a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestArgument.java b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestArgument.java index 00d32c856..200203b59 100644 --- a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestArgument.java +++ b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestArgument.java @@ -8,4 +8,5 @@ public class PerformanceTestArgument extends ServiceArgument { private static final long serialVersionUID = 1L; public long duration = 15; public TimeUnit unit = TimeUnit.SECONDS; + public int nrOfElements = 1; } diff --git a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestService.java b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestService.java index 90d175be4..d947714a4 100644 --- a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestService.java +++ b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestService.java @@ -1,12 +1,12 @@ /* * Copyright 2015 Robert von Burg - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,13 +15,18 @@ */ package li.strolch.performance; +import static li.strolch.model.ModelGenerator.BAG_ID; +import static li.strolch.model.ModelGenerator.PARAM_STRING_ID; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; import java.util.concurrent.TimeUnit; import li.strolch.agent.api.StrolchAgent; import li.strolch.model.ModelGenerator; import li.strolch.model.Resource; -import li.strolch.persistence.api.AddResourceCommand; -import li.strolch.persistence.api.RemoveResourceCommand; +import li.strolch.model.parameter.StringParameter; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.service.api.AbstractService; import li.strolch.service.api.ServiceResultState; @@ -61,17 +66,50 @@ public class PerformanceTestService extends AbstractService resourceIds = new ArrayList<>(); while (run(start)) { try (StrolchTransaction tx = openUserTx()) { - if (resId != null) { - Resource toDelete = queryResource(tx, resId); - deleteResource(tx, toDelete); + if (resourceIds.isEmpty()) { + for (int i = 0; i < arg.nrOfElements; i++) { + resourceIds.add(createResource(tx)); + } + } else { + + if (resourceIds.size() > 10) { + + int removeTo = resourceIds.size() / 3; + int updateTo = (resourceIds.size() / 3) * 2; + + // we have many, so update some, change some, create some + List toRemove = new ArrayList<>(resourceIds.subList(0, removeTo)); + List toUpdate = new ArrayList<>(resourceIds.subList(removeTo, updateTo)); + resourceIds.removeAll(toRemove); + + for (String resourceId : toRemove) { + tx.remove(tx.getResourceBy(MY_TYPE, resourceId, true)); + } + for (String resourceId : toUpdate) { + Resource resource = tx.getResourceBy(MY_TYPE, resourceId, true); + StringParameter stringP = resource.getParameter(BAG_ID, PARAM_STRING_ID); + stringP.setValue("Yellow!"); + tx.update(resource); + } + for (int i = 0; i < removeTo; i++) { + resourceIds.add(createResource(tx)); + } + + } else { + + for (Iterator iterator = resourceIds.iterator(); iterator.hasNext(); ) { + String resourceId = iterator.next(); + tx.remove(tx.getResourceBy(MY_TYPE, resourceId, true)); + iterator.remove(); + } + } } - resId = createResource(tx); tx.commitOnClose(); } @@ -101,24 +139,10 @@ public class PerformanceTestService extends AbstractService - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -39,11 +39,16 @@ public class PerformanceTransientTest extends PerformanceTest { @Test public void runPerformanceTest() { - runPerformanceTest("transient"); + runPerformanceTest("transient", 1); + } + + @Test + public void runPerformanceTestBulk() { + runPerformanceTest("transient", 20); } @Test public void runParallelPerformanceTest() { - runParallelPerformanceTest("transient"); + runParallelPerformanceTest("transient", 1); } } diff --git a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceXmlTest.java b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceXmlTest.java index 1933d6771..84b755bc2 100644 --- a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceXmlTest.java +++ b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceXmlTest.java @@ -39,11 +39,16 @@ public class PerformanceXmlTest extends PerformanceTest { @Test public void runPerformanceTestCached() { - runPerformanceTest("cached"); + runPerformanceTest("cached", 1); + } + + @Test + public void runPerformanceTestBulk() { + runPerformanceTest("cached", 20); } @Test public void runParallelPerformanceTest() { - runParallelPerformanceTest("cached"); + runParallelPerformanceTest("cached", 1); } }