/*
* Copyright (c) 2016 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.server.impl;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.service.StorageService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.services.util.NamedScheduledThreadPoolExecutor;
public class DbCompactWorker implements Runnable{
private static final Logger log = LoggerFactory.getLogger(DbCompactWorker.class);
private int retryTimes;
private int initialDelayInHour;
private int intervalInHour;
private static ScheduledExecutorService executor = new NamedScheduledThreadPoolExecutor("DbCompact", 1);
/*
* start the background db major compact job which will run every day,
* a major compaction consolidates all existing SSTables into a single SSTable.
* it would clean tombstones.
* */
public void start() {
executor.scheduleWithFixedDelay(this, initialDelayInHour, intervalInHour, TimeUnit.HOURS);
}
private void runDbCompactWithRetry(String keyspace) {
for (int i=0; i<retryTimes; i++) {
try {
StorageService.instance.forceKeyspaceCompaction(keyspace);
log.info("{} db compact successfully", keyspace);
return;
} catch (Exception e) {
log.error("{} db compact failed", keyspace);
}
}
}
@Override
public void run() {
String keyspace = DatabaseDescriptor.getClusterName();
log.info("start db compact for {}", keyspace);
runDbCompactWithRetry(keyspace);
}
public int getRetryTimes() {
return retryTimes;
}
public void setRetryTimes(int retryTimes) {
this.retryTimes = retryTimes;
}
public int getInitialDelayInHour() {
return initialDelayInHour;
}
public void setInitialDelayInHour(int initialDelayInHour) {
this.initialDelayInHour = initialDelayInHour;
}
public int getIntervalInHour() {
return intervalInHour;
}
public void setIntervalInHour(int intervalInHour) {
this.intervalInHour = intervalInHour;
}
}