@Override
  public void receive(TransportClient client, byte[] message, RpcResponseCallback callback) {
    BlockTransferMessage msgObj = BlockTransferMessage.Decoder.fromByteArray(message);

    if (msgObj instanceof OpenBlocks) {
      OpenBlocks msg = (OpenBlocks) msgObj;
      List<ManagedBuffer> blocks = Lists.newArrayList();

      for (String blockId : msg.blockIds) {
        blocks.add(blockManager.getBlockData(msg.appId, msg.execId, blockId));
      }
      long streamId = streamManager.registerStream(blocks.iterator());
      logger.trace("Registered streamId {} with {} buffers", streamId, msg.blockIds.length);
      callback.onSuccess(new StreamHandle(streamId, msg.blockIds.length).toByteArray());

    } else if (msgObj instanceof RegisterExecutor) {
      RegisterExecutor msg = (RegisterExecutor) msgObj;
      blockManager.registerExecutor(msg.appId, msg.execId, msg.executorInfo);
      callback.onSuccess(new byte[0]);

    } else {
      throw new UnsupportedOperationException("Unexpected message: " + msgObj);
    }
  }
 /**
  * Removes an application (once it has been terminated), and optionally will clean up any local
  * directories associated with the executors of that application in a separate thread.
  */
 public void applicationRemoved(String appId, boolean cleanupLocalDirs) {
   blockManager.applicationRemoved(appId, cleanupLocalDirs);
 }