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 am...@apache.org on 2015/07/16 05:36:13 UTC
svn commit: r1691307 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/document/SplitDocumentCleanUp.java
test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorTest.java
Author: amitj
Date: Thu Jul 16 03:36:13 2015
New Revision: 1691307
URL: http://svn.apache.org/r1691307
Log:
OAK-3099: Revision GC fails when split documents with very long paths are present
Proper handling of long paths and associated test
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitDocumentCleanUp.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitDocumentCleanUp.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitDocumentCleanUp.java?rev=1691307&r1=1691306&r2=1691307&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitDocumentCleanUp.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitDocumentCleanUp.java Thu Jul 16 03:36:13 2015
@@ -79,14 +79,16 @@ public class SplitDocumentCleanUp {
mainId, splitId);
return;
}
- int slashIdx = splitId.lastIndexOf('/');
- int height = Integer.parseInt(splitId.substring(slashIdx + 1));
+
+ String splitDocPath = splitDoc.getPath();
+ int slashIdx = splitDocPath.lastIndexOf('/');
+ int height = Integer.parseInt(splitDocPath.substring(slashIdx + 1));
Revision rev = Revision.fromString(
- splitId.substring(splitId.lastIndexOf('/', slashIdx - 1) + 1, slashIdx));
+ splitDocPath.substring(splitDocPath.lastIndexOf('/', slashIdx - 1) + 1, slashIdx));
doc = doc.findPrevReferencingDoc(rev, height);
if (doc == null) {
- LOG.warn("Split document {} not referenced anymore. Main document is {}",
- splitId, mainId);
+ LOG.warn("Split document {} for path {} not referenced anymore. Main document is {}",
+ splitId, splitDocPath, mainId);
return;
}
// remove reference
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorTest.java?rev=1691307&r1=1691306&r2=1691307&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorTest.java Thu Jul 16 03:36:13 2015
@@ -46,6 +46,7 @@ import static org.junit.Assert.assertNul
import static org.junit.Assert.assertTrue;
import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
@@ -191,13 +192,22 @@ public class VersionGarbageCollectorTest
}
@Test
- public void gcSplitDocs() throws Exception{
+ public void gcSplitDocs() throws Exception {
+ gcSplitDocsInternal("foo");
+ }
+
+ @Test
+ public void gcLongPathSplitDocs() throws Exception {
+ gcSplitDocsInternal(Strings.repeat("sub", 120));
+ }
+
+ private void gcSplitDocsInternal(String subNodeName) throws Exception {
long maxAge = 1; //hrs
long delta = TimeUnit.MINUTES.toMillis(10);
NodeBuilder b1 = store.getRoot().builder();
- b1.child("test").child("foo").child("bar");
- b1.child("test2").child("foo");
+ b1.child("test").child(subNodeName).child("bar");
+ b1.child("test2").child(subNodeName);
store.merge(b1, EmptyHook.INSTANCE, CommitInfo.EMPTY);
//Commit on a node which has a child and where the commit root
@@ -206,18 +216,18 @@ public class VersionGarbageCollectorTest
b1 = store.getRoot().builder();
//This updates a middle node i.e. one which has child bar
//Should result in SplitDoc of type PROP_COMMIT_ONLY
- b1.child("test").child("foo").setProperty("prop",i);
+ b1.child("test").child(subNodeName).setProperty("prop",i);
//This should result in SplitDoc of type DEFAULT_NO_CHILD
- b1.child("test2").child("foo").setProperty("prop", i);
+ b1.child("test2").child(subNodeName).setProperty("prop", i);
store.merge(b1, EmptyHook.INSTANCE, CommitInfo.EMPTY);
}
store.runBackgroundOperations();
List<NodeDocument> previousDocTestFoo =
- ImmutableList.copyOf(getDoc("/test/foo").getAllPreviousDocs());
+ ImmutableList.copyOf(getDoc("/test/" + subNodeName).getAllPreviousDocs());
List<NodeDocument> previousDocTestFoo2 =
- ImmutableList.copyOf(getDoc("/test2/foo").getAllPreviousDocs());
+ ImmutableList.copyOf(getDoc("/test2/" + subNodeName).getAllPreviousDocs());
assertEquals(1, previousDocTestFoo.size());
assertEquals(1, previousDocTestFoo2.size());
@@ -314,9 +324,9 @@ public class VersionGarbageCollectorTest
b1 = store.getRoot().builder();
b1.getChildNode("test-7").remove();
names.remove("test-7");
-
+
store.merge(b1, EmptyHook.INSTANCE, CommitInfo.EMPTY);
-
+
clock.waitUntil(clock.getTime() + HOURS.toMillis(maxAge) + delta);
VersionGCStats stats = gc.gc(maxAge, HOURS);
@@ -505,4 +515,4 @@ public class VersionGarbageCollectorTest
return store.getDocumentStore().find(NODES, Utils.getIdFromPath(path), 0);
}
-}
\ No newline at end of file
+}