protected synchronized boolean trackMessage(ImageReplyMessage m) {
        if (msgsProcessed == null) {
          msgsProcessed = new int[m.numSeries];
        }
        if (numInSeries == null) {
          numInSeries = new int[m.numSeries];
        }
        msgsProcessed[m.seriesNum]++;

        if (m.lastInSeries) {
          numInSeries[m.seriesNum] = m.msgNum + 1;
        }
        if (logger.isDebugEnabled()) {
          logger.debug(
              "InitialImage Message Tracking Status: Processor id: {}; Sender: {}; Messages Processed: {}; NumInSeries:{}",
              getProcessorId(), m.getSender(), arrayToString(msgsProcessed),
              arrayToString(numInSeries));
        }

        // this.numInSeries starts out as zeros and gets initialized
        // for a series only when we get a lastInSeries true.
        // Since we increment msgsProcessed, the following condition
        // cannot be true until sometime after we've received the
        // lastInSeries for a given series.
        allChunksReceived = Arrays.equals(msgsProcessed, numInSeries);
        return (allChunksReceived);
      }
Return true if this is the very last reply for this member
geode-core/src/main/java/org/apache/geode/internal/cache/InitialImageOperation.java