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 2016/07/26 14:54:05 UTC

svn commit: r1754138 - in /jackrabbit/oak/trunk/oak-segment-tar/src: main/java/org/apache/jackrabbit/oak/segment/file/ test/java/org/apache/jackrabbit/oak/segment/ test/java/org/apache/jackrabbit/oak/segment/file/

Author: frm
Date: Tue Jul 26 14:54:04 2016
New Revision: 1754138

URL: http://svn.apache.org/viewvc?rev=1754138&view=rev
Log:
OAK-4604 - Trim down and propagate the binary references index during garbage collection

When garbage collection runs and a new generation of a TAR file is created, the
binary references index must be built from scratch in the new TAR file.
Moreover, since some segments might be removed from the original file, the
binary references index in the new TAR file should not contain any references
to old, removed segments.

Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentDataStoreBlobGCIT.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java?rev=1754138&r1=1754137&r2=1754138&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java Tue Jul 26 14:54:04 2016
@@ -871,6 +871,23 @@ class TarReader implements Closeable {
                         entry.msb(), entry.lsb(), data, 0, entry.size(), entry.generation());
             }
         }
+
+        // Reconstruct the binary reference index for non-cleaned segments.
+
+        Map<Integer, Map<UUID, Set<String>>> references = getBinaryReferences();
+
+        for (Entry<Integer, Map<UUID, Set<String>>> ge : references.entrySet()) {
+            for (Entry<UUID, Set<String>> se : ge.getValue().entrySet()) {
+                if (cleaned.contains(se.getKey())) {
+                    continue;
+                }
+                for (String reference : se.getValue()) {
+                    writer.addBinaryReference(ge.getKey(), se.getKey(), reference);
+                }
+            }
+
+        }
+
         writer.close();
 
         TarReader reader = openFirstFileWithValidIndex(

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentDataStoreBlobGCIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentDataStoreBlobGCIT.java?rev=1754138&r1=1754137&r2=1754138&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentDataStoreBlobGCIT.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentDataStoreBlobGCIT.java Tue Jul 26 14:54:04 2016
@@ -77,7 +77,6 @@ import org.apache.jackrabbit.oak.spi.com
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.junit.After;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -97,7 +96,7 @@ public class SegmentDataStoreBlobGCIT {
     SegmentGCOptions gcOptions = defaultGCOptions();
 
     @Rule
-    public TemporaryFolder folder;
+    public TemporaryFolder folder = new TemporaryFolder(new File("target"));
 
     @BeforeClass
     public static void assumptions() {
@@ -255,7 +254,6 @@ public class SegmentDataStoreBlobGCIT {
     }
 
     @Test
-    @Ignore("OAK-4598")
     public void checkMark() throws Exception {
         LogCustomizer customLogs = LogCustomizer
             .forLogger(MarkSweepGarbageCollector.class.getName())

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java?rev=1754138&r1=1754137&r2=1754138&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java Tue Jul 26 14:54:04 2016
@@ -21,11 +21,13 @@ package org.apache.jackrabbit.oak.segmen
 import static com.google.common.base.Charsets.UTF_8;
 import static com.google.common.collect.Maps.newHashMap;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.mockito.internal.util.collections.Sets.newSet;
 
 import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
@@ -126,4 +128,40 @@ public class TarFileTest {
         }
     }
 
+    @Test
+    public void binaryReferencesIndexShouldBeTrimmedDownOnSweep() throws Exception {
+        try (TarWriter writer = new TarWriter(file)) {
+            writer.writeEntry(1, 1, new byte[] {1}, 0, 1, 1);
+            writer.writeEntry(1, 2, new byte[] {1}, 0, 1, 1);
+            writer.writeEntry(2, 1, new byte[] {1}, 0, 1, 2);
+            writer.writeEntry(2, 2, new byte[] {1}, 0, 1, 2);
+
+            writer.addBinaryReference(1, new UUID(1, 1), "a");
+            writer.addBinaryReference(1, new UUID(1, 2), "b");
+
+            writer.addBinaryReference(2, new UUID(2, 1), "c");
+            writer.addBinaryReference(2, new UUID(2, 2), "d");
+        }
+
+        Set<UUID> sweep = newSet(new UUID(1, 1), new UUID(2, 2));
+
+        try (TarReader reader = TarReader.open(file, false)) {
+            try (TarReader swept = reader.sweep(sweep, new HashSet<UUID>())) {
+                assertNotNull(swept);
+
+                Map<UUID, Set<String>> one = newHashMap();
+                one.put(new UUID(1, 2), newSet("b"));
+
+                Map<UUID, Set<String>> two = newHashMap();
+                two.put(new UUID(2, 1), newSet("c"));
+
+                Map<Integer, Map<UUID, Set<String>>> references = newHashMap();
+                references.put(1, one);
+                references.put(2, two);
+
+                assertEquals(references, swept.getBinaryReferences());
+            }
+        }
+    }
+
 }