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 2013/10/02 20:48:40 UTC

svn commit: r1528590 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment: AbstractStore.java SegmentCache.java file/FileStore.java memory/MemoryStore.java mongo/MongoStore.java

Author: jukka
Date: Wed Oct  2 18:48:40 2013
New Revision: 1528590

URL: http://svn.apache.org/r1528590
Log:
OAK-1031: SegmentMK: Fewer segment lookups

Push the segment cache down to AbstractStore to avoid duplication and to simplify further refactoring

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/AbstractStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCache.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/memory/MemoryStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/mongo/MongoStore.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/AbstractStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/AbstractStore.java?rev=1528590&r1=1528589&r2=1528590&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/AbstractStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/AbstractStore.java Wed Oct  2 18:48:40 2013
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.segment;
 
+import java.util.UUID;
 import java.util.concurrent.Callable;
 
 import org.apache.jackrabbit.oak.cache.CacheLIRS;
@@ -24,17 +25,49 @@ import com.google.common.cache.Cache;
 
 public abstract class AbstractStore implements SegmentStore {
 
+    private final SegmentCache cache;
+
     private final Cache<RecordId, Object> records =
             CacheLIRS.newBuilder().maximumSize(1000).build();
 
     private final SegmentWriter writer = new SegmentWriter(this);
 
+    protected AbstractStore(int cacheSize) {
+        this.cache = SegmentCache.create(cacheSize);
+    }
+
+    protected abstract Segment loadSegment(UUID id) throws Exception;
+
     @Override
     public SegmentWriter getWriter() {
         return writer;
     }
 
     @Override
+    public Segment readSegment(final UUID id) {
+        try {
+            Segment segment = getWriter().getCurrentSegment(id);
+            if (segment == null) {
+                segment = cache.getSegment(id, new Callable<Segment>() {
+                    @Override
+                    public Segment call() throws Exception {
+                        return loadSegment(id);
+                    }
+                });
+            }
+            return segment;
+        } catch (IllegalStateException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void deleteSegment(UUID segmentId) {
+    }
+
+    @Override
     public <T> T getRecord(RecordId id, Callable<T> loader) {
         @SuppressWarnings("unchecked")
         T record = (T) records.getIfPresent(id);
@@ -50,4 +83,9 @@ public abstract class AbstractStore impl
         return record;
     }
 
+    @Override
+    public void close() {
+        records.invalidateAll();
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCache.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCache.java?rev=1528590&r1=1528589&r2=1528590&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCache.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCache.java Wed Oct  2 18:48:40 2013
@@ -34,8 +34,6 @@ import org.apache.jackrabbit.oak.cache.C
  */
 public class SegmentCache {
 
-    private static final int DEFAULT_MEMORY_CACHE_SIZE = 1 << 28; // 256MB
-
     protected final int maximumSize;
     
     protected int currentSize;
@@ -59,10 +57,6 @@ public class SegmentCache {
         this.maximumSize = maximumSize;
     }
 
-    public static SegmentCache create() {
-        return create(DEFAULT_MEMORY_CACHE_SIZE);
-    }
-
     public static SegmentCache create(int maximumSize) {
         if (Boolean.parseBoolean(System.getProperty("oak.segmentCacheLIRS", "false"))) {
             return new SegmentCacheLIRS(maximumSize);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java?rev=1528590&r1=1528589&r2=1528590&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java Wed Oct  2 18:48:40 2013
@@ -30,19 +30,19 @@ import java.nio.ByteBuffer;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.Callable;
 import java.util.UUID;
 
 import org.apache.jackrabbit.oak.plugins.segment.AbstractStore;
 import org.apache.jackrabbit.oak.plugins.segment.Journal;
 import org.apache.jackrabbit.oak.plugins.segment.RecordId;
 import org.apache.jackrabbit.oak.plugins.segment.Segment;
-import org.apache.jackrabbit.oak.plugins.segment.SegmentCache;
 import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 
 public class FileStore extends AbstractStore {
 
+    private static final int DEFAULT_MEMORY_CACHE_SIZE = 1 << 28; // 256MB
+
     private static final long SEGMENT_MAGIC = 0x4f616b0a527845ddL;
 
     private static final long JOURNAL_MAGIC = 0xdf36544212c0cb24L;
@@ -61,10 +61,9 @@ public class FileStore extends AbstractS
 
     private final Map<String, Journal> journals = newHashMap();
 
-    private final SegmentCache cache = SegmentCache.create();
-
     public FileStore(File directory, int maxFileSize, boolean memoryMapping)
             throws IOException {
+        super(DEFAULT_MEMORY_CACHE_SIZE);
         checkNotNull(directory).mkdirs();
         this.directory = directory;
         this.maxFileSize = maxFileSize;
@@ -109,11 +108,11 @@ public class FileStore extends AbstractS
     @Override
     public synchronized void close() {
         try {
+            super.close();
             for (TarFile file : files) {
                 file.close();
             }
             files.clear();
-            cache.clear();
             System.gc(); // for any memory-mappings that are no longer used
         } catch (Exception e) {
             throw new RuntimeException(e);
@@ -131,26 +130,7 @@ public class FileStore extends AbstractS
     }
 
     @Override
-    public Segment readSegment(final UUID id) {
-        try {
-            Segment segment = getWriter().getCurrentSegment(id);
-            if (segment == null) {
-                segment = cache.getSegment(id, new Callable<Segment>() {
-                    @Override
-                    public Segment call() throws Exception {
-                        return loadSegment(id);
-                    }
-                });
-            }
-            return segment;
-        } catch (IllegalStateException e) {
-            throw e;
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private Segment loadSegment(UUID id) throws Exception {
+    protected Segment loadSegment(UUID id) throws Exception {
         for (TarFile file : files) {
             ByteBuffer buffer = file.readEntry(id);
             if (buffer != null) {
@@ -221,11 +201,7 @@ public class FileStore extends AbstractS
     @Override
     public void deleteSegment(UUID segmentId) {
         // TODO: implement
-        try {
-            cache.removeSegment(segmentId);
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        }
+        super.deleteSegment(segmentId);
     }
 
     synchronized void writeJournals() throws IOException {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/memory/MemoryStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/memory/MemoryStore.java?rev=1528590&r1=1528589&r2=1528590&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/memory/MemoryStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/memory/MemoryStore.java Wed Oct  2 18:48:40 2013
@@ -41,6 +41,7 @@ public class MemoryStore extends Abstrac
             Maps.newConcurrentMap();
 
     public MemoryStore(NodeState root) {
+        super(1024 * 1024);
         NodeBuilder builder = EMPTY_NODE.builder();
         builder.setChildNode("root", root);
         journals.put("root", new MemoryJournal(this, builder.getNodeState()));
@@ -65,11 +66,8 @@ public class MemoryStore extends Abstrac
     }
 
     @Override
-    public Segment readSegment(UUID id) {
-        Segment segment = getWriter().getCurrentSegment(id);
-        if (segment == null) {
-            segment = segments.get(id);
-        }
+    protected Segment loadSegment(UUID id) {
+        Segment segment = segments.get(id);
         if (segment != null) {
             return segment;
         } else {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/mongo/MongoStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/mongo/MongoStore.java?rev=1528590&r1=1528589&r2=1528590&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/mongo/MongoStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/mongo/MongoStore.java Wed Oct  2 18:48:40 2013
@@ -27,12 +27,10 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
-import java.util.concurrent.Callable;
 
 import org.apache.jackrabbit.oak.plugins.segment.AbstractStore;
 import org.apache.jackrabbit.oak.plugins.segment.Journal;
 import org.apache.jackrabbit.oak.plugins.segment.Segment;
-import org.apache.jackrabbit.oak.plugins.segment.SegmentCache;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 
 import com.google.common.collect.Lists;
@@ -54,12 +52,10 @@ public class MongoStore extends Abstract
 
     private final Map<String, Journal> journals = Maps.newHashMap();
 
-    private final SegmentCache cache;
-
     public MongoStore(DB db, int cacheSize) {
+        super(cacheSize);
         this.db = checkNotNull(db);
         this.segments = db.getCollection("segments");
-        this.cache = SegmentCache.create(cacheSize);
         NodeBuilder builder = EMPTY_NODE.builder();
         builder.child("root");
         journals.put("root", new MongoJournal(
@@ -87,24 +83,6 @@ public class MongoStore extends Abstract
     }
 
     @Override
-    public Segment readSegment(final UUID segmentId) {
-        try {
-            Segment segment = getWriter().getCurrentSegment(segmentId);
-            if (segment == null) {
-                segment = cache.getSegment(segmentId, new Callable<Segment>() {
-                    @Override
-                    public Segment call() throws Exception {
-                        return findSegment(segmentId);
-                    }
-                });
-            }
-            return segment;
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
     public void writeSegment(
             UUID segmentId, byte[] data, int offset, int length,
             List<UUID> referencedSegmentIds) {
@@ -113,7 +91,8 @@ public class MongoStore extends Abstract
         insertSegment(segmentId, d, referencedSegmentIds);
     }
 
-    private Segment findSegment(UUID segmentId) {
+    @Override
+    protected Segment loadSegment(UUID segmentId) {
         DBObject id = new BasicDBObject("_id", segmentId.toString());
         DBObject fields = new BasicDBObject(of("data", 1, "uuids", 1));
 
@@ -152,11 +131,7 @@ public class MongoStore extends Abstract
     @Override
     public void deleteSegment(UUID segmentId) {
         segments.remove(new BasicDBObject("_id", segmentId.toString()));
-        try {
-            cache.removeSegment(segmentId);
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        }
+        super.deleteSegment(segmentId);;
     }
 
 }