code: public final Future<RecordMetadata> append (D record, WriteCallback callback) throws InterruptedException {
      appendsInProgress.incrementAndGet();
      try {
        if (this.closed) {
          throw new RuntimeException ("Cannot append after accumulator has been closed");
        }
        return this.enqueue(record, callback);
      } finally {
        appendsInProgress.decrementAndGet();
      }
    }
docs: Append a record to this accumulator
  <p>
  This method should never fail unless there is an exception. A future object should always be returned
  which can be queried to see if this record has been completed (completion means the wrapped batch has been
  sent and received acknowledgement and callback has been invoked). Internally it tracks how many parallel appends
  are in progress by incrementing appendsInProgress counter. The real append logic is inside {@link BatchAccumulator#enqueue(Object, WriteCallback)}
  </p>
  
  @param record : record needs to be added
  @param callback : A callback which will be invoked when the whole batch gets sent and acknowledged
  @return A future object which contains {@link RecordMetadata}