@Override
  public void remoteHandler(
      RpcController controller,
      TransactionPrepareRequest request,
      RpcCallback<TransactionPrepareResponse> callback) {
    assert (request.hasTransactionId())
        : "Got " + request.getClass().getSimpleName() + " without a txn id!";
    Long txn_id = Long.valueOf(request.getTransactionId());
    if (debug.val)
      LOG.debug(String.format("Got %s for txn #%d", request.getClass().getSimpleName(), txn_id));

    // HACK
    // Use a TransactionPrepareWrapperCallback to ensure that we only send back
    // the prepare response once all of the PartitionExecutors have successfully
    // acknowledged that we're ready to commit
    PartitionSet partitions = new PartitionSet(request.getPartitionsList());
    assert (partitions.isEmpty() == false)
        : "Unexpected empty list of updated partitions for txn #" + txn_id;
    partitions.retainAll(hstore_site.getLocalPartitionIds());

    RemoteTransaction ts = this.hstore_site.getTransaction(txn_id);
    assert (ts != null) : "Unexpected null transaction handle for txn #" + txn_id;

    // Always create a new prepare callback because we may get multiple messages
    // to prepare this txn for commit.
    RemotePrepareCallback wrapper = ts.getPrepareCallback();
    assert (wrapper.isInitialized() == false);
    wrapper.init(ts, partitions, callback);

    this.hstore_site.transactionPrepare(ts, partitions, wrapper);
  }
 @Override
 public void remoteQueue(
     RpcController controller,
     TransactionPrepareRequest request,
     RpcCallback<TransactionPrepareResponse> callback) {
   if (debug.val)
     LOG.debug(
         String.format(
             "Sending %s to remote handler for txn #%d",
             request.getClass().getSimpleName(), request.getTransactionId()));
   this.remoteHandler(controller, request, callback);
 }