1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.util;
21
22 import java.util.concurrent.TimeUnit;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26
27 public class RetryCounter {
28 private static final Log LOG = LogFactory.getLog(RetryCounter.class);
29 private final int maxRetries;
30 private int retriesRemaining;
31 private final int retryIntervalMillis;
32 private final TimeUnit timeUnit;
33
34 public RetryCounter(int maxRetries,
35 int retryIntervalMillis, TimeUnit timeUnit) {
36 this.maxRetries = maxRetries;
37 this.retriesRemaining = maxRetries;
38 this.retryIntervalMillis = retryIntervalMillis;
39 this.timeUnit = timeUnit;
40 }
41
42 public int getMaxRetries() {
43 return maxRetries;
44 }
45
46
47
48
49
50 public void sleepUntilNextRetry() throws InterruptedException {
51 int attempts = getAttemptTimes();
52 long sleepTime = (long) (retryIntervalMillis * Math.pow(2, attempts));
53 LOG.info("Sleeping " + sleepTime + "ms before retry #" + attempts + "...");
54 timeUnit.sleep(sleepTime);
55 }
56
57 public boolean shouldRetry() {
58 return retriesRemaining > 0;
59 }
60
61 public void useRetry() {
62 retriesRemaining--;
63 }
64
65 public int getAttemptTimes() {
66 return maxRetries-retriesRemaining+1;
67 }
68 }