package edu.brown.hstore;
import java.util.concurrent.BlockingQueue;
import org.apache.log4j.Logger;
import org.voltdb.ClientResponseImpl;
import com.google.protobuf.RpcCallback;
import edu.brown.hstore.util.AbstractProcessingRunnable;
import edu.brown.logging.LoggerUtil;
import edu.brown.logging.LoggerUtil.LoggerBoolean;
/**
* Special thread that will process ClientResponses and send them back to clients
* @author pavlo
*/
public final class TransactionPostProcessor extends AbstractProcessingRunnable<Object[]> {
private static final Logger LOG = Logger.getLogger(TransactionPostProcessor.class);
private static final LoggerBoolean debug = new LoggerBoolean();
static {
LoggerUtil.attachObserver(LOG, debug);
}
/**
*
* @param hstore_site
*/
public TransactionPostProcessor(HStoreSite hstore_site,
BlockingQueue<Object[]> queue) {
super(hstore_site,
HStoreConstants.THREAD_NAME_POSTPROCESSOR,
queue,
hstore_site.getHStoreConf().site.status_exec_info);
}
@Override
protected void processingCallback(Object data[]) {
ClientResponseImpl cresponse = (ClientResponseImpl)data[0];
@SuppressWarnings("unchecked")
RpcCallback<ClientResponseImpl> clientCallback = (RpcCallback<ClientResponseImpl>)data[1];
long initiateTime = (Long)data[2];
int restartCounter = (Integer)data[3];
assert(cresponse != null);
assert(clientCallback != null);
if (debug.val)
LOG.debug(String.format("Processing ClientResponse for txn #%d at partition %d [status=%s]",
cresponse.getTransactionId(), cresponse.getBasePartition(), cresponse.getStatus()));
try {
this.hstore_site.responseSend(cresponse, clientCallback, initiateTime, restartCounter);
} catch (Throwable ex) {
if (this.isShuttingDown() == false) throw new RuntimeException(ex);
this.shutdown();
}
}
}