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 ch...@apache.org on 2015/03/03 05:55:08 UTC

svn commit: r1663526 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/ main/java/org/apache/jackrabbit/oak/plugins/document/memory/ main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ main/java/org/a...

Author: chetanm
Date: Tue Mar  3 04:55:07 2015
New Revision: 1663526

URL: http://svn.apache.org/r1663526
Log:
OAK-2499 - Expose mongo and db versions for reporting purposes

Applying a modified patch from Marius. The description is now a JSON string capturing required metadata attribute

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java?rev=1663526&r1=1663525&r2=1663526&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java Tue Mar  3 04:55:07 2015
@@ -92,6 +92,7 @@ public class DocumentNodeStoreService {
     private static final String DEFAULT_DB = "oak";
     private static final String DEFAULT_PERSISTENT_CACHE = "";
     private static final String PREFIX = "oak.documentstore.";
+    private static final String DESCRIPTION = "oak.nodestore.description";
 
     /**
      * Name of framework property to configure Mongo Connection URI
@@ -340,8 +341,11 @@ public class DocumentNodeStoreService {
 
         observerTracker.start(context.getBundleContext());
 
+        DocumentStore ds = mk.getDocumentStore();
+
         Dictionary<String, String> props = new Hashtable<String, String>();
         props.put(Constants.SERVICE_PID, DocumentNodeStore.class.getName());
+        props.put(DESCRIPTION, ds.getDescription());
         reg = context.getBundleContext().registerService(NodeStore.class.getName(), store, props);
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java?rev=1663526&r1=1663525&r2=1663526&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java Tue Mar  3 04:55:07 2015
@@ -251,4 +251,9 @@ public interface DocumentStore {
      */
     @CheckForNull
     CacheStats getCacheStats();
+
+    /**
+     * @return description of the underlying storage.
+     */
+    String getDescription();
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java?rev=1663526&r1=1663525&r2=1663526&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java Tue Mar  3 04:55:07 2015
@@ -28,7 +28,6 @@ import java.util.concurrent.locks.Reentr
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
-import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.oak.cache.CacheStats;
 import org.apache.jackrabbit.oak.plugins.document.Collection;
@@ -349,4 +348,9 @@ public class MemoryDocumentStore impleme
         return null;
     }
 
+    @Override
+    public String getDescription() {
+        return "{\"type\":\"memory\"}";
+    }
+
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java?rev=1663526&r1=1663525&r2=1663526&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java Tue Mar  3 04:55:07 2015
@@ -44,6 +44,7 @@ import com.mongodb.ReadPreference;
 
 import org.apache.jackrabbit.oak.cache.CacheStats;
 import org.apache.jackrabbit.oak.cache.CacheValue;
+import org.apache.jackrabbit.oak.commons.json.JsopBuilder;
 import org.apache.jackrabbit.oak.plugins.document.CachedNodeDocument;
 import org.apache.jackrabbit.oak.plugins.document.Collection;
 import org.apache.jackrabbit.oak.plugins.document.Document;
@@ -153,8 +154,12 @@ public class MongoDocumentStore implemen
 
     private String lastReadWriteMode;
 
+    private final String dbDescription;
+
     public MongoDocumentStore(DB db, DocumentMK.Builder builder) {
-        checkVersion(db);
+        String version = checkVersion(db);
+        dbDescription = String.format("{\"type\":\"mongo\",\"version\":%s}", JsopBuilder.encode(version));
+
         nodes = db.getCollection(
                 Collection.NODES.toString());
         clusterNodes = db.getCollection(
@@ -209,7 +214,7 @@ public class MongoDocumentStore implemen
                 "maxDeltaForModTimeIdxSecs {}",maxReplicationLagMillis, maxDeltaForModTimeIdxSecs);
     }
 
