private void timeout(boolean suspectThem, boolean severeAlert) {

    if (!processTimeout()) {
      return;
    }

    Set activeMembers = getDistributionManagerIds();

    // an alert that will show up in the console
    long timeout = getAckWaitThreshold();
    final Object[] msgArgs =
        new Object[] {timeout + (severeAlert ? getSevereAlertThreshold() : 0), this,
            getDistributionManager().getId(), activeMembers};
    final String msg =
        "%s seconds have elapsed while waiting for replies: %s on %s whose current membership list is: [%s]";
    if (severeAlert) {
      logger.fatal(String.format(msg, msgArgs));
    } else {
      logger.warn(String.format(msg, msgArgs));
    }
    msgArgs[3] = "(omitted)";
    Breadcrumbs.setProblem(msg, msgArgs);

    // Increment the stat
    getDistributionManager().getStats().incReplyTimeouts();

    final Set<InternalDistributedMember> suspectMembers;
    if (suspectThem || severeAlert) {
      suspectMembers = new HashSet();
    } else {
      suspectMembers = null;
    }

    synchronized (members) {
      for (final InternalDistributedMember member : members) {
        if (member != null) {
          if (!activeMembers.contains(member)) {
            logger.warn(
                "View no longer has {} as an active member, so we will no longer wait for it.",
                member);
            memberDeparted(getDistributionManager(), member, false);
          } else {
            if (suspectMembers != null) {
              suspectMembers.add(member);
            }
          }
        }
      }
    }

    if (THROW_EXCEPTION_ON_TIMEOUT) {
      // init the cause to be a TimeoutException so catchers can determine cause
      TimeoutException cause =
          new TimeoutException("Timed out waiting for ACKS.");
      throw new InternalGemFireException(
          String.format(
              "%s seconds have elapsed while waiting for replies: %s on %s whose current membership list is: [%s]",
              msgArgs),
          cause);
    } else if (suspectThem) {
      if (suspectMembers != null && suspectMembers.size() > 0) {
        getDistributionManager().getDistribution().suspectMembers(
            suspectMembers,
            "Failed to respond within ack-wait-threshold");
      }
    }
  }
process a wait-timeout. Usually suspectThem would be used in the first timeout, followed by a
subsequent use of disconnectThem

@param suspectThem whether to ask the membership manager to suspect the unresponsive members
@param severeAlert whether to ask the membership manager to disconnect the unresponseive
       members
geode-core/src/main/java/org/apache/geode/distributed/internal/ReplyProcessor21.java