Exemple #1
0
  private long newPosition(
      final int activeTermId,
      final int activeIndex,
      final int currentTail,
      final long position,
      final int nextOffset) {
    long newPosition = BACK_PRESSURED;
    if (nextOffset > 0) {
      newPosition = (position - currentTail) + nextOffset;
    } else if (nextOffset == TermAppender.TRIPPED) {
      final int newTermId = activeTermId + 1;
      final int nextIndex = nextPartitionIndex(activeIndex);
      final int nextNextIndex = nextPartitionIndex(nextIndex);

      defaultHeaderTermId(logMetaDataBuffer, nextIndex, newTermId);

      // Need to advance the term id in case a publication takes an interrupt
      // between reading the active term and incrementing the tail.
      // This covers the case of an interrupt taking longer than
      // the time taken to complete the current term.
      defaultHeaderTermId(logMetaDataBuffer, nextNextIndex, newTermId + 1);

      termAppenders[nextNextIndex].statusOrdered(NEEDS_CLEANING);
      LogBufferDescriptor.activeTermId(logMetaDataBuffer, newTermId);

      newPosition = ADMIN_ACTION;
    }

    return newPosition;
  }