package org.apache.cassandra.tools;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.thrift.CassandraDaemon;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.silveregg.wrapper.WrapperListener;
import com.silveregg.wrapper.WrapperManager;
/**
* Wrapper listener for cassandra server
*
* @author Oleg Anastasyev<oa@hq.one.lv>
*
*/
public class WrapperMain implements WrapperListener
{
/* /**
* Logger for this class
*/
private static final Logger logger = LoggerFactory.getLogger(WrapperMain.class);
private CassandraDaemon daemon;
/**
*
*/
public WrapperMain(CassandraDaemon daemon)
{
this.daemon = daemon;
}
public static void main (String[] args)
{
try
{
WrapperManager.start(new WrapperMain(new CassandraDaemon()), args);
} catch (Exception e)
{
e.printStackTrace();
WrapperManager.stop(-1);
}
}
public Integer start(final String[] args)
{
WrapperManager.signalStarting(3600000*24);
try {
daemon.setup();
WrapperManager.signalStarting(30000);
new Thread(new Runnable()
{
@Override
public void run()
{
daemon.start();
}
},"ThriftMain").start();
}
catch (Throwable e)
{
String msg = "Exception encountered during startup.";
logger.error(msg, e);
// try to warn user on stdout too, if we haven't already detached
System.out.println(msg);
e.printStackTrace();
System.exit(3);
}
return null;
}
public int stop(int exitCode)
{
WrapperManager.signalStopping(30000);
daemon.stop();
// making pause before proceeding, so all thrift clients
// go to failover node
WrapperManager.signalStopping((int) (DatabaseDescriptor.getRpcTimeout()*3));
try {
Thread.sleep(DatabaseDescriptor.getRpcTimeout()*2);
} catch (InterruptedException e1) {
logger.error("Hm",e1);
}
WrapperManager.signalStopping(300000);
try {
StorageService.instance.drain();
} catch (Exception e) {
logger.error("Drain failed",e);
}
return exitCode;
}
public void controlEvent(int event)
{
if (!WrapperManager.isControlledByNativeWrapper())
WrapperManager.stop(0);
}
}