/*
* @(#) ClusterSnapshotTask.java
* Created Sep 23, 2011 by oleg
* (C) ONE, SIA
*/
package org.apache.cassandra.maint;
import java.io.IOException;
import java.util.Set;
import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.tools.NodeProbe;
import org.apache.cassandra.utils.FBUtilities;
import org.apache.log4j.Logger;
/**
* Run only by 0th node in ring - launches global cluster wide snapshot on a cluster, like clustertool global_snapshot do
*
* @author Oleg Anastasyev<oa@hq.one.lv>
*
*/
public class ClusterSnapshotTask implements MaintenanceTask, Runnable
{
private final Logger logger = Logger.getLogger(MaintenanceTaskManager.class);
private long lastSuccessfulWindowMillis = 0l;
private MaintenanceContext currentCtx ;
protected final String tagname;
protected final String cfRegExp;
/*example of config: night(tablename1,tablename2)*/
public ClusterSnapshotTask(String config)
{
int openBraceIndex = config.indexOf('(');
if (openBraceIndex != -1)
{
tagname = config.substring(0, openBraceIndex);
int closeBraceIndex = config.lastIndexOf(')');
if (closeBraceIndex != -1 && closeBraceIndex > openBraceIndex)
{
cfRegExp = config.substring(openBraceIndex + 1, closeBraceIndex);
} else {
logger.error("Can't parse table names from snapshot config string");
cfRegExp = null;
}
} else {
tagname = config;
cfRegExp = null;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.maint.MaintenanceTask#maybeRun(org.apache.cassandra.maint.MaintenanceContext)
*/
@Override
public Runnable maybeRun(MaintenanceContext ctx)
{
this.currentCtx = ctx;
return ctx.ringPosition() == 0 && ctx.startedMillis()>lastSuccessfulWindowMillis ? this : null;
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run()
{
Set<String> liveNodes = StorageService.instance.getLiveNodes();
liveNodes.remove(FBUtilities.getLocalAddress().getHostAddress());
try
{
if (cfRegExp == null)
{
if (logger.isDebugEnabled())
{
logger.debug("Take snapshot for all tables");
}
StorageService.instance.takeAllSnapshot(tagname);
} else {
if (logger.isDebugEnabled())
{
logger.debug("Take snapshot for all tables for column families according regexp: " + cfRegExp);
}
StorageService.instance.takeAllSnapshot(cfRegExp, tagname);
}
if (logger.isDebugEnabled())
{
logger.debug("local snapshot taken");
}
}
catch (IOException e)
{
logger.error("local snapshot FAILED: ", e);
}
for (String liveNode : liveNodes)
{
try
{
NodeProbe probe = new NodeProbe( liveNode );
if (cfRegExp == null)
{
probe.takeSnapshot(tagname);
} else {
probe.takeSnapshot(cfRegExp, tagname);
}
logger.debug(liveNode + " snapshot taken");
}
catch (Exception e)
{
logger.error(liveNode + " snapshot FAILED: ", e);
}
}
lastSuccessfulWindowMillis = currentCtx.startedMillis();
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return "Cluster snapshot with tag "+tagname;
}
}