You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2011/09/07 16:48:44 UTC

svn commit: r1166205 - in /jackrabbit/sandbox/microkernel: ./ src/main/java/org/apache/jackrabbit/mk/ src/main/java/org/apache/jackrabbit/mk/blobs/ src/main/java/org/apache/jackrabbit/mk/store/

Author: stefan
Date: Wed Sep  7 14:48:43 2011
New Revision: 1166205

URL: http://svn.apache.org/viewvc?rev=1166205&view=rev
Log:
add bdb support (for testing/comparison only)
some minor performance tweaks

Added:
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BDbRevisionStore.java
Modified:
    jackrabbit/sandbox/microkernel/pom.xml
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/Repository.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java
    jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2RevisionStore.java

Modified: jackrabbit/sandbox/microkernel/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/pom.xml?rev=1166205&r1=1166204&r2=1166205&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/pom.xml (original)
+++ jackrabbit/sandbox/microkernel/pom.xml Wed Sep  7 14:48:43 2011
@@ -36,6 +36,12 @@
             <version>1.3.158</version>
         </dependency>
 
+        <dependency>
+          <groupId>com.sleepycat</groupId>
+          <artifactId>je</artifactId>
+          <version>4.1.10</version>
+        </dependency>
+
         <!--Test Dependencies-->
         <dependency>
             <groupId>com.googlecode.json-simple</groupId>

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/Repository.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/Repository.java?rev=1166205&r1=1166204&r2=1166205&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/Repository.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/Repository.java Wed Sep  7 14:48:43 2011
@@ -18,12 +18,14 @@ package org.apache.jackrabbit.mk;
 
 import org.apache.jackrabbit.mk.blobs.BlobStore;
 import org.apache.jackrabbit.mk.blobs.FileBlobStore;
+import org.apache.jackrabbit.mk.store.BDbRevisionStore;
 import org.apache.jackrabbit.mk.store.Commit;
 import org.apache.jackrabbit.mk.store.CommitBuilder;
 import org.apache.jackrabbit.mk.store.H2RevisionStore;
 import org.apache.jackrabbit.mk.store.Node;
 import org.apache.jackrabbit.mk.store.PersistenceManager;
 import org.apache.jackrabbit.mk.store.RevisionStore;
+import org.apache.jackrabbit.mk.store.SimpleRevisionStore;
 import org.apache.jackrabbit.mk.util.PathUtils;
 
 import java.io.File;