-    private static void checkVersion(DB db) {
+    private static String checkVersion(DB db) {
         String version = db.command("buildInfo").getString("version");
         Matcher m = Pattern.compile("^(\\d+)\\.(\\d+)\\..*").matcher(version);
         if (!m.matches()) {
@@ -218,13 +223,15 @@ public class MongoDocumentStore implemen
         int major = Integer.parseInt(m.group(1));
         int minor = Integer.parseInt(m.group(2));
         if (major > 2) {
-            return;
+            return version;
         }
         if (minor < 6) {
             String msg = "MongoDB version 2.6.0 or higher required. " +
                     "Currently connected to a MongoDB with version: " + version;
             throw new RuntimeException(msg);
         }
+
+        return version;
     }
 
     private Cache<CacheValue, NodeDocument> createOffHeapCache(
@@ -922,6 +929,11 @@ public class MongoDocumentStore implemen
         return cacheStats;
     }
 
+    @Override
+    public String getDescription() {
+        return dbDescription;
+    }
+
     long getMaxDeltaForModTimeIdxSecs() {
         return maxDeltaForModTimeIdxSecs;
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1663526&r1=1663525&r2=1663526&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java Tue Mar  3 04:55:07 2015
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.oak.plugins.document.rdb;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.jackrabbit.oak.commons.json.JsopBuilder.encode;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -333,6 +334,11 @@ public class RDBDocumentStore implements
         return this.cacheStats;
     }
 
+    @Override
+    public String getDescription() {
+        return dbDescription;
+    }
+
     // implementation
 
     enum FETCHFIRSTSYNTAX { FETCHFIRST, LIMIT, TOP};
@@ -561,6 +567,8 @@ public class RDBDocumentStore implements
     // DB-specific information
     private DB db;
 
+    private String dbDescription;
+
     // set of supported indexed properties
     private static final Set<String> INDEXEDPROPERTIES = new HashSet<String>(Arrays.asList(new String[] { MODIFIED,
             NodeDocument.HAS_BINARY_FLAG, NodeDocument.DELETED_ONCE }));
@@ -590,6 +598,9 @@ public class RDBDocumentStore implements
         String driverDesc = md.getDriverName() + " " + md.getDriverVersion();
 
         this.db = DB.getValue(md.getDatabaseProductName());
+        this.dbDescription = String.format("{\"type\":\"rdb\",\"db\":%s,\"version\":%s}",
+                encode(md.getDatabaseProductName()),
+                encode(md.getDatabaseProductVersion()));
 
         if (! "".equals(db.getInitializationStatement())) {
             Statement stmt = con.createStatement();

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java?rev=1663526&r1=1663525&r2=1663526&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java Tue Mar  3 04:55:07 2015
@@ -296,6 +296,11 @@ public class LoggingDocumentStoreWrapper
         }
     }
 
+    @Override
+    public String getDescription() {
+        return store.getDescription();
+    }
+
     private void logMethod(String methodName, Object... args) {
         StringBuilder buff = new StringBuilder("ds");
         buff.append('.').append(methodName).append('(');

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java?rev=1663526&r1=1663525&r2=1663526&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java Tue Mar  3 04:55:07 2015
@@ -125,4 +125,9 @@ public class SynchronizingDocumentStoreW
     public synchronized CacheStats getCacheStats() {
         return store.getCacheStats();
     }
+
+    @Override
+    public String getDescription() {
+        return store.getDescription();
+    }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java?rev=1663526&r1=1663525&r2=1663526&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java Tue Mar  3 04:55:07 2015
@@ -317,6 +317,11 @@ public class TimingDocumentStoreWrapper
         }
     }
 
+    @Override
+    public String getDescription() {
+        return base.getDescription();
+    }
+
     private void logCommonCall(long start, String key) {
         int time = (int) (System.currentTimeMillis() - start);
         if (time <= 0) {

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java?rev=1663526&r1=1663525&r2=1663526&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java Tue Mar  3 04:55:07 2015
@@ -37,6 +37,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
+import org.apache.jackrabbit.oak.commons.json.JsonObject;
+import org.apache.jackrabbit.oak.commons.json.JsopTokenizer;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
 import org.junit.Assume;
 import org.junit.Test;
@@ -955,4 +957,14 @@ public class BasicDocumentStoreTest exte
             assertTrue(cmc2.longValue() == cmc3.longValue());
         }
     }
