org.apache.jackrabbit.oak.scalability.ScalabilityRunner.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.jackrabbit.oak.scalability.ScalabilityRunner.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.jackrabbit.oak.scalability;

import static java.util.Arrays.asList;

import java.io.File;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.google.common.base.Charsets;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import joptsimple.OptionParser;
import joptsimple.OptionSet;
import joptsimple.OptionSpec;

import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.oak.benchmark.CSVResultGenerator;
import org.apache.jackrabbit.oak.benchmark.util.Date;
import org.apache.jackrabbit.oak.fixture.JackrabbitRepositoryFixture;
import org.apache.jackrabbit.oak.fixture.OakRepositoryFixture;
import org.apache.jackrabbit.oak.fixture.RepositoryFixture;
import org.apache.jackrabbit.oak.scalability.benchmarks.AggregateNodeSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.ConcurrentReader;
import org.apache.jackrabbit.oak.scalability.benchmarks.ConcurrentWriter;
import org.apache.jackrabbit.oak.scalability.benchmarks.FacetSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.FormatSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.FullTextSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.LastModifiedSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.MultiFilterOrderByKeysetPageSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.MultiFilterOrderByOffsetPageSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.MultiFilterOrderBySearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.MultiFilterSplitOrderByKeysetPageSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.MultiFilterSplitOrderByOffsetPageSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.MultiFilterSplitOrderBySearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.NodeTypeSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.OrderByDate;
import org.apache.jackrabbit.oak.scalability.benchmarks.OrderByKeysetPageSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.OrderByOffsetPageSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.OrderBySearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.SplitOrderByKeysetPageSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.SplitOrderByOffsetPageSearcher;
import org.apache.jackrabbit.oak.scalability.benchmarks.SplitOrderBySearcher;
import org.apache.jackrabbit.oak.scalability.suites.ScalabilityBlobSearchSuite;
import org.apache.jackrabbit.oak.scalability.suites.ScalabilityNodeRelationshipSuite;
import org.apache.jackrabbit.oak.scalability.suites.ScalabilityNodeSuite;

/**
 * Main class for running scalability/longevity tests.
 * 
 */
public class ScalabilityRunner {

    private static final long MB = 1024 * 1024L;

