code: void proposeNewEpoch()
        throws IOException {
      long maxEpoch = persistence.getProposedEpoch();
      int maxSyncTimeoutMs = getSyncTimeoutMs();
      for (PeerHandler ph : this.quorumMap.values()) {
        if (ph.getLastProposedEpoch() > maxEpoch) {
          maxEpoch = ph.getLastProposedEpoch();
        }
        if (ph.getSyncTimeoutMs() > maxSyncTimeoutMs) {
          maxSyncTimeoutMs = ph.getSyncTimeoutMs();
        }
      }
      // The new epoch number should be larger than any follower's epoch.
      long newEpoch = maxEpoch + 1;
      // Updates leader's last proposed epoch.
      persistence.setProposedEpoch(newEpoch);
      // Updates leader's sync timeout to the largest timeout found in the quorum.
      setSyncTimeoutMs(maxSyncTimeoutMs);
      LOG.debug("Begins proposing new epoch {} with sync timeout {} ms",
                newEpoch, getSyncTimeoutMs());
      // Sends new epoch message to quorum.
      broadcast(this.quorumMap.keySet().iterator(),
                MessageBuilder.buildNewEpochMessage(newEpoch,
                                                    getSyncTimeoutMs()));
    }
docs: Finds an epoch number which is higher than any proposed epoch in quorum
  set and propose the epoch to them.
  
  @throws IOException in case of IO failure.