/*
* @(#) ClusterSnapshotTask.java
* Created Sep 23, 2011 by oleg
* (C) ONE, SIA
*/
package org.apache.cassandra.maint;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Calendar;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.io.util.FileUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Logger;
/**
* Runs on every node in cluster. Removes archived commit logs older than X days.
*
* @author Oleg Anastasyev<oa@hq.one.lv>
*
*/
public class CleanArchivedLogsTask implements MaintenanceTask, Runnable
{
private final Logger logger = Logger.getLogger(MaintenanceTaskManager.class);
private long lastSuccessfulWindowMillis = 0l;
private MaintenanceContext currentCtx ;
private int daysOld = 3;
public CleanArchivedLogsTask(int daysold)
{
this.daysOld = daysold;
}
/* (non-Javadoc)
* @see org.apache.cassandra.maint.MaintenanceTask#maybeRun(org.apache.cassandra.maint.MaintenanceContext)
*/
@Override
public Runnable maybeRun(MaintenanceContext ctx)
{
this.currentCtx = ctx;
return DatabaseDescriptor.isLogArchiveActive() && ctx.startedMillis()>lastSuccessfulWindowMillis ? this : null;
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run()
{
String logArchDir = DatabaseDescriptor.getLogArchiveDestination();
final long earliestLogfile = earliestLogFile();
File[] obsoleteLogs = new File(logArchDir).listFiles(new FileFilter()
{
@Override
public boolean accept(File file)
{
try {
String name = file.getName();
return name.matches("CommitLog-\\d+\\.log(\\.z)?") && Long.parseLong(name.split("-|[.]")[1])<=earliestLogfile;
} catch (Exception e)
{
logger.warn("Commit log name is not understood and skipped: "+file);
return false;
}
}
});
if (obsoleteLogs!=null && obsoleteLogs.length>0)
{
logger.info("Deleting obsolete archived logs (older than "+daysOld+" days): "+ArrayUtils.toString(obsoleteLogs));
try {
FileUtils.delete(obsoleteLogs);
} catch (IOException e)
{
logger.error("Cannot remove archived logs",e);
}
}
lastSuccessfulWindowMillis = currentCtx.startedMillis();
}
/**
* @return
*/
private long earliestLogFile()
{
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(currentCtx.startedMillis());
calendar.add(Calendar.DAY_OF_YEAR, -daysOld);
return calendar.getTimeInMillis();
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return "Cleaning archived log files older than "+daysOld+" days old";
}
}