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());