You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2017/08/08 15:11:21 UTC
svn commit: r1804433 -
/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java
Author: mduerig
Date: Tue Aug 8 15:11:21 2017
New Revision: 1804433
URL: http://svn.apache.org/viewvc?rev=1804433&view=rev
Log:
OAK-6522: Implement unit tests for OnlineCompactor
Test for IOException during compaction
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java?rev=1804433&r1=1804432&r2=1804433&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java Tue Aug 8 15:11:21 2017
@@ -31,15 +31,20 @@ import static org.junit.Assert.assertNul
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
import java.util.List;
+import java.util.Map;
import java.util.Random;
import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import org.apache.jackrabbit.oak.api.Blob;
import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.segment.file.FileStore;
import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
@@ -75,7 +80,7 @@ public class OnlineCompactorTest {
@Test
public void testCompact() throws Exception {
- OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(false));
+ OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(false), null);
addTestContent(nodeStore);
SegmentNodeState uncompacted = (SegmentNodeState) nodeStore.getRoot();
@@ -96,7 +101,7 @@ public class OnlineCompactorTest {
@Test
public void testExceedUpdateLimit() throws Exception {
- OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(false));
+ OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(false), null);
addNodes(nodeStore, OnlineCompactor.UPDATE_LIMIT * 2 + 1);
SegmentNodeState uncompacted = (SegmentNodeState) nodeStore.getRoot();
@@ -109,7 +114,7 @@ public class OnlineCompactorTest {
@Test
public void testCancel() throws IOException, CommitFailedException {
- OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(true));
+ OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(true), null);
addTestContent(nodeStore);
NodeBuilder builder = nodeStore.getRoot().builder();
builder.setChildNode("cancel").setProperty("cancel", "cancel");
@@ -118,13 +123,22 @@ public class OnlineCompactorTest {
assertNull(compactor.compact(nodeStore.getRoot()));
}
+ @Test(expected = IOException.class)
+ public void testIOException() throws IOException, CommitFailedException {
+ OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(false), "IOException");
+ addTestContent(nodeStore);
+ compactor.compact(nodeStore.getRoot());
+ }
+
@Nonnull
- private static OnlineCompactor createCompactor(FileStore fileStore, Supplier<Boolean> cancel) {
+ private static OnlineCompactor createCompactor(FileStore fileStore, Supplier<Boolean> cancel, String failOnName) {
SegmentWriter writer = defaultSegmentWriterBuilder("c")
.withGeneration(newGCGeneration(1, 1, true))
.build(fileStore);
- return new OnlineCompactor(fileStore.getReader(), writer, fileStore.getBlobStore(), cancel, () -> {});
- }
+ if (failOnName != null) {
+ writer = new FailingSegmentWriter(writer, failOnName);
+ }
+ return new OnlineCompactor(fileStore.getReader(), writer, fileStore.getBlobStore(), cancel, () -> {}); }
private static void addNodes(SegmentNodeStore nodeStore, int count)
throws CommitFailedException {
@@ -138,6 +152,7 @@ public class OnlineCompactorTest {
private static void addTestContent(NodeStore nodeStore) throws CommitFailedException, IOException {
NodeBuilder builder = nodeStore.getRoot().builder();
builder.setChildNode("a").setChildNode("aa").setProperty("p", 42);
+ builder.getChildNode("a").setChildNode("error").setChildNode("IOException");
builder.setChildNode("b").setProperty("bin", createBlob(nodeStore, 42));
builder.setChildNode("c").setProperty(binaryPropertyFromBlob("bins", createBlobs(nodeStore, 42, 43, 44)));
nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
@@ -165,4 +180,77 @@ public class OnlineCompactorTest {
return blobs;
}
+ private static class FailingSegmentWriter implements SegmentWriter {
+ @Nonnull
+ private final SegmentWriter delegate;
+
+ @Nonnull
+ private final String failOnName;
+
+ public FailingSegmentWriter(@Nonnull SegmentWriter delegate, @Nonnull String failOnName) {
+ this.delegate = delegate;
+ this.failOnName = failOnName;
+ }
+
+ @Override
+ public void flush() throws IOException {
+ delegate.flush();
+ }
+
+ @Nonnull
+ @Override
+ public RecordId writeMap(
+ @Nullable MapRecord base, @Nonnull Map<String, RecordId> changes)
+ throws IOException {
+ return delegate.writeMap(base, changes);
+ }
+
+ @Nonnull
+ @Override
+ public RecordId writeList(@Nonnull List<RecordId> list) throws IOException {
+ return delegate.writeList(list);
+ }
+
+ @Nonnull
+ @Override
+ public RecordId writeString(@Nonnull String string) throws IOException {
+ return delegate.writeString(string);
+ }
+
+ @Nonnull
+ @Override
+ public RecordId writeBlob(@Nonnull Blob blob) throws IOException {
+ return delegate.writeBlob(blob);
+ }
+
+ @Nonnull
+ @Override
+ public RecordId writeBlock(@Nonnull byte[] bytes, int offset, int length)
+ throws IOException {
+ return delegate.writeBlock(bytes, offset, length);
+ }
+
+ @Nonnull
+ @Override
+ public RecordId writeStream(@Nonnull InputStream stream) throws IOException {
+ return delegate.writeStream(stream);
+ }
+
+ @Nonnull
+ @Override
+ public RecordId writeProperty(@Nonnull PropertyState state) throws IOException {
+ return delegate.writeProperty(state);
+ }
+
+ @Nonnull
+ @Override
+ public RecordId writeNode(@Nonnull NodeState state, @Nullable ByteBuffer stableIdBytes)
+ throws IOException {
+ if (state.hasChildNode(failOnName)) {
+ throw new IOException("Encountered node with name " + failOnName);
+ }
+
+ return delegate.writeNode(state, stableIdBytes);
+ }
+ }
}