package org.voltdb.sysprocs;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.voltdb.DependencySet;
import org.voltdb.ParameterSet;
import org.voltdb.ProcInfo;
import org.voltdb.VoltSystemProcedure;
import org.voltdb.VoltTable;
import org.voltdb.VoltTable.ColumnInfo;
import org.voltdb.VoltType;
import org.voltdb.exceptions.ServerFaultException;
import org.voltdb.types.TimestampType;
import org.voltdb.utils.VoltTableUtil;
import edu.brown.hstore.PartitionExecutor;
import edu.brown.profilers.ProfileMeasurement;
/**
* Force the garbage collector run at each HStoreSite
*/
@ProcInfo(singlePartition = false)
public class GarbageCollection extends VoltSystemProcedure {
private static final Logger LOG = Logger.getLogger(GarbageCollection.class);
public static final ColumnInfo nodeResultsColumns[] = {
new ColumnInfo("SITE", VoltType.STRING),
new ColumnInfo("ELAPSED", VoltType.INTEGER),
new ColumnInfo("CREATED", VoltType.TIMESTAMP),
};
private final ProfileMeasurement gcTime = new ProfileMeasurement(this.getClass().getSimpleName());
@Override
public void initImpl() {
executor.registerPlanFragment(SysProcFragmentId.PF_gcAggregate, this);
executor.registerPlanFragment(SysProcFragmentId.PF_gcDistribute, this);
}
@Override
public DependencySet executePlanFragment(Long txn_id,
Map<Integer, List<VoltTable>> dependencies,
int fragmentId,
ParameterSet params,
PartitionExecutor.SystemProcedureExecutionContext context) {
DependencySet result = null;
switch (fragmentId) {
// Perform Garbage Collection
case SysProcFragmentId.PF_gcDistribute: {
LOG.debug("Invoking garbage collector");
this.gcTime.clear();
this.gcTime.start();
// System.gc();
this.gcTime.stop();
if (LOG.isDebugEnabled())
LOG.debug(String.format("Performed Garbage Collection at %s: %s",
this.executor.getHStoreSite().getSiteName(),
this.gcTime.debug()));
VoltTable vt = new VoltTable(nodeResultsColumns);
vt.addRow(this.executor.getHStoreSite().getSiteName(),
(int)this.gcTime.getTotalThinkTimeMS(),
new TimestampType());
result = new DependencySet(SysProcFragmentId.PF_gcDistribute, vt);
break;
}
// Aggregate Results
case SysProcFragmentId.PF_gcAggregate:
LOG.debug("Combining results");
List<VoltTable> siteResults = dependencies.get(SysProcFragmentId.PF_gcDistribute);
if (siteResults == null || siteResults.isEmpty()) {
String msg = "Missing site results";
throw new ServerFaultException(msg, txn_id);
}
VoltTable vt = VoltTableUtil.union(siteResults);
result = new DependencySet(SysProcFragmentId.PF_gcAggregate, vt);
break;
default:
String msg = "Unexpected sysproc fragmentId '" + fragmentId + "'";
throw new ServerFaultException(msg, txn_id);
} // SWITCH
// Invalid!
return (result);
}
public VoltTable[] run() {
return this.executeOncePerSite(SysProcFragmentId.PF_gcDistribute,
SysProcFragmentId.PF_gcAggregate);
}
}