mirror of
https://github.com/fabianonline/telegram_backup.git
synced 2025-03-12 15:13:47 +00:00
65 lines
1.6 KiB
Java
65 lines
1.6 KiB
Java
package org.telegram.mtproto.backoff;
|
|
|
|
import org.telegram.mtproto.log.Logger;
|
|
|
|
import java.util.Random;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
/**
|
|
* Created by ex3ndr on 27.12.13.
|
|
*/
|
|
public class ExponentalBackoff {
|
|
|
|
private static final int MIN_DELAY = 100;
|
|
private static final int MAX_DELAY = 15000;
|
|
private static final int MAX_FAILURE_COUNT = 50;
|
|
|
|
private Random rnd = new Random();
|
|
|
|
private AtomicInteger currentFailureCount = new AtomicInteger();
|
|
|
|
private final String TAG;
|
|
|
|
public ExponentalBackoff(String logTag) {
|
|
this.TAG = logTag;
|
|
}
|
|
|
|
public void onFailure() throws InterruptedException {
|
|
int val = currentFailureCount.incrementAndGet();
|
|
if (val > 50) {
|
|
currentFailureCount.compareAndSet(val, MAX_FAILURE_COUNT);
|
|
val = MAX_FAILURE_COUNT;
|
|
}
|
|
|
|
int delay = MIN_DELAY + ((MAX_DELAY - MIN_DELAY) / MAX_FAILURE_COUNT) * val;
|
|
|
|
synchronized (this) {
|
|
Logger.d(TAG, "onFailure: wait " + delay + " ms");
|
|
wait(delay);
|
|
}
|
|
}
|
|
|
|
public void onFailureNoWait() {
|
|
Logger.d(TAG, "onFailureNoWait");
|
|
int val = currentFailureCount.incrementAndGet();
|
|
if (val > 50) {
|
|
currentFailureCount.compareAndSet(val, MAX_FAILURE_COUNT);
|
|
val = MAX_FAILURE_COUNT;
|
|
}
|
|
}
|
|
|
|
public void onSuccess() {
|
|
Logger.d(TAG, "onSuccess");
|
|
reset();
|
|
}
|
|
|
|
public void reset() {
|
|
Logger.d(TAG, "reset");
|
|
currentFailureCount.set(0);
|
|
|
|
synchronized (this) {
|
|
notifyAll();
|
|
}
|
|
}
|
|
}
|