You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-dev@jackrabbit.apache.org by Francesco Mari <ma...@gmail.com> on 2017/08/16 15:46:04 UTC
Re: svn commit: r1805209 - in /jackrabbit/oak/trunk/oak-segment-tar:
./ src/main/java/org/apache/jackrabbit/oak/segment/file/ src/main/java/org/apache/jackrabbit/oak/segment/file/tar/
src/test/java/org/apache/jackrabbit/oak/segment/upgrade/ src/test/upgrad...
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, <md...@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);
>
>