/**
* 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 java.lang.reflect.InvocationTargetException;
import org.apache.commons.configuration.ConfigurationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linkedin.pinot.common.data.DataManager;
import com.linkedin.pinot.common.metrics.ServerMetrics;
import com.linkedin.pinot.common.query.QueryExecutor;
import com.linkedin.pinot.core.query.scheduler.QueryScheduler;
import com.linkedin.pinot.server.conf.ServerConf;
import com.linkedin.pinot.transport.netty.NettyServer;
import com.linkedin.pinot.transport.netty.NettyServer.RequestHandlerFactory;
import com.yammer.metrics.core.MetricsRegistry;
/**
*
* 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 ServerInstance {
private static final Logger LOGGER = LoggerFactory.getLogger(ServerInstance.class);
private ServerConf _serverConf;
private DataManager _instanceDataManager;
private QueryExecutor _queryExecutor;
private RequestHandlerFactory _requestHandlerFactory;
private NettyServer _nettyServer;
private ServerMetrics _serverMetrics;
private QueryScheduler _queryScheduler;
private Thread _serverThread;
private boolean _istarted = false;
public ServerInstance() {
}
/**
* Initialize ServerInstance with ServerConf
* @param serverConf
* @throws InstantiationException
* @throws IllegalAccessException
* @throws ClassNotFoundException
* @throws ConfigurationException
*/
public void init(ServerConf serverConf, MetricsRegistry metricsRegistry)
throws InstantiationException, IllegalAccessException, ClassNotFoundException, ConfigurationException,
NoSuchMethodException, InvocationTargetException {
_serverConf = serverConf;
LOGGER.info("Trying to build server config");
ServerBuilder serverBuilder = new ServerBuilder(_serverConf, metricsRegistry);
LOGGER.info("Trying to build InstanceDataManager");
_instanceDataManager = serverBuilder.buildInstanceDataManager();
LOGGER.info("Trying to build QueryExecutor");
_queryExecutor = serverBuilder.buildQueryExecutor(_instanceDataManager);
_queryScheduler = serverBuilder.buildQueryScheduler(_queryExecutor);
LOGGER.info("Trying to build RequestHandlerFactory");
setRequestHandlerFactory(serverBuilder.buildRequestHandlerFactory(_queryScheduler));
LOGGER.info("Trying to build TransformFunctionFactory");
serverBuilder.init(_serverConf);
LOGGER.info("Trying to build NettyServer");
_nettyServer = serverBuilder.buildNettyServer(_serverConf.getNettyConfig(), _requestHandlerFactory);
setServerThread(new Thread(_nettyServer));
LOGGER.info("ServerInstance Initialization is Done!");
_serverMetrics = serverBuilder.getServerMetrics();
}
/**
* Start ServerInstance
*/
public void start() {
LOGGER.info("Trying to start InstanceDataManager");
_instanceDataManager.start();
LOGGER.info("Trying to start QueryExecutor");
_queryExecutor.start();
LOGGER.info("Trying to start ServerThread");
_serverThread.start();
_istarted = true;
LOGGER.info("ServerInstance is Started!");
}
/**
* ShutDown ServerInstance
*/
public void shutDown() {
if (isStarted()) {
_queryExecutor.shutDown();
_instanceDataManager.shutDown();
_nettyServer.shutdownGracefully();
_istarted = false;
LOGGER.info("ServerInstance is ShutDown Completely!");
} else {
LOGGER.info("ServerInstance is already ShutDown! Won't do anything!");
}
}
/**
* @return instanceDataManager
*/
public DataManager getInstanceDataManager() {
return _instanceDataManager;
}
/**
* @param instanceDataManager
*/
public void setInstanceDataManager(DataManager instanceDataManager) {
this._instanceDataManager = instanceDataManager;
}
/**
* @return queryExecutor
*/
public QueryExecutor getQueryExecutor() {
return _queryExecutor;
}
/**
* @param queryExecutor
*/
public void setQueryExecutor(QueryExecutor queryExecutor) {
this._queryExecutor = queryExecutor;
}
/**
* @return requestHandlerFactory
*/
public RequestHandlerFactory getRequestHandlerFactory() {
return _requestHandlerFactory;
}
/**
* @param requestHandlerFactory
*/
public void setRequestHandlerFactory(RequestHandlerFactory requestHandlerFactory) {
this._requestHandlerFactory = requestHandlerFactory;
}
public boolean isStarted() {
return _istarted;
}
/**
* @return serverThread
*/
public Thread getServerThread() {
return _serverThread;
}
/**
* @param serverThread
*/
public void setServerThread(Thread serverThread) {
this._serverThread = serverThread;
}
/**
* @return nettyServer
*/
public NettyServer getNettyServer() {
return _nettyServer;
}
/**
* @param nettyServer
*/
public void setNettyServer(NettyServer nettyServer) {
this._nettyServer = nettyServer;
}
public ServerMetrics getServerMetrics() {
return _serverMetrics;
}
}