Author: mduerig
Date: Fri Jun 10 16:45:10 2016
New Revision: 1747742
URL: http://svn.apache.org/viewvc?rev=1747742&view=rev
Log:
OAK-4465: Remove the read-only concern from TarRevisions
Remove the read-only flag from TarRevisions and handle setting the current head
revision through the regular setHead method (ReadOnlyStore)
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java?rev=1747742&r1=1747741&r2=1747742&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
Fri Jun 10 16:45:10 2016
@@ -95,6 +95,7 @@ import org.apache.jackrabbit.oak.segment
import org.apache.jackrabbit.oak.segment.WriterCacheManager.Empty;
import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
import org.apache.jackrabbit.oak.spi.blob.BlobStore;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -370,6 +371,32 @@ public class FileStore implements Segmen
log.debug("TarMK readers {}", this.readers);
}
+ FileStore bind(TarRevisions revisions) throws IOException {
+ revisions.bind(this, initialNode());
+ return this;
+ }
+
+ @Nonnull
+ private Supplier<RecordId> initialNode() {
+ return new Supplier<RecordId>() {
+ @Override
+ public RecordId get() {
+ try {
+ SegmentWriter writer =
segmentWriterBuilder("init").build(FileStore.this);
+ NodeBuilder builder = EMPTY_NODE.builder();
+ builder.setChildNode("root", EMPTY_NODE);
+ SegmentNodeState node =
writer.writeNode(builder.getNodeState());
+ writer.flush();
+ return node.getRecordId();
+ } catch (IOException e) {
+ String msg = "Failed to write initial node";
+ log.error(msg, e);
+ throw new IllegalStateException(msg, e);
+ }
+ }
+ };
+ }
+
private int getGcGeneration() {
return revisions.getHead().getSegment().getGcGeneration();
}
@@ -1304,15 +1331,6 @@ public class FileStore implements Segmen
return emptyMap();
}
- private void setRevision(String rootRevision) {
- fileStoreLock.writeLock().lock();
- try {
- revisions.setHeadId(RecordId.fromString(this, rootRevision));
- } finally {
- fileStoreLock.writeLock().unlock();
- }
- }
-
private void checkDiskSpace() {
long repositoryDiskSpace = approximateSize.get();
long availableDiskSpace = directory.getFreeSpace();
@@ -1339,18 +1357,34 @@ public class FileStore implements Segmen
* All write methods are no-ops.
*/
public static class ReadOnlyStore extends FileStore {
+ private RecordId currentHead;
ReadOnlyStore(FileStoreBuilder builder) throws IOException {
super(builder, true);
}
+ @Override
+ ReadOnlyStore bind(@Nonnull TarRevisions revisions) throws IOException
{
+ revisions.bind(this, new Supplier<RecordId>() {
+ @Override
+ public RecordId get() {
+ throw new IllegalStateException("Cannot start readonly
store from empty journal");
+ }
+ });
+ currentHead = revisions.getHead();
+ return this;
+ }
+
/**
* Go to the specified {@code revision}
*
* @param revision
*/
public void setRevision(String revision) {
- super.setRevision(revision);
+ RecordId newHead = RecordId.fromString(this, revision);
+ if (super.revisions.setHead(currentHead, newHead)) {
+ currentHead = newHead;
+ }
}
/**
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java?rev=1747742&r1=1747741&r2=1747742&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
Fri Jun 10 16:45:10 2016
@@ -22,8 +22,6 @@ package org.apache.jackrabbit.oak.segmen
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static java.util.Collections.singleton;
-import static
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
-import static
org.apache.jackrabbit.oak.segment.SegmentWriterBuilder.segmentWriterBuilder;
import static
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.defaultGCOptions;
import java.io.File;
@@ -33,10 +31,6 @@ import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-import org.apache.jackrabbit.oak.segment.RecordId;
-import org.apache.jackrabbit.oak.segment.SegmentNodeState;
-import org.apache.jackrabbit.oak.segment.SegmentWriter;
import org.apache.jackrabbit.oak.segment.WriterCacheManager;
import org.apache.jackrabbit.oak.segment.compaction.LoggingGCMonitor;
import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
@@ -44,7 +38,6 @@ import org.apache.jackrabbit.oak.segment
import org.apache.jackrabbit.oak.spi.blob.BlobStore;
import org.apache.jackrabbit.oak.spi.gc.DelegatingGCMonitor;
import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
-import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.stats.StatisticsProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -279,9 +272,7 @@ public class FileStoreBuilder {
public FileStore build() throws IOException {
directory.mkdir();
revisions = new TarRevisions(false, directory);
- FileStore store = new FileStore(this, false);
- revisions.bind(store, initialNode(store));
- return store;
+ return new FileStore(this, false).bind(revisions);
}
/**
@@ -305,30 +296,7 @@ public class FileStoreBuilder {
public ReadOnlyStore buildReadOnly() throws IOException {
checkState(directory.exists() && directory.isDirectory());
revisions = new TarRevisions(true, directory);
- ReadOnlyStore store = new ReadOnlyStore(this);
- revisions.bind(store, initialNode(store));
- return store;
- }
-
- @Nonnull
- private static Supplier<RecordId> initialNode(final FileStore store) {
- return new Supplier<RecordId>() {
- @Override
- public RecordId get() {
- try {
- SegmentWriter writer =
segmentWriterBuilder("init").build(store);
- NodeBuilder builder = EMPTY_NODE.builder();
- builder.setChildNode("root", EMPTY_NODE);
- SegmentNodeState node =
writer.writeNode(builder.getNodeState());
- writer.flush();
- return node.getRecordId();
- } catch (IOException e) {
- String msg = "Failed to write initial node";
- LOG.error(msg, e);
- throw new IllegalStateException(msg, e);
- }
- }
- };
+ return new ReadOnlyStore(this).bind(revisions);
}
@Nonnull
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java?rev=1747742&r1=1747741&r2=1747742&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java
Fri Jun 10 16:45:10 2016
@@ -55,8 +55,6 @@ public class TarRevisions implements Rev
public static final String JOURNAL_FILE_NAME = "journal.log";
- private final boolean readOnly;
-
/**
* The latest head state.
*/
@@ -110,7 +108,6 @@ public class TarRevisions implements Rev
public TarRevisions(boolean readOnly, @Nonnull File directory)
throws IOException {
- this.readOnly = readOnly;
this.directory = checkNotNull(directory);
this.journalFile = new RandomAccessFile(new File(directory,
JOURNAL_FILE_NAME),
readOnly ? "r" : "rw");
@@ -240,10 +237,4 @@ public class TarRevisions implements Rev
public void close() throws IOException {
journalFile.close();
}
-
- void setHeadId(@Nonnull RecordId headId) {
- checkState(readOnly, "Cannot set revision on a writable store");
- head.set(headId);
- persistedHead.set(headId);
- }
}
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java?rev=1747742&r1=1747741&r2=1747742&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
Fri Jun 10 16:45:10 2016
@@ -225,4 +225,27 @@ public class FileStoreIT {
}
}
+ @Test
+ public void setRevisionTest() throws IOException {
+ try (FileStore store = fileStoreBuilder(getFileStoreFolder()).build())
{
+ RecordId id1 = store.getRevisions().getHead();
+ SegmentNodeState base = store.getReader().readHeadState();
+ SegmentNodeBuilder builder = base.builder();
+ builder.setProperty("step", "a");
+ store.getRevisions().setHead(base.getRecordId(),
builder.getNodeState().getRecordId());
+ RecordId id2 = store.getRevisions().getHead();
+ store.flush();
+
+ try (ReadOnlyStore roStore =
fileStoreBuilder(getFileStoreFolder()).buildReadOnly()) {
+ assertEquals(id2, roStore.getRevisions().getHead());
+
+ roStore.setRevision(id1.toString());
+ assertEquals(id1, roStore.getRevisions().getHead());
+
+ roStore.setRevision(id2.toString());
+ assertEquals(id2, roStore.getRevisions().getHead());
+ }
+ }
+ }
+
}