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