package edu.brown.hstore; import org.apache.log4j.Logger; import com.google.protobuf.RpcCallback; import com.google.protobuf.RpcController; import edu.brown.hstore.Hstoreservice.HStoreService; import edu.brown.hstore.Hstoreservice.HeartbeatRequest; import edu.brown.hstore.Hstoreservice.HeartbeatResponse; import edu.brown.hstore.Hstoreservice.InitializeRequest; import edu.brown.hstore.Hstoreservice.InitializeResponse; import edu.brown.hstore.Hstoreservice.SendDataRequest; import edu.brown.hstore.Hstoreservice.SendDataResponse; import edu.brown.hstore.Hstoreservice.ShutdownPrepareRequest; import edu.brown.hstore.Hstoreservice.ShutdownPrepareResponse; import edu.brown.hstore.Hstoreservice.ShutdownRequest; import edu.brown.hstore.Hstoreservice.ShutdownResponse; import edu.brown.hstore.Hstoreservice.Status; import edu.brown.hstore.Hstoreservice.TimeSyncRequest; import edu.brown.hstore.Hstoreservice.TimeSyncResponse; import edu.brown.hstore.Hstoreservice.TransactionDebugRequest; import edu.brown.hstore.Hstoreservice.TransactionDebugResponse; import edu.brown.hstore.Hstoreservice.TransactionFinishRequest; import edu.brown.hstore.Hstoreservice.TransactionFinishResponse; import edu.brown.hstore.Hstoreservice.TransactionInitRequest; import edu.brown.hstore.Hstoreservice.TransactionInitResponse; import edu.brown.hstore.Hstoreservice.TransactionMapRequest; import edu.brown.hstore.Hstoreservice.TransactionMapResponse; import edu.brown.hstore.Hstoreservice.TransactionPrefetchAcknowledgement; import edu.brown.hstore.Hstoreservice.TransactionPrefetchResult; import edu.brown.hstore.Hstoreservice.TransactionPrepareRequest; import edu.brown.hstore.Hstoreservice.TransactionPrepareResponse; import edu.brown.hstore.Hstoreservice.TransactionRedirectRequest; import edu.brown.hstore.Hstoreservice.TransactionRedirectResponse; import edu.brown.hstore.Hstoreservice.TransactionReduceRequest; import edu.brown.hstore.Hstoreservice.TransactionReduceResponse; import edu.brown.hstore.Hstoreservice.TransactionWorkRequest; import edu.brown.hstore.Hstoreservice.TransactionWorkResponse; import edu.brown.hstore.Hstoreservice.UnevictDataRequest; import edu.brown.hstore.Hstoreservice.UnevictDataResponse; import edu.brown.logging.LoggerUtil; import edu.brown.logging.LoggerUtil.LoggerBoolean; import edu.brown.utils.EventObservable; import edu.brown.utils.EventObserver; import edu.brown.utils.PartitionSet; import edu.brown.utils.StringUtil; import edu.brown.hstore.conf.HStoreConf; import edu.brown.hstore.txns.RemoteTransaction; public class MockHStoreCoordinator extends HStoreCoordinator { private static final Logger LOG = Logger.getLogger(MockHStoreCoordinator.class); private final static LoggerBoolean debug = new LoggerBoolean(); private final static LoggerBoolean trace = new LoggerBoolean(); static { LoggerUtil.attachObserver(LOG, debug, trace); } final TransactionQueueManager txnQueueManager; final HStoreConf hstore_conf; final HStoreSite hstore_site; /** * Constructor * @param catalog_site */ public MockHStoreCoordinator(final MockHStoreSite hstore_site) { super(hstore_site); this.hstore_site = hstore_site; this.hstore_conf = this.hstore_site.getHStoreConf(); this.txnQueueManager = this.hstore_site.getTransactionQueueManager(); Thread t = new Thread(this.txnQueueManager); t.setDaemon(true); t.start(); // For debugging! this.getReadyObservable().addObserver(new EventObserver<HStoreCoordinator>() { @Override public void update(EventObservable<HStoreCoordinator> o, HStoreCoordinator arg) { if (HStoreCoordinator.getRemoteCoordinators(hstore_site.getSite()).isEmpty() == false) { LOG.info("Established connections to remote HStoreCoordinators:\n" + StringUtil.join(" ", "\n", HStoreCoordinator.getRemoteCoordinators(hstore_site.getSite()))); } } }); // Runtime.getRuntime().addShutdownHook(new Thread() { // @Override // public void run() { // if (isShuttingDown() == false) { // shutdownCluster(); // System.out.println("Shutdown hook ran!"); // } // } // }); } @Override protected HStoreService initHStoreService() { return new MockServiceHandler(); } @Override protected void initCluster() { // Nothing to do... } private class MockServiceHandler extends HStoreService { @Override public void transactionInit(RpcController controller, TransactionInitRequest request, RpcCallback<TransactionInitResponse> done) { LOG.info("Incoming " + request.getClass().getSimpleName()); PartitionSet partitions = new PartitionSet(request.getPartitionsList()); RemoteTransaction ts = hstore_site.getTransactionInitializer() .createRemoteTransaction(request.getTransactionId(), partitions, null, request.getBasePartition(), request.getProcedureId()); // FIXME hstore_site.transactionInit(ts, done); } @Override public void transactionWork(RpcController controller, TransactionWorkRequest request, RpcCallback<TransactionWorkResponse> done) { LOG.info("Incoming " + request.getClass().getSimpleName()); // TODO Auto-generated method stub } @Override public void transactionPrepare(RpcController controller, TransactionPrepareRequest request, RpcCallback<TransactionPrepareResponse> done) { LOG.info("Incoming " + request.getClass().getSimpleName()); // TODO Auto-generated method stub } @Override public void transactionFinish(RpcController controller, TransactionFinishRequest request, RpcCallback<TransactionFinishResponse> done) { LOG.info("Incoming " + request.getClass().getSimpleName()); // TODO Auto-generated method stub } @Override public void transactionRedirect(RpcController controller, TransactionRedirectRequest request, RpcCallback<TransactionRedirectResponse> done) { LOG.info("Incoming " + request.getClass().getSimpleName()); // Ignore } @Override public void initialize(RpcController controller, InitializeRequest request, RpcCallback<InitializeResponse> done) { // TODO Auto-generated method stub } @Override public void shutdown(RpcController controller, ShutdownRequest request, RpcCallback<ShutdownResponse> done) { LOG.info("Incoming " + request.getClass().getSimpleName()); ShutdownResponse response = ShutdownResponse.newBuilder() .setSenderSite(hstore_site.getSiteId()) .build(); System.exit(1); done.run(response); } @Override public void heartbeat(RpcController controller, HeartbeatRequest request, RpcCallback<HeartbeatResponse> done) { // TODO Auto-generated method stub } @Override public void timeSync(RpcController controller, TimeSyncRequest request, RpcCallback<TimeSyncResponse> done) { // TODO Auto-generated method stub } @Override public void transactionMap(RpcController controller, TransactionMapRequest request, RpcCallback<TransactionMapResponse> done) { // TODO Auto-generated method stub } @Override public void transactionReduce(RpcController controller, TransactionReduceRequest request, RpcCallback<TransactionReduceResponse> done) { // TODO Auto-generated method stub } @Override public void sendData(RpcController controller, SendDataRequest request, RpcCallback<SendDataResponse> done) { // TODO Auto-generated method stub } @Override public void transactionPrefetch(RpcController controller, TransactionPrefetchResult request, RpcCallback<TransactionPrefetchAcknowledgement> done) { // TODO Auto-generated method stub } @Override public void shutdownPrepare(RpcController controller, ShutdownPrepareRequest request, RpcCallback<ShutdownPrepareResponse> done) { // TODO Auto-generated method stub } @Override public void transactionDebug(RpcController controller, TransactionDebugRequest request, RpcCallback<TransactionDebugResponse> done) { // TODO Auto-generated method stub } @Override public void unevictData(RpcController controller, UnevictDataRequest request, RpcCallback<UnevictDataResponse> done) { LOG.info(String.format("Received %s from HStoreSite %s at HStoreSite %s", request.getClass().getSimpleName(), HStoreThreadManager.formatSiteName(request.getSenderSite()), HStoreThreadManager.formatSiteName(hstore_site.getSiteId()))); if (debug.val) LOG.debug(String.format("Received %s from HStoreSite %s", request.getClass().getSimpleName(), HStoreThreadManager.formatSiteName(request.getSenderSite()))); Long oldTxnId = request.getTransactionId(); UnevictDataResponse.Builder builder = UnevictDataResponse.newBuilder() .setSenderSite(hstore_site.getSiteId()) .setTransactionId(oldTxnId) .setPartitionId(1) // some id .setStatus(Status.OK); done.run(builder.build()); } } }