/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2015, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.core.recovery; public class RecoveryCoordinator { public final static long BACKOFF_COEFFICIENT_MIN = 20; public final static long BACKOFF_MULTIPLIER = 4; static long BACKOFF_COEFFICIENT_MAX = 327680; // BACKOFF_COEFFICIENT_MIN * 4^7 private long backOffCoefficient = BACKOFF_COEFFICIENT_MIN; private static long UNSET = -1; // tests can set the time directly independently of system clock private long currentTime = UNSET; private long next; public RecoveryCoordinator() { next = getCurrentTime() + getBackoffCoefficient(); } public RecoveryCoordinator(long currentTime) { this.currentTime = currentTime; next = getCurrentTime() + getBackoffCoefficient(); } public boolean isTooSoon() { long now = getCurrentTime(); if (now > next) { next = now + getBackoffCoefficient(); return false; } else { return true; } } void setCurrentTime(long forcedTime) { currentTime = forcedTime; } private long getCurrentTime() { if (currentTime != UNSET) { return currentTime; } return System.currentTimeMillis(); } private long getBackoffCoefficient() { long currentCoeff = backOffCoefficient; if (backOffCoefficient < BACKOFF_COEFFICIENT_MAX) { backOffCoefficient *= BACKOFF_MULTIPLIER; } return currentCoeff; } }