/* This file is part of VoltDB.
* Copyright (C) 2008-2010 VoltDB L.L.C.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
package org.voltdb.regressionsuites;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.voltdb.BackendTarget;
import org.voltdb.CatalogContext;
import org.voltdb.ServerThread;
import org.voltdb.catalog.Catalog;
import org.voltdb.compiler.VoltProjectBuilder;
import org.voltdb.jni.ExecutionEngineIPC;
import edu.brown.catalog.CatalogUtil;
import edu.brown.hstore.conf.HStoreConf;
/**
* Implementation of a VoltServerConfig for the simplest case:
* the single-process VoltServer that's so easy to use.
*
*/
public class LocalSingleProcessServer extends VoltServerConfig {
private static final Logger LOG = Logger.getLogger(LocalSingleProcessServer.class);
public final File m_jarFileName;
public final int m_partitionCount;
public final BackendTarget m_target;
CatalogContext catalogContext = null;
ServerThread m_server = null;
boolean m_compiled = false;
public LocalSingleProcessServer(String jarFileName, int partitionCount,
BackendTarget target)
{
assert(jarFileName != null);
assert(partitionCount > 0);
final String buildType = System.getenv().get("BUILD");
m_jarFileName = new File(VoltServerConfig.getPathToCatalogForTest(jarFileName));
m_partitionCount = partitionCount;
if (buildType == null) {
m_target = target;
} else {
if (buildType.startsWith("memcheck")) {
if (target.equals(BackendTarget.NATIVE_EE_JNI)) {
m_target = BackendTarget.NATIVE_EE_VALGRIND_IPC;
} else {
m_target = target;//For memcheck
}
} else {
m_target = target;
}
}
}
@Override
public boolean compile(VoltProjectBuilder builder) {
if (m_compiled == true) {
LOG.info("ALREADY COMPILED");
return true;
}
builder.clearPartitions();
for (int partition = 0; partition < m_partitionCount; ++partition) {
builder.addPartition("localhost", 0, partition);
} // FOR
m_compiled = builder.compile(m_jarFileName.getAbsolutePath(), m_partitionCount, 0);
return m_compiled;
}
@Override
public List<String> getListenerAddresses() {
// return just "localhost"
if (m_server == null)
return null;
ArrayList<String> listeners = new ArrayList<String>();
listeners.add("localhost");
return listeners;
}
@Override
public String getName() {
// name is combo of the classname and the parameters
String retval = "localSingleProcess-";
retval += String.valueOf(m_partitionCount);
if (m_target == BackendTarget.HSQLDB_BACKEND)
retval += "-HSQL";
else if (m_target == BackendTarget.NATIVE_EE_IPC)
retval += "-IPC";
else
retval += "-JNI";
if (this.nameSuffix != null && this.nameSuffix.isEmpty() == false)
retval += "-" + this.nameSuffix;
return retval;
}
@Override
public int getNodeCount()
{
return 1;
}
@Override
public int getPartitionCount() {
return (m_partitionCount);
}
@Override
public List<String> shutDown() throws InterruptedException {
m_server.shutdown();
if (m_target == BackendTarget.NATIVE_EE_VALGRIND_IPC) {
if (!ExecutionEngineIPC.m_valgrindErrors.isEmpty()) {
ArrayList<String> retval = new ArrayList<String>(ExecutionEngineIPC.m_valgrindErrors);
ExecutionEngineIPC.m_valgrindErrors.clear();
return retval;
}
}
return null;
}
@Override
public void startUp() {
// Configuration config = new Configuration();
// config.m_backend = m_target;
// config.m_noLoadLibVOLTDB = (m_target == BackendTarget.HSQLDB_BACKEND);
// // m_jarFileName is already prefixed with test output path.
// config.m_pathToCatalog = m_jarFileName;
// config.m_profilingLevel = ProcedureProfiler.Level.DISABLED;
this.catalogContext = CatalogUtil.loadCatalogContextFromJar(m_jarFileName);
HStoreConf hstore_conf = HStoreConf.singleton(HStoreConf.isInitialized() == false);
hstore_conf.loadFromArgs(this.confParams);
m_server = new ServerThread(this.catalogContext, hstore_conf, 0);
m_server.start();
m_server.waitForInitialization();
}
@Override
public CatalogContext getCatalogContext() {
return this.catalogContext;
}
@Override
public Catalog getCatalog() {
return this.catalogContext.catalog;
}
@Override
public boolean isHSQL() {
return m_target == BackendTarget.HSQLDB_BACKEND;
}
@Override
public boolean isValgrind() {
return m_target == BackendTarget.NATIVE_EE_VALGRIND_IPC;
}
}