View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
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   * A RecoverableZooKeeper instance which gives broken connections a number of times, and then
31   * returns good connections.
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        // Construct our "special" ZooKeeper instance
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  }