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 mr...@apache.org on 2017/12/05 10:56:24 UTC

svn commit: r1817174 - in /jackrabbit/oak/trunk/oak-store-document: ./ src/main/java/org/apache/jackrabbit/oak/plugins/document/ src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/ src/main/java/org/apache/jackrabbit/oak/plugins/document/m...

Author: mreutegg
Date: Tue Dec  5 10:56:23 2017
New Revision: 1817174

URL: http://svn.apache.org/viewvc?rev=1817174&view=rev
Log:
OAK-7021: Collect DocumentStore stats as part of status zip

Added:
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinter.java   (with props)
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinterTest.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-store-document/pom.xml
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LeaseCheckDocumentStoreWrapper.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CountingDocumentStore.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreWrapper.java

Modified: jackrabbit/oak/trunk/oak-store-document/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/pom.xml?rev=1817174&r1=1817173&r2=1817174&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-store-document/pom.xml Tue Dec  5 10:56:23 2017
@@ -166,6 +166,14 @@
       <optional>true</optional>
     </dependency>
 
+    <!-- Optional dependency for inventory printer -->
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.inventory</artifactId>
+      <version>1.0.4</version>
+      <optional>true</optional>
+    </dependency>
+
     <!-- Required for the persistent cache -->
     <dependency>
       <groupId>com.h2database</groupId>

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java?rev=1817174&r1=1817173&r2=1817174&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStore.java Tue Dec  5 10:56:23 2017
@@ -423,6 +423,19 @@ public interface DocumentStore {
     Map<String, String> getMetadata();
 
     /**
+     * Returns statistics about the underlying storage. The information and
+     * keys returned by this method are implementation specific, may change
+     * between releases or may even depend on deployment aspects. E.g. depending
+     * on access rights, the method may return more or less information from
+     * the underlying store. This method should only be used for informational
+     * or debug purposes.
+     *
+     * @return statistics about this document store.
+     */
+    @Nonnull
+    Map<String, String> getStats();
+
+    /**
      * @return the estimated time difference in milliseconds between the local
      * instance and the (typically common, shared) document server system. The
      * value can be zero if the times are estimated to be equal, positive when

Added: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinter.java?rev=1817174&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinter.java (added)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinter.java Tue Dec  5 10:56:23 2017
@@ -0,0 +1,69 @@
+/*
+ * 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.oak.plugins.document;
+
+import java.io.PrintWriter;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import com.google.common.base.Strings;
+
+import org.apache.felix.inventory.Format;
+import org.apache.felix.inventory.InventoryPrinter;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+
+/**
+ * Inventory printer for {@link DocumentStore#getStats()}.
+ */
+@Component(property = {
+        "felix.inventory.printer.name=oak-document-store-stats",
+        "felix.inventory.printer.title=Oak DocumentStore Statistics",
+        "felix.inventory.printer.format=TEXT"
+})
+public class DocumentStoreStatsPrinter implements InventoryPrinter {
+
+    @Reference
+    DocumentNodeStore nodeStore;
+
+    @Override
+    public void print(PrintWriter pw, Format format, boolean isZip) {
+        if (format != Format.TEXT) {
+            return;
+        }
+        DocumentStore store = nodeStore.getDocumentStore();
+        printTitle(pw, "DocumentStore metadata");
+        print(pw, store.getMetadata());
+        pw.println();
+        printTitle(pw, "DocumentStore statistics");
+        print(pw, store.getStats());
+        pw.flush();
+    }
+
+    private void printTitle(PrintWriter pw, String title) {
+        pw.println(title);
+        pw.println(Strings.repeat("=", title.length()));
+    }
+
+    private void print(PrintWriter pw, Map<String, String> data) {
+        SortedMap<String, String> sortedData = new TreeMap<>(data);
+        sortedData.forEach((k, v) -> pw.println(k + "=" + v));
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java?rev=1817174&r1=1817173&r2=1817174&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java Tue Dec  5 10:56:23 2017
@@ -455,6 +455,17 @@ public class MemoryDocumentStore impleme
         return metadata;
     }
 
+    @Nonnull
+    @Override
+    public Map<String, String> getStats() {
+        return ImmutableMap.<String, String>builder()
+                .put(Collection.NODES.toString(), String.valueOf(nodes.size()))
+                .put(Collection.CLUSTER_NODES.toString(), String.valueOf(clusterNodes.size()))
+                .put(Collection.SETTINGS.toString(), String.valueOf(settings.size()))
+                .put(Collection.JOURNAL.toString(), String.valueOf(externalChanges.size()))
+                .build();
+    }
+
     @Override
     public long determineServerTimeDifferenceMillis() {
         // the MemoryDocumentStore has no delays, thus return 0

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java?rev=1817174&r1=1817173&r2=1817174&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java Tue Dec  5 10:56:23 2017
@@ -1429,6 +1429,13 @@ public class MongoDocumentStore implemen
         return metadata;
     }
 
+    @Nonnull
+    @Override
+    public Map<String, String> getStats() {
+        // TODO: OAK-7028
+        return Collections.emptyMap();
+    }
+
     long getMaxDeltaForModTimeIdxSecs() {
         return maxDeltaForModTimeIdxSecs;
     }

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1817174&r1=1817173&r2=1817174&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java Tue Dec  5 10:56:23 2017
@@ -754,6 +754,13 @@ public class RDBDocumentStore implements
         return metadata;
     }
 
+    @Nonnull
+    @Override
+    public Map<String, String> getStats() {
+        // TODO: OAK-7029
+        return Collections.emptyMap();
+    }
+
     // implementation
 
     private static final String MODIFIED = "_modified";

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LeaseCheckDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LeaseCheckDocumentStoreWrapper.java?rev=1817174&r1=1817173&r2=1817174&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LeaseCheckDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LeaseCheckDocumentStoreWrapper.java Tue Dec  5 10:56:23 2017
@@ -21,6 +21,8 @@ package org.apache.jackrabbit.oak.plugin
 import java.util.List;
 import java.util.Map;
 
+import javax.annotation.Nonnull;
+
 import org.apache.jackrabbit.oak.cache.CacheStats;
 import org.apache.jackrabbit.oak.plugins.document.ClusterNodeInfo;
 import org.apache.jackrabbit.oak.plugins.document.Collection;
@@ -199,6 +201,13 @@ public final class LeaseCheckDocumentSto
         return delegate.getMetadata();
     }
 
