Author: mduerig
Date: Mon Jun  8 15:59:00 2015
New Revision: 1684212

URL: http://svn.apache.org/r1684212
Log:
OAK-2967: Merge OAK-2800, OAK-2801, OAK-2692, OAK-2713
Merged r1682555

Modified:
    jackrabbit/oak/branches/1.2/   (props changed)
    
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
    
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
    
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
    
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
    
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupTest.java

Propchange: jackrabbit/oak/branches/1.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jun  8 15:59:00 2015
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414,1673436,1673644,1673662-1673664,1673669,1673695,1674046,1674065,1674075,1674107,1674228,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677939,1677991,1678173,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679235,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680805-1680806,1680903,1681282,1681767,1681918,1682218,1682235,1682437,1682494,1682855,1682904,1683089,1683213,1683249,1683278,1683323,1683687,1684174-1684175
+/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414,1673436,1673644,1673662-1673664,1673669,1673695,1674046,1674065,1674075,1674107,1674228,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677939,1677991,1678173,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679235,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680805-1680806,1680903,1681282,1681767,1681918,1682218,1682235,1682437,1682494,1682555,1682855,1682904,1683089,1683213,1683249,1683278,1683323,1683687,1684174-1684175
 /jackrabbit/trunk:1345480

Modified: 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java?rev=1684212&r1=1684211&r2=1684212&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
 Mon Jun  8 15:59:00 2015
@@ -123,6 +123,14 @@ public class SegmentTracker {
         return store;
     }
 
+    /**
+     * Clear the segment cache
+     */
+    public synchronized void clearCache() {
+        segments.clear();
+        currentSize = 0;
+    }
+
     Segment getSegment(SegmentId id) {
         try {
             Segment segment = store.readSegment(id);

Modified: 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java?rev=1684212&r1=1684211&r2=1684212&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
 Mon Jun  8 15:59:00 2015
@@ -641,6 +641,9 @@ public class FileStore implements Segmen
         gcMonitor.info("TarMK revision cleanup started. Current repository 
size {}",
                 humanReadableByteCount(initialSize));
 
+        newWriter();
+        tracker.clearCache();
+
         // Suggest to the JVM that now would be a good time
         // to clear stale weak references in the SegmentTracker
         System.gc();
@@ -873,25 +876,31 @@ public class FileStore implements Segmen
                     id.getLeastSignificantBits(),
                     data, offset, length);
             if (size >= maxFileSize) {
-                writer.close();
-
-                List<TarReader> list =
-                        newArrayListWithCapacity(1 + readers.size());
-                list.add(TarReader.open(writeFile, memoryMapping));
-                list.addAll(readers);
-                readers = list;
-
-                writeNumber++;
-                writeFile = new File(
-                        directory,
-                        String.format(FILE_NAME_FORMAT, writeNumber, "a"));
-                writer = new TarWriter(writeFile);
+                newWriter();
             }
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
     }
 
+    private void newWriter() throws IOException {
+        if (writer.isDirty()) {
+            writer.close();
+
+            List<TarReader> list =
+                    newArrayListWithCapacity(1 + readers.size());
+            list.add(TarReader.open(writeFile, memoryMapping));
+            list.addAll(readers);
+            readers = list;
+
+            writeNumber++;
+            writeFile = new File(
+                    directory,
+                    String.format(FILE_NAME_FORMAT, writeNumber, "a"));
+            writer = new TarWriter(writeFile);
+        }
+    }
+
     @Override
     public Blob readBlob(String blobId) {
         if (blobStore != null) {

Modified: 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java?rev=1684212&r1=1684211&r2=1684212&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
 Mon Jun  8 15:59:00 2015
@@ -597,26 +597,14 @@ class TarReader {
                 cleaned.add(id);
                 sorted[i] = null;
             } else {
+                size += getEntrySize(entry.size());
+                count += 1;
                 if (isDataSegmentId(entry.lsb())) {
-                    size += getEntrySize(entry.size());
-                    count += 1;
-
                     // this is a referenced data segment, so follow the graph
                     if (graph != null) {
                         List<UUID> refids = graph.get(id);
                         if (refids != null) {
-                            for (UUID r : refids) {
-                                if 
(isDataSegmentId(r.getLeastSignificantBits())) {
-                                    referencedIds.add(r);
-                                } else {
-                                    if (cm != null && cm.wasCompacted(id)) {
-                                        // skip bulk compacted segment
-                                        // references
-                                    } else {
-                                        referencedIds.add(r);
-                                    }
-                                }
-                            }
+                            referencedIds.addAll(refids);
                         }
                     } else {
                         // a pre-compiled graph is not available, so read the
@@ -628,28 +616,11 @@ class TarReader {
                         int refcount = segment.get(pos + REF_COUNT_OFFSET) & 
0xff;
                         int refend = pos + 16 * (refcount + 1);
                         for (int refpos = pos + 16; refpos < refend; refpos += 
16) {
-                            UUID r = new UUID(segment.getLong(refpos),
-                                    segment.getLong(refpos + 8));
-                            if (isDataSegmentId(r.getLeastSignificantBits())) {
-                                referencedIds.add(r);
-                            } else {
-                                if (cm != null && cm.wasCompacted(id)) {
-                                    // skip bulk compacted segment references
-                                } else {
-                                    referencedIds.add(r);
-                                }
-                            }
+                            referencedIds.add(new UUID(
+                                    segment.getLong(refpos),
+                                    segment.getLong(refpos + 8)));
                         }
                     }
-                } else {
-                    // bulk segments compaction check
-                    if (cm != null && cm.wasCompacted(id)) {
-                        cleaned.add(id);
-                        sorted[i] = null;
-                    } else {
-                        size += getEntrySize(entry.size());
-                        count += 1;
-                    }
                 }
             }
         }

Modified: 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java?rev=1684212&r1=1684211&r2=1684212&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
 Mon Jun  8 15:59:00 2015
@@ -278,6 +278,10 @@ class TarWriter {
         }
     }
 
+    boolean isDirty() {
+        return access != null;
+    }
+
     /**
      * Closes this tar file.
      *

Modified: 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupTest.java?rev=1684212&r1=1684211&r2=1684212&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupTest.java
 Mon Jun  8 15:59:00 2015
@@ -162,8 +162,7 @@ public class CompactionAndCleanupTest {
             // fileStore.size() in [blobSize + dataSize, blobSize + 2xdataSize]
             assertTrue(fileStore.maybeCompact(false));
             fileStore.cleanup();
-            assertSize("post cleanup", fileStore.size(), blobSize + dataSize,
-                    blobSize + 2 * dataSize);
+            assertSize("post cleanup", fileStore.size(), 0, blobSize + 2 * 
dataSize);
 
             // refresh the ts ref, to simulate a long wait time
             custom.setOlderThan(0);


Reply via email to