Author: reschke
Date: Thu Oct  5 14:39:37 2017
New Revision: 1811212

URL: http://svn.apache.org/viewvc?rev=1811212&view=rev
Log:
OAK-6719: add ability to run benchmarks with continuous version GC enabled (RDB 
fixtures)

Modified:
    jackrabbit/oak/trunk/oak-benchmarks/README.md
    
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
    
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/scalability/ScalabilityRunner.java
    
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/OakFixture.java
    
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/OakRepositoryFixture.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/ServerCommand.java

Modified: jackrabbit/oak/trunk/oak-benchmarks/README.md
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/README.md?rev=1811212&r1=1811211&r2=1811212&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/README.md (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/README.md Thu Oct  5 14:39:37 2017
@@ -39,6 +39,7 @@ The following benchmark options (with de
     --rdbjdbcuser          - JDBC username (defaults to "")
     --rdbjdbcpasswd        - JDBC password (defaults to "")
     --rdbjdbctableprefix   - for RDB persistence: prefix for table names 
(defaults to "")
+    --vgcMaxAge            - Continuous DocumentNodeStore VersionGC max age in 
sec (RDB only)
 
 These options are passed to the test cases and repository fixtures
 that need them. For example the Wikipedia dump option is needed by the

Modified: 
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java?rev=1811212&r1=1811211&r2=1811212&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 Thu Oct  5 14:39:37 2017
@@ -164,6 +164,8 @@ public class BenchmarkRunner {
                 .withOptionalArg().ofType(Integer.class).defaultsTo(2);
         OptionSpec<Integer> pathsPerMount = parser.accepts("pathsPerMount", 
"Number of paths per one mount.")
                 .withOptionalArg().ofType(Integer.class).defaultsTo(1000);
+        OptionSpec<Integer> vgcMaxAge = parser.accepts("vgcMaxAge", 
"Continuous DocumentNodeStore VersionGC max age in sec (RDB only)")
+                .withRequiredArg().ofType(Integer.class).defaultsTo(-1);
         OptionSpec<?> verbose = parser.accepts("verbose", "Enable verbose 
output");
         OptionSpec<String> nonOption = parser.nonOptions();
         OptionSpec help = parser.acceptsAll(asList("h", "?", "help"), "show 
help").forHelp();
@@ -203,11 +205,11 @@ public class BenchmarkRunner {
                         mmap.value(options), fdsCache.value(options)),
                 OakRepositoryFixture.getRDB(rdbjdbcuri.value(options), 
rdbjdbcuser.value(options),
                         rdbjdbcpasswd.value(options), 
rdbjdbctableprefix.value(options), 
-                        dropDBAfterTest.value(options), cacheSize * MB),
+                        dropDBAfterTest.value(options), cacheSize * MB, 
vgcMaxAge.value(options)),
                 OakRepositoryFixture.getRDBWithDS(rdbjdbcuri.value(options), 
rdbjdbcuser.value(options),
                         rdbjdbcpasswd.value(options), 
rdbjdbctableprefix.value(options),
                         dropDBAfterTest.value(options), cacheSize * MB, 
base.value(options),
-                        fdsCache.value(options)),
+                        fdsCache.value(options), vgcMaxAge.value(options)),
                 OakRepositoryFixture.getCompositeStore(base.value(options), 
256, cacheSize,
                         mmap.value(options), mounts.value(options), 
pathsPerMount.value(options)),
                 
OakRepositoryFixture.getCompositeMemoryStore(mounts.value(options), 
pathsPerMount.value(options))

Modified: 
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/scalability/ScalabilityRunner.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/scalability/ScalabilityRunner.java?rev=1811212&r1=1811211&r2=1811212&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/scalability/ScalabilityRunner.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/scalability/ScalabilityRunner.java
 Thu Oct  5 14:39:37 2017
@@ -147,11 +147,11 @@ public class ScalabilityRunner {
                     mmap.value(options), fdsCache.value(options)),
                 OakRepositoryFixture.getRDB(rdbjdbcuri.value(options), 
rdbjdbcuser.value(options),
                     rdbjdbcpasswd.value(options), 
rdbjdbctableprefix.value(options),
-                    dropDBAfterTest.value(options), cacheSize * MB),
+                    dropDBAfterTest.value(options), cacheSize * MB, -1),
                 OakRepositoryFixture.getRDBWithDS(rdbjdbcuri.value(options), 
rdbjdbcuser.value(options),
                     rdbjdbcpasswd.value(options), 
rdbjdbctableprefix.value(options),
                     dropDBAfterTest.value(options), cacheSize * MB, 
base.value(options),
-                    fdsCache.value(options))
+                    fdsCache.value(options), -1)
         };
         ScalabilitySuite[] allSuites =
                 new ScalabilitySuite[] {

Modified: 
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/OakFixture.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/OakFixture.java?rev=1811212&r1=1811211&r2=1811212&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/OakFixture.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/OakFixture.java
 Thu Oct  5 14:39:37 2017
@@ -19,11 +19,15 @@ package org.apache.jackrabbit.oak.fixtur
 import java.io.File;
 import java.lang.management.ManagementFactory;
 import java.net.UnknownHostException;
+import java.util.concurrent.TimeUnit;
 
 import javax.sql.DataSource;
 
 import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.plugins.document.DocumentMK;
+import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
+import org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector;
+import 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.VersionGCStats;
 import org.apache.jackrabbit.oak.plugins.document.rdb.RDBBlobStore;
 import org.apache.jackrabbit.oak.plugins.document.rdb.RDBDataSourceFactory;
 import org.apache.jackrabbit.oak.plugins.document.rdb.RDBDocumentStore;
@@ -33,6 +37,8 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public abstract class OakFixture {
 
@@ -157,15 +163,16 @@ public abstract class OakFixture {
     }
 
     public static OakFixture getRDB(final String name, final String jdbcuri, 
final String jdbcuser, final String jdbcpasswd,
-        final String tablePrefix, final boolean dropDBAfterTest, final long 
cacheSize) {
-        return getRDB(name, jdbcuri, jdbcuser, jdbcpasswd, tablePrefix, 
dropDBAfterTest, cacheSize, false, null, 0);
+        final String tablePrefix, final boolean dropDBAfterTest, final long 
cacheSize, final int vgcMaxAge) {
+        return getRDB(name, jdbcuri, jdbcuser, jdbcpasswd, tablePrefix, 
dropDBAfterTest, cacheSize, false, null, 0, vgcMaxAge);
     }
 
     public static OakFixture getRDB(final String name, final String jdbcuri, 
final String jdbcuser, final String jdbcpasswd,
                                     final String tablePrefix, final boolean 
dropDBAfterTest, final long cacheSize,
-                                    final boolean useDataStore, final File 
base, final int dsCacheInMB) {
+                                    final boolean useDataStore, final File 
base, final int dsCacheInMB, final int vgcMaxAge) {
         return new OakFixture(name) {
             private DocumentMK[] kernels;
+            private VersionGarbageCollectionJob versionGarbageCollectionJob = 
null;
             private BlobStoreFixture blobStoreFixture;
 
             private RDBOptions getOptions(boolean dropDBAFterTest, String 
tablePrefix) {
@@ -219,12 +226,21 @@ public abstract class OakFixture {
                     kernels[i] = mkBuilder.open();
                     cluster[i] = newOak(kernels[i].getNodeStore());
                 }
+                if (vgcMaxAge > 0 && kernels.length >= 1) {
+                    versionGarbageCollectionJob = new 
VersionGarbageCollectionJob(kernels[0].getNodeStore(), vgcMaxAge);
+                    Thread t = new Thread(versionGarbageCollectionJob);
+                    t.setDaemon(true);
+                    t.start();
+                }
                 return cluster;
             }
 
             @Override
             public void tearDownCluster() {
                 String dropped = "";
+                if (versionGarbageCollectionJob != null) {
+                    versionGarbageCollectionJob.stop();
+                }
                 for (DocumentMK kernel : kernels) {
                     kernel.dispose();
                     if (kernel.getDocumentStore() instanceof RDBDocumentStore) 
{
@@ -232,7 +248,7 @@ public abstract class OakFixture {
                     }
                 }
                 if (dropDBAfterTest) {
-                    if(blobStoreFixture != null){
+                    if (blobStoreFixture != null) {
                         blobStoreFixture.tearDown();
                     }
 
@@ -250,6 +266,39 @@ public abstract class OakFixture {
         };
     }
 
+    private static class VersionGarbageCollectionJob implements Runnable {
+
+        private static final Logger LOG = 
LoggerFactory.getLogger(OakFixture.class);
+        private boolean stopped = false;
+        final VersionGarbageCollector vgc;
+        final long maxAge;
+
+        public VersionGarbageCollectionJob(DocumentNodeStore dns, long maxAge) 
{
+            this.vgc = dns.getVersionGarbageCollector();
+            this.maxAge = maxAge;
+        }
+
+        @Override
+        public void run() {
+            while(!stopped) {
+                try {
+                    VersionGCStats stats = this.vgc.gc(maxAge, 
TimeUnit.SECONDS);
+                    LOG.debug("vgc: " + stats);
+                    // 
org.apache.jackrabbit.oak.plugins.document.NodeDocument.MODIFIED_IN_SECS_RESOLUTION
+                    Thread.sleep(5 * 1000);
+                }
+                catch (Throwable ex) {
+                    LOG.warn("While running GC", ex);
+                }
+            }
+        }
+
+        public void stop() {
+            this.vgc.cancel();
+            this.stopped = true;
+        }
+    }
+
     public static OakFixture getSegmentTar(final String name, final File base,
         final int maxFileSizeMB, final int cacheSizeMB, final boolean 
memoryMapping,
         final boolean useBlobStore) {
@@ -382,6 +431,6 @@ public abstract class OakFixture {
 
     static Oak newOak(NodeStore nodeStore) {
         return new 
Oak(nodeStore).with(ManagementFactory.getPlatformMBeanServer());
-    }    
+    }
 
 }
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/OakRepositoryFixture.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/OakRepositoryFixture.java?rev=1811212&r1=1811211&r2=1811212&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/OakRepositoryFixture.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/OakRepositoryFixture.java
 Thu Oct  5 14:39:37 2017
@@ -80,18 +80,18 @@ public class OakRepositoryFixture implem
     }
 
     public static RepositoryFixture getRDB(String jdbcuri, String jdbcuser, 
String jdbcpasswd,
-        String jdbctableprefix, boolean dropDBAfterTest, long cacheSize) {
+        String jdbctableprefix, boolean dropDBAfterTest, long cacheSize, int 
vgcMaxAge) {
         return new OakRepositoryFixture(OakFixture
             .getRDB(OakFixture.OAK_RDB, jdbcuri, jdbcuser, jdbcpasswd, 
jdbctableprefix,
-                dropDBAfterTest, cacheSize));
+                dropDBAfterTest, cacheSize, vgcMaxAge));
     }
 
     public static RepositoryFixture getRDBWithDS(String jdbcuri, String 
jdbcuser, String jdbcpasswd,
-        String jdbctableprefix, boolean dropDBAfterTest, long cacheSize, final 
File base,
-        final int fdsCacheInMB) {
+        String jdbctableprefix, boolean dropDBAfterTest, long cacheSize, File 
base,
+        int fdsCacheInMB, int vgcMaxAge) {
         return new OakRepositoryFixture(OakFixture
             .getRDB(OakFixture.OAK_RDB_DS, jdbcuri, jdbcuser, jdbcpasswd, 
jdbctableprefix,
-                dropDBAfterTest, cacheSize, true, base, fdsCacheInMB));
+                dropDBAfterTest, cacheSize, true, base, fdsCacheInMB, 
vgcMaxAge));
     }
 
     public static RepositoryFixture getSegmentTar(File base, int 
maxFileSizeMB, int cacheSizeMB,

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/ServerCommand.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/ServerCommand.java?rev=1811212&r1=1811211&r2=1811212&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/ServerCommand.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/ServerCommand.java
 Thu Oct  5 14:39:37 2017
@@ -125,7 +125,7 @@ class ServerCommand implements Command {
             oakFixture = OakFixture.getSegmentTar(OakFixture.OAK_SEGMENT_TAR, 
baseFile, 256, cacheSize, mmap.value(options), false);
         } else if (fix.equals(OakFixture.OAK_RDB)) {
             oakFixture = OakFixture.getRDB(OakFixture.OAK_RDB, 
rdbjdbcuri.value(options), rdbjdbcuser.value(options),
-                    rdbjdbcpasswd.value(options), 
rdbjdbctableprefix.value(options), false, cacheSize);
+                    rdbjdbcpasswd.value(options), 
rdbjdbctableprefix.value(options), false, cacheSize, -1);
         } else {
             throw new IllegalArgumentException("Unsupported repository setup " 
+ fix);
         }


Reply via email to