package edu.berkeley.thebes.twopl.server;
import edu.berkeley.thebes.common.config.Config;
import edu.berkeley.thebes.common.config.ConfigParameterTypes.PersistenceEngine;
import edu.berkeley.thebes.common.config.ConfigParameterTypes.TransactionMode;
import edu.berkeley.thebes.common.log4j.Log4JConfig;
import edu.berkeley.thebes.common.persistence.IPersistenceEngine;
import edu.berkeley.thebes.common.persistence.memory.MemoryPersistenceEngine;
import edu.berkeley.thebes.common.thrift.ThriftServer;
import edu.berkeley.thebes.twopl.common.thrift.TwoPLMasterReplicaService;
import edu.berkeley.thebes.twopl.common.thrift.TwoPLSlaveReplicaService;
import org.slf4j.LoggerFactory;
import com.yammer.metrics.Metrics;
import com.yammer.metrics.core.Counter;
import javax.naming.ConfigurationException;
public class ThebesTwoPLServer {
private static org.slf4j.Logger logger = LoggerFactory.getLogger(ThebesTwoPLServer.class);
private static final Counter masterServersMetric = Metrics.newCounter(TwoPLLocalLockManager.class, "2pl-masters");
private static final Counter slaveServersMetric = Metrics.newCounter(TwoPLLocalLockManager.class, "2pl-slaves");
private static TwoPLSlaveReplicationService slaveReplicationService;
public static void startMasterServer(TwoPLMasterServiceHandler serviceHandler) {
logger.debug("Starting master server...");
masterServersMetric.inc();
// Connect to slaves to replicate to them.
if (Config.shouldReplicateToTwoPLSlaves()) {
new Thread() {
@Override
public void run() {
slaveReplicationService.connectSlaves();
}
}.start();
}
ThriftServer.startInCurrentThread(
new TwoPLMasterReplicaService.Processor<TwoPLMasterServiceHandler>(serviceHandler),
Config.getTwoPLServerBindIP());
}
public static void startSlaveServer(TwoPLSlaveServiceHandler serviceHandler) {
logger.debug("Starting slave server...");
slaveServersMetric.inc();
ThriftServer.startInCurrentThread(
new TwoPLSlaveReplicaService.Processor<TwoPLSlaveServiceHandler>(serviceHandler),
Config.getTwoPLServerBindIP());
}
public static void main(String[] args) {
try {
Config.initializeServer(TransactionMode.TWOPL);
Log4JConfig.configureLog4J();
IPersistenceEngine engine = Config.getPersistenceEngine();
engine.open();
TwoPLLocalLockManager lockManager = new TwoPLLocalLockManager();
slaveReplicationService = new TwoPLSlaveReplicationService();
if (Config.isMaster()) {
startMasterServer(new TwoPLMasterServiceHandler(engine, lockManager,
slaveReplicationService));
} else {
startSlaveServer(new TwoPLSlaveServiceHandler(engine));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}