Instead of creating IOMonitor.NULL, you could instantiate a new IOMonitorAdapter when needed. This has already been done many times in TarFileTest and TarWriterTest.
On Wed, Aug 16, 2017 at 5:26 PM, <mdue...@apache.org> wrote: > Author: mduerig > Date: Wed Aug 16 15:26:29 2017 > New Revision: 1805209 > > URL: http://svn.apache.org/viewvc?rev=1805209&view=rev > Log: > OAK-6555: Implement ITs for rolling upgrade > > Added: > > jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/upgrade/ > > jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/upgrade/UpgradeIT.java > jackrabbit/oak/trunk/oak-segment-tar/src/test/upgrade-it-scripts/ > > jackrabbit/oak/trunk/oak-segment-tar/src/test/upgrade-it-scripts/create16store.groovy > Modified: > jackrabbit/oak/trunk/oak-segment-tar/pom.xml > > jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ManifestChecker.java > > jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitor.java > > Modified: jackrabbit/oak/trunk/oak-segment-tar/pom.xml > URL: > http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/pom.xml?rev=1805209&r1=1805208&r2=1805209&view=diff > ============================================================================== > --- jackrabbit/oak/trunk/oak-segment-tar/pom.xml (original) > +++ jackrabbit/oak/trunk/oak-segment-tar/pom.xml Wed Aug 16 15:26:29 2017 > @@ -87,6 +87,40 @@ > <redirectTestOutputToFile>true</redirectTestOutputToFile> > </configuration> > </plugin> > + <plugin> > + <groupId>org.apache.maven.plugins</groupId> > + <artifactId>maven-dependency-plugin</artifactId> > + <executions> > + <execution> > + <phase>pre-integration-test</phase> > + <goals><goal>copy</goal></goals> > + <configuration> > + > <artifact>org.apache.jackrabbit:oak-run:1.6.1</artifact> > + > <outputDirectory>${project.build.directory}/upgrade-it</outputDirectory> > + <stripVersion>true</stripVersion> > + </configuration> > + </execution> > + </executions> > + </plugin> > + <plugin> > + <groupId>org.apache.maven.plugins</groupId> > + <artifactId>maven-resources-plugin</artifactId> > + <executions> > + <execution> > + <phase>pre-integration-test</phase> > + <goals><goal>copy-resources</goal></goals> > + <configuration> > + > <outputDirectory>${project.build.directory}/upgrade-it</outputDirectory> > + <resources> > + <resource> > + > <directory>src/test/upgrade-it-scripts</directory> > + <filtering>false</filtering> > + </resource> > + </resources> > + </configuration> > + </execution> > + </executions> > + </plugin> > </plugins> > </build> > > > Modified: > jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ManifestChecker.java > URL: > http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ManifestChecker.java?rev=1805209&r1=1805208&r2=1805209&view=diff > ============================================================================== > --- > jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ManifestChecker.java > (original) > +++ > jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ManifestChecker.java > Wed Aug 16 15:26:29 2017 > @@ -22,9 +22,9 @@ import static com.google.common.base.Pre > import java.io.File; > import java.io.IOException; > > -class ManifestChecker { > +public class ManifestChecker { > > - static ManifestChecker newManifestChecker(File path, boolean > shouldExist, int minStoreVersion, int maxStoreVersion) { > + public static ManifestChecker newManifestChecker(File path, boolean > shouldExist, int minStoreVersion, int maxStoreVersion) { > checkArgument(path != null, "path"); > checkArgument(minStoreVersion > 0, "minStoreVersion"); > checkArgument(maxStoreVersion > 0, "maxStoreVersion"); > @@ -52,7 +52,7 @@ class ManifestChecker { > updateManifest(manifest); > } > > - void checkManifest() throws IOException, > InvalidFileStoreVersionException { > + public void checkManifest() throws IOException, > InvalidFileStoreVersionException { > checkManifest(openManifest()); > } > > > Modified: > jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitor.java > URL: > http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitor.java?rev=1805209&r1=1805208&r2=1805209&view=diff > ============================================================================== > --- > jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitor.java > (original) > +++ > jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitor.java > Wed Aug 16 15:26:29 2017 > @@ -26,6 +26,16 @@ import java.io.File; > public interface IOMonitor { > > /** > + * A trivial instance of {@code IOMonitor} that does nothing. > + */ > + IOMonitor NULL = new IOMonitor(){ > + @Override public void beforeSegmentRead(File file, long msb, long > lsb, int length) {} > + @Override public void afterSegmentRead(File file, long msb, long > lsb, int length, long elapsed) {} > + @Override public void beforeSegmentWrite(File file, long msb, long > lsb, int length) {} > + @Override public void afterSegmentWrite(File file, long msb, long > lsb, int length, long elapsed) {} > + }; > + > + /** > * Called before a segment is read from the file system. > * > * @param file File containing the segment. > > Added: > jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/upgrade/UpgradeIT.java > URL: > http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/upgrade/UpgradeIT.java?rev=1805209&view=auto > ============================================================================== > --- > jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/upgrade/UpgradeIT.java > (added) > +++ > jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/upgrade/UpgradeIT.java > Wed Aug 16 15:26:29 2017 > @@ -0,0 +1,138 @@ > +/* > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You 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. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + * > + */ > + > +package org.apache.jackrabbit.oak.segment.upgrade; > + > +import static com.google.common.collect.Iterables.transform; > +import static java.lang.String.format; > +import static java.util.concurrent.TimeUnit.MINUTES; > +import static org.apache.jackrabbit.oak.segment.SegmentVersion.V_12; > +import static org.apache.jackrabbit.oak.segment.SegmentVersion.V_13; > +import static > org.apache.jackrabbit.oak.segment.data.SegmentData.newSegmentData; > +import static > org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder; > +import static > org.apache.jackrabbit.oak.segment.file.ManifestChecker.newManifestChecker; > +import static org.junit.Assert.assertEquals; > +import static org.junit.Assert.assertTrue; > +import static org.junit.Assert.fail; > + > +import java.io.File; > +import java.io.IOException; > +import java.lang.ProcessBuilder.Redirect; > + > +import javax.annotation.Nonnull; > + > +import org.apache.jackrabbit.oak.segment.SegmentVersion; > +import org.apache.jackrabbit.oak.segment.data.SegmentData; > +import > org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; > +import org.apache.jackrabbit.oak.segment.file.tar.IOMonitor; > +import org.apache.jackrabbit.oak.segment.file.tar.TarFiles; > +import org.apache.jackrabbit.oak.segment.tool.Compact; > +import org.junit.Before; > +import org.junit.Rule; > +import org.junit.Test; > +import org.junit.rules.TemporaryFolder; > + > +public class UpgradeIT { > + > + private final File upgradeItHome = new File("target/upgrade-it"); > + > + @Rule > + public TemporaryFolder fileStoreHome = new > TemporaryFolder(upgradeItHome); > + > + /** > + * Launch a groovy script in an Oak 1.6. console to initialise the > upgrade > + * source. See pom.xml for how these files are placed under > target/upgrade-it. > + */ > + @Before > + public void setup() throws IOException, InterruptedException { > + Process oakConsole = new ProcessBuilder( > + "java", "-jar", "oak-run.jar", > + "console", fileStoreHome.getRoot().getAbsolutePath(), > "--read-write", > + ":load create16store.groovy") > + .directory(upgradeItHome) > + .redirectError(Redirect.INHERIT) > + .redirectOutput(Redirect.INHERIT) > + .redirectInput(Redirect.INHERIT) > + .start(); > + > + assertTrue( > + "Timeout while creating the source repository", > + oakConsole.waitFor(2, MINUTES)); > + } > + > + @Test > + public void openUpgradesStore() throws IOException, > InvalidFileStoreVersionException { > + checkStoreVersion(1); > + fileStoreBuilder(fileStoreHome.getRoot()) > + .build() > + .close(); > + checkStoreVersion(2); > + } > + > + @Test > + public void openReadonlyDoesNotUpgradeStore() throws IOException, > InvalidFileStoreVersionException { > + checkStoreVersion(1); > + fileStoreBuilder(fileStoreHome.getRoot()) > + .buildReadOnly() > + .close(); > + checkStoreVersion(1); > + } > + > + @Test > + public void offRCUpgradesSegments() throws IOException, > InvalidFileStoreVersionException { > + checkSegmentVersion(V_12); > + checkStoreVersion(1); > + Compact.builder() > + .withPath(fileStoreHome.getRoot()) > + .withMmap(true) > + .build() > + .run(); > + checkStoreVersion(2); > + checkSegmentVersion(V_13); > + } > + > + private void checkStoreVersion(int version) throws IOException, > InvalidFileStoreVersionException { > + newManifestChecker(new File(fileStoreHome.getRoot(), "/manifest"), > + true, version, version).checkManifest(); > + } > + > + private void checkSegmentVersion(@Nonnull SegmentVersion version) throws > IOException { > + try (TarFiles tarFiles = TarFiles.builder() > + .withDirectory(fileStoreHome.getRoot()) > + .withTarRecovery((_1, _2, _3) -> fail("Unexpected recovery")) > + .withIOMonitor(IOMonitor.NULL) > + .withReadOnly() > + .build()) { > + > + for (SegmentData segmentData : getSegments(tarFiles)) { > + SegmentVersion actualVersion = > SegmentVersion.fromByte(segmentData.getVersion()); > + assertEquals( > + format("Segment version mismatch. Expected %s, found > %s", version, actualVersion), > + version, actualVersion); > + } > + } > + } > + > + private static Iterable<SegmentData> getSegments(@Nonnull TarFiles > tarFiles) { > + return transform( > + tarFiles.getSegmentIds(), > + uuid -> newSegmentData(tarFiles.readSegment( > + uuid.getMostSignificantBits(), > + uuid.getLeastSignificantBits()))); > + } > +} > > Added: > jackrabbit/oak/trunk/oak-segment-tar/src/test/upgrade-it-scripts/create16store.groovy > URL: > http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/upgrade-it-scripts/create16store.groovy?rev=1805209&view=auto > ============================================================================== > --- > jackrabbit/oak/trunk/oak-segment-tar/src/test/upgrade-it-scripts/create16store.groovy > (added) > +++ > jackrabbit/oak/trunk/oak-segment-tar/src/test/upgrade-it-scripts/create16store.groovy > Wed Aug 16 15:26:29 2017 > @@ -0,0 +1,40 @@ > +/* > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You 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. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + * > + */ > + > +import org.apache.jackrabbit.oak.segment.SegmentNodeBuilder > +import org.apache.jackrabbit.oak.spi.commit.EmptyHook > +import org.apache.jackrabbit.oak.spi.commit.CommitInfo > + > +void addNodes(SegmentNodeBuilder builder, int count, int depth) { > + if (depth > 0) { > + for (int c = 0; c < count; c++) { > + builder.setProperty( > + "property-name-" + depth + "-" + c, > + "property-value-" + depth + "-" + c) > + addNodes( > + builder.setChildNode("node-" + depth + "-" + c), > + count, > + depth - 1) > + } > + } > +} > + > +nodeStore = session.store > +builder = nodeStore.getRoot().builder() > +addNodes(builder, 10, 5) > +nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); > >