/* * Copyright 2015-2016 OpenCB * * Licensed 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.opencb.opencga.storage.core.benchmark; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryResult; import org.opencb.opencga.storage.core.exceptions.StorageEngineException; import org.opencb.opencga.storage.core.StorageEngineFactory; import org.opencb.opencga.storage.core.config.StorageConfiguration; import org.opencb.opencga.storage.core.variant.VariantStorageEngine; import org.opencb.opencga.storage.core.variant.adaptors.VariantDBAdaptor; import org.slf4j.LoggerFactory; import java.util.*; import java.util.concurrent.*; /** * Created by imedina on 16/06/15. */ public class VariantBenchmarkRunner extends BenchmarkRunner { private String[] queryType; private String queryParams; private BenchmarkStats benchmarkStats; public VariantBenchmarkRunner(StorageConfiguration storageConfiguration) throws IllegalAccessException, ClassNotFoundException, InstantiationException, StorageEngineException { this(storageConfiguration.getDefaultStorageEngineId(), storageConfiguration); } public VariantBenchmarkRunner(String storageEngine, StorageConfiguration storageConfiguration) throws IllegalAccessException, ClassNotFoundException, InstantiationException, StorageEngineException { this.storageEngine = storageEngine; this.storageConfiguration = storageConfiguration; logger = LoggerFactory.getLogger(this.getClass()); init(storageEngine); } private void init(String storageEngine) throws IllegalAccessException, InstantiationException, ClassNotFoundException, StorageEngineException { StorageEngineFactory storageEngineFactory = StorageEngineFactory.get(storageConfiguration); VariantStorageEngine variantStorageEngine = storageEngineFactory.getVariantStorageEngine(storageEngine); variantDBAdaptor = variantStorageEngine.getDBAdaptor(storageConfiguration.getBenchmark().getDatabaseName()); } @Override public BenchmarkStats convert() { return null; } @Override public BenchmarkStats insert() { return null; } @Override public BenchmarkStats query() throws ExecutionException, InterruptedException { return query(3, new HashSet<>(Arrays.asList("count", "queryByRegion"))); } @Override public BenchmarkStats query(int numRepetitions, Set<String> benchmarkTests) throws ExecutionException, InterruptedException { // int executionTime = 0; benchmarkStats = new BenchmarkStats(); for (int i = 0; i < numRepetitions; i++) { Iterator<String> iterator = benchmarkTests.iterator(); while (iterator.hasNext()) { String next = iterator.next(); queryType = next.split("-"); if (queryType.length >= 2) { queryParams = queryType[1]; } else if (queryType.length == 1 && queryType[0].equals("distinct")) { // System.out.println("inside else .query :: "); queryParams = "gene"; } Query query = new Query(); QueryOptions queryOptions = new QueryOptions(); switch (queryType[0]) { case "count": executeThreads(queryType[0], () -> variantDBAdaptor.count(new Query())); System.out.println("VariantBenchmarkRunner.query" + variantDBAdaptor.count(new Query()).getResult()); // executionTime = count(); break; case "distinct": executeThreads(queryType[0], () -> variantDBAdaptor.distinct(new Query(), queryParams)); // System.out.println("VariantBenchmarkRunner.query >>>>>> " + queryParams + " " // + variantDBAdaptor.distinct(new Query(), // queryParams).getResult().size()); break; case "queryById": query.put(VariantDBAdaptor.VariantQueryParams.ID.key(), queryParams); executeThreads(queryType[0], () -> variantDBAdaptor.get(query, queryOptions)); break; case "queryByRegion": query.put(VariantDBAdaptor.VariantQueryParams.REGION.key(), queryParams); executeThreads(queryType[0], () -> variantDBAdaptor.get(query, queryOptions)); break; case "queryByChromosome": query.put(VariantDBAdaptor.VariantQueryParams.CHROMOSOME.key(), queryParams); executeThreads(queryType[0], () -> variantDBAdaptor.get(query, queryOptions)); break; case "queryByGene": query.put(VariantDBAdaptor.VariantQueryParams.GENE.key(), queryParams); executeThreads(queryType[0], () -> variantDBAdaptor.get(query, queryOptions)); break; case "queryByType": query.put(VariantDBAdaptor.VariantQueryParams.TYPE.key(), queryParams); executeThreads(queryType[0], () -> variantDBAdaptor.get(query, queryOptions)); break; case "queryByReference": query.put(VariantDBAdaptor.VariantQueryParams.REFERENCE.key(), queryParams); executeThreads(queryType[0], () -> variantDBAdaptor.get(query, queryOptions)); break; case "queryByAlternate": query.put(VariantDBAdaptor.VariantQueryParams.ALTERNATE.key(), queryParams); executeThreads(queryType[0], () -> variantDBAdaptor.get(query, queryOptions)); break; case "queryByStudies": query.put(VariantDBAdaptor.VariantQueryParams.STUDIES.key(), queryParams); executeThreads(queryType[0], () -> variantDBAdaptor.get(query, queryOptions)); break; default: break; } // benchmarkStats.addExecutionTime(next, executionTime); } } benchmarkStats.printSummary(storageConfiguration.getBenchmark().getDatabaseName(), storageConfiguration.getBenchmark().getTable(), storageConfiguration.getBenchmark().getNumRepetitions(), storageConfiguration.getBenchmark().getConcurrency()); return benchmarkStats; } private <T> List<Future<T>> executeThreads(String test, Callable<T> task) throws ExecutionException, InterruptedException { int concurrency = storageConfiguration.getBenchmark().getConcurrency(); // System.out.println("concurrency :: " + concurrency); ExecutorService executorService = Executors.newFixedThreadPool(10); List<Future<T>> futureList = new ArrayList<>(10); for (int i = 0; i < concurrency; i++) { futureList.add(executorService.submit(task)); } int totalTime = 0; for (Future<T> queryResultFuture : futureList) { totalTime += ((QueryResult) queryResultFuture.get()).getDbTime(); // System.out.println("queryResultFuture.get().getDbTime() = " + queryResultFuture.get().getDbTime()); // System.out.println("queryResultFuture.get().getResult().size() = " + queryResultFuture.get().getResult().get(0)); } benchmarkStats.addExecutionTime(test, totalTime); benchmarkStats.addStdDeviation(test, totalTime); return futureList; } }