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.Hstoreservice.Status; import edu.brown.hstore.PartitionExecutor; /** * Flush out and reject all of the txns queued up at each PartitionExecutor */ @ProcInfo(singlePartition = false) public class Quiesce extends VoltSystemProcedure { private static final Logger LOG = Logger.getLogger(Quiesce.class); private static final ColumnInfo ResultsColumns[] = { new ColumnInfo(VoltSystemProcedure.CNAME_HOST_ID, VoltSystemProcedure.CTYPE_ID), new ColumnInfo("HOSTNAME", VoltType.STRING), new ColumnInfo("PARTITION", VoltType.INTEGER), new ColumnInfo("STATUS", VoltType.STRING), new ColumnInfo("CREATED", VoltType.TIMESTAMP), }; @Override public void initImpl() { executor.registerPlanFragment(SysProcFragmentId.PF_quiesceDistribute, this); executor.registerPlanFragment(SysProcFragmentId.PF_quiesceAggregate, 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) { case SysProcFragmentId.PF_quiesceDistribute: { LOG.debug("Clearing out work queue at partition " + executor.getPartitionId()); executor.haltProcessing(); // Clear out the QueueManager too if this is the first partition // at this site hstore_site.getTransactionQueueManager().clearQueues(executor.getPartitionId()); VoltTable vt = new VoltTable(ResultsColumns); Object row[] = { this.hstore_site.getSiteId(), this.hstore_site.getSiteName(), this.executor.getPartitionId(), Status.OK.name(), new TimestampType(), }; vt.addRow(row); result = new DependencySet(SysProcFragmentId.PF_quiesceDistribute, vt); break; } // Aggregate Results case SysProcFragmentId.PF_quiesceAggregate: List<VoltTable> siteResults = dependencies.get(SysProcFragmentId.PF_quiesceDistribute); 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_quiesceAggregate, vt); break; default: String msg = "Unexpected sysproc fragmentId '" + fragmentId + "'"; throw new ServerFaultException(msg, txn_id); } // SWITCH // Invalid! return (result); } public VoltTable[] run() { return this.executeOncePerPartition(SysProcFragmentId.PF_quiesceDistribute, SysProcFragmentId.PF_quiesceAggregate, new ParameterSet()); } }