+
+    @Test
+    public void description() throws Exception{
+        String desc = ds.getDescription();
+        System.out.println(desc);
+        JsopTokenizer t = new JsopTokenizer(desc);
+        t.read('{');
+        JsonObject json = JsonObject.create(t);
+        assertNotNull(json.getProperties().get("type"));
+    }
 }



Re: svn commit: r1663526 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/ main/java/org/apache/jackrabbit/oak/plugins/document/memory/ main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ main/java/o...

Posted by Chetan Mehrotra <ch...@gmail.com>.
Ack. Done with http://svn.apache.org/r1663854. Further DocumentStore
now returns a map of metadata and it should not be concerned now with
how this metadata gets serialized.
Chetan Mehrotra


On Tue, Mar 3, 2015 at 8:30 PM, Marius Petria <mp...@adobe.com> wrote:
> Hi Chetan,
>
> I commented also on the issue. Probably the best approach would be to
> register a String[] such that it can be read by PropertiesUtil.toMap
> (key=value). I think is the “standard” way to represent maps in OSGI
> properties.
>
> Marius
>
>
>
>
> On 3/3/15, 8:52 AM, "Chetan Mehrotra" <ch...@gmail.com> wrote:
>
>>On Tue, Mar 3, 2015 at 12:19 PM, Julian Reschke <ju...@gmx.de>
>>wrote:
>>> This is ugly; I don't think it's a good idea to introduce JSON-shaped
>>> strings here. If we need more structure, why not a Map?
>>
>>The description has to be finally converted to string to be published
>>as string service property. So probably DocumentStore API returns a
>>Map with method name like getMetadata and then
>>DocumentNodeStoreService serializes it as a JSON string.
>>
>>Would that work?
>>
>>Chetan Mehrotra

Re: svn commit: r1663526 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/ main/java/org/apache/jackrabbit/oak/plugins/document/memory/ main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ main/java/o...

Posted by Marius Petria <mp...@adobe.com>.
Hi Chetan,

I commented also on the issue. Probably the best approach would be to 
register a String[] such that it can be read by PropertiesUtil.toMap 
(key=value). I think is the “standard” way to represent maps in OSGI 
properties.

Marius 




On 3/3/15, 8:52 AM, "Chetan Mehrotra" <ch...@gmail.com> wrote:

>On Tue, Mar 3, 2015 at 12:19 PM, Julian Reschke <ju...@gmx.de> 
>wrote:
>> This is ugly; I don't think it's a good idea to introduce JSON-shaped
>> strings here. If we need more structure, why not a Map?
>
>The description has to be finally converted to string to be published
>as string service property. So probably DocumentStore API returns a
>Map with method name like getMetadata and then
>DocumentNodeStoreService serializes it as a JSON string.
>
>Would that work?
>
>Chetan Mehrotra

Re: svn commit: r1663526 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/ main/java/org/apache/jackrabbit/oak/plugins/document/memory/ main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ main/java/org/a...

Posted by Chetan Mehrotra <ch...@gmail.com>.
On Tue, Mar 3, 2015 at 12:19 PM, Julian Reschke <ju...@gmx.de> wrote:
> This is ugly; I don't think it's a good idea to introduce JSON-shaped
> strings here. If we need more structure, why not a Map?

The description has to be finally converted to string to be published
as string service property. So probably DocumentStore API returns a
Map with method name like getMetadata and then
DocumentNodeStoreService serializes it as a JSON string.

Would that work?

Chetan Mehrotra

Re: svn commit: r1663526 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/ main/java/org/apache/jackrabbit/oak/plugins/document/memory/ main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ main/java/org/a...

Posted by Julian Reschke <ju...@gmx.de>.
On 2015-03-03 05:55, chetanm@apache.org wrote:
> Author: chetanm
> Date: Tue Mar  3 04:55:07 2015
> New Revision: 1663526
>
> URL: http://svn.apache.org/r1663526
> Log:
> OAK-2499 - Expose mongo and db versions for reporting purposes
>
> Applying a modified patch from Marius. The description is now a JSON string capturing required metadata attribute
> ...

This is ugly; I don't think it's a good idea to introduce JSON-shaped 
strings here. If we need more structure, why not a Map?

Best regards, Julian