    public static void main(String[] args) throws Exception {
        OptionParser parser = new OptionParser();
        OptionSpec<File> base = parser.accepts("base", "Base directory").withRequiredArg().ofType(File.class)
                .defaultsTo(new File("target"));
        OptionSpec<String> host = parser.accepts("host", "MongoDB host").withRequiredArg().defaultsTo("localhost");
        OptionSpec<Integer> port = parser.accepts("port", "MongoDB port").withRequiredArg().ofType(Integer.class)
                .defaultsTo(27017);
        OptionSpec<String> dbName = parser.accepts("db", "MongoDB database").withRequiredArg();
        OptionSpec<Boolean> dropDBAfterTest = parser
                .accepts("dropDBAfterTest", "Whether to drop the MongoDB database after the test").withOptionalArg()
                .ofType(Boolean.class).defaultsTo(true);
        OptionSpec<String> rdbjdbcuri = parser.accepts("rdbjdbcuri", "RDB JDBC URI").withOptionalArg()
                .defaultsTo("jdbc:h2:./target/benchmark");
        OptionSpec<String> rdbjdbcuser = parser.accepts("rdbjdbcuser", "RDB JDBC user").withOptionalArg()
                .defaultsTo("");
        OptionSpec<String> rdbjdbcpasswd = parser.accepts("rdbjdbcpasswd", "RDB JDBC password").withOptionalArg()
                .defaultsTo("");
        OptionSpec<String> rdbjdbctableprefix = parser.accepts("rdbjdbctableprefix", "RDB JDBC table prefix")
                .withOptionalArg().defaultsTo("");
        OptionSpec<Boolean> mmap = parser.accepts("mmap", "TarMK memory mapping").withOptionalArg()
                .ofType(Boolean.class).defaultsTo("64".equals(System.getProperty("sun.arch.data.model")));
        OptionSpec<Integer> cache = parser.accepts("cache", "cache size (MB)").withRequiredArg()
                .ofType(Integer.class).defaultsTo(100);
        OptionSpec<Integer> fdsCache = parser.accepts("blobCache", "cache size (MB)").withRequiredArg()
                .ofType(Integer.class).defaultsTo(32);
        OptionSpec<Boolean> withStorage = parser.accepts("storage", "Index storage enabled").withOptionalArg()
                .ofType(Boolean.class);
        OptionSpec<File> csvFile = parser.accepts("csvFile", "File to write a CSV version of the benchmark data.")
                .withOptionalArg().ofType(File.class);
        OptionSpec help = parser.acceptsAll(asList("h", "?", "help"), "show help").forHelp();
        OptionSpec<String> nonOption = parser.nonOptions();

        OptionSet options = parser.parse(args);

        if (options.has(help)) {
            parser.printHelpOn(System.out);
            System.exit(0);
        }

        int cacheSize = cache.value(options);
        RepositoryFixture[] allFixtures = new RepositoryFixture[] {
                new JackrabbitRepositoryFixture(base.value(options), cacheSize),
                OakRepositoryFixture.getMemoryNS(cacheSize * MB),
                OakRepositoryFixture.getMongo(host.value(options), port.value(options), dbName.value(options),
                        dropDBAfterTest.value(options), cacheSize * MB),
                OakRepositoryFixture.getMongoWithFDS(host.value(options), port.value(options),
                        dbName.value(options), dropDBAfterTest.value(options), cacheSize * MB, base.value(options),
                        fdsCache.value(options)),
                OakRepositoryFixture.getMongoNS(host.value(options), port.value(options), dbName.value(options),
                        dropDBAfterTest.value(options), cacheSize * MB),
                OakRepositoryFixture.getTar(base.value(options), 256, cacheSize, mmap.value(options)),
                OakRepositoryFixture.getTarWithBlobStore(base.value(options), 256, cacheSize, mmap.value(options)),
                OakRepositoryFixture.getSegmentTar(base.value(options), 256, cacheSize, mmap.value(options)),
                OakRepositoryFixture.getSegmentTarWithBlobStore(base.value(options), 256, cacheSize,
                        mmap.value(options)),
                OakRepositoryFixture.getRDB(rdbjdbcuri.value(options), rdbjdbcuser.value(options),
                        rdbjdbcpasswd.value(options), rdbjdbctableprefix.value(options),
                        dropDBAfterTest.value(options), cacheSize * MB),
                OakRepositoryFixture.getRDBWithFDS(rdbjdbcuri.value(options), rdbjdbcuser.value(options),
                        rdbjdbcpasswd.value(options), rdbjdbctableprefix.value(options),
                        dropDBAfterTest.value(options), cacheSize * MB, base.value(options),
                        fdsCache.value(options)) };
        ScalabilitySuite[] allSuites = new ScalabilitySuite[] {
                new ScalabilityBlobSearchSuite(withStorage.value(options)).addBenchmarks(new FullTextSearcher(),
                        new NodeTypeSearcher(), new FormatSearcher(), new FacetSearcher(),
                        new LastModifiedSearcher(Date.LAST_2_HRS), new LastModifiedSearcher(Date.LAST_24_HRS),
                        new LastModifiedSearcher(Date.LAST_7_DAYS), new LastModifiedSearcher(Date.LAST_MONTH),
                        new LastModifiedSearcher(Date.LAST_YEAR), new OrderByDate()),
                new ScalabilityNodeSuite(withStorage.value(options)).addBenchmarks(new OrderBySearcher(),
                        new SplitOrderBySearcher(), new OrderByOffsetPageSearcher(),
                        new SplitOrderByOffsetPageSearcher(), new OrderByKeysetPageSearcher(),
                        new SplitOrderByKeysetPageSearcher(), new MultiFilterOrderBySearcher(),
                        new MultiFilterSplitOrderBySearcher(), new MultiFilterOrderByOffsetPageSearcher(),
                        new MultiFilterSplitOrderByOffsetPageSearcher(), new MultiFilterOrderByKeysetPageSearcher(),
                        new MultiFilterSplitOrderByKeysetPageSearcher(), new ConcurrentReader(),
                        new ConcurrentWriter()),
                new ScalabilityNodeRelationshipSuite(withStorage.value(options))
                        .addBenchmarks(new AggregateNodeSearcher()) };

        Set<String> argset = Sets.newHashSet(nonOption.values(options));
        List<RepositoryFixture> fixtures = Lists.newArrayList();
        for (RepositoryFixture fixture : allFixtures) {
            if (argset.remove(fixture.toString())) {
                fixtures.add(fixture);
            }
        }

        Map<String, List<String>> argmap = Maps.newHashMap();
        // Split the args to get suites and benchmarks (i.e. suite:benchmark1,benchmark2)
        for (String arg : argset) {
            List<String> tokens = Splitter.on(":").limit(2).splitToList(arg);
            if (tokens.size() > 1) {
                argmap.put(tokens.get(0), Splitter.on(",").trimResults().splitToList(tokens.get(1)));
            } else {
                argmap.put(tokens.get(0), null);
            }
            argset.remove(arg);
        }

        if (argmap.isEmpty()) {
            System.err.println(
                    "Warning: no scalability suites specified, " + "supported  are: " + Arrays.asList(allSuites));
        }

        List<ScalabilitySuite> suites = Lists.newArrayList();
        for (ScalabilitySuite suite : allSuites) {
            if (argmap.containsKey(suite.toString())) {
                List<String> benchmarks = argmap.get(suite.toString());
                // Only keep requested benchmarks
                if (benchmarks != null) {
                    Iterator<String> iter = suite.getBenchmarks().keySet().iterator();
                    for (; iter.hasNext();) {
                        String availBenchmark = iter.next();
                        if (!benchmarks.contains(availBenchmark)) {
                            iter.remove();
                        }
                    }
                }
                suites.add(suite);
                argmap.remove(suite.toString());
            }
        }

        if (argmap.isEmpty()) {
            PrintStream out = null;
            if (options.has(csvFile)) {
                out = new PrintStream(FileUtils.openOutputStream(csvFile.value(options), true), false,
                        Charsets.UTF_8.name());
            }
            for (ScalabilitySuite suite : suites) {
                if (suite instanceof CSVResultGenerator) {
                    ((CSVResultGenerator) suite).setPrintStream(out);
                }
                suite.run(fixtures);
            }
            if (out != null) {
                out.close();
            }
        } else {
            System.err.println("Unknown arguments: " + argset);
        }
    }
}