You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2018/07/09 08:53:19 UTC

svn commit: r1835390 [3/23] - in /jackrabbit/site/live/oak/docs: ./ architecture/ coldstandby/ features/ nodestore/ nodestore/document/ nodestore/segment/ oak-mongo-js/ oak_api/ plugins/ query/ security/ security/accesscontrol/ security/authentication/...

Modified: jackrabbit/site/live/oak/docs/migration.html
URL: http://svn.apache.org/viewvc/jackrabbit/site/live/oak/docs/migration.html?rev=1835390&r1=1835389&r2=1835390&view=diff
==============================================================================
--- jackrabbit/site/live/oak/docs/migration.html (original)
+++ jackrabbit/site/live/oak/docs/migration.html Mon Jul  9 08:53:17 2018
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <!--
- | Generated by Apache Maven Doxia Site Renderer 1.7.4 at 2018-05-24 
+ | Generated by Apache Maven Doxia Site Renderer 1.8.1 at 2018-07-09 
  | Rendered using Apache Maven Fluido Skin 1.6
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Jackrabbit Oak &#x2013; Repository migration</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.6.min.css" />
@@ -136,7 +136,7 @@
 
       <div id="breadcrumbs">
         <ul class="breadcrumb">
-        <li id="publishDate">Last Published: 2018-05-24<span class="divider">|</span>
+        <li id="publishDate">Last Published: 2018-07-09<span class="divider">|</span>
 </li>
           <li id="projectVersion">Version: 1.10-SNAPSHOT</li>
         </ul>
@@ -241,52 +241,47 @@
  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.
- --><h1>Repository migration</h1>
+ -->
+<h1>Repository migration</h1>
 <p>Oak offers a few tools which can be used to migrate the old, Jackrabbit 2 repository and also to copy content between Oak instances. <tt>oak-upgrade</tt> is a Swiss army knife for copying content between virtually any repositories. On the other hand, the <tt>SplitBlobStore</tt> allows to copy the binaries gradually, from one blob store to another, without having a long repository downtime.</p>
 <div class="section">
 <h2><a name="Offline_migration_using_oak-upgrade"></a>Offline migration using oak-upgrade</h2>
 <p><img src="img/migration-general.png" alt="oak-upgrade chart" /></p>
 <p>The <tt>oak-upgrade</tt> module allows to do an upgrade from the classic Jackrabbit 2.0 repository to the Oak node store and also to sidegrade from one nodestore type to another. Besides from that it has a number of features that can be useful in everyday system maintenance:</p>
-
 <ul>
-  
+
 <li>copying only a selcted subtree from one repository to another,</li>
-  
 <li>precise control over version histories migration,</li>
-  
 <li>migrating binaries from one blobstore to another.</li>
 </ul>
 <div class="section">
 <h3><a name="Sidegrade"></a>Sidegrade</h3>
 <p><tt>oak-upgrade</tt> module creates an executable jar file. It can be invoked like this:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint">java -jar oak-upgrade-*.jar [options] source destination
+<div>
+<div>
+<pre class="source">java -jar oak-upgrade-*.jar [options] source destination
 </pre></div></div>
-<p>The <tt>source</tt> and <tt>destination</tt> are the node store paths/URIs. Following node stores are supported:</p>
 
+<p>The <tt>source</tt> and <tt>destination</tt> are the node store paths/URIs. Following node stores are supported:</p>
 <ul>
-  
+
 <li><tt>SegmentNodeStore</tt> - use a path to the <tt>repository</tt> directory,</li>
-  
 <li>old <tt>SegmentNodeStore</tt> (Oak &lt; 1.6) - use the <tt>segment-old:</tt> prefix and the path to the <tt>repository</tt> directory,</li>
-  
 <li><tt>DocumentNodeStore</tt> with MongoDB - <tt>mongodb://host:port/database</tt>,</li>
-  
 <li><tt>DocumentNodeStore</tt> with a RDB - <tt>jdbc:...</tt>. It requires passing user and password with separate parameters.</li>
 </ul>
 <p>Following parameters should be used for the JDBC node store:</p>
-
 <ul>
-  
+
 <li>Source database: <tt>--src-password=... --src-user=...</tt></li>
-  
 <li>Desination database: <tt>--user=... --password=...</tt></li>
 </ul>
 <p>Examples:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint">java -jar oak-upgrade-*.jar \
+<div>
+<div>
+<pre class="source">java -jar oak-upgrade-*.jar \
     path/to/the/repository \
     mongodb://localhost:27017/oak
 
@@ -294,13 +289,15 @@ java -jar oak-upgrade-*.jar \
     --user=sa --password=sa \
     mongodb://localhost:27017/oak \
     jdbc:h2:path/to/repo
-</pre></div></div></div>
+</pre></div></div>
+</div>
 <div class="section">
 <h3><a name="Upgrade"></a>Upgrade</h3>
 <p>In order to upgrade Jackrabbit 2 repository to the new node store, pass the path to the <tt>repository</tt> directory as the <tt>source</tt> parameter. Optionally, you may also pass the path to the <tt>repository.xml</tt> file as a separate parameter. Examples:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint">java -jar oak-upgrade-*.jar \
+<div>
+<div>
+<pre class="source">java -jar oak-upgrade-*.jar \
     path/to/the/jr2/repository \
     path/to/repository.xml \
     path/to/the/new/repository
@@ -308,144 +305,93 @@ java -jar oak-upgrade-*.jar \
 java -jar oak-upgrade-*.jar \
     path/to/the/jr2/repository \
     mongodb://localhost:27017/oak
-</pre></div></div></div>
+</pre></div></div>
+</div>
 <div class="section">
 <h3><a name="Migrating_blob_store"></a>Migrating blob store</h3>
 <p>By default, the <tt>oak-upgrade</tt> only copies the binary references, so you need to reuse the same blob/data store in the new repository. However, it&#x2019;s also possible to migrate binaries as well using the <tt>--copy-binaries</tt> parameter. Following migration paths are possible for the binaries. The <i>internal</i> means that the binaries are stored inside the segment or document node store:</p>
-
 <table border="0" class="table table-striped">
-  <thead>
-    
+<thead>
+
 <tr class="a">
-      
-<th align="center">From &#x2193; To &#x2192; </th>
-      
-<th align="center">Internal </th>
-      
-<th align="center">FileBlobStore </th>
-      
-<th align="center">FileDataStore </th>
-      
-<th align="center">S3 </th>
-    </tr>
-  </thead>
-  <tbody>
-    
+<th align="center"> From &#x2193; To &#x2192;   </th>
+<th align="center"> Internal </th>
+<th align="center"> FileBlobStore </th>
+<th align="center"> FileDataStore </th>
+<th align="center"> S3                     </th></tr>
+</thead><tbody>
+
 <tr class="b">
-      
-<td align="center">Internal </td>
-      
-<td align="center">Yes&#xb2; </td>
-      
-<td align="center">Yes </td>
-      
-<td align="center">Yes </td>
-      
-<td align="center">Yes </td>
-    </tr>
-    
+<td align="center"> Internal      </td>
+<td align="center"> Yes&#xb2;     </td>
+<td align="center"> Yes           </td>
+<td align="center"> Yes           </td>
+<td align="center"> Yes                    </td></tr>
 <tr class="a">
-      
-<td align="center">FileBlobStore </td>
-      
-<td align="center">Yes </td>
-      
-<td align="center">Yes&#xb2; </td>
-      
-<td align="center">Yes </td>
-      
-<td align="center">Yes </td>
-    </tr>
-    
+<td align="center"> FileBlobStore </td>
+<td align="center"> Yes      </td>
+<td align="center"> Yes&#xb2;          </td>
+<td align="center"> Yes           </td>
+<td align="center"> Yes                    </td></tr>
 <tr class="b">
-      
-<td align="center">FileDataStore </td>
-      
-<td align="center">Yes </td>
-      
-<td align="center">Yes </td>
-      
-<td align="center">Yes&#xb2; </td>
-      
-<td align="center">Yes (not recommended)&#xb9; </td>
-    </tr>
-    
+<td align="center"> FileDataStore </td>
+<td align="center"> Yes      </td>
+<td align="center"> Yes           </td>
+<td align="center"> Yes&#xb2;          </td>
+<td align="center"> Yes (not recommended)&#xb9; </td></tr>
 <tr class="a">
-      
-<td align="center">S3 </td>
-      
-<td align="center">Yes </td>
-      
-<td align="center">Yes </td>
-      
-<td align="center">Yes </td>
-      
-<td align="center">Yes&#xb2; </td>
-    </tr>
-  </tbody>
+<td align="center"> S3            </td>
+<td align="center"> Yes      </td>
+<td align="center"> Yes           </td>
+<td align="center"> Yes           </td>
+<td align="center"> Yes&#xb2;                   </td></tr>
+</tbody>
 </table>
 <p>&#xb9; The S3DataStore will take care of this migration automatically, no need to use oak-upgrade <br /> &#xb2; The storage might be simple cloned without using oak2oak</p>
 <p>Following parameters can be used to define the source and the destination blob stores:</p>
-
 <table border="0" class="table table-striped">
-  <thead>
-    
+<thead>
+
 <tr class="a">
-      
-<th align="center">Blob store type </th>
-      
-<th align="center">Source parameter </th>
-      
-<th align="center">Destination </th>
-    </tr>
-  </thead>
-  <tbody>
-    
+<th align="center"> Blob store type </th>
+<th align="center"> Source parameter                           </th>
+<th align="center"> Destination                        </th></tr>
+</thead><tbody>
+
 <tr class="b">
-      
-<td align="center">FileBlobStore </td>
-      
-<td align="center"><tt>--src-fileblobstore=...</tt> </td>
-      
-<td align="center"><tt>--fileblobstore=...</tt> </td>
-    </tr>
-    
+<td align="center"> FileBlobStore   </td>
+<td align="center"> <tt>--src-fileblobstore=...</tt>                  </td>
+<td align="center"> <tt>--fileblobstore=...</tt>              </td></tr>
 <tr class="a">
