1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.zookeeper;
19
20 import java.io.IOException;
21 import java.util.concurrent.atomic.AtomicInteger;
22
23 import org.apache.zookeeper.KeeperException;
24 import org.apache.zookeeper.Watcher;
25 import org.apache.zookeeper.ZooKeeper;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29
30
31
32
33 public class SelfHealingRecoverableZooKeeper extends RecoverableZooKeeper {
34 private static final Logger LOG = LoggerFactory.getLogger(SelfHealingRecoverableZooKeeper.class);
35 private Watcher watcher;
36 private int sessionTimeout;
37 private String quorumServers;
38 private final AtomicInteger counter;
39
40 public SelfHealingRecoverableZooKeeper(String quorumServers, int sessionTimeout, Watcher watcher,
41 int maxRetries, int retryIntervalMillis, int maxSleepTime, String identifier,
42 int authFailedRetries, int authFailedPause, int numFailuresBeforeSuccess, int multiMaxSize)
43 throws IOException {
44 super(quorumServers, sessionTimeout, watcher, maxRetries, retryIntervalMillis, maxSleepTime,
45 identifier, authFailedRetries, authFailedPause, multiMaxSize);
46 this.quorumServers = quorumServers;
47 this.sessionTimeout = sessionTimeout;
48 this.watcher = watcher;
49 this.counter = new AtomicInteger(numFailuresBeforeSuccess);
50 }
51
52 @Override
53 ZooKeeper createNewZooKeeper() throws KeeperException {
54 try {
55 int remaining = counter.getAndDecrement();
56
57 AuthFailingZooKeeper zk = new AuthFailingZooKeeper(quorumServers, sessionTimeout, watcher);
58 if (remaining > 0) {
59 zk.triggerAuthFailed();
60 }
61 return zk;
62 } catch (IOException ex) {
63 LOG.warn("Unable to create ZooKeeper Connection", ex);
64 throw new KeeperException.OperationTimeoutException();
65 }
66 }
67 }