Author: mduerig
Date: Tue Apr 25 10:02:44 2017
New Revision: 1792595

URL: http://svn.apache.org/viewvc?rev=1792595&view=rev
Log:
OAK-6106: Excessive memory usage by the cached segment references
Reverting the previous changes and fixing the test

Modified:
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java

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=1792595&r1=1792594&r2=1792595&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
 Tue Apr 25 10:02:44 2017
@@ -256,30 +256,33 @@ public class Segment {
         final int referencedSegmentIdCount = getReferencedSegmentIdCount();
         final int refOffset = data.position() + HEADER_SIZE;
 
-        // lazily populated cache of msbs and lsbs of the referenced segments 
ids.
-        // DO NOT keep references to the SegmentIds here as this will overflow 
the heap.
-        // See OAK-4949.
-        final long[] ids = new long[2 * referencedSegmentIdCount];
+        // We need to keep SegmentId references (as opposed to e.g. UUIDs)
+        // here as frequently resolving the segment ids via the segment id
+        // tables is prohibitively expensive.
+        // These SegmentId references are not a problem wrt. heap usage as
+        // their individual memoised references to their underlying segment
+        // is managed via the SegmentCache. It is the size of that cache that
+        // keeps overall heap usage by Segment instances bounded.
+        // See OAK-6106.
+        final SegmentId[] refIds = new SegmentId[referencedSegmentIdCount];
         return new SegmentReferences() {
             @Override
             public SegmentId getSegmentId(int reference) {
                 checkArgument(reference <= referencedSegmentIdCount, "Segment 
reference out of bounds");
-                long msb = ids[2*(reference - 1)];
-                long lsb = ids[2*(reference - 1) + 1];
-                if (lsb == 0 && msb == 0) {
-                    synchronized(ids) {
-                        msb = ids[2*(reference - 1)];
-                        lsb = ids[2*(reference - 1) + 1];
-                        if (lsb == 0 && msb == 0) {
+                SegmentId id = refIds[reference - 1];
+                if (id == null) {
+                    synchronized(refIds) {
+                        id = refIds[reference - 1];
+                        if (id == null) {
                             int position = refOffset + (reference - 1) * 
SEGMENT_REFERENCE_SIZE;
-                            msb = data.getLong(position);
-                            lsb = data.getLong(position + 8);
-                            ids[2*(reference - 1)] = msb;
-                            ids[2*(reference - 1) + 1] = lsb;
+                            long msb = data.getLong(position);
+                            long lsb = data.getLong(position + 8);
+                            id = idProvider.newSegmentId(msb, lsb);
+                            refIds[reference - 1] = id;
                         }
                     }
                 }
-                return idProvider.newSegmentId(msb, lsb);
+                return id;
             }
 
             @Nonnull

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java?rev=1792595&r1=1792594&r2=1792595&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java
 Tue Apr 25 10:02:44 2017
@@ -65,7 +65,6 @@ public class ManyChildNodesIT {
     @Nonnull
     private FileStore createFileStore() throws 
InvalidFileStoreVersionException, IOException {
         return fileStoreBuilder(folder.getRoot())
-                .withSegmentCacheSize(0)
                 .withStringCacheSize(0)
                 .withTemplateCacheSize(0)
                 .withStringDeduplicationCacheSize(0)


Reply via email to