-      
-<td align="center">FileDataStore </td>
-      
-<td align="center"><tt>--src-datastore=...</tt> </td>
-      
-<td align="center"><tt>--datastore=...</tt> </td>
-    </tr>
-    
+<td align="center"> FileDataStore   </td>
+<td align="center"> <tt>--src-datastore=...</tt>                      </td>
+<td align="center"> <tt>--datastore=...</tt>                  </td></tr>
 <tr class="b">
-      
-<td align="center">S3 </td>
-      
-<td align="center"><tt>--src-s3config=... --src-s3datastore=...</tt> </td>
-      
-<td align="center"><tt>--s3config=... --s3datastore=...</tt> </td>
-    </tr>
-  </tbody>
+<td align="center"> S3              </td>
+<td align="center"> <tt>--src-s3config=... --src-s3datastore=...</tt> </td>
+<td align="center"> <tt>--s3config=... --s3datastore=...</tt> </td></tr>
+</tbody>
 </table>
 <p>Use the <tt>--copy-binaries</tt> parameter to instruct the <tt>oak-upgrade</tt> to copy binaries.</p>
 <p>Example:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint">java -jar oak-upgrade-*.jar \
+<div>
+<div>
+<pre class="source">java -jar oak-upgrade-*.jar \
     --copy-binaries \
     --src-datastore=/old/repository/datastore \
     --fileblobstore=/new/repository/datastore \
     /old/repository \
     /new/repository
 </pre></div></div>
+
 <div class="section">
 <h4><a name="S3_configuration"></a>S3 configuration</h4>
 <p>Using S3DataStore as a source or destination for binaries requires passing two arguments: <tt>s3datastore</tt> and <tt>s3config</tt>. The first one should point to the datastore directory (eg. <tt>crx-quickstart/repository/datastore</tt>). The second should be used to define the <tt>org.apache.jackrabbit.oak.plugins.blob.datastore.S3DataStore.cfg</tt> configuration file path. File should have following format:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint">accessKey=...
+<div>
+<div>
+<pre class="source">accessKey=...
 secretKey=...
 s3Bucket=...
 s3Region=eu-west-1
@@ -457,36 +403,43 @@ maxConnections=40
 writeThreads=30
 maxErrorRetry=10
 </pre></div></div>
+
 <p>For the region and endpoints please visit the <a class="externalLink" href="http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region">Amazon documentation</a>.</p>
-<p>Alternativly the <tt>*.config</tt> file format, described on the <a class="externalLink" href="https://sling.apache.org/documentation/bundles/configuration-installer-factory.html#configuration-files">Apache Sling website</a>, can be used as it may be convenient for re-using existing OSGi configuration files. </p></div></div>
+<p>Alternativly the <tt>*.config</tt> file format, described on the <a class="externalLink" href="https://sling.apache.org/documentation/bundles/configuration-installer-factory.html#configuration-files">Apache Sling website</a>, can be used as it may be convenient for re-using existing OSGi configuration files.</p></div></div>
 <div class="section">
 <h3><a name="Migrating_a_subtree"></a>Migrating a subtree</h3>
-<p><img src="img/migration-paths.png" alt="&ndash;include-paths chart" /></p>
+<p><img src="img/migration-paths.png" alt="include-paths chart" /></p>
 <p>It&#x2019;s possible to define a list of content subtrees to include or exclude during the migration. By default, the whole repository gets copied. In order to copy only a subtree, use the <tt>--include-paths</tt>. For example, the following command will copy only the <tt>/content/site</tt> and <tt>/content/other_site</tt> subtrees:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint">java -jar oak-upgrade-*.jar \
+<div>
+<div>
+<pre class="source">java -jar oak-upgrade-*.jar \
     --include-paths=/content/site,/content/other_site \
     /old/repository \
     /new/repository
 </pre></div></div>
+
 <p>You may also exclude specific paths from being copied. Following command will copy the whole content without the <tt>/content/redundant_site</tt>:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint">java -jar oak-upgrade-*.jar \
+<div>
+<div>
+<pre class="source">java -jar oak-upgrade-*.jar \
     --exclude-paths=/content/redundant_site \
     /old/repository \
     /new/repository
 </pre></div></div>
