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 fr...@apache.org on 2017/07/27 08:58:21 UTC
svn commit: r1803142 - in /jackrabbit/oak/trunk/oak-segment-tar/src:
main/java/org/apache/jackrabbit/oak/backup/impl/
main/java/org/apache/jackrabbit/oak/segment/
main/java/org/apache/jackrabbit/oak/segment/file/
main/java/org/apache/jackrabbit/oak/seg...
Author: frm
Date: Thu Jul 27 08:58:21 2017
New Revision: 1803142
URL: http://svn.apache.org/viewvc?rev=1803142&view=rev
Log:
OAK-3349 - Replace gc generation integer with ADT
Contribution by Michael Dürig
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/GCGeneration.java (with props)
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterBuilder.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentId.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
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/GCJournal.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCListener.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/CleanupContext.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientSync.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/OnlineCompactorTest.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPoolTest.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java Thu Jul 27 08:58:21 2017
@@ -31,6 +31,7 @@ import com.google.common.base.Suppliers;
import org.apache.jackrabbit.oak.backup.FileStoreBackup;
import org.apache.jackrabbit.oak.segment.Compactor;
import org.apache.jackrabbit.oak.segment.DefaultSegmentWriter;
+import org.apache.jackrabbit.oak.segment.GCGeneration;
import org.apache.jackrabbit.oak.segment.Revisions;
import org.apache.jackrabbit.oak.segment.SegmentBufferWriter;
import org.apache.jackrabbit.oak.segment.SegmentNodeState;
@@ -67,7 +68,7 @@ public class FileStoreBackupImpl impleme
SegmentNodeState current = reader.readHeadState(revisions);
try {
- int gen = current.getRecordId().getSegmentId().getGcGeneration();
+ GCGeneration gen = current.getRecordId().getSegmentId().getGcGeneration();
SegmentBufferWriter bufferWriter = new SegmentBufferWriter(
backup.getSegmentIdProvider(),
backup.getReader(),
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java Thu Jul 27 08:58:21 2017
@@ -30,6 +30,7 @@ import com.google.common.base.Suppliers;
import org.apache.jackrabbit.oak.backup.FileStoreRestore;
import org.apache.jackrabbit.oak.segment.Compactor;
import org.apache.jackrabbit.oak.segment.DefaultSegmentWriter;
+import org.apache.jackrabbit.oak.segment.GCGeneration;
import org.apache.jackrabbit.oak.segment.SegmentBufferWriter;
import org.apache.jackrabbit.oak.segment.SegmentNodeState;
import org.apache.jackrabbit.oak.segment.SegmentWriter;
@@ -61,7 +62,7 @@ public class FileStoreRestoreImpl implem
try {
SegmentNodeState head = restore.getHead();
- int gen = head.getRecordId().getSegmentId().getGcGeneration();
+ GCGeneration gen = head.getRecordId().getSegmentId().getGcGeneration();
SegmentBufferWriter bufferWriter = new SegmentBufferWriter(
store.getSegmentIdProvider(),
store.getReader(),
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java Thu Jul 27 08:58:21 2017
@@ -271,7 +271,7 @@ public class DefaultSegmentWriter implem
SegmentWriteOperation with(@Nonnull SegmentBufferWriter writer) {
checkState(this.writer == null);
this.writer = writer;
- int generation = writer.getGeneration();
+ int generation = writer.getGeneration().getGeneration();
this.stringCache = cacheManager.getStringCache(generation);
this.templateCache = cacheManager.getTemplateCache(generation);
this.nodeCache = cacheManager.getNodeCache(generation);
@@ -987,9 +987,9 @@ public class DefaultSegmentWriter implem
private boolean isOldGeneration(RecordId id) {
try {
- int thatGen = id.getSegmentId().getGcGeneration();
- int thisGen = writer.getGeneration();
- return thatGen < thisGen;
+ GCGeneration thatGen = id.getSegmentId().getGcGeneration();
+ GCGeneration thisGen = writer.getGeneration();
+ return thatGen.compareWith(thisGen) < 0;
} catch (SegmentNotFoundException snfe) {
// This SNFE means a defer compacted node state is too far
// in the past. It has been gc'ed already and cannot be
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterBuilder.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterBuilder.java Thu Jul 27 08:58:21 2017
@@ -54,7 +54,7 @@ public final class DefaultSegmentWriterB
private final String name;
@Nonnull
- private Supplier<Integer> generation = Suppliers.ofInstance(0);
+ private Supplier<GCGeneration> generation = Suppliers.ofInstance(GCGeneration.NULL);
private boolean pooled = false;
@@ -86,7 +86,7 @@ public final class DefaultSegmentWriterB
* is created by the returned writer.
*/
@Nonnull
- public DefaultSegmentWriterBuilder withGeneration(@Nonnull Supplier<Integer> generation) {
+ public DefaultSegmentWriterBuilder withGeneration(@Nonnull Supplier<GCGeneration> generation) {
this.generation = checkNotNull(generation);
return this;
}
@@ -96,8 +96,8 @@ public final class DefaultSegmentWriterB
* segment writer.
*/
@Nonnull
- public DefaultSegmentWriterBuilder withGeneration(int generation) {
- this.generation = Suppliers.ofInstance(generation);
+ public DefaultSegmentWriterBuilder withGeneration(@Nonnull GCGeneration generation) {
+ this.generation = Suppliers.ofInstance(checkNotNull(generation));
return this;
}
Added: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/GCGeneration.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/GCGeneration.java?rev=1803142&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/GCGeneration.java (added)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/GCGeneration.java Thu Jul 27 08:58:21 2017
@@ -0,0 +1,68 @@
+/*
+ * 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;
+
+import javax.annotation.Nonnull;
+
+import com.google.common.base.Objects;
+
+public final class GCGeneration {
+ public static final GCGeneration NULL = new GCGeneration(0);
+
+ private final int generation;
+
+ public GCGeneration(int generation) {
+ this.generation = generation;
+ }
+
+ public int getGeneration() {
+ return generation;
+ }
+
+ public GCGeneration next() {
+ return new GCGeneration(generation + 1);
+ }
+
+ public int compareWith(@Nonnull GCGeneration that) {
+ return generation - that.generation;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (other == null || getClass() != other.getClass()) {
+ return false;
+ }
+ GCGeneration that = (GCGeneration) other;
+ return generation == that.generation;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(generation);
+ }
+
+ @Override
+ public String toString() {
+ return "GCGeneration{" +
+ "generation=" + generation + '}';
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/GCGeneration.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java Thu Jul 27 08:58:21 2017
@@ -25,9 +25,9 @@ import static com.google.common.base.Pre
import static java.util.Arrays.fill;
import static org.apache.jackrabbit.oak.commons.IOUtils.closeQuietly;
import static org.apache.jackrabbit.oak.segment.CacheWeights.OBJECT_HEADER_SIZE;
-import static org.apache.jackrabbit.oak.segment.SegmentStream.BLOCK_SIZE;
import static org.apache.jackrabbit.oak.segment.RecordNumbers.EMPTY_RECORD_NUMBERS;
import static org.apache.jackrabbit.oak.segment.SegmentId.isDataSegmentId;
+import static org.apache.jackrabbit.oak.segment.SegmentStream.BLOCK_SIZE;
import static org.apache.jackrabbit.oak.segment.SegmentVersion.LATEST_VERSION;
import static org.apache.jackrabbit.oak.segment.SegmentVersion.isValid;
@@ -371,10 +371,11 @@ public class Segment {
* @param segmentId the id of the segment
* @return the gc generation of this segment or 0 if this is bulk segment.
*/
- public static int getGcGeneration(ByteBuffer data, UUID segmentId) {
+ @Nonnull
+ public static GCGeneration getGcGeneration(ByteBuffer data, UUID segmentId) {
return isDataSegmentId(segmentId.getLeastSignificantBits())
- ? data.getInt(GC_GENERATION_OFFSET)
- : 0;
+ ? new GCGeneration(data.getInt(GC_GENERATION_OFFSET))
+ : GCGeneration.NULL;
}
/**
@@ -382,7 +383,8 @@ public class Segment {
* generations (i.e. stay at 0).
* @return the gc generation of this segment or 0 if this is bulk segment.
*/
- public int getGcGeneration() {
+ @Nonnull
+ public GCGeneration getGcGeneration() {
return getGcGeneration(data, id.asUUID());
}
@@ -617,7 +619,7 @@ public class Segment {
writer.format("Segment %s (%d bytes)%n", id, length);
String segmentInfo = getSegmentInfo();
if (segmentInfo != null) {
- writer.format("Info: %s, Generation: %d%n", segmentInfo, getGcGeneration());
+ writer.format("Info: %s, Generation: %s%n", segmentInfo, getGcGeneration());
}
if (id.isDataSegmentId()) {
writer.println("--------------------------------------------------------------------------");
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java Thu Jul 27 08:58:21 2017
@@ -106,7 +106,8 @@ public class SegmentBufferWriter impleme
@Nonnull
private final String wid;
- private final int generation;
+ @Nonnull
+ private final GCGeneration generation;
/**
* The segment write buffer, filled from the end to the beginning
@@ -139,14 +140,14 @@ public class SegmentBufferWriter impleme
public SegmentBufferWriter(@Nonnull SegmentIdProvider idProvider,
@Nonnull SegmentReader reader,
@CheckForNull String wid,
- int generation) {
+ @Nonnull GCGeneration generation) {
this.idProvider = checkNotNull(idProvider);
this.reader = checkNotNull(reader);
this.wid = (wid == null
? "w-" + identityHashCode(this)
: wid);
- this.generation = generation;
+ this.generation = checkNotNull(generation);
}
@Nonnull
@@ -155,7 +156,8 @@ public class SegmentBufferWriter impleme
return writeOperation.execute(this);
}
- int getGeneration() {
+ @Nonnull
+ GCGeneration getGeneration() {
return generation;
}
@@ -180,10 +182,10 @@ public class SegmentBufferWriter impleme
buffer[4] = 0; // reserved
buffer[5] = 0; // reserved
- buffer[GC_GENERATION_OFFSET] = (byte) (generation >> 24);
- buffer[GC_GENERATION_OFFSET + 1] = (byte) (generation >> 16);
- buffer[GC_GENERATION_OFFSET + 2] = (byte) (generation >> 8);
- buffer[GC_GENERATION_OFFSET + 3] = (byte) generation;
+ buffer[GC_GENERATION_OFFSET] = (byte) (generation.getGeneration() >> 24);
+ buffer[GC_GENERATION_OFFSET + 1] = (byte) (generation.getGeneration() >> 16);
+ buffer[GC_GENERATION_OFFSET + 2] = (byte) (generation.getGeneration() >> 8);
+ buffer[GC_GENERATION_OFFSET + 3] = (byte) generation.getGeneration();
length = 0;
position = buffer.length;
recordNumbers = new MutableRecordNumbers();
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java Thu Jul 27 08:58:21 2017
@@ -74,7 +74,7 @@ public class SegmentBufferWriterPool imp
private final SegmentReader reader;
@Nonnull
- private final Supplier<Integer> gcGeneration;
+ private final Supplier<GCGeneration> gcGeneration;
@Nonnull
private final String wid;
@@ -85,7 +85,7 @@ public class SegmentBufferWriterPool imp
@Nonnull SegmentIdProvider idProvider,
@Nonnull SegmentReader reader,
@Nonnull String wid,
- @Nonnull Supplier<Integer> gcGeneration) {
+ @Nonnull Supplier<GCGeneration> gcGeneration) {
this.idProvider = checkNotNull(idProvider);
this.reader = checkNotNull(reader);
this.wid = checkNotNull(wid);
@@ -190,7 +190,7 @@ public class SegmentBufferWriterPool imp
getWriterId(wid),
gcGeneration.get()
);
- } else if (writer.getGeneration() != gcGeneration.get()) {
+ } else if (!writer.getGeneration().equals(gcGeneration.get())) {
disposed.add(writer);
writer = new SegmentBufferWriter(
idProvider,
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentId.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentId.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentId.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentId.java Thu Jul 27 08:58:21 2017
@@ -69,7 +69,8 @@ public class SegmentId implements Compar
/**
* The gc generation of this segment or -1 if unknown.
*/
- private int gcGeneration = -1;
+ @CheckForNull
+ private GCGeneration gcGeneration;
/**
* The gc info of this segment if it has been reclaimed or {@code null} otherwise.
@@ -168,7 +169,7 @@ public class SegmentId implements Compar
if (gcInfo != null) {
sb.append(",").append(gcInfo);
}
- if (gcGeneration >= 0) {
+ if (gcGeneration != null) {
sb.append(",").append("segment-generation=").append(gcGeneration);
}
return sb.toString();
@@ -238,8 +239,9 @@ public class SegmentId implements Compar
* get loaded if the generation info is missing
* @return the segment's gc generation
*/
- public int getGcGeneration() {
- if (gcGeneration < 0) {
+ @Nonnull
+ public GCGeneration getGcGeneration() {
+ if (gcGeneration == null) {
getSegment();
}
return gcGeneration;
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java Thu Jul 27 08:58:21 2017
@@ -233,7 +233,7 @@ public abstract class AbstractFileStore
long msb = id.getMostSignificantBits();
long lsb = id.getLeastSignificantBits();
ByteBuffer buffer = ByteBuffer.wrap(data);
- int generation = Segment.getGcGeneration(buffer, id);
+ int generation = Segment.getGcGeneration(buffer, id).getGeneration();
w.recoverEntry(msb, lsb, data, 0, data.length, generation);
if (SegmentId.isDataSegmentId(lsb)) {
Segment segment = new Segment(tracker, segmentReader, tracker.newSegmentId(msb, lsb), buffer);
@@ -250,7 +250,7 @@ public abstract class AbstractFileStore
}
private static void populateTarBinaryReferences(final Segment segment, final EntryRecovery w) {
- final int generation = segment.getGcGeneration();
+ final int generation = segment.getGcGeneration().getGeneration();
final UUID id = segment.getSegmentId().asUUID();
segment.forEachRecord(new RecordConsumer() {
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=1803142&r1=1803141&r2=1803142&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 Thu Jul 27 08:58:21 2017
@@ -74,6 +74,7 @@ import com.google.common.base.Stopwatch;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.io.Closer;
+import org.apache.jackrabbit.oak.segment.GCGeneration;
import org.apache.jackrabbit.oak.segment.OnlineCompactor;
import org.apache.jackrabbit.oak.segment.RecordId;
import org.apache.jackrabbit.oak.segment.Segment;
@@ -179,12 +180,7 @@ public class FileStore extends AbstractF
}
this.segmentWriter = defaultSegmentWriterBuilder("sys")
- .withGeneration(new Supplier<Integer>() {
- @Override
- public Integer get() {
- return getGcGeneration();
- }
- })
+ .withGeneration(this::getGcGeneration)
.withWriterPool()
.with(builder.getCacheManager()
.withAccessTracking("WRITE", builder.getStatsProvider()))
@@ -287,7 +283,8 @@ public class FileStore extends AbstractF
};
}
- private int getGcGeneration() {
+ @Nonnull
+ private GCGeneration getGcGeneration() {
return revisions.getHead().getSegmentId().getGcGeneration();
}
@@ -493,7 +490,7 @@ public class FileStore extends AbstractF
}
segment = new Segment(tracker, segmentReader, id, data);
- generation = segment.getGcGeneration();
+ generation = segment.getGcGeneration().getGeneration();
references = readReferences(segment);
binaryReferences = readBinaryReferences(segment);
}
@@ -651,20 +648,20 @@ public class FileStore extends AbstractF
}
@Nonnull
- private CompactionResult compactionAborted(int generation) {
+ private CompactionResult compactionAborted(@Nonnull GCGeneration generation) {
gcListener.compactionFailed(generation);
return CompactionResult.aborted(getGcGeneration(), generation);
}
@Nonnull
- private CompactionResult compactionSucceeded(int generation, @Nonnull RecordId compactedRootId) {
+ private CompactionResult compactionSucceeded(@Nonnull GCGeneration generation, @Nonnull RecordId compactedRootId) {
gcListener.compactionSucceeded(generation);
return CompactionResult.succeeded(generation, gcOptions, compactedRootId);
}
@Nonnull
synchronized CompactionResult compact() {
- final int newGeneration = getGcGeneration() + 1;
+ final GCGeneration newGeneration = getGcGeneration().next();
try {
Stopwatch watch = Stopwatch.createStarted();
gcListener.info("TarMK GC #{}: compaction started, gc options={}", GC_COUNT, gcOptions);
@@ -916,14 +913,14 @@ public class FileStore extends AbstractF
: null;
}
- private CleanupContext newCleanupContext(Predicate<Integer> old) {
+ private CleanupContext newCleanupContext(Predicate<GCGeneration> old) {
return new CleanupContext() {
private boolean isUnreferencedBulkSegment(UUID id, boolean referenced) {
return !isDataSegmentId(id.getLeastSignificantBits()) && !referenced;
}
- private boolean isOldDataSegment(UUID id, int generation) {
+ private boolean isOldDataSegment(UUID id, GCGeneration generation) {
return isDataSegmentId(id.getLeastSignificantBits()) && old.apply(generation);
}
@@ -939,7 +936,7 @@ public class FileStore extends AbstractF
}
@Override
- public boolean shouldReclaim(UUID id, int generation, boolean referenced) {
+ public boolean shouldReclaim(UUID id, GCGeneration generation, boolean referenced) {
return isUnreferencedBulkSegment(id, referenced) || isOldDataSegment(id, generation);
}
@@ -1013,8 +1010,8 @@ public class FileStore extends AbstractF
*/
synchronized void collectBlobReferences(Consumer<String> collector) throws IOException {
segmentWriter.flush();
- int oldGeneration = getGcGeneration() - gcOptions.getRetainedGenerations();
- tarFiles.collectBlobReferences(collector, CompactionResult.newOldReclaimer(oldGeneration));
+ tarFiles.collectBlobReferences(collector,
+ CompactionResult.newOldReclaimer(getGcGeneration(), gcOptions.getRetainedGenerations()));
}
void cancel() {
@@ -1085,13 +1082,14 @@ public class FileStore extends AbstractF
/**
* Instances of this class represent the result from a compaction.
- * Either {@link #succeeded(int, SegmentGCOptions, RecordId) succeeded},
- * {@link #aborted(int, int) aborted} or {@link #skipped(int, SegmentGCOptions) skipped}.
+ * Either {@link #succeeded(GCGeneration, SegmentGCOptions, RecordId) succeeded},
+ * {@link #aborted(GCGeneration, GCGeneration) aborted} or {@link #skipped(GCGeneration, SegmentGCOptions) skipped}.
*/
private abstract static class CompactionResult {
- private final int currentGeneration;
+ @Nonnull
+ private final GCGeneration currentGeneration;
- protected CompactionResult(int currentGeneration) {
+ protected CompactionResult(@Nonnull GCGeneration currentGeneration) {
this.currentGeneration = currentGeneration;
}
@@ -1102,15 +1100,13 @@ public class FileStore extends AbstractF
* @param compactedRootId the record id of the root created by compaction
*/
static CompactionResult succeeded(
- final int newGeneration,
+ @Nonnull GCGeneration newGeneration,
@Nonnull final SegmentGCOptions gcOptions,
@Nonnull final RecordId compactedRootId) {
return new CompactionResult(newGeneration) {
- final int oldGeneration = newGeneration - gcOptions.getRetainedGenerations();
-
@Override
- Predicate<Integer> reclaimer() {
- return CompactionResult.newOldReclaimer(oldGeneration);
+ Predicate<GCGeneration> reclaimer() {
+ return CompactionResult.newOldReclaimer(newGeneration, gcOptions.getRetainedGenerations());
}
@Override
@@ -1131,11 +1127,11 @@ public class FileStore extends AbstractF
* @param failedGeneration the generation that compaction attempted to create
*/
static CompactionResult aborted(
- int currentGeneration,
- final int failedGeneration) {
+ @Nonnull GCGeneration currentGeneration,
+ @Nonnull final GCGeneration failedGeneration) {
return new CompactionResult(currentGeneration) {
@Override
- Predicate<Integer> reclaimer() {
+ Predicate<GCGeneration> reclaimer() {
return CompactionResult.newFailedReclaimer(failedGeneration);
}
@@ -1152,13 +1148,12 @@ public class FileStore extends AbstractF
* @param gcOptions the current GC options used by compaction
*/
static CompactionResult skipped(
- final int currentGeneration,
+ @Nonnull GCGeneration currentGeneration,
@Nonnull final SegmentGCOptions gcOptions) {
return new CompactionResult(currentGeneration) {
- final int oldGeneration = currentGeneration - gcOptions.getRetainedGenerations();
@Override
- Predicate<Integer> reclaimer() {
- return CompactionResult.newOldReclaimer(oldGeneration);
+ Predicate<GCGeneration> reclaimer() {
+ return CompactionResult.newOldReclaimer(currentGeneration, gcOptions.getRetainedGenerations());
}
@Override
@@ -1173,11 +1168,11 @@ public class FileStore extends AbstractF
* {@link GarbageCollector#cleanup(CompactionResult) clean up} for
* the given compaction result.
*/
- abstract Predicate<Integer> reclaimer();
+ abstract Predicate<GCGeneration> reclaimer();
/**
- * @return {@code true} for {@link #succeeded(int, SegmentGCOptions, RecordId) succeeded}
- * and {@link #skipped(int, SegmentGCOptions) skipped}, {@code false} otherwise.
+ * @return {@code true} for {@link #succeeded(GCGeneration, SegmentGCOptions, RecordId) succeeded}
+ * and {@link #skipped(GCGeneration, SegmentGCOptions) skipped}, {@code false} otherwise.
*/
abstract boolean isSuccess();
@@ -1199,11 +1194,11 @@ public class FileStore extends AbstractF
",reclaim-predicate=" + reclaimer();
}
- private static Predicate<Integer> newFailedReclaimer(final int failedGeneration) {
- return new Predicate<Integer>() {
+ private static Predicate<GCGeneration> newFailedReclaimer(@Nonnull final GCGeneration failedGeneration) {
+ return new Predicate<GCGeneration>() {
@Override
- public boolean apply(Integer generation) {
- return generation == failedGeneration;
+ public boolean apply(GCGeneration generation) {
+ return generation.equals(failedGeneration);
}
@Override
public String toString() {
@@ -1212,15 +1207,15 @@ public class FileStore extends AbstractF
};
}
- private static Predicate<Integer> newOldReclaimer(final int oldGeneration) {
- return new Predicate<Integer>() {
+ private static Predicate<GCGeneration> newOldReclaimer(@Nonnull final GCGeneration reference, int retainedGenerations) {
+ return new Predicate<GCGeneration>() {
@Override
- public boolean apply(Integer generation) {
- return generation <= oldGeneration;
+ public boolean apply(GCGeneration generation) {
+ return reference.compareWith(generation) >= retainedGenerations;
}
@Override
public String toString() {
- return "(generation<=" + oldGeneration + ")";
+ return "(" + reference + " - generation >= " + retainedGenerations + ")";
}
};
}
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=1803142&r1=1803141&r2=1803142&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 Thu Jul 27 08:58:21 2017
@@ -40,6 +40,7 @@ import com.google.common.base.Predicate;
import org.apache.jackrabbit.oak.segment.CacheWeights.NodeCacheWeigher;
import org.apache.jackrabbit.oak.segment.CacheWeights.StringCacheWeigher;
import org.apache.jackrabbit.oak.segment.CacheWeights.TemplateCacheWeigher;
+import org.apache.jackrabbit.oak.segment.GCGeneration;
import org.apache.jackrabbit.oak.segment.RecordCache;
import org.apache.jackrabbit.oak.segment.SegmentNotFoundExceptionListener;
import org.apache.jackrabbit.oak.segment.WriterCacheManager;
@@ -98,17 +99,17 @@ public class FileStoreBuilder {
@Nonnull
private final GCListener gcListener = new GCListener(){
@Override
- public void compactionSucceeded(int newGeneration) {
+ public void compactionSucceeded(@Nonnull GCGeneration newGeneration) {
compacted();
if (cacheManager != null) {
- cacheManager.evictOldGeneration(newGeneration);
+ cacheManager.evictOldGeneration(newGeneration.getGeneration());
}
}
@Override
- public void compactionFailed(int failedGeneration) {
+ public void compactionFailed(@Nonnull GCGeneration failedGeneration) {
if (cacheManager != null) {
- cacheManager.evictGeneration(failedGeneration);
+ cacheManager.evictGeneration(failedGeneration.getGeneration());
}
}
};
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java Thu Jul 27 08:58:21 2017
@@ -38,6 +38,7 @@ import java.util.List;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
+import org.apache.jackrabbit.oak.segment.GCGeneration;
import org.apache.jackrabbit.oak.segment.RecordId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -75,9 +76,9 @@ public class GCJournal {
* @param root record id of the compacted root node
*/
public synchronized void persist(long reclaimedSize, long repoSize,
- int gcGeneration, long nodes, @Nonnull String root) {
+ @Nonnull GCGeneration gcGeneration, long nodes, @Nonnull String root) {
GCJournalEntry current = read();
- if (current.getGcGeneration() == gcGeneration) {
+ if (current.getGcGeneration().equals(gcGeneration)) {
// failed compaction, only update the journal if the generation
// increases
return;
@@ -138,19 +139,21 @@ public class GCJournal {
public static class GCJournalEntry {
static final GCJournalEntry EMPTY = new GCJournalEntry(
- -1, -1, -1, -1, -1, RecordId.NULL.toString10());
+ -1, -1, -1, GCGeneration.NULL, -1, RecordId.NULL.toString10());
private final long repoSize;
private final long reclaimedSize;
private final long ts;
- private final int gcGeneration;
+
+ @Nonnull
+ private final GCGeneration gcGeneration;
private final long nodes;
@Nonnull
private final String root;
public GCJournalEntry(long repoSize, long reclaimedSize, long ts,
- int gcGeneration, long nodes, @Nonnull String root) {
+ @Nonnull GCGeneration gcGeneration, long nodes, @Nonnull String root) {
this.repoSize = repoSize;
this.reclaimedSize = reclaimedSize;
this.ts = ts;
@@ -175,7 +178,7 @@ public class GCJournal {
if (root == null) {
root = RecordId.NULL.toString10();
}
- return new GCJournalEntry(repoSize, reclaimedSize, ts, gcGen, nodes, root);
+ return new GCJournalEntry(repoSize, reclaimedSize, ts, new GCGeneration(gcGen), nodes, root);
}
@CheckForNull
@@ -222,7 +225,8 @@ public class GCJournal {
/**
* Returns the gc generation
*/
- public int getGcGeneration() {
+ @Nonnull
+ public GCGeneration getGcGeneration() {
return gcGeneration;
}
@@ -245,7 +249,7 @@ public class GCJournal {
public int hashCode() {
final int prime = 31;
int result = 1;
- result = prime * result + gcGeneration;
+ result = prime * result + gcGeneration.hashCode();
result = prime * result + root.hashCode();
result = prime * result + (int) (nodes ^ (nodes >>> 32));
result = prime * result + (int) (reclaimedSize ^ (reclaimedSize >>> 32));
@@ -266,7 +270,7 @@ public class GCJournal {
return false;
}
GCJournalEntry other = (GCJournalEntry) obj;
- if (gcGeneration != other.gcGeneration) {
+ if (!gcGeneration.equals(other.gcGeneration)) {
return false;
}
if (nodes != other.nodes) {
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCListener.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCListener.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCListener.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCListener.java Thu Jul 27 08:58:21 2017
@@ -19,6 +19,9 @@
package org.apache.jackrabbit.oak.segment.file;
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.oak.segment.GCGeneration;
import org.apache.jackrabbit.oak.spi.gc.DelegatingGCMonitor;
/**
@@ -31,12 +34,12 @@ abstract class GCListener extends Delega
* a new generation of segments
* @param newGeneration the new generation number
*/
- public abstract void compactionSucceeded(int newGeneration);
+ public abstract void compactionSucceeded(@Nonnull GCGeneration newGeneration);
/**
* Notification of a failed compaction. A new generation of
* segments could not be created.
* @param failedGeneration the generation number that could not be created
*/
- public abstract void compactionFailed(int failedGeneration);
+ public abstract void compactionFailed(@Nonnull GCGeneration failedGeneration);
}
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/CleanupContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/CleanupContext.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/CleanupContext.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/CleanupContext.java Thu Jul 27 08:58:21 2017
@@ -20,6 +20,8 @@ package org.apache.jackrabbit.oak.segmen
import java.util.Collection;
import java.util.UUID;
+import org.apache.jackrabbit.oak.segment.GCGeneration;
+
/**
* Initial data and logic needed for the cleanup of unused TAR entries.
*/
@@ -44,7 +46,7 @@ public interface CleanupContext {
* @return {@code true} if the entry should be reclaimed, {@code false}
* otherwise.
*/
- boolean shouldReclaim(UUID id, int generation, boolean referenced);
+ boolean shouldReclaim(UUID id, GCGeneration generation, boolean referenced);
/**
* Determine if a reference between two entries should be followed, and if
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java Thu Jul 27 08:58:21 2017
@@ -50,6 +50,7 @@ import javax.annotation.Nonnull;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
+import org.apache.jackrabbit.oak.segment.GCGeneration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -652,7 +653,7 @@ public class TarFiles implements Closeab
return result;
}
- public void collectBlobReferences(Consumer<String> collector, Predicate<Integer> reclaim) throws IOException {
+ public void collectBlobReferences(Consumer<String> collector, Predicate<GCGeneration> reclaim) throws IOException {
Node head;
lock.writeLock().lock();
try {
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java Thu Jul 27 08:58:21 2017
@@ -61,6 +61,7 @@ import com.google.common.base.Predicate;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Sets;
import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.oak.segment.GCGeneration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -683,7 +684,7 @@ class TarReader implements Closeable {
* @param collector An instance of {@link Consumer}.
* @param skipGeneration An instance of {@link Predicate}.
*/
- void collectBlobReferences(@Nonnull Consumer<String> collector, Predicate<Integer> skipGeneration) {
+ void collectBlobReferences(@Nonnull Consumer<String> collector, Predicate<GCGeneration> skipGeneration) {
Map<Integer, Map<UUID, Set<String>>> generations = getBinaryReferences();
if (generations == null) {
@@ -691,7 +692,7 @@ class TarReader implements Closeable {
}
for (Entry<Integer, Map<UUID, Set<String>>> entry : generations.entrySet()) {
- if (skipGeneration.apply(entry.getKey())) {
+ if (skipGeneration.apply(new GCGeneration(entry.getKey()))) {
continue;
}
@@ -747,7 +748,7 @@ class TarReader implements Closeable {
// CPU on subsequent look-ups.
TarEntry entry = entries[i];
UUID id = new UUID(entry.msb(), entry.lsb());
- if (context.shouldReclaim(id, entry.generation(), references.remove(id))) {
+ if (context.shouldReclaim(id, new GCGeneration(entry.generation()), references.remove(id))) {
reclaimable.add(id);
} else {
for (UUID refId : getReferences(id, graph)) {
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientSync.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientSync.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientSync.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientSync.java Thu Jul 27 08:58:21 2017
@@ -35,6 +35,7 @@ import javax.management.StandardMBean;
import com.google.common.base.Supplier;
import io.netty.channel.nio.NioEventLoopGroup;
import org.apache.jackrabbit.core.data.util.NamedThreadFactory;
+import org.apache.jackrabbit.oak.segment.GCGeneration;
import org.apache.jackrabbit.oak.segment.file.FileStore;
import org.apache.jackrabbit.oak.segment.standby.jmx.ClientStandbyStatusMBean;
import org.apache.jackrabbit.oak.segment.standby.jmx.StandbyStatusMBean;
@@ -152,11 +153,11 @@ public final class StandbyClientSync imp
try (StandbyClient client = new StandbyClient(group, observer.getID(), secure, readTimeoutMs)) {
client.connect(host, port);
- int genBefore = headGeneration(fileStore);
+ GCGeneration genBefore = headGeneration(fileStore);
new StandbyClientSyncExecution(fileStore, client, newRunningSupplier()).execute();
- int genAfter = headGeneration(fileStore);
+ GCGeneration genAfter = headGeneration(fileStore);
- if (autoClean && (genAfter > genBefore)) {
+ if (autoClean && (genAfter.compareWith(genBefore)) > 0) {
log.info("New head generation detected (prevHeadGen: {} newHeadGen: {}), running cleanup.", genBefore, genAfter);
cleanupAndRemove();
}
@@ -178,7 +179,8 @@ public final class StandbyClientSync imp
}
}
- private static int headGeneration(FileStore fileStore) {
+ @Nonnull
+ private static GCGeneration headGeneration(FileStore fileStore) {
return fileStore.getHead().getRecordId().getSegment().getGcGeneration();
}
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java Thu Jul 27 08:58:21 2017
@@ -1145,7 +1145,7 @@ public class CompactionAndCleanupIT {
builder = nodeStore.getRoot().builder();
builder.setChildNode("x").setChildNode("xx");
- NodeState uncompacted = nodeStore.getRoot();
+ SegmentNodeState uncompacted = (SegmentNodeState) nodeStore.getRoot();
fileStore.compact();
NodeState compacted = nodeStore.getRoot();
@@ -1155,7 +1155,9 @@ public class CompactionAndCleanupIT {
builder.setChildNode("y").setChildNode("yy");
builder.getChildNode("a").remove();
NodeState deferCompacted = nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
- assertEquals(1, ((SegmentNodeState)deferCompacted).getSegment().getGcGeneration());
+ assertEquals(
+ uncompacted.getSegment().getGcGeneration().next(),
+ ((SegmentNodeState)deferCompacted).getSegment().getGcGeneration());
}
}
@@ -1166,7 +1168,7 @@ public class CompactionAndCleanupIT {
SegmentNodeState sns1 = (SegmentNodeState) node1;
SegmentNodeState sns2 = (SegmentNodeState) node2;
assertEquals("GC generation should be bumped by one " + path,
- sns1.getSegment().getGcGeneration() + 1, sns2.getSegment().getGcGeneration());
+ sns1.getSegment().getGcGeneration().next(), sns2.getSegment().getGcGeneration());
assertEquals("Nodes should have same stable id: " + path,
sns1.getStableId(), sns2.getStableId());
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTest.java Thu Jul 27 08:58:21 2017
@@ -52,7 +52,9 @@ public class CompactorTest {
NodeStore store = SegmentNodeStoreBuilders.builder(memoryStore).build();
init(store);
- SegmentWriter writer = defaultSegmentWriterBuilder("c").withGeneration(1).build(memoryStore);
+ SegmentWriter writer = defaultSegmentWriterBuilder("c")
+ .withGeneration(new GCGeneration(1))
+ .build(memoryStore);
Compactor compactor = new Compactor(memoryStore.getReader(), writer,
memoryStore.getBlobStore(), Suppliers.ofInstance(false), defaultGCOptions());
addTestContent(store, 0);
@@ -75,7 +77,9 @@ public class CompactorTest {
// doesn't have the child named "b".
NodeStore store = SegmentNodeStoreBuilders.builder(memoryStore).build();
- SegmentWriter writer = defaultSegmentWriterBuilder("c").withGeneration(1).build(memoryStore);
+ SegmentWriter writer = defaultSegmentWriterBuilder("c")
+ .withGeneration(new GCGeneration(1))
+ .build(memoryStore);
Compactor compactor = new Compactor(memoryStore.getReader(), writer,
memoryStore.getBlobStore(), Suppliers.ofInstance(true), defaultGCOptions());
SegmentNodeState sns = compactor.compact(store.getRoot(),
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java Thu Jul 27 08:58:21 2017
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.oak.segment;
+import static org.apache.jackrabbit.oak.segment.DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
@@ -36,16 +37,16 @@ import org.junit.rules.TemporaryFolder;
public class NodeRecordTest {
- private static class Generation implements Supplier<Integer> {
+ private static class Generation implements Supplier<GCGeneration> {
- private int generation;
+ private GCGeneration generation;
- public void set(int generation) {
+ public void set(GCGeneration generation) {
this.generation = generation;
}
@Override
- public Integer get() {
+ public GCGeneration get() {
return generation;
}
@@ -63,15 +64,21 @@ public class NodeRecordTest {
try (FileStore store = newFileStore()) {
SegmentWriter writer;
- writer = DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder("1").withGeneration(1).build(store);
+ writer = defaultSegmentWriterBuilder("1")
+ .withGeneration(new GCGeneration(1))
+ .build(store);
SegmentNodeState one = new SegmentNodeState(store.getReader(), writer, store.getBlobStore(), writer.writeNode(EmptyNodeState.EMPTY_NODE));
writer.flush();
- writer = DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder("2").withGeneration(2).build(store);
+ writer = defaultSegmentWriterBuilder("2")
+ .withGeneration(new GCGeneration(2))
+ .build(store);
SegmentNodeState two = new SegmentNodeState(store.getReader(), writer, store.getBlobStore(), writer.writeNode(one));
writer.flush();
- writer = DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder("3").withGeneration(3).build(store);
+ writer = defaultSegmentWriterBuilder("3")
+ .withGeneration(new GCGeneration(3))
+ .build(store);
SegmentNodeState three = new SegmentNodeState(store.getReader(), writer, store.getBlobStore(), writer.writeNode(two));
writer.flush();
@@ -95,13 +102,13 @@ public class NodeRecordTest {
// otherwise the write of some records (in this case, template
// records) will be cached and prevent this test to fail.
- SegmentWriter writer = DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder("test")
+ SegmentWriter writer = defaultSegmentWriterBuilder("test")
.withGeneration(generation)
.withWriterPool()
.with(nodesOnlyCache())
.build(store);
- generation.set(1);
+ generation.set(new GCGeneration(1));
// Write a new node with a non trivial template. This record will
// belong to generation 1.
@@ -114,7 +121,7 @@ public class NodeRecordTest {
SegmentNodeState base = new SegmentNodeState(store.getReader(), writer, store.getBlobStore(), baseId);
writer.flush();
- generation.set(2);
+ generation.set(new GCGeneration(2));
// Compact that same record to generation 2.
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=1803142&r1=1803141&r2=1803142&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 Thu Jul 27 08:58:21 2017
@@ -76,12 +76,12 @@ public class OnlineCompactorTest {
OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(false));
addTestContent(nodeStore);
- NodeState uncompacted = nodeStore.getRoot();
+ SegmentNodeState uncompacted = (SegmentNodeState) nodeStore.getRoot();
SegmentNodeState compacted = compactor.compact(uncompacted);
assertNotNull(compacted);
assertFalse(uncompacted == compacted);
assertEquals(uncompacted, compacted);
- assertEquals(1, compacted.getSegment().getGcGeneration());
+ assertEquals(uncompacted.getSegment().getGcGeneration().next(), compacted.getSegment().getGcGeneration());
modifyTestContent(nodeStore);
NodeState modified = nodeStore.getRoot();
@@ -89,7 +89,7 @@ public class OnlineCompactorTest {
assertNotNull(compacted);
assertFalse(modified == compacted);
assertEquals(modified, compacted);
- assertEquals(1, compacted.getSegment().getGcGeneration());
+ assertEquals(uncompacted.getSegment().getGcGeneration().next(), compacted.getSegment().getGcGeneration());
}
@Test
@@ -97,12 +97,12 @@ public class OnlineCompactorTest {
OnlineCompactor compactor = createCompactor(fileStore, Suppliers.ofInstance(false));
addNodes(nodeStore, OnlineCompactor.UPDATE_LIMIT * 2 + 1);
- NodeState uncompacted = nodeStore.getRoot();
+ SegmentNodeState uncompacted = (SegmentNodeState) nodeStore.getRoot();
SegmentNodeState compacted = compactor.compact(uncompacted);
assertNotNull(compacted);
assertFalse(uncompacted == compacted);
assertEquals(uncompacted, compacted);
- assertEquals(1, compacted.getSegment().getGcGeneration());
+ assertEquals(uncompacted.getSegment().getGcGeneration().next(), compacted.getSegment().getGcGeneration());
}
@Test
@@ -118,7 +118,9 @@ public class OnlineCompactorTest {
@Nonnull
private static OnlineCompactor createCompactor(FileStore fileStore, Supplier<Boolean> cancel) {
- SegmentWriter writer = defaultSegmentWriterBuilder("c").withGeneration(1).build(fileStore);
+ SegmentWriter writer = defaultSegmentWriterBuilder("c")
+ .withGeneration(new GCGeneration(1))
+ .build(fileStore);
return new OnlineCompactor(fileStore.getReader(), writer, fileStore.getBlobStore(), cancel, () -> {});
}
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPoolTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPoolTest.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPoolTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPoolTest.java Thu Jul 27 08:58:21 2017
@@ -54,7 +54,7 @@ public class SegmentBufferWriterPoolTest
store.getSegmentIdProvider(),
store.getReader(),
"",
- Suppliers.ofInstance(0)
+ Suppliers.ofInstance(GCGeneration.NULL)
);
private final ExecutorService[] executors = new ExecutorService[] {
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java?rev=1803142&r1=1803141&r2=1803142&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java Thu Jul 27 08:58:21 2017
@@ -28,6 +28,7 @@ import java.nio.file.Files;
import java.util.Collection;
import java.util.List;
+import org.apache.jackrabbit.oak.segment.GCGeneration;
import org.apache.jackrabbit.oak.segment.RecordId;
import org.apache.jackrabbit.oak.segment.file.GCJournal.GCJournalEntry;
import org.junit.Rule;
@@ -45,21 +46,21 @@ public class GcJournalTest {
File directory = segmentFolder.newFolder();
GCJournal gc = new GCJournal(directory);
- gc.persist(0, 100, 1, 50, RecordId.NULL.toString10());
+ gc.persist(0, 100, new GCGeneration(1), 50, RecordId.NULL.toString10());
GCJournalEntry e0 = gc.read();
assertEquals(100, e0.getRepoSize());
assertEquals(0, e0.getReclaimedSize());
assertEquals(50, e0.getNodes());
assertEquals(RecordId.NULL.toString10(), e0.getRoot());
- gc.persist(0, 250, 2, 75, RecordId.NULL.toString());
+ gc.persist(0, 250, new GCGeneration(2), 75, RecordId.NULL.toString());
GCJournalEntry e1 = gc.read();
assertEquals(250, e1.getRepoSize());
assertEquals(0, e1.getReclaimedSize());
assertEquals(75, e1.getNodes());
assertEquals(RecordId.NULL.toString(), e1.getRoot());
- gc.persist(50, 200, 3, 90, "foo");
+ gc.persist(50, 200, new GCGeneration(3), 90, "foo");
GCJournalEntry e2 = gc.read();
assertEquals(200, e2.getRepoSize());
assertEquals(50, e2.getReclaimedSize());
@@ -67,7 +68,7 @@ public class GcJournalTest {
assertEquals("foo", e2.getRoot());
// same gen
- gc.persist(75, 300, 3, 125, "bar");
+ gc.persist(75, 300, new GCGeneration(3), 125, "bar");
GCJournalEntry e3 = gc.read();
assertEquals(200, e3.getRepoSize());
assertEquals(50, e3.getReclaimedSize());