@@ -57,6 +59,7 @@ public class Repository {
 
         RevisionStore revStore = new H2RevisionStore();
         //RevisionStore revStore = new SimpleRevisionStore();
+        //RevisionStore revStore = new BDbRevisionStore();
         revStore.initialize(home);
 
         BlobStore blobStore;
@@ -167,7 +170,7 @@ public class Repository {
         // get root node
         ids[0] = commit.getRootNodeId();
         Node parent = pm.getNode(ids[0]);
-        // traverse path and pm id of each element
+        // traverse path and remember id of each element
         for (int i = 0; i < names.length; i++) {
             String id = parent.getChildNodeEntries().get(names[i]);
             if (id == null) {

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java?rev=1166205&r1=1166204&r2=1166205&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/blobs/AbstractBlobStore.java Wed Sep  7 14:48:43 2011
@@ -18,8 +18,8 @@ package org.apache.jackrabbit.mk.blobs;
 
 import org.apache.jackrabbit.mk.util.ExceptionFactory;
 import org.apache.jackrabbit.mk.util.IOUtils;
+import org.apache.jackrabbit.mk.util.SimpleLRUCache;
 import org.apache.jackrabbit.mk.util.StringUtils;
-import org.h2.util.SmallLRUCache;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -73,7 +73,8 @@ public abstract class AbstractBlobStore 
      */
     private int blockSize = 2 * 1024 * 1024;
 
-    private SmallLRUCache<String, byte[]> cache = SmallLRUCache.newInstance(5);
+    private SimpleLRUCache<String, byte[]> cache = SimpleLRUCache
+            .newInstance(5);
 
     public void setBlockSizeMin(int x) {
         this.blockSizeMin = x;

Added: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BDbRevisionStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BDbRevisionStore.java?rev=1166205&view=auto
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BDbRevisionStore.java (added)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/BDbRevisionStore.java Wed Sep  7 14:48:43 2011
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mk.store;
+
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.Durability;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+import com.sleepycat.je.EnvironmentMutableConfig;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+import org.apache.jackrabbit.mk.util.StringUtils;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.security.DigestOutputStream;
+import java.security.MessageDigest;
+
+/**
+ *
+ */
+public class BDbRevisionStore extends AbstractRevisionStore {
+
+    private boolean initialized;
+
+    private Environment dbEnv;
+    private Database db;
+
+    public BDbRevisionStore() throws Exception {
+        initialized = false;
+    }
+
+    public void initialize(File homeDir) throws Exception {
+        if (initialized) {
+            throw new IllegalStateException("already initialized");
+        }
+
+        super.initialize(homeDir);
+
+        File dbDir = new File(homeDir, "db");
+        if (!dbDir.exists()) {
+            dbDir.mkdir();
+        }
+
+        EnvironmentConfig envConfig = new EnvironmentConfig();
+        //envConfig.setTransactional(true);
+        envConfig.setAllowCreate(true);
+        dbEnv = new Environment(dbDir, envConfig);
+
+        EnvironmentMutableConfig envMutableConfig = new EnvironmentMutableConfig();
+        //envMutableConfig.setDurability(Durability.COMMIT_SYNC);
+        //envMutableConfig.setDurability(Durability.COMMIT_NO_SYNC);
+        envMutableConfig.setDurability(Durability.COMMIT_WRITE_NO_SYNC);
+        dbEnv.setMutableConfig(envMutableConfig);
+
+        DatabaseConfig dbConfig = new DatabaseConfig();
+        dbConfig.setAllowCreate(true);
+        //dbConfig.setDeferredWrite(true);
+        db = dbEnv.openDatabase(null, "revs", dbConfig);
+
+        // TODO FIXME workaround in case we're not closed properly
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+            public void run() {
+                close();
+            }
+        });
+
+        initialized = true;
+    }
+
+    public void close() {
+        if (!initialized) {
+            return;
+        }
+        try {
+            if (db.getConfig().getDeferredWrite()) {
+                db.sync();
+            }
+            db.close();
+            dbEnv.close();
+
+            db = null;
+            dbEnv = null;
+        } catch (Throwable t) {
+            t.printStackTrace();
+        }
+
+        initialized = false;
+    }
+
+    public InputStream get(String id) throws Exception {
+        if (!initialized) {
+            throw new IllegalStateException("not initialized");
+        }
+
+        DatabaseEntry key = new DatabaseEntry(StringUtils.convertHexToBytes(id));
+        DatabaseEntry data = new DatabaseEntry();
+
+        if (db.get(null, key, data, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
+            return new ByteArrayInputStream(data.getData());
+        } else {
+            throw new Exception("not found: " + id);
+        }
+    }
+
+    public String put(InputStream in) throws Exception {
+        if (!initialized) {
+            throw new IllegalStateException("not initialized");
+        }
+
+        MessageDigest digest = MessageDigest.getInstance("SHA-1");
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        DigestOutputStream dos = new DigestOutputStream(baos, digest);
+
+        try {
+            int read;
+            byte[] buf = new byte[8192];
+            while ((read = in.read(buf, 0, buf.length)) != -1) {
+                dos.write(buf, 0, read);
+            }
+        } finally {
+            dos.flush();
+            // baos.close();
+            in.close();
+        }
+
+        DatabaseEntry key = new DatabaseEntry(digest.digest());
+        DatabaseEntry data = new DatabaseEntry(baos.toByteArray());
+
+        db.put(null, key, data);
+
+        return StringUtils.convertBytesToHex(key.getData());
+    }
+
+    @Override
+    public void setHeadId(String revId) throws Exception {
+/*
+        if (db.getConfig().getDeferredWrite()) {
+            db.sync();
+        }
+*/
+        super.setHeadId(revId);
+    }
+}

Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2RevisionStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2RevisionStore.java?rev=1166205&r1=1166204&r2=1166205&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2RevisionStore.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/H2RevisionStore.java Wed Sep  7 14:48:43 2011
@@ -92,6 +92,8 @@ public class H2RevisionStore extends Abs
 
         initialized = false;
     }
+/*
+    // don't stpre HEAD revision in db in order to minimize lock contention on persistecne layer
 
     public String getHeadId() throws Exception {
         if (!initialized) {
@@ -126,7 +128,7 @@ public class H2RevisionStore extends Abs
             con.close();
         }
     }
-
+*/
     public InputStream get(String id) throws Exception {
         if (!initialized) {
             throw new IllegalStateException("not initialized");