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 ju...@apache.org on 2014/06/10 22:50:33 UTC

svn commit: r1601767 - in /jackrabbit/oak/branches/1.0: ./ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins...

Author: jukka
Date: Tue Jun 10 20:50:32 2014
New Revision: 1601767

URL: http://svn.apache.org/r1601767
Log:
1.0.1: Merged revisions 1601388 and 1601757 (OAK-1804)

Added:
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMap.java
      - copied unchanged from r1601757, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMap.java
    jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMapTest.java
      - copied unchanged from r1601757, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionMapTest.java
Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Record.java
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1601388,1601757

Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java?rev=1601767&r1=1601766&r2=1601767&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java Tue Jun 10 20:50:32 2014
@@ -52,7 +52,7 @@ public class Compactor {
     /** Logger instance */
     private static final Logger log = LoggerFactory.getLogger(Compactor.class);
 
-    public static void compact(SegmentStore store) {
+    public static CompactionMap compact(SegmentStore store) {
         SegmentWriter writer = store.getTracker().getWriter();
         Compactor compactor = new Compactor(writer);
 
@@ -74,6 +74,16 @@ public class Compactor {
             before = head;
             after = builder.getNodeState();
         }
+
+        return new CompactionMap(compactor.compacted);
+    }
+
+    /**
+     * Locks down the RecordId persistence structure
+     */
+    static long[] recordAsKey(RecordId r) {
+        return new long[] { r.getSegmentId().getMostSignificantBits(),
+                r.getSegmentId().getLeastSignificantBits(), r.getOffset() };
     }
 
     private final SegmentWriter writer;

Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Record.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Record.java?rev=1601767&r1=1601766&r2=1601767&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Record.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Record.java Tue Jun 10 20:50:32 2014
@@ -32,7 +32,15 @@ class Record {
     }
 
     static boolean fastEquals(Record a, Record b) {
-        return a.segmentId == b.segmentId && a.offset == b.offset;
+        if (a.segmentId == b.segmentId && a.offset == b.offset) {
+            return true;
+        }
+
+        CompactionMap compaction = a.getStore().getTracker().getCompactionMap();
+        RecordId aid = a.getRecordId();
+        RecordId bid = b.getRecordId();
+        return compaction.wasCompactedTo(aid, bid)
+                || compaction.wasCompactedTo(bid, aid);
     }
 
     /**
@@ -69,6 +77,15 @@ class Record {
     }
 
     /**
+     * Returns the segment store.
+     *
+     * @return segment store
+     */
+    public SegmentStore getStore() {
+        return segmentId.getTracker().getStore();
+    }
+
+    /**
      * Returns the identifier of this record.
      *
      * @return record identifier

Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java?rev=1601767&r1=1601766&r2=1601767&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java Tue Jun 10 20:50:32 2014
@@ -25,6 +25,9 @@ import java.security.SecureRandom;
 import java.util.LinkedList;
 import java.util.Queue;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
 import org.slf4j.Logger;
@@ -63,6 +66,14 @@ public class SegmentTracker {
 
     private final SegmentWriter writer;
 
+    /**
+     * Serialized map that contains the link between old record
+     * identifiers and identifiers of the corresponding records
+     * after compaction.
+     */
+    private final AtomicReference<CompactionMap> compactionMap =
+            new AtomicReference<CompactionMap>(new CompactionMap());
+
     private final long cacheSize;
 
     /**
@@ -142,6 +153,15 @@ public class SegmentTracker {
         }
     }
 
+    public void setCompactionMap(CompactionMap compaction) {
+        compactionMap.set(compaction);
+    }
+
+    @Nonnull
+    CompactionMap getCompactionMap() {
+        return compactionMap.get();
+    }
+
     /**
      * Returns all segment identifiers that are currently referenced in memory.
      *

Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java?rev=1601767&r1=1601766&r2=1601767&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java Tue Jun 10 20:50:32 2014
@@ -406,10 +406,11 @@ public class FileStore implements Segmen
         }
     }
 
-    private void compact() {
+    public void compact() {
         if (compactNeeded.getAndSet(false)) {
             long start = System.nanoTime();
-            Compactor.compact(this);
+            tracker.getWriter().dropCache();
+            tracker.setCompactionMap(Compactor.compact(this));
             log.info("TarMK Compaction: Completed in {}ms", MILLISECONDS
                     .convert(System.nanoTime() - start, NANOSECONDS));
             cleanupNeeded.set(true);