Fix benchmark compilation and runtime 00/62600/3
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 4 Sep 2017 07:51:29 +0000 (09:51 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 5 Sep 2017 12:17:28 +0000 (12:17 +0000)
Benchmark has been broken for some time, fix it up.

Change-Id: If2e1f3292a110947a1428a096de20e90591b0f6d
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
benchmarks/pom.xml
benchmarks/src/main/java/org/opendaylight/yangtools/yang/data/impl/tree/BenchmarkModel.java
benchmarks/src/main/java/org/opendaylight/yangtools/yang/data/impl/tree/InMemoryDataTreeBenchmark.java

index 18f27abc6af645534ae24b870421aea5637ae21d..e965025e4232234f276f1adf5bd98a0895a067e1 100644 (file)
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <groupId>org.opendaylight.yangtools</groupId>
-        <artifactId>yangtools-parent</artifactId>
-        <version>2.0.0-SNAPSHOT</version>
-        <relativePath>../common/parent</relativePath>
+        <groupId>org.opendaylight.odlparent</groupId>
+        <artifactId>odlparent</artifactId>
+        <version>2.0.4</version>
+        <relativePath/>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
+    <groupId>org.opendaylight.yangtools</groupId>
     <artifactId>benchmarks</artifactId>
-
-    <properties>
-        <yangtools.version>2.0.0-SNAPSHOT</yangtools.version>
-        <yang.maven.plugin.version>2.0.0-SNAPSHOT</yang.maven.plugin.version>
-        <java.source.version>1.7</java.source.version>
-        <java.target.version>1.7</java.target.version>
-        <jmh.version>0.9.7</jmh.version>
-    </properties>
+    <version>2.0.0-SNAPSHOT</version>
 
     <dependencies>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>yang-data-impl</artifactId>
-            <version>${yangtools.version}</version>
+            <version>2.0.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>yang-parser-impl</artifactId>
-            <version>${yangtools.version}</version>
+            <version>2.0.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.openjdk.jmh</groupId>
             <artifactId>jmh-core</artifactId>
-            <version>${jmh.version}</version>
+            <version>1.19</version>
         </dependency>
         <dependency>
             <groupId>org.openjdk.jmh</groupId>
             <artifactId>jmh-generator-annprocess</artifactId>
-            <version>${jmh.version}</version>
+            <version>1.19</version>
         </dependency>
     </dependencies>
 
     <build>
         <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>${java.source.version}</source>
-                    <target>${java.source.version}</target>
-                </configuration>
-            </plugin>
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>exec-maven-plugin</artifactId>
         </plugins>
     </build>
 
-  <!--
-      Maven Site Configuration
+    <!--
+        Maven Site Configuration
 
-      The following configuration is necessary for maven-site-plugin to
-      correctly identify the correct deployment path for OpenDaylight Maven
-      sites.
-  -->
-  <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
+        The following configuration is necessary for maven-site-plugin to
+        correctly identify the correct deployment path for OpenDaylight Maven
+        sites.
+    -->
+    <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
 
-  <distributionManagement>
-    <site>
-      <id>opendaylight-site</id>
-      <url>${nexus.site.url}/${project.artifactId}/</url>
-    </site>
-  </distributionManagement>
+    <distributionManagement>
+      <site>
+        <id>opendaylight-site</id>
+        <url>${nexus.site.url}/${project.artifactId}/</url>
+      </site>
+    </distributionManagement>
 </project>
index a5a1d935e5076843d477e24f8be19c1db43d915f..9f6305a54677d57b0a0dbb45fbf7e7a639fc908a 100644 (file)
@@ -7,49 +7,43 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.tree;
 
-import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
-import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
-
-import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
-import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
-import java.io.InputStream;
-import java.util.Collections;
+import java.io.IOException;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
+import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+import org.opendaylight.yangtools.yang.parser.rfc6020.repo.YangStatementStreamSource;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
+import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
 
 /**
  * @author Lukas Sedlak &lt;lsedlak@cisco.com&gt;
  */
 public class BenchmarkModel {
 
-    public static final QName TEST_QNAME = QName.create("urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test", "2014-03-13",
-        "test");
+    public static final QName TEST_QNAME =
+            QName.create("urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test", "2014-03-13", "test");
     public static final QName OUTER_LIST_QNAME = QName.create(TEST_QNAME, "outer-list");
     public static final QName INNER_LIST_QNAME = QName.create(TEST_QNAME, "inner-list");
     public static final QName OUTER_CHOICE_QNAME = QName.create(TEST_QNAME, "outer-choice");
     public static final QName ID_QNAME = QName.create(TEST_QNAME, "id");
     public static final QName NAME_QNAME = QName.create(TEST_QNAME, "name");
     public static final QName VALUE_QNAME = QName.create(TEST_QNAME, "value");
-    private static final String DATASTORE_TEST_YANG = "/odl-datastore-test.yang";
 
     public static final YangInstanceIdentifier TEST_PATH = YangInstanceIdentifier.of(TEST_QNAME);
-    public static final YangInstanceIdentifier OUTER_LIST_PATH = YangInstanceIdentifier.builder(TEST_PATH).node(OUTER_LIST_QNAME).build();
+    public static final YangInstanceIdentifier OUTER_LIST_PATH = YangInstanceIdentifier.builder(TEST_PATH)
+            .node(OUTER_LIST_QNAME).build();
 
-    public static final InputStream getDatastoreBenchmarkInputStream() {
-        return getInputStream(DATASTORE_TEST_YANG);
-    }
-
-    private static InputStream getInputStream(final String resourceName) {
-        return BenchmarkModel.class.getResourceAsStream(resourceName);
-    }
-
-    public static SchemaContext createTestContext() throws SourceException, ReactorException {
+    public static SchemaContext createTestContext() {
         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
-        SchemaContext schemaContext = reactor.buildEffective(Collections.singletonList(
-            getDatastoreBenchmarkInputStream()));
-
-        return schemaContext;
+        try {
+            reactor.addSource(YangStatementStreamSource.create(
+                YangTextSchemaSource.forResource("/odl-datastore-test.yang")));
+            return reactor.buildEffective();
+        } catch (IOException | YangSyntaxErrorException | ReactorException e) {
+            throw new IllegalStateException(e);
+        }
     }
-
 }
index a1f8961ec3646c8e9f8577241317ed8c0fbf33d7..d6e7346b9325c351b68f9cc6093b09a0488694d2 100644 (file)
@@ -7,9 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.tree;
 
-import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
-import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
-
 import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -17,13 +14,31 @@ import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.*;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.openjdk.jmh.annotations.*;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.annotations.Warmup;
 import org.openjdk.jmh.runner.Runner;
 import org.openjdk.jmh.runner.RunnerException;
 import org.openjdk.jmh.runner.options.Options;
@@ -86,7 +101,7 @@ public class InMemoryDataTreeBenchmark {
     private static final NormalizedNode<?, ?>[] OUTER_LIST_TWO_ITEM_INNER_LIST = initOuterListItems(OUTER_LIST_50K, TWO_ITEM_INNER_LIST);
     private static final NormalizedNode<?, ?>[] OUTER_LIST_TEN_ITEM_INNER_LIST = initOuterListItems(OUTER_LIST_10K, TEN_ITEM_INNER_LIST);
 
-    private static NormalizedNode<?,?>[] initOuterListItems(int outerListItemsCount, MapNode innerList) {
+    private static NormalizedNode<?,?>[] initOuterListItems(final int outerListItemsCount, final MapNode innerList) {
         final NormalizedNode<?,?>[] outerListItems = new NormalizedNode[outerListItemsCount];
 
         for (int i = 0; i < outerListItemsCount; ++i) {
@@ -100,7 +115,7 @@ public class InMemoryDataTreeBenchmark {
     private SchemaContext schemaContext;
     private DataTree datastore;
 
-    public static void main(String... args) throws IOException, RunnerException {
+    public static void main(final String... args) throws IOException, RunnerException {
         Options opt = new OptionsBuilder()
             .include(".*" + InMemoryDataTreeBenchmark.class.getSimpleName() + ".*")
             .forks(1)
@@ -113,7 +128,7 @@ public class InMemoryDataTreeBenchmark {
     public void setup() throws DataValidationFailedException, SourceException, ReactorException {
         schemaContext = BenchmarkModel.createTestContext();
         final InMemoryDataTreeFactory factory = InMemoryDataTreeFactory.getInstance();
-        datastore = factory.create();
+        datastore = factory.create(DataTreeConfiguration.DEFAULT_CONFIGURATION);
         datastore.setSchemaContext(schemaContext);
         final DataTreeSnapshot snapshot = datastore.takeSnapshot();
         initTestNode(snapshot);
@@ -131,12 +146,13 @@ public class InMemoryDataTreeBenchmark {
             .build();
 
         modification.write(testPath, provideOuterListNode());
+        modification.ready();
         datastore.validate(modification);
         final DataTreeCandidate candidate = datastore.prepare(modification);
         datastore.commit(candidate);
     }
 
-    private DataContainerChild<?, ?> provideOuterListNode() {
+    private static DataContainerChild<?, ?> provideOuterListNode() {
         return ImmutableContainerNodeBuilder
             .create()
             .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(BenchmarkModel.TEST_QNAME))
@@ -154,6 +170,7 @@ public class InMemoryDataTreeBenchmark {
         for (int outerListKey = 0; outerListKey < OUTER_LIST_100K; ++outerListKey) {
             modification.write(OUTER_LIST_100K_PATHS[outerListKey], OUTER_LIST_ONE_ITEM_INNER_LIST[outerListKey]);
         }
+        modification.ready();
         datastore.validate(modification);
         final DataTreeCandidate candidate = datastore.prepare(modification);
         datastore.commit(candidate);
@@ -167,6 +184,7 @@ public class InMemoryDataTreeBenchmark {
         for (int outerListKey = 0; outerListKey < OUTER_LIST_100K; ++outerListKey) {
             final DataTreeModification modification = snapshot.newModification();
             modification.write(OUTER_LIST_100K_PATHS[outerListKey], OUTER_LIST_ONE_ITEM_INNER_LIST[outerListKey]);
+            modification.ready();
             datastore.validate(modification);
             final DataTreeCandidate candidate = datastore.prepare(modification);
             datastore.commit(candidate);
@@ -183,6 +201,7 @@ public class InMemoryDataTreeBenchmark {
             modification.write(OUTER_LIST_50K_PATHS[outerListKey], OUTER_LIST_TWO_ITEM_INNER_LIST[outerListKey]);
         }
         datastore.validate(modification);
+        modification.ready();
         final DataTreeCandidate candidate = datastore.prepare(modification);
         datastore.commit(candidate);
     }
@@ -196,6 +215,7 @@ public class InMemoryDataTreeBenchmark {
             final DataTreeModification modification = snapshot.newModification();
             modification.write(OUTER_LIST_50K_PATHS[outerListKey], OUTER_LIST_TWO_ITEM_INNER_LIST[outerListKey]);
             datastore.validate(modification);
+            modification.ready();
             final DataTreeCandidate candidate = datastore.prepare(modification);
             datastore.commit(candidate);
         }
@@ -211,6 +231,7 @@ public class InMemoryDataTreeBenchmark {
             modification.write(OUTER_LIST_10K_PATHS[outerListKey], OUTER_LIST_TEN_ITEM_INNER_LIST[outerListKey]);
         }
         datastore.validate(modification);
+        modification.ready();
         final DataTreeCandidate candidate = datastore.prepare(modification);
         datastore.commit(candidate);
     }
@@ -224,6 +245,7 @@ public class InMemoryDataTreeBenchmark {
             final DataTreeModification modification = snapshot.newModification();
             modification.write(OUTER_LIST_10K_PATHS[outerListKey], OUTER_LIST_TEN_ITEM_INNER_LIST[outerListKey]);
             datastore.validate(modification);
+            modification.ready();
             final DataTreeCandidate candidate = datastore.prepare(modification);
             datastore.commit(candidate);
         }