/**
* Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com)
*
* 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 com.linkedin.pinot.server.starter;
import com.yammer.metrics.core.MetricsRegistry;
import java.io.File;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Options;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linkedin.pinot.server.conf.ServerConf;
/**
*
* A Standalone Server which will run on the port configured in the properties file.
* and accept queries. All configurations needed to run the server is provided
* in the config file passed. No external cluster manager integration available (yet)
*
*/
public class SingleNodeServerStarter {
private static final Logger LOGGER = LoggerFactory.getLogger(SingleNodeServerStarter.class);
public static final String SERVER_CONFIG_OPT_NAME = "server_conf";
public static final String PINOT_PROPERTIES = "pinot.properties";
private static String _serverConfigPath;
private static ServerConf _serverConf;
private static ServerInstance _serverInstance;
private static void processCommandLineArgs(String[] cliArgs) throws Exception {
final CommandLineParser cliParser = new GnuParser();
final Options cliOptions = new Options();
cliOptions.addOption(SERVER_CONFIG_OPT_NAME, true, "Server Config file");
final CommandLine cmd = cliParser.parse(cliOptions, cliArgs, true);
if (!cmd.hasOption(SERVER_CONFIG_OPT_NAME)) {
System.err.println("Missing required arguments !!");
System.err.println(cliOptions);
throw new RuntimeException("Missing required arguments !!");
}
_serverConfigPath = cmd.getOptionValue(SERVER_CONFIG_OPT_NAME);
buildServerConfig(new File(_serverConfigPath, PINOT_PROPERTIES));
}
/**
* Construct from config file path
* @param configFilePath Path to the config file
* @throws Exception
*/
public static void buildServerConfig(File configFilePath) throws Exception {
if (!configFilePath.exists()) {
LOGGER.error("configuration file: " + configFilePath.getAbsolutePath() + " does not exist.");
throw new ConfigurationException("configuration file: " + configFilePath.getAbsolutePath() + " does not exist.");
}
// build _serverConf
final PropertiesConfiguration serverConf = new PropertiesConfiguration();
serverConf.setDelimiterParsingDisabled(false);
serverConf.load(configFilePath);
_serverConf = new ServerConf(serverConf);
}
public static class ShutdownHook extends Thread {
private final ServerInstance _serverInstance;
public ShutdownHook(ServerInstance serverInstance) {
_serverInstance = serverInstance;
}
@Override
public void run() {
LOGGER.info("Running shutdown hook");
if (_serverInstance != null) {
_serverInstance.shutDown();
}
LOGGER.info("Shutdown completed !!");
}
}
// Below is the sample arg put in the running parameters.
// --server_conf src/test/resources/conf
public static void main(String[] args) throws Exception {
//Process Command Line to get config and port
processCommandLineArgs(args);
LOGGER.info("Trying to create a new ServerInstance!");
_serverInstance = new ServerInstance();
LOGGER.info("Trying to initial ServerInstance!");
_serverInstance.init(_serverConf, new MetricsRegistry());
LOGGER.info("Trying to start ServerInstance!");
_serverInstance.start();
LOGGER.info("Adding ShutdownHook!");
final ShutdownHook shutdownHook = new ShutdownHook(_serverInstance);
Runtime.getRuntime().addShutdownHook(shutdownHook);
}
}