+
 <p>By default, the source repository replaces the destination repository (if there&#x2019;s one). For instance, in the first example if the <tt>/content/site</tt> node already exists in the destination repository, it&#x2019;ll be removed and replaced by the source node. It&#x2019;s also possible to merge content from the source repository with <tt>--merge-paths</tt>:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint">java -jar oak-upgrade-*.jar \
+<div>
+<div>
+<pre class="source">java -jar oak-upgrade-*.jar \
     --include-paths=/content/site \
     --merge-paths=/content/site \
     /old/repository \
     /new/repository
 </pre></div></div>
+
 <p>Please notice that in the last example it&#x2019;s necessary to narrow the migration scope using <tt>--include-paths</tt> parameter.</p></div>
 <div class="section">
 <h3><a name="Version_history_copying"></a>Version history copying</h3>
@@ -494,8 +447,9 @@ maxErrorRetry=10
 <p>By default, the whole version storage is migrated. This includes referenced version histories (their versionable node still exists in the repository) and orphaned ones (their versionable node no longer exists). <tt>oak-upgrade</tt> allows to skip the orphaned version histories to make the migration faster and the destination repository smaller. It&#x2019;s also possible to define a maximum age for the version histories (both referenced and orphaned) to be copied.</p>
 <p>There are two parameters: <tt>--copy-orphaned-versions</tt> and <tt>--copy-versions</tt>. Both accepts boolean values or a <tt>YYYY-MM-DD</tt> date. Examples:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint"># only copy referenced versions
+<div>
+<div>
+<pre class="source"># only copy referenced versions
 java -jar oak-upgrade-*.jar \
     --copy-orphaned-versions=false \
     /old/repository /new/repository
@@ -511,17 +465,15 @@ java -jar oak-upgrade-*.jar \
     --copy-versions=2010-01-01 \
     --copy-orphaned-versions=2011-01-01 \
     /old/repository /new/repository
-</pre></div></div></div>
+</pre></div></div>
+</div>
 <div class="section">
 <h3><a name="Incremental_migration"></a>Incremental migration</h3>
 <p>If an existing repository is passed as the destination, then only a diff between source and destination will be migrated. It allows to migrate the content in a few iterations. For instance, following case is possible:</p>
-
 <ol style="list-style-type: decimal">
-  
+
 <li>migrate a large repository a week before go-live</li>
-  
 <li>run the migration again every night (only the recent changes are copied)</li>
-  
 <li>run the migration one final time before go-live</li>
 </ol></div>
 <div class="section">
@@ -532,14 +484,18 @@ java -jar oak-upgrade-*.jar \
 <p>It&#x2019;s possible to inject custom logic into the upgrade process, by implementing <a class="externalLink" href="https://jackrabbit.apache.org/oak/docs/apidocs/org/apache/jackrabbit/oak/spi/lifecycle/RepositoryInitializer.html"><tt>RepositoryInitializer</tt></a> or <a class="externalLink" href="https://jackrabbit.apache.org/oak/docs/apidocs/org/apache/jackrabbit/oak/spi/commit/CommitHook.html"><tt>CommitHook</tt></a>.</p>
 <p>In order to do that, create a new Maven project, with appropriate implementation. Then create following file:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint">src/main/resources/META-INF/services/org.apache.jackrabbit.oak.spi.commit.CommitHook
+<div>
+<div>
+<pre class="source">src/main/resources/META-INF/services/org.apache.jackrabbit.oak.spi.commit.CommitHook
 </pre></div></div>
+
 <p>The file should contain just one line - the name of the class with the <tt>CoomitHook</tt> implementation. Build the project and attach the JAR to the oak-upgrade class path:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint">java -cp my-commit-hook.jar:oak-upgrade-*.jar org.apache.jackrabbit.oak.upgrade.cli.OakUpgrade [normal oak-upgrade parameters]
+<div>
+<div>
+<pre class="source">java -cp my-commit-hook.jar:oak-upgrade-*.jar org.apache.jackrabbit.oak.upgrade.cli.OakUpgrade [normal oak-upgrade parameters]
 </pre></div></div>
+
 <p>A custom <tt>RepositoryInitializer</tt> can be injected in a similar way.</p></div>
 <div class="section">
 <h3><a name="Other_parameters"></a>Other parameters</h3>
@@ -547,20 +503,20 @@ java -jar oak-upgrade-*.jar \
 <div class="section">
 <h3><a name="Checkpoints_migration"></a>Checkpoints migration</h3>
 <p>When migrating an old SegmentMK repository (pre-Oak 1.6) to the new SegmentMK (Oak &gt;= 1.6), the checkpoints are migrated as well. This allows to avoid reindexing when the Oak is being run for the first time on the new repository. However, the checkpoints won&#x2019;t be migrated in following cases:</p>
-
 <ul>
-  
+
 <li>custom include-, exclude- or merge- paths are specified or</li>
-  
 <li>the binaries are copied by references, no source datastore is specified and two different checkpoints contains different binary under the same path.</li>
 </ul>
 <p>In the second case oak-upgrade emits following warning and breaks:</p>
 
-<div class="source">
-<div class="source"><pre class="prettyprint">Checkpoints won't be copied, because no external datastore has been specified. This will result in the full repository reindexing on the first start. Use --skip-checkpoints to force the migration or see https://jackrabbit.apache.org/oak/docs/migration.html#Checkpoints_migration for more info.
+<div>
+<div>
+<pre class="source">Checkpoints won't be copied, because no external datastore has been specified. This will result in the full repository reindexing on the first start. Use --skip-checkpoints to force the migration or see https://jackrabbit.apache.org/oak/docs/migration.html#Checkpoints_migration for more info.
 </pre></div></div>
+
 <p>The easiest way to fix this issue is specifying the source datastore in the command line options (eg. <tt>--src-datastore</tt> or <tt>--src-s3datastore</tt>).</p>
-<p>The warning may also be ignored, but in this case the repository will be fully reindexed on the first startup. It may be a long process, especially for the big instance. Repository won&#x2019;t be usable until the reindexing process is done. Use <tt>--skip-checkpoints</tt> option to suppress the warning. </p></div></div>
+<p>The warning may also be ignored, but in this case the repository will be fully reindexed on the first startup. It may be a long process, especially for the big instance. Repository won&#x2019;t be usable until the reindexing process is done. Use <tt>--skip-checkpoints</tt> option to suppress the warning.</p></div></div>
 <div class="section">
 <h2><a name="Online_blob_migration_with_SplitBlobStore"></a>Online blob migration with SplitBlobStore</h2>
 <p>Oak offers one more way to migrate blob store, without turning off the instance (a few restarts might be required, but the migration process is done during normal repository operation).</p>
@@ -569,60 +525,54 @@ java -jar oak-upgrade-*.jar \
 <div class="section">
 <div class="section">
 <h4><a name="Requirements"></a>Requirements</h4>
-
 <ul>
-  
+
 <li>An OSGi-based Oak installation (eg. Sling or AEM).</li>
 </ul></div>
 <div class="section">
 <h4><a name="Enabling_SplitBlobStore_-_external_blob_store_case"></a>Enabling SplitBlobStore - external blob store case</h4>
 <p>These steps should be followed for migration from <tt>FileBlobStore</tt>, <tt>FileDataStore</tt> or <tt>S3DataStore</tt>.</p>
-
 <ol style="list-style-type: decimal">
-  
+
 <li>Add <tt>split.blobstore=old</tt> OSGi property to the source blob store.</li>
-  
 <li>Configure the destination blob store and add <tt>split.blobstore=new</tt> property to its OSGi configuration.</li>
-  
-<li>
-<p>Create a configuration for the <tt>org.apache.jackrabbit.oak.spi.blob.osgi.SplitBlobStoreService</tt>.</p>
-  
-<div class="source">
-<div class="source"><pre class="prettyprint">split.old.blobstore.type=INTERNAL
+<li>Create a configuration for the <tt>org.apache.jackrabbit.oak.spi.blob.osgi.SplitBlobStoreService</tt>.
+
+<div>
+<div>
+<pre class="source">split.old.blobstore.type=INTERNAL
 # optional:
 repository.home=crx-quickstart/repository
 </pre></div></div>
-  
+
 <ul>
-    
+
 <li>The directory is used to save the <tt>migrated_blobs.txt</tt> file.</li>
-  </ul></li>
-  
+</ul>
+</li>
 <li>Restart the instance</li>
 </ol></div>
 <div class="section">
 <h4><a name="Enabling_SplitBlobStore_-_internal_blob_store_case"></a>Enabling SplitBlobStore - internal blob store case</h4>
 <p>These steps should be followed for migration from <tt>MongoBlobStore</tt> or for blobs embedded in the <tt>SegmentNodeStore</tt>.</p>
-
 <ol style="list-style-type: decimal">
-  
+
 <li>Configure the destination blob store and add <tt>split.blobstore=new</tt> property to its OSGi configuration.</li>
-  
-<li>
-<p>Create a configuration for the <tt>org.apache.jackrabbit.oak.spi.blob.osgi.SplitBlobStoreService</tt>.</p>
-  
-<div class="source">
-<div class="source"><pre class="prettyprint"># use DOCUMENT or SEGMENT, depending on the NodeStore type:
+<li>Create a configuration for the <tt>org.apache.jackrabbit.oak.spi.blob.osgi.SplitBlobStoreService</tt>.
+
+<div>
+<div>
+<pre class="source"># use DOCUMENT or SEGMENT, depending on the NodeStore type:
 split.old.blobstore.type=SEGMENT
 # optional:
 repository.home=crx-quickstart/repository
 </pre></div></div>
-  
+
 <ul>
-    
+
 <li>The directory is used to save the migrated_blobs.txt file.</li>
-  </ul></li>
-  
+</ul>
+</li>
 <li>Restart the instance</li>
 </ol>
 <p>After starting the instance, the <tt>SplitBlobStoreService</tt> will wait until blob stores with <tt>split.blobstore</tt> properties (the <tt>old</tt> and the <tt>new</tt>) are available. They will be bound and the <tt>SplitBlobStore</tt> will be registered in the OSGi. On the other hand, the <tt>NodeStoreService</tt> will ignore blob stores configured with the <tt>split.blobstore</tt> property and will wait until the <tt>SplitBlobStore</tt> is available.</p>
@@ -630,33 +580,25 @@ repository.home=crx-quickstart/repositor
 <p>The <tt>split.blobstore</tt> property support was added to <tt>FileBlobStore</tt>, <tt>AbstractDataStoreService</tt> (handling all Jackrabbit data stores), <tt>DocumentNodeStoreService</tt> and <tt>SegmentNodeStoreService</tt>.</p></div>
 <div class="section">
 <h4><a name="Migration"></a>Migration</h4>
-
 <ol style="list-style-type: decimal">
-  
+
 <li>Find <tt>BlobMigration</tt> JMX bean in the Felix console.</li>
-  
 <li>Run <tt>startBlobMigration(false)</tt> operation</li>
 </ol>
 <p>The migration can be stopped using <tt>stopBlobMigration()</tt> and then resumed with <tt>startBlobMigration(true)</tt>. The current stats are available via the JMX as well:</p>
-
 <ul>
-  
+
 <li>last processed path,</li>
-  
 <li>number of migrated nodes.</li>
 </ul></div>
 <div class="section">
 <h4><a name="Switching_to_the_new_blob_store"></a>Switching to the new blob store</h4>
 <p>When the migration is finished, it&#x2019;s possible to completely switch to the new blob store:</p>
-
 <ol style="list-style-type: decimal">
-  
+
 <li>Remove the configuration for the old blob store.</li>
-  
 <li>Remove the configuration for the <tt>SplitBlobStoreService</tt></li>
-  
 <li>Remove the <tt>split.blobstore=new</tt> OSGi property from the new blob store, so it can be find by the <tt>NodeStoreService</tt>.</li>
-  
 <li>Restart the instance, so there are no JCR sessions bound to the old NodeState.</li>
 </ol>
 <p>Migration is now complete!</p></div></div></div>

Modified: jackrabbit/site/live/oak/docs/nodestore/compositens.html
URL: http://svn.apache.org/viewvc/jackrabbit/site/live/oak/docs/nodestore/compositens.html?rev=1835390&r1=1835389&r2=1835390&view=diff
==============================================================================
--- jackrabbit/site/live/oak/docs/nodestore/compositens.html (original)
+++ jackrabbit/site/live/oak/docs/nodestore/compositens.html Mon Jul  9 08:53:17 2018
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <!--
- | Generated by Apache Maven Doxia Site Renderer 1.7.4 at 2018-05-24 
+ | Generated by Apache Maven Doxia Site Renderer 1.8.1 at 2018-07-09 
  | Rendered using Apache Maven Fluido Skin 1.6
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180524" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Jackrabbit Oak &#x2013; Oak Composite NodeStore</title>
     <link rel="stylesheet" href="../css/apache-maven-fluido-1.6.min.css" />
@@ -136,7 +136,7 @@
 
       <div id="breadcrumbs">
         <ul class="breadcrumb">
-        <li id="publishDate">Last Published: 2018-05-24<span class="divider">|</span>
+        <li id="publishDate">Last Published: 2018-07-09<span class="divider">|</span>
 </li>
           <li id="projectVersion">Version: 1.10-SNAPSHOT</li>
         </ul>
@@ -241,7 +241,8 @@
    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.
-  --><h1>Oak Composite NodeStore</h1>
+  -->
+<h1>Oak Composite NodeStore</h1>
 <p><b>The documentation of the Composite NodeStore implementation is work-in-progress. Please ask on oak-dev for things that are missing or unclear.</b></p>
 <div class="section">
 <h2><a name="Overview"></a>Overview</h2>

Added: jackrabbit/site/live/oak/docs/nodestore/document/cluster-node-lease.png
URL: http://svn.apache.org/viewvc/jackrabbit/site/live/oak/docs/nodestore/document/cluster-node-lease.png?rev=1835390&view=auto
==============================================================================
Binary file - no diff available.

Propchange: jackrabbit/site/live/oak/docs/nodestore/document/cluster-node-lease.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: jackrabbit/site/live/oak/docs/nodestore/document/metrics.html
URL: http://svn.apache.org/viewvc/jackrabbit/site/live/oak/docs/nodestore/document/metrics.html?rev=1835390&view=auto
==============================================================================
--- jackrabbit/site/live/oak/docs/nodestore/document/metrics.html (added)
+++ jackrabbit/site/live/oak/docs/nodestore/document/metrics.html Mon Jul  9 08:53:17 2018
@@ -0,0 +1,1034 @@
+<!DOCTYPE html>
+<!--
+ | Generated by Apache Maven Doxia Site Renderer 1.8.1 at 2018-07-09 
+ | Rendered using Apache Maven Fluido Skin 1.6
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <meta name="Date-Revision-yyyymmdd" content="20180709" />
+    <meta http-equiv="Content-Language" content="en" />
+    <title>Jackrabbit Oak &#x2013; Metrics</title>
+    <link rel="stylesheet" href="../../css/apache-maven-fluido-1.6.min.css" />
+    <link rel="stylesheet" href="../../css/site.css" />
+    <link rel="stylesheet" href="../../css/print.css" media="print" />
+      <script type="text/javascript" src="../../js/apache-maven-fluido-1.6.min.js"></script>
+      </head>
+    <body class="topBarEnabled">
+                  <a href="https://github.com/apache/jackrabbit-oak">
+      <img style="position: absolute; top: 0; right: 0; border: 0; z-index: 10000;"
+        src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png"
+        alt="Fork me on GitHub">
+    </a>
+      <div id="topbar" class="navbar navbar-fixed-top ">
+      <div class="navbar-inner">
+        <div class="container-fluid">
+        <a data-target=".nav-collapse" data-toggle="collapse" class="btn btn-navbar">
+          <span class="icon-bar"></span>
+          <span class="icon-bar"></span>
+          <span class="icon-bar"></span>
+        </a>
+<a class="brand" href="../../"  title="Oak logo"><img src="../../oak_logo.png" alt="Oak logo" />
+</a>
+            <ul class="nav">
+        <li class="dropdown">
+        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Overview <b class="caret"></b></a>
+        <ul class="dropdown-menu">
+            <li><a href="../../index.html" title="Jackrabbit Oak">Jackrabbit Oak</a></li>
+            <li><a href="../../license.html" title="License">License</a></li>
+            <li><a href="../../downloads.html" title="Downloads">Downloads</a></li>
+            <li><a href="../../articles.html" title="Articles">Articles</a></li>
+        </ul>
+      </li>
+        <li class="dropdown">
+        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Concepts and Architecture <b class="caret"></b></a>
+        <ul class="dropdown-menu">
+            <li><a href="../../architecture/overview.html" title="Overview">Overview</a></li>
+            <li><a href="../../architecture/nodestate.html" title="The Node State Model">The Node State Model</a></li>
+        </ul>
+      </li>
+        <li class="dropdown">
+        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Main APIs <b class="caret"></b></a>
+        <ul class="dropdown-menu">
+            <li><a href="http://www.day.com/specs/jcr/2.0/index.html" title="JCR API">JCR API</a></li>
+            <li><a href="../../oak_api/overview.html" title="Oak API">Oak API</a></li>
+        </ul>
+      </li>
+        <li class="dropdown">
+        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Features and Plugins <b class="caret"></b></a>
+        <ul class="dropdown-menu">
+            <li class="dropdown-submenu">
+<a href="../../nodestore/overview.html" title="Node Storage">Node Storage</a>
+              <ul class="dropdown-menu">
+                  <li><a href="../../nodestore/documentmk.html" title="Document NodeStore">Document NodeStore</a></li>
+                  <li><a href="../../nodestore/segment/overview.html" title="Segment NodeStore">Segment NodeStore</a></li>
+                  <li><a href="../../nodestore/compositens.html" title="Composite NodeStore">Composite NodeStore</a></li>
+              </ul>
+            </li>
+            <li><a href="../../plugins/blobstore.html" title="Blob Storage">Blob Storage</a></li>
+            <li class="dropdown-submenu">
+<a href="../../query/query.html" title="Query">Query</a>
+              <ul class="dropdown-menu">
+                  <li><a href="../../query/query-engine.html" title="Query Engine">Query Engine</a></li>
+                  <li><a href="../../query/grammar-xpath.html" title="XPath Grammar">XPath Grammar</a></li>
+                  <li><a href="../../query/grammar-sql2.html" title="SQL-2 Grammar">SQL-2 Grammar</a></li>
+                  <li><a href="../../query/query-troubleshooting.html" title="Troubleshooting">Troubleshooting</a></li>
+                  <li><a href="../../query/indexing.html" title="Indexing">Indexing</a></li>
+                  <li><a href="../../query/lucene.html" title="Lucene Index">Lucene Index</a></li>
+                  <li><a href="../../query/property-index.html" title="Property Index">Property Index</a></li>
+                  <li><a href="../../query/solr.html" title="Solr Index">Solr Index</a></li>
+              </ul>
+            </li>
+            <li><a href="../../security/overview.html" title="Security">Security</a></li>
+            <li><a href="../../features/atomic-counter.html" title="Atomic Counter">Atomic Counter</a></li>
+            <li><a href="../../features/observation.html" title="Observation">Observation</a></li>
+        </ul>
+      </li>
+        <li class="dropdown">
+        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Using Oak <b class="caret"></b></a>
+        <ul class="dropdown-menu">
+            <li><a href="../../use_getting_started.html" title="Getting Started">Getting Started</a></li>
+            <li><a href="../../construct.html" title="Repository Construction">Repository Construction</a></li>
+            <li><a href="../../osgi_config.html" title="Configuring Oak">Configuring Oak</a></li>
+            <li><a href="../../command_line.html" title="Command Line Tools">Command Line Tools</a></li>
+            <li><a href="../../migration.html" title="Migration">Migration</a></li>
+            <li><a href="../../differences.html" title="Differences to Jackrabbit 2">Differences to Jackrabbit 2</a></li>
+            <li><a href="../../known_issues.html" title="Known Issues">Known Issues</a></li>
+            <li><a href="../../constraints.html" title="Constraints">Constraints</a></li>
+            <li><a href="../../dos_and_donts.html" title="Dos and Don'ts">Dos and Don'ts</a></li>
+            <li><a href="../../coldstandby/coldstandby.html" title="Cold Standby">Cold Standby</a></li>
+            <li><a href="../../FAQ.html" title="FAQ">FAQ</a></li>
+        </ul>
+      </li>
+        <li class="dropdown">
+        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Developing Oak <b class="caret"></b></a>
+        <ul class="dropdown-menu">
+            <li><a href="../../dev_getting_started.html" title="Getting Started">Getting Started</a></li>
+            <li><a href="../../participating.html" title="Participating">Participating</a></li>
+            <li><a href="../../developing-with-git.html" title="Developing with Git">Developing with Git</a></li>
+            <li><a href="../../diagnostic-builds.html" title="Cutting diagnostic builds">Cutting diagnostic builds</a></li>
+            <li><a href="../../branching.html" title="Branching off a new stable">Branching off a new stable</a></li>
+            <li><a href="../../attribution.html" title="Attribution">Attribution</a></li>
+            <li><a href="../../release-schedule.html" title="Release Schedule">Release Schedule</a></li>
+        </ul>
+      </li>
+        <li class="dropdown">
+        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Links <b class="caret"></b></a>
+        <ul class="dropdown-menu">
+            <li><a href="http://jackrabbit.apache.org/oak" title="Apache Jackrabbit Oak">Apache Jackrabbit Oak</a></li>
+            <li><a href="http://jackrabbit.apache.org/" title="Apache Jackrabbit">Apache Jackrabbit</a></li>
+        </ul>
+      </li>
+              </ul>
+            </div>
+        </div>
+      </div>
+    </div>
+    <div class="container-fluid">
+      <div id="banner">
+        <div class="pull-left"><div id="bannerLeft"><h2>Oak Documentation</h2>
+</div>
+</div>
+        <div class="pull-right"></div>
+        <div class="clear"><hr/></div>
+      </div>
+
+      <div id="breadcrumbs">
+        <ul class="breadcrumb">
+        <li id="publishDate">Last Published: 2018-07-09<span class="divider">|</span>
+</li>
+          <li id="projectVersion">Version: 1.10-SNAPSHOT</li>
+        </ul>
+      </div>
+      <div class="row-fluid">
+        <div id="leftColumn" class="span2">
+          <div class="well sidebar-nav">
+<ul class="nav nav-list">
+          <li class="nav-header">Overview</li>
+    <li><a href="../../index.html" title="Jackrabbit Oak"><span class="none"></span>Jackrabbit Oak</a>  </li>
+    <li><a href="../../license.html" title="License"><span class="none"></span>License</a>  </li>
+    <li><a href="../../downloads.html" title="Downloads"><span class="none"></span>Downloads</a>  </li>
+    <li><a href="../../articles.html" title="Articles"><span class="none"></span>Articles</a>  </li>
+          <li class="nav-header">Concepts and Architecture</li>
+    <li><a href="../../architecture/overview.html" title="Overview"><span class="none"></span>Overview</a>  </li>
+    <li><a href="../../architecture/nodestate.html" title="The Node State Model"><span class="none"></span>The Node State Model</a>  </li>
+          <li class="nav-header">Main APIs</li>
+    <li><a href="http://www.day.com/specs/jcr/2.0/index.html" class="externalLink" title="JCR API"><span class="none"></span>JCR API</a>  </li>
+    <li><a href="../../oak_api/overview.html" title="Oak API"><span class="none"></span>Oak API</a>  </li>
+          <li class="nav-header">Features and Plugins</li>
+    <li><a href="../../nodestore/overview.html" title="Node Storage"><span class="icon-chevron-down"></span>Node Storage</a>
+      <ul class="nav nav-list">
+    <li><a href="../../nodestore/documentmk.html" title="Document NodeStore"><span class="icon-chevron-down"></span>Document NodeStore</a>
+      <ul class="nav nav-list">
+    <li><a href="../../nodestore/document/mongo-document-store.html" title="MongoDB DocumentStore"><span class="none"></span>MongoDB DocumentStore</a>  </li>
+    <li><a href="../../nodestore/document/node-bundling.html" title="Node Bundling"><span class="none"></span>Node Bundling</a>  </li>
+    <li><a href="../../nodestore/document/secondary-store.html" title="Secondary Store"><span class="none"></span>Secondary Store</a>  </li>
+    <li><a href="../../nodestore/persistent-cache.html" title="Persistent Cache"><span class="none"></span>Persistent Cache</a>  </li>
+    <li><a href="../../clustering.html" title="Clustering"><span class="none"></span>Clustering</a>  </li>
+      </ul>
+  </li>
+    <li><a href="../../nodestore/segment/overview.html" title="Segment NodeStore"><span class="none"></span>Segment NodeStore</a>  </li>
+    <li><a href="../../nodestore/compositens.html" title="Composite NodeStore"><span class="none"></span>Composite NodeStore</a>  </li>
+      </ul>
+  </li>
+    <li><a href="../../plugins/blobstore.html" title="Blob Storage"><span class="none"></span>Blob Storage</a>  </li>
+    <li><a href="../../query/query.html" title="Query"><span class="icon-chevron-down"></span>Query</a>
+      <ul class="nav nav-list">
+    <li><a href="../../query/query-engine.html" title="Query Engine"><span class="none"></span>Query Engine</a>  </li>
+    <li><a href="../../query/grammar-xpath.html" title="XPath Grammar"><span class="none"></span>XPath Grammar</a>  </li>
+    <li><a href="../../query/grammar-sql2.html" title="SQL-2 Grammar"><span class="none"></span>SQL-2 Grammar</a>  </li>
+    <li><a href="../../query/query-troubleshooting.html" title="Troubleshooting"><span class="none"></span>Troubleshooting</a>  </li>
+    <li><a href="../../query/indexing.html" title="Indexing"><span class="none"></span>Indexing</a>  </li>
+    <li><a href="../../query/lucene.html" title="Lucene Index"><span class="none"></span>Lucene Index</a>  </li>
+    <li><a href="../../query/property-index.html" title="Property Index"><span class="none"></span>Property Index</a>  </li>
+    <li><a href="../../query/solr.html" title="Solr Index"><span class="none"></span>Solr Index</a>  </li>
+      </ul>
+  </li>
+    <li><a href="../../security/overview.html" title="Security"><span class="none"></span>Security</a>  </li>
+    <li><a href="../../features/atomic-counter.html" title="Atomic Counter"><span class="none"></span>Atomic Counter</a>  </li>
+    <li><a href="../../features/observation.html" title="Observation"><span class="none"></span>Observation</a>  </li>
+          <li class="nav-header">Using Oak</li>
+    <li><a href="../../use_getting_started.html" title="Getting Started"><span class="none"></span>Getting Started</a>  </li>
+    <li><a href="../../construct.html" title="Repository Construction"><span class="none"></span>Repository Construction</a>  </li>
+    <li><a href="../../osgi_config.html" title="Configuring Oak"><span class="none"></span>Configuring Oak</a>  </li>
+    <li><a href="../../command_line.html" title="Command Line Tools"><span class="none"></span>Command Line Tools</a>  </li>
+    <li><a href="../../migration.html" title="Migration"><span class="none"></span>Migration</a>  </li>
+    <li><a href="../../differences.html" title="Differences to Jackrabbit 2"><span class="none"></span>Differences to Jackrabbit 2</a>  </li>
+    <li><a href="../../known_issues.html" title="Known Issues"><span class="none"></span>Known Issues</a>  </li>
+    <li><a href="../../constraints.html" title="Constraints"><span class="none"></span>Constraints</a>  </li>
+    <li><a href="../../dos_and_donts.html" title="Dos and Don'ts"><span class="none"></span>Dos and Don'ts</a>  </li>
+    <li><a href="../../coldstandby/coldstandby.html" title="Cold Standby"><span class="none"></span>Cold Standby</a>  </li>
+    <li><a href="../../FAQ.html" title="FAQ"><span class="none"></span>FAQ</a>  </li>
+          <li class="nav-header">Developing Oak</li>
+    <li><a href="../../dev_getting_started.html" title="Getting Started"><span class="none"></span>Getting Started</a>  </li>
+    <li><a href="../../participating.html" title="Participating"><span class="none"></span>Participating</a>  </li>
+    <li><a href="../../developing-with-git.html" title="Developing with Git"><span class="none"></span>Developing with Git</a>  </li>
+    <li><a href="../../diagnostic-builds.html" title="Cutting diagnostic builds"><span class="none"></span>Cutting diagnostic builds</a>  </li>
+    <li><a href="../../branching.html" title="Branching off a new stable"><span class="none"></span>Branching off a new stable</a>  </li>
+    <li><a href="../../attribution.html" title="Attribution"><span class="none"></span>Attribution</a>  </li>
+    <li><a href="../../release-schedule.html" title="Release Schedule"><span class="none"></span>Release Schedule</a>  </li>
+          <li class="nav-header">Links</li>
+    <li><a href="http://jackrabbit.apache.org/oak" class="externalLink" title="Apache Jackrabbit Oak"><span class="none"></span>Apache Jackrabbit Oak</a>  </li>
+    <li><a href="http://jackrabbit.apache.org/" class="externalLink" title="Apache Jackrabbit"><span class="none"></span>Apache Jackrabbit</a>  </li>
+  </ul>
+          <hr />
+          <div id="poweredBy">
+          <script type="text/javascript">asyncJs( 'https://apis.google.com/js/plusone.js' )</script>
+        <div class="g-plusone" data-href="http://jackrabbit.apache.org/oak/docs/" data-size="tall" ></div>
+                  <div class="clear"></div>
+              <div class="clear"></div>
+              <div class="clear"></div>
+              <div class="clear"></div>
+  <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="../../images/logos/maven-feather.png" /></a>
+              </div>
+          </div>
+        </div>
+        <div id="bodyColumn"  class="span10" >
+<!--
+   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.
+  -->
+<h1>Metrics</h1>
+<p>The <tt>DocumentNodeStore</tt> and the underlying <tt>DocumentStore</tt> expose a number of metrics that can be used to monitor a running system.</p>
+<p>Depending on the <tt>StatisticsProvider</tt> in use by Oak, these metrics can then be accessed via JMX or bridged to <a class="externalLink" href="https://sling.apache.org/documentation/bundles/metrics.html">Apache Sling Metrics</a>.</p>
+<p>There are different types of metrics used by the <tt>DocumentNodeStore</tt> and the <tt>DocumentStore</tt>:</p>
+<ul>
+
+<li>Counter: a monotonically increasing number. Though, the value will be reset to zero when Oak is restarted.</li>
+<li>Gauge: an instantaneous measurement of a value. E.g. the current length of a queue.</li>
+<li>Meter: measures the rate of an event or action per second.</li>
+<li>Timer: measures the rate of an event or action per second and provides information on the distribution of the duration (percentiles).</li>
+</ul>
+<div class="section">
+<h2><a name="DocumentNodeStore"></a>DocumentNodeStore</h2>
+<p>The following <tt>DocumentNodeStore</tt> Counter metrics are available, independent of the underlying <tt>DocumentStore</tt> in use (MongoDB, RDB, etc.):</p>
+<table border="0" class="table table-striped">
+<thead>
+
+<tr class="a">
+<th>Name </th>
+<th> Description </th>
+<th> Unit</th></tr>
+</thead><tbody>
+
+<tr class="b">
+<td>CacheStats.Document-Documents.element </td>
+<td> The number of elements (documents) in the Documents cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-Documents.eviction </td>
+<td> The number of evictions from the Documents cache. </td>
+<td> </td></tr>
+<tr class="b">
+<td>CacheStats.Document-Documents.hit </td>
+<td> The number of cache hits for the Documents cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-Documents.loadTime </td>
+<td> The accumulated load time on a Documents cache miss. </td>
+<td> nanoseconds </td></tr>
+<tr class="b">
+<td>CacheStats.Document-Documents.miss </td>
+<td> The number of cache misses for the Documents cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-Documents.request </td>
+<td> The number of lookup requests made on the Documents cache. This is the sum of cache hits and misses. </td>
+<td> </td></tr>
+<tr class="b">
+<td>CacheStats.Document-LocalDiff.element </td>
+<td> The number of elements in the LocalDiff cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-LocalDiff.eviction </td>
+<td> The number of evictions from the LocalDiff cache. </td>
+<td> </td></tr>
+<tr class="b">
+<td>CacheStats.Document-LocalDiff.hit </td>
+<td> The number of cache hits for the LocalDiff cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-LocalDiff.loadTime </td>
+<td> The accumulated load time on the LocalDiff cache. Please note, the LocalDiff cache is pro-actively populated and never loads on a cache miss. This value will always be zero. </td>
+<td> nanoseconds </td></tr>
+<tr class="b">
+<td>CacheStats.Document-LocalDiff.miss </td>
+<td> The number of cache misses for the LocalDiff cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-LocalDiff.request </td>
+<td> The number of lookup requests made on the LocalDiff cache. This is the sum of cache hits and misses. </td>
+<td> </td></tr>
+<tr class="b">
+<td>CacheStats.Document-MemoryDiff.element </td>
+<td> The number of elements in the MemoryDiff cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-MemoryDiff.eviction </td>
+<td> The number of evictions in the MemoryDiff cache. </td>
+<td> </td></tr>
+<tr class="b">
+<td>CacheStats.Document-MemoryDiff.hit </td>
+<td> The number of hits for the MemoryDiff cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-MemoryDiff.loadTime </td>
+<td> The accumulated load time on the MemoryDiff cache. </td>
+<td> nanoseconds </td></tr>
+<tr class="b">
+<td>CacheStats.Document-MemoryDiff.miss </td>
+<td> The number of cache misses for the MemoryDiff cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-MemoryDiff.request </td>
+<td> The number of lookup requests made on the MemoryDiff cache. This is the sum of cache hits and misses. </td>
+<td> </td></tr>
+<tr class="b">
+<td>CacheStats.Document-NodeChildren.element </td>
+<td> The number of elements in the NodeChildren cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-NodeChildren.eviction </td>
+<td> The number of evictions in the NodeChildren cache. </td>
+<td> </td></tr>
+<tr class="b">
+<td>CacheStats.Document-NodeChildren.hit </td>
+<td> The number of hits for the NodeChildren cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-NodeChildren.loadTime </td>
+<td> The accumulated load time on the NodeChildren cache. </td>
+<td> nanoseconds </td></tr>
+<tr class="b">
+<td>CacheStats.Document-NodeChildren.miss </td>
+<td> The number of cache misses for the NodeChildren cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-NodeChildren.request </td>
+<td> The number of lookup requests made on the NodeChildren cache. This is the sum of cache hits and misses. </td>
+<td> </td></tr>
+<tr class="b">
+<td>CacheStats.Document-NodeState.element </td>
+<td> The number of elements in the NodeState cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-NodeState.eviction </td>
+<td> The number of evictions in the NodeState cache. </td>
+<td> </td></tr>
+<tr class="b">
+<td>CacheStats.Document-NodeState.hit </td>
+<td> The number of hits for the NodeState cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-NodeState.loadTime </td>
+<td> The accumulated load time on the NodeState cache. </td>
+<td> nanoseconds </td></tr>
+<tr class="b">
+<td>CacheStats.Document-NodeState.miss </td>
+<td> The number of cache misses for the NodeState cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-NodeState.request </td>
+<td> The number of lookup requests made on the NodeState cache. This is the sum of cache hits and misses. </td>
+<td> </td></tr>
+<tr class="b">
+<td>CacheStats.Document-PrevDocuments.element </td>
+<td> The number of elements (documents) in the PrevDocuments cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-PrevDocuments.eviction </td>
+<td> The number of evictions in the PrevDocuments cache. </td>
+<td> </td></tr>
+<tr class="b">
+<td>CacheStats.Document-PrevDocuments.hit </td>
+<td> The number of hits for the PrevDocuments cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-PrevDocuments.loadTime </td>
+<td> The accumulated load time on the PrevDocuments cache. </td>
+<td> nanoseconds </td></tr>
+<tr class="b">
+<td>CacheStats.Document-PrevDocuments.miss </td>
+<td> The number of cache misses for the PrevDocuments cache. </td>
+<td> </td></tr>
+<tr class="a">
+<td>CacheStats.Document-PrevDocuments.request </td>
+<td> The number of lookup requests made on the PrevDocuments cache. This is the sum of cache hits and misses. </td>
+<td> </td></tr>
+</tbody>
+</table>
+<p>More information on CacheStats is also available in the <a class="externalLink" href="https://jackrabbit.apache.org/oak/docs/apidocs/org/apache/jackrabbit/oak/api/jmx/CacheStatsMBean.html">CacheStatsMBean</a> of the Oak API.</p>
+<p>The following Meters are available, each exposing a cumulative count and various rates for the event (mean, one minute, five minute, fifteen minute):</p>
+<table border="0" class="table table-striped">
+<thead>
+
+<tr class="a">
+<th>Name </th>
+<th> Description </th>
+<th> Rate unit</th></tr>
+</thead><tbody>
+
+<tr class="b">
+<td>DOCUMENT_NS_BGR_NUM_CHANGES_RATE </td>
+<td> The number of changes the async background reader pulls in from other cluster nodes. This does not necessarily mean a cluster node reads the documents for all those changes, but it must at least invalidate the affected documents in the cache.</td>
+<td> changes per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NS_BGW_NUM_WRITE_RATE </td>
+<td> The number of documents the async background writer updates and pushes to the DocumentStore. </td>
+<td> updates per second</td></tr>
+<tr class="b">
+<td>DOCUMENT_NS_BRANCH_COMMIT_COUNT </td>
+<td> The number of branch commits performed by this DocumentNodeStore. </td>
+<td> branch commits per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NS_MERGE_BRANCH_COMMIT_COUNT </td>
+<td> The number of branch commits merged. This count can be lower than the branch commit count because some branch commits have not yet been merged or never will be merged. </td>
+<td> branch commits merged per second</td></tr>
+<tr class="b">
+<td>DOCUMENT_NS_MERGE_FAILED_EXCLUSIVE </td>
+<td> The number of failed merges while holding the merge lock exclusively. </td>
+<td> failed merges per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NS_MERGE_SUCCESS_COUNT </td>
+<td> The number of successful merges </td>
+<td> merges per second</td></tr>
+<tr class="b">
+<td>DOCUMENT_NS_MERGE_SUCCESS_EXCLUSIVE </td>
+<td> The number of successful merges while holding the merge lock exclusively. </td>
+<td> merges per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NS_MERGE_SUCCESS_SUSPENDED </td>
+<td> The number of successful merges that previously had to be suspended because of a not yet visible conflict from another cluster node. </td>
+<td> merges per second</td></tr>
+</tbody>
+</table>
+<blockquote>
+
+<p>Note: a merge operation on the DocumentNodeStore level is roughly equivalent to a JCR Session save() operation.</p>
+</blockquote>
+<p>A <tt>DocumentNodeStore</tt> also exposes the following Timers with different percentiles for the duration of an operation. The timings include the latency between Oak and a backend store like MongoDB.</p>
+<table border="0" class="table table-striped">
+<thead>
+
+<tr class="a">
+<th>Name </th>
+<th> Description</th></tr>
+</thead><tbody>
+
+<tr class="b">
+<td>DOCUMENT_NS_BGR_CACHE_INVALIDATE </td>
+<td> The time it takes to invalidate affected cache entries on a background read operation.</td></tr>
+<tr class="a">
+<td>DOCUMENT_NS_BGR_DIFF_CACHE </td>
+<td> The time it takes to populate the diff cache for external changes on a background read operation.</td></tr>
+<tr class="b">
+<td>DOCUMENT_NS_BGR_DISPATCH </td>
+<td> The time it takes the <tt>DocumentNodeStore</tt> to dispatch external changes on a background read operation.</td></tr>
+<tr class="a">
+<td>DOCUMENT_NS_BGR_LOCK </td>
+<td> The time it takes to acquire locks on a background read operation.</td></tr>
+<tr class="b">
+<td>DOCUMENT_NS_BGR_READ_HEAD </td>
+<td> The time it takes to read the root document on a background read operation.</td></tr>
+<tr class="a">
+<td>DOCUMENT_NS_BGR_TOTAL_TIME </td>
+<td> The total time of a background read operation.</td></tr>
+<tr class="b">
+<td>DOCUMENT_NS_BGW_CLEAN </td>
+<td> The time it takes to clean up orphaned branches and collisions on a background write operation.</td></tr>
+<tr class="a">
+<td>DOCUMENT_NS_BGW_LOCK </td>
+<td> The time it takes to acquire locks on a background write operation.</td></tr>
+<tr class="b">
+<td>DOCUMENT_NS_BGW_SPLIT </td>
+<td> The time it takes to split documents in a background write operation.</td></tr>
+<tr class="a">
+<td>DOCUMENT_NS_BGW_SWEEP </td>
+<td> The time it takes to sweep documents in a background write operation.</td></tr>
+<tr class="b">
+<td>DOCUMENT_NS_BGW_TOTAL_TIME </td>
+<td> The total time of a background write operation.</td></tr>
+<tr class="a">
+<td>DOCUMENT_NS_MERGE_SUCCESS_TIME </td>
+<td> The time it takes a successful merge to complete. This does not include merge attempts that failed.</td></tr>
+</tbody>
+</table>
+<blockquote>
+
+<p>Note: Oak tracks the duration for above timers at millisecond accuracy, but tools may translate the duration percentiles to different units.</p>
+</blockquote>
+<p>If a <tt>DocumentNodeStore</tt> is configured with persistent caches, then the following Meters are available:</p>
+<table border="0" class="table table-striped">
+<thead>
+
+<tr class="a">
+<th>Name </th>
+<th> Description </th>
+<th> Rate unit</th></tr>
+</thead><tbody>
+
+<tr class="b">
+<td>PersistentCache.NodeCache.children.BROADCAST_RECV </td>
+<td> The number of broadcast messages received by the <tt>children</tt> persistent cache. </td>
+<td> messages per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.children.CACHE_PUT </td>
+<td> The number of entries put into the <tt>children</tt> persistent cache. </td>
+<td> entries per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.children.HITS </td>
+<td> The number of hits for the <tt>children</tt> persistent cache. </td>
+<td> hits per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.children.INVALIDATE_ALL </td>
+<td> The number of invalidate all operations on the <tt>children</tt> persistent cache. </td>
+<td> events per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.children.INVALIDATE_ONE </td>
+<td> The number of times an entry from the <tt>children</tt> persistent cache was explicitly invalidated. </td>
+<td> entries per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.children.LOAD_EXCEPTIONS </td>
+<td> The number of times a loader threw an exception on a cache miss for the <tt>children</tt> persistent cache. </td>
+<td> exceptions per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.children.PUT_REJECTED_SECONDARY_CACHE </td>
+<td> The number of rejected put operations on the <tt>children</tt> persistent cache because the configuration excludes the key. </td>
+<td> rejects per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.children.REQUESTS </td>
+<td> The number of lookup requests made on the <tt>children</tt> persistent cache. This does not include lookup operations for keys that have been excluded by configuration. </td>
+<td> requests per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.diff.BROADCAST_RECV </td>
+<td> The number of broadcast messages received by the <tt>diff</tt> persistent cache. </td>
+<td> messages per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.diff.CACHE_PUT </td>
+<td> The number of entries put into the <tt>diff</tt> persistent cache. </td>
+<td> entries per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.diff.HITS </td>
+<td> The number of hits for the <tt>diff</tt> persistent cache. </td>
+<td> hits per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.diff.INVALIDATE_ALL </td>
+<td> The number of invalidate all operations on the <tt>diff</tt> persistent cache. </td>
+<td> events per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.diff.INVALIDATE_ONE </td>
+<td> The number of times an entry from the <tt>diff</tt> persistent cache was explicitly invalidated. </td>
+<td> entries per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.diff.LOAD_EXCEPTIONS </td>
+<td> The number of times a loader threw an exception on a cache miss for the <tt>diff</tt> persistent cache. </td>
+<td> exceptions per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.diff.PUT_REJECTED_SECONDARY_CACHE </td>
+<td> The number of rejected put operations on the <tt>diff</tt> persistent cache because the configuration excludes the key. </td>
+<td> rejects per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.diff.REQUESTS </td>
+<td> The number of lookup requests made on the <tt>diff</tt> persistent cache. This does not include lookup operations for keys that have been excluded by configuration. </td>
+<td> requests per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.local_diff.BROADCAST_RECV </td>
+<td> The number of broadcast messages received by the <tt>local_diff</tt> persistent cache. </td>
+<td> messages per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.local_diff.CACHE_PUT </td>
+<td> The number of entries put into the <tt>local_diff</tt> persistent cache. </td>
+<td> entries per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.local_diff.HITS </td>
+<td> The number of hits for the <tt>local_diff</tt> persistent cache. </td>
+<td> hits per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.local_diff.INVALIDATE_ALL </td>
+<td> The number of invalidate all operations on the <tt>local_diff</tt> persistent cache. </td>
+<td> events per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.local_diff.INVALIDATE_ONE </td>
+<td> The number of times an entry from the <tt>local_diff</tt> persistent cache was explicitly invalidated. </td>
+<td> entries per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.local_diff.LOAD_EXCEPTIONS </td>
+<td> The number of times a loader threw an exception on a cache miss for the <tt>local_diff</tt> persistent cache. </td>
+<td> exceptions per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.local_diff.PUT_REJECTED_SECONDARY_CACHE </td>
+<td> The number of rejected put operations on the <tt>local_diff</tt> persistent cache because the configuration excludes the key. </td>
+<td> rejects per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.local_diff.REQUESTS </td>
+<td> The number of lookup requests made on the <tt>local_diff</tt> persistent cache. This does not include lookup operations for keys that have been excluded by configuration. </td>
+<td> requests per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.node.BROADCAST_RECV </td>
+<td> The number of broadcast messages received by the <tt>node</tt> persistent cache. </td>
+<td> messages per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.node.CACHE_PUT </td>
+<td> The number of entries put into the <tt>node</tt> persistent cache. </td>
+<td> entries per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.node.HITS </td>
+<td> The number of hits for the <tt>node</tt> persistent cache. </td>
+<td> hits per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.node.INVALIDATE_ALL </td>
+<td> The number of invalidate all operations on the <tt>node</tt> persistent cache. </td>
+<td> events per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.node.INVALIDATE_ONE </td>
+<td> The number of times an entry from the <tt>node</tt> persistent cache was explicitly invalidated. </td>
+<td> entries per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.node.LOAD_EXCEPTIONS </td>
+<td> The number of times a loader threw an exception on a cache miss for the <tt>node</tt> persistent cache. </td>
+<td> exceptions per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.node.PUT_REJECTED_SECONDARY_CACHE </td>
+<td> The number of rejected put operations on the <tt>node</tt> persistent cache because the configuration excludes the key. </td>
+<td> rejects per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.node.REQUESTS </td>
+<td> The number of lookup requests made on the <tt>node</tt> persistent cache. This does not include lookup operations for keys that have been excluded by configuration. </td>
+<td> requests per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.prev_document.BROADCAST_RECV </td>
+<td> The number of broadcast messages received by the <tt>prev_document</tt> persistent cache. </td>
+<td> messages per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.prev_document.CACHE_PUT </td>
+<td> The number of entries put into the <tt>prev_document</tt> persistent cache. </td>
+<td> entries per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.prev_document.HITS </td>
+<td> The number of hits for the <tt>prev_document</tt> persistent cache. </td>
+<td> hits per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.prev_document.INVALIDATE_ALL </td>
+<td> The number of invalidate all operations on the <tt>prev_document</tt> persistent cache. </td>
+<td> events per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.prev_document.INVALIDATE_ONE </td>
+<td> The number of times an entry from the <tt>prev_document</tt> persistent cache was explicitly invalidated. </td>
+<td> entries per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.prev_document.LOAD_EXCEPTIONS </td>
+<td> The number of times a loader threw an exception on a cache miss for the <tt>prev_document</tt> persistent cache. </td>
+<td> exceptions per second</td></tr>
+<tr class="b">
+<td>PersistentCache.NodeCache.prev_document.PUT_REJECTED_SECONDARY_CACHE </td>
+<td> The number of rejected put operations on the <tt>prev_document</tt> persistent cache because the configuration excludes the key. </td>
+<td> rejects per second</td></tr>
+<tr class="a">
+<td>PersistentCache.NodeCache.prev_document.REQUESTS </td>
+<td> The number of lookup requests made on the <tt>prev_document</tt> persistent cache. This does not include lookup operations for keys that have been excluded by configuration. </td>
+<td> requests per second</td></tr>
+</tbody>
+</table>
+<blockquote>
+
+<p>Note: the broadcast feature of the persistent cache is disabled by default, which means the number of received broadcast messages will be zero in that case.</p>
+</blockquote></div>
+<div class="section">
+<h2><a name="Revision_GC"></a>Revision GC</h2>
+<p>Basic Revision GC can be monitored with the following Counters:</p>
+<table border="0" class="table table-striped">
+<thead>
+
+<tr class="a">
+<th>Name </th>
+<th> Description</th></tr>
+</thead><tbody>
+
+<tr class="b">
+<td>RevisionGC.COUNTER </td>
+<td> The number of Revision GC cycles performed by this <tt>DocumentNodeStore</tt>. In a cluster only one of the <tt>DocumentNodeStore</tt> instances will perform Revision GC and show an increasing value for this counter.</td></tr>
+<tr class="a">
+<td>RevisionGC.FAILURE </td>
+<td> The number of times the Revision GC failed.</td></tr>
+</tbody>
+</table>
+<p>More detailed insight is provided by these Meters, each exposing a cumulative count and various rates for the event (mean, one minute, five minute, fifteen minute):</p>
+<table border="0" class="table table-striped">
+<thead>
+
+<tr class="a">
+<th>Name </th>
+<th> Description</th></tr>
+</thead><tbody>
+
+<tr class="b">
+<td>RevisionGC.DELETE_DOC </td>
+<td> The total number of documents deleted by the Revision GC on this <tt>DocumentNodeStore</tt>. This include all other types of documents deleted by the Revision GC.</td></tr>
+<tr class="a">
+<td>RevisionGC.DELETE_INT_SPLIT_DOC </td>
+<td> The number of intermediate split documents deleted by the Revision GC on this <tt>DocumentNodeStore</tt>.</td></tr>
+<tr class="b">
+<td>RevisionGC.DELETE_LEAF_DOC </td>
+<td> The number of leaf documents deleted by the Revision GC on this <tt>DocumentNodeStore</tt>.</td></tr>
+<tr class="a">
+<td>RevisionGC.DELETE_SPLIT_DOC </td>
+<td> The number of split/previous documents deleted by the Revision GC on this <tt>DocumentNodeStore</tt>.</td></tr>
+<tr class="b">
+<td>RevisionGC.READ_DOC </td>
+<td> The number of documents read by the Revision GC on this <tt>DocumentNodeStore</tt>.</td></tr>
+<tr class="a">
+<td>RevisionGC.RESET_DELETED_FLAG </td>
+<td> The number of documents where the Revision GC reset the <tt>_deletedOnce</tt> flag.</td></tr>
+</tbody>
+</table>
+<p>The following Timers are available for the Revision GC, with different percentiles for the duration of an operation. The timings include the latency between Oak and a backend store like MongoDB.</p>
+<table border="0" class="table table-striped">
+<thead>
+
+<tr class="a">
+<th>Name </th>
+<th> Description</th></tr>
+</thead><tbody>
+
+<tr class="b">
+<td>RevisionGC.ACTIVE_TIMER </td>
+<td> The total time the Revision GC was active in one cycle.</td></tr>
+<tr class="a">
+<td>RevisionGC.CHECK_DELETED_TIMER </td>
+<td> The time it takes to check documents whether they can be deleted by the Revision GC in one cycle.</td></tr>
+<tr class="b">
+<td>RevisionGC.DELETE_DOC_TIMER </td>
+<td> The time it takes to delete documents in one Revision GC cycle. This includes all types of documents to delete.</td></tr>
+<tr class="a">
+<td>RevisionGC.DELETE_SPLIT_DOC_TIMER </td>
+<td> The time it takes to collect and delete split/previous documents in one Revision GC cycle.</td></tr>
+<tr class="b">
+<td>RevisionGC.READ_DOC_TIMER </td>
+<td> The time it takes to read candidate documents from the <tt>DocumentStore</tt> in one Revision GC cycle.</td></tr>
+<tr class="a">
+<td>RevisionGC.RESET_DELETED_FLAG_TIMER </td>
+<td> The time it takes to reset the <tt>_deletedOnce</tt> flag on documents in on Revision GC cycle.</td></tr>
+<tr class="b">
+<td>RevisionGC.SORT_IDS_TIMER </td>
+<td> The time it takes to sort <tt>_id</tt> values of documents to delete in one Revision GC cycle.</td></tr>
+</tbody>
+</table>
+<blockquote>
+
+<p>Note: Oak tracks the duration for above timers at microsecond accuracy, but many tools will translate the duration percentiles to milliseconds.</p>
+</blockquote></div>
+<div class="section">
+<h2><a name="DocumentStore"></a>DocumentStore</h2>
+<p>Every <tt>DocumentStore</tt> exposes the following Meters with a cumulative count and various rates for each of the operations (mean, one minute, five minute, fifteen minute):</p>
+<table border="0" class="table table-striped">
+<thead>
+
+<tr class="a">
+<th>Name </th>
+<th> Description </th>
+<th> Rate unit</th></tr>
+</thead><tbody>
+
+<tr class="b">
+<td>DOCUMENT_JOURNAL_CREATE </td>
+<td> The number of documents created in the <tt>journal</tt> collection by this <tt>DocumentStore</tt>. </td>
+<td> documents per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_JOURNAL_QUERY </td>
+<td> The number of documents read from the <tt>journal</tt> collection by this <tt>DocumentStore</tt>. </td>
+<td> documents per second</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_CREATE </td>
+<td> The number of documents created in the <tt>nodes</tt> collection by this <tt>DocumentStore</tt>. </td>
+<td> documents per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_CREATE_SPLIT </td>
+<td> The number of split/previous documents created in the <tt>nodes</tt> collection by this <tt>DocumentStore</tt>. </td>
+<td> documents per second</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_CREATE_UPSERT </td>
+<td> The number of documents upserted in the <tt>nodes</tt> collection by this <tt>DocumentStore</tt>. </td>
+<td> documents per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_FIND_CACHED </td>
+<td> The number of documents from the <tt>nodes</tt> collection served from the cache. </td>
+<td> documents per second</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_FIND_MISSING </td>
+<td> The number of document reads from the <tt>nodes</tt> collection that did not return a document. </td>
+<td> reads per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_FIND_PRIMARY </td>
+<td> The number of document reads from the <tt>nodes</tt> collection served by the primary. </td>
+<td> reads per second</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_FIND_SLAVE </td>
+<td> The number of document reads from the <tt>nodes</tt> collection served by the slave/secondary. </td>
+<td> reads per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_FIND_SPLIT </td>
+<td> The number of split/previous document reads from the <tt>nodes</tt> collection. </td>
+<td> reads per second</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_QUERY_FIND </td>
+<td> The number of documents returned by queries on the <tt>nodes</tt> collection. </td>
+<td> documents per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_QUERY_LOCK </td>
+<td> The number of times queries on the <tt>nodes</tt> collection had to acquire a lock in the <tt>DocumentStore</tt>. </td>
+<td> locks per second</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_QUERY_PRIMARY </td>
+<td> The number of queries on the <tt>nodes</tt> collection targeting the primary. </td>
+<td> queries per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_QUERY_SLAVE </td>
+<td> The number of queries on the <tt>nodes</tt> collection targeting the slave/secondary. </td>
+<td> queries per second</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_REMOVE </td>
+<td> The number of documents removed from the <tt>nodes</tt> collection by this <tt>DocumentStore</tt>. </td>
+<td> documents per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_UPDATE </td>
+<td> The number of documents updated in the <tt>nodes</tt> collection by this <tt>DocumentStore</tt>. </td>
+<td> documents per second</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_UPDATE_FAILURE </td>
+<td> The number of failed updates of a document in the <tt>nodes</tt> collection by this <tt>DocumentStore</tt>. </td>
+<td> failures per second</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_UPDATE_RETRY </td>
+<td> The number of times an update of a document in the <tt>nodes</tt> collection was retried by this <tt>DocumentStore</tt>. </td>
+<td> retries per second</td></tr>
+</tbody>
+</table>
+<blockquote>
+
+<p>Note: the terms <i>primary</i> and <i>slave</i> are only relevant for a <tt>DocumentStore</tt> implementation that works with replicated data, like MongoDB. Implementations that do not make this distinction will report all calls for <i>primary</i>.</p>
+<p>Note: update failures and retries are only relevant for the RDB DocumentStore. On a MongoDB DocumentStore, these values will always be zero.</p>
+</blockquote>
+<p>In addition to above Meters, a <tt>DocumentStore</tt> also exposes the following Timers with different percentiles for the duration of an operation. The timings include the latency between Oak and a backend store like MongoDB.</p>
+<table border="0" class="table table-striped">
+<thead>
+
+<tr class="a">
+<th>Name </th>
+<th> Description</th></tr>
+</thead><tbody>
+
+<tr class="b">
+<td>DOCUMENT_JOURNAL_CREATE_TIMER </td>
+<td> The time it takes to create an entry in the <tt>journal</tt> collection.</td></tr>
+<tr class="a">
+<td>DOCUMENT_JOURNAL_QUERY_TIMER </td>
+<td> The time it takes to perform a query on the <tt>journal</tt> collection.</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_CREATE_TIMER </td>
+<td> The time it takes to create a document in the <tt>nodes</tt> collection.</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_CREATE_UPSERT_TIMER </td>
+<td> The time it takes to upsert a document in the <tt>nodes</tt> collection.</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_FIND </td>
+<td> The time it takes to lookup a document in the <tt>nodes</tt> collection. This does not include lookups for documents that do not exist.</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_FIND_MISSING_TIMER </td>
+<td> The time it takes to lookup a document in the <tt>nodes</tt> collection that does not exist.</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_QUERY </td>
+<td> The time it takes to perform a query on the <tt>nodes</tt> collection without additional filters. These are queries that only put a constraint on the <tt>_id</tt> field.</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_QUERY_FILTER </td>
+<td> The time it takes to perform a query on the <tt>nodes</tt> collection with additional filters. Additional filters could e.g. include a constraint on the <tt>_modified</tt> field.</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_QUERY_LOCK_TIMER </td>
+<td> The time a query spent in the <tt>DocumentStore</tt> waiting on a lock before it is executed.</td></tr>
+<tr class="a">
+<td>DOCUMENT_NODES_REMOVE_TIMER </td>
+<td> The time it takes to remove a document from the <tt>nodes</tt> collection.</td></tr>
+<tr class="b">
+<td>DOCUMENT_NODES_UPDATE_TIMER </td>
+<td> The time it takes to update a document in the <tt>nodes</tt> collection.</td></tr>
+</tbody>
+</table>
+<blockquote>
+
+<p>Note: Oak tracks the duration for above timers at nanosecond accuracy, but many tools will translate the duration percentiles to milliseconds.</p>
+</blockquote></div>
+<div class="section">
+<h2><a name="MongoDocumentStore"></a>MongoDocumentStore</h2>
+<p>In addition to the general metrics of a <tt>DocumentStore</tt>, a <tt>MongoDocumentStore</tt> also exposes the following Counters:</p>
+<table border="0" class="table table-striped">
+<thead>
+
+<tr class="a">
+<th>Name </th>
+<th> Description </th>
+<th> Unit</th></tr>
+</thead><tbody>
+
+<tr class="b">
+<td>MongoDB.blobs.count </td>
+<td> The number of documents in the <tt>blobs</tt> collection. </td>
+<td> </td></tr>
+<tr class="a">
+<td>MongoDB.blobs.size </td>
+<td> The total size of the documents in the <tt>blobs</tt> collection without indexes. </td>
+<td> bytes </td></tr>
+<tr class="b">
+<td>MongoDB.blobs.storageSize </td>
+<td> The total amount of storage allocated to the <tt>blobs</tt> collection. This value may be smaller than <tt>size</tt> because MongoDB uses compression when it stores documents on disk. </td>
+<td> bytes </td></tr>
+<tr class="a">
+<td>MongoDB.blobs.totalIndexSize </td>
+<td> The total size of all indexes in the <tt>blobs</tt> collection. </td>
+<td> bytes </td></tr>
+<tr class="b">
+<td>MongoDB.clusterNodes.count </td>
+<td> The number of documents in the <tt>clusterNodes</tt> collection. </td>
+<td> </td></tr>
+<tr class="a">
+<td>MongoDB.clusterNodes.size </td>
+<td> The total size of the documents in the <tt>clusterNodes</tt> collection without indexes. </td>
+<td> bytes </td></tr>
+<tr class="b">
+<td>MongoDB.clusterNodes.storageSize </td>
+<td> The total amount of storage allocated to the <tt>clusterNodes</tt> collection. This value may be smaller than <tt>size</tt> because MongoDB uses compression when it stores documents on disk. </td>
+<td> bytes </td></tr>
+<tr class="a">
+<td>MongoDB.clusterNodes.totalIndexSize </td>
+<td> The total size of all indexes in the <tt>clusterNodes</tt> collection. </td>
+<td> bytes </td></tr>
+<tr class="b">
+<td>MongoDB.journal.count </td>
+<td> The number of documents in the <tt>journal</tt> collection. </td>
+<td> </td></tr>
+<tr class="a">
+<td>MongoDB.journal.size </td>
+<td> The total size of the documents in the <tt>journal</tt> collection without indexes. </td>
+<td> bytes </td></tr>
+<tr class="b">
+<td>MongoDB.journal.storageSize </td>
+<td> The total amount of storage allocated to the <tt>journal</tt> collection. This value may be smaller than <tt>size</tt> because MongoDB uses compression when it stores documents on disk. </td>
+<td> bytes </td></tr>
+<tr class="a">
+<td>MongoDB.journal.totalIndexSize </td>
+<td> The total size of all indexes in the <tt>journal</tt> collection. </td>
+<td> bytes </td></tr>
+<tr class="b">
+<td>MongoDB.nodes.count </td>
+<td> The number of documents in the <tt>nodes</tt> collection. </td>
+<td> </td></tr>
+<tr class="a">
+<td>MongoDB.nodes.size </td>
+<td> The total size of the documents in the <tt>nodes</tt> collection without indexes. </td>
+<td> bytes </td></tr>
+<tr class="b">
+<td>MongoDB.nodes.storageSize </td>
+<td> The total amount of storage allocated to the <tt>nodes</tt> collection. This value may be smaller than <tt>size</tt> because MongoDB uses compression when it stores documents on disk. </td>
+<td> bytes </td></tr>
+<tr class="a">
+<td>MongoDB.nodes.totalIndexSize </td>
+<td> The total size of all indexes in the <tt>nodes</tt> collection. </td>
+<td> bytes </td></tr>
+<tr class="b">
+<td>MongoDB.settings.count </td>
+<td> The number of documents in the <tt>settings</tt> collection. </td>
+<td> </td></tr>
+<tr class="a">
+<td>MongoDB.settings.size </td>
+<td> The total size of the documents in the <tt>settings</tt> collection without indexes. </td>
+<td> bytes </td></tr>
+<tr class="b">
+<td>MongoDB.settings.storageSize </td>
+<td> The total amount of storage allocated to the <tt>settings</tt> collection. This value may be smaller than <tt>size</tt> because MongoDB uses compression when it stores documents on disk. </td>
+<td> bytes </td></tr>
+<tr class="a">
+<td>MongoDB.settings.totalIndexSize </td>
+<td> The total size of all indexes in the <tt>settings</tt> collection. </td>
+<td> bytes </td></tr>
+</tbody>
+</table></div>
+<div class="section">
+<h2><a name="Monitoring"></a>Monitoring</h2>
+<p>While not all metrics described on this page are necessary to monitor a <tt>DocumentNodeStore</tt>, it is still advised to collect data for all metrics. In case of a problem, metrics can be a valuable source of historical data to analyze the problem and gain insight how the system behaved over time.</p>
+<p>Some essential metrics that should be monitored are:</p>
+<ul>
+
+<li>Background read and write operations. These operations are scheduled to run every second. If this interval gets too long, changes from other cluster nodes will get picked up with a delay, which can result in failed merges because of conflicts. As a general rule of thumb, background operations that take longer than ten seconds should be analyzed. Possible reasons for an unusually long background operation may be increased load on the system with many changes to write to or read from the <tt>DocumentStore</tt>, general slow down of the JVM because of increased Java GC activity or an overloaded backend store.</li>
+<li>Revision GC rate and duration. Starting with Oak 1.8, Revision GC on MongoDB runs every five seconds. This is also known as Continuous Revision GC. This rate and the duration of a Revision GC cycle should be monitored and analyzed if the duration is more than five seconds for a couple of cycles.</li>
+<li>Revision GC failure. These should not occur and require immediate attention. The log files should provide details in this case why the Revision GC failed.</li>
+<li>Number of merges under an exclusive lock or that were suspended. Periods of increased merges with exclusive locks or suspended merges indicate conflicts usually caused by the application when multiple sessions try to write conflicting changes. The application should be analyzed to prevent such write patterns.</li>
+</ul></div>
+        </div>
+      </div>
+    </div>
+    <hr/>
+    <footer>
+      <div class="container-fluid">
+        <div class="row-fluid">
+            <p>Copyright &copy;2012&#x2013;2018
+<a href="https://www.apache.org/">The Apache Software Foundation</a>.
+All rights reserved.</p>
+        </div>
+                          <div id="ohloh" class="pull-right">
+      <script type="text/javascript" src="https://www.ohloh.net/p/jackrabbit-oak/widgets/project_thin_badge.js"></script>
+    </div>
+        </div>
+    </footer>
+    </body>
+</html>
\ No newline at end of file

Propchange: jackrabbit/site/live/oak/docs/nodestore/document/metrics.html
------------------------------------------------------------------------------
    svn:eol-style = native