Esempio n. 1
0
  /**
   * Called from the {@link Receiver} thread to processing any pending loss of packets.
   *
   * @return number of work items processed.
   */
  int processPendingLoss() {
    int workCount = 0;
    final long changeNumber = endLossChange;

    if (changeNumber != lastLossChangeNumber) {
      final int termId = lossTermId;
      final int termOffset = lossTermOffset;
      final int length = lossLength;

      UNSAFE
          .loadFence(); // LoadLoad required so previous loads don't move past version check below.

      if (changeNumber == beginLossChange) {
        if (isReliable) {
          channelEndpoint.sendNakMessage(
              controlAddress, sessionId, streamId, termId, termOffset, length);
          nakMessagesSent.orderedIncrement();
        } else {
          final UnsafeBuffer termBuffer = termBuffers[indexByTerm(initialTermId, termId)];
          if (tryFillGap(rawLog.logMetaData(), termBuffer, termId, termOffset, length)) {
            lossGapFills.orderedIncrement();
          }
        }

        lastLossChangeNumber = changeNumber;
        workCount = 1;
      }
    }

    return workCount;
  }