code: synchronized ListenableFuture<Boolean> send(StreamSnapshotMessageType type, int blockIndex, BBContainer chunk, boolean replicatedTable) {
          SettableFuture<Boolean> sendFuture = SettableFuture.create();
          rejoinLog.trace("Sending block " + blockIndex + " of type " + (replicatedTable?"REPLICATED ":"PARTITIONED ") + type.name() +
                  " from targetId " + m_targetId + " to " + CoreUtils.hsIdToString(m_destHSId) +
                  (replicatedTable?", " + CoreUtils.hsIdCollectionToString(m_otherDestHostHSIds):""));
          SendWork sendWork = new SendWork(type, m_targetId, m_destHSId,
                  replicatedTable?m_otherDestHostHSIds:null, chunk, sendFuture);
          m_outstandingWork.put(blockIndex, sendWork);
          m_outstandingWorkCount.incrementAndGet();
          m_sender.offer(sendWork);
          return sendFuture;
      }
docs: Send data to the rejoining node, tracking what was sent for ack tracking.
  Synchronized to protect access to m_outstandingWork and to keep
  m_outstandingWorkCount in sync with m_outstandingWork.
  
  @param blockIndex Index useful for ack tracking and debugging
  @param schemaContainer Optional schema for table (can be null)
  @param chunk Snapshot data to send.
  @return return a listenable future for the caller to wait until the buffer is sent