+    @Nonnull
+    @Override
+    public Map<String, String> getStats() {
+        performLeaseCheck();
+        return delegate.getStats();
+    }
+
     @Override
     public long determineServerTimeDifferenceMillis() {
         performLeaseCheck();

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java?rev=1817174&r1=1817173&r2=1817174&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LoggingDocumentStoreWrapper.java Tue Dec  5 10:56:23 2017
@@ -352,6 +352,14 @@ public class LoggingDocumentStoreWrapper
         return store.getMetadata();
     }
 
+    @Nonnull
+    @Override
+    public Map<String, String> getStats() {
+        Map<String, String> result = store.getStats();
+        logMethod("getStats", result);
+        return result;
+    }
+
     @Override
     public long determineServerTimeDifferenceMillis() {
         logMethod("determineServerTimeDifferenceMillis", "start");

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java?rev=1817174&r1=1817173&r2=1817174&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/SynchronizingDocumentStoreWrapper.java Tue Dec  5 10:56:23 2017
@@ -155,6 +155,12 @@ public class SynchronizingDocumentStoreW
         return store.getMetadata();
     }
 
+    @Nonnull
+    @Override
+    public synchronized Map<String, String> getStats() {
+        return store.getStats();
+    }
+
     @Override
     public synchronized void updateAccessedRevision(RevisionVector revision, int currentClusterId) {
         if (store instanceof RevisionListener) {

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java?rev=1817174&r1=1817173&r2=1817174&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/TimingDocumentStoreWrapper.java Tue Dec  5 10:56:23 2017
@@ -383,6 +383,19 @@ public class TimingDocumentStoreWrapper
         return base.getMetadata();
     }
 
+    @Nonnull
+    @Override
+    public Map<String, String> getStats() {
+        try {
+            long start = now();
+            Map<String, String> result = base.getStats();
+            updateAndLogTimes("getStats", start, 0, 0);
+            return result;
+        } catch (Exception e) {
+            throw convert(e);
+        }
+    }
+
     @Override
     public long determineServerTimeDifferenceMillis() {
         try {

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CountingDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CountingDocumentStore.java?rev=1817174&r1=1817173&r2=1817174&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CountingDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CountingDocumentStore.java Tue Dec  5 10:56:23 2017
@@ -224,6 +224,12 @@ public class CountingDocumentStore imple
         return delegate.getMetadata();
     }
 
+    @Nonnull
+    @Override
+    public Map<String, String> getStats() {
+        return delegate.getStats();
+    }
+
     @Override
     public long determineServerTimeDifferenceMillis() {
         return delegate.determineServerTimeDifferenceMillis();

Added: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinterTest.java?rev=1817174&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinterTest.java (added)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinterTest.java Tue Dec  5 10:56:23 2017
@@ -0,0 +1,54 @@
+/*
+ * 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.oak.plugins.document;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.List;
+
+import org.apache.felix.inventory.Format;
+import org.junit.Rule;
+import org.junit.Test;
+
+import static java.util.Arrays.asList;
+import static org.apache.commons.lang.StringUtils.split;
+import static org.hamcrest.Matchers.hasItem;
+import static org.junit.Assert.assertThat;
+
+public class DocumentStoreStatsPrinterTest {
+
+    @Rule
+    public DocumentMKBuilderProvider builderProvider = new DocumentMKBuilderProvider();
+
+    @Test
+    public void printStats() {
+        DocumentNodeStore ns = builderProvider.newBuilder().getNodeStore();
+        DocumentStoreStatsPrinter printer = new DocumentStoreStatsPrinter();
+        printer.nodeStore = ns;
+
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        printer.print(pw, Format.TEXT, false);
+
+        List<String> lines = asList(split(sw.toString(),"\r\n"));
+        assertThat(lines, hasItem("type=memory"));
+        assertThat(lines, hasItem("nodes=1"));
+        assertThat(lines, hasItem("clusterNodes=1"));
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreStatsPrinterTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreWrapper.java?rev=1817174&r1=1817173&r2=1817174&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreWrapper.java Tue Dec  5 10:56:23 2017
@@ -160,6 +160,12 @@ public class DocumentStoreWrapper implem
         return store.getMetadata();
     }
 
+    @Nonnull
+    @Override
+    public Map<String, String> getStats() {
+        return store.getStats();
+    }
+
     @Override
     public long determineServerTimeDifferenceMillis() {
         return store.determineServerTimeDifferenceMillis();