View Javadoc

1   /**
2    * Copyright 2010 The Apache Software Foundation
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS,
16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17   * See the License for the specific language governing permissions and
18   * limitations under the License.
19   */
20  package org.apache.hadoop.hbase.zookeeper;
21  
22  import java.io.IOException;
23  
24  import org.apache.commons.logging.Log;
25  import org.apache.commons.logging.LogFactory;
26  import org.apache.hadoop.hbase.Abortable;
27  import org.apache.hadoop.hbase.HRegionInfo;
28  import org.apache.hadoop.hbase.catalog.CatalogTracker;
29  
30  /**
31   * Tracks the unassigned zookeeper node used by the META table.
32   *
33   * A callback is made into the passed {@link CatalogTracker} when
34   * <code>.META.</code> completes a new assignment.
35   * <p>
36   * If META is already assigned when instantiating this class, you will not
37   * receive any notification for that assignment.  You will receive a
38   * notification after META has been successfully assigned to a new location.
39   */
40  public class MetaNodeTracker extends ZooKeeperNodeTracker {
41    private static final Log LOG = LogFactory.getLog(MetaNodeTracker.class);
42  
43    /** Catalog tracker to notify when META has a new assignment completed. */
44    private final CatalogTracker catalogTracker;
45  
46    /**
47     * Creates a meta node tracker.
48     * @param watcher
49     * @param abortable
50     */
51    public MetaNodeTracker(final ZooKeeperWatcher watcher,
52        final CatalogTracker catalogTracker, final Abortable abortable) {
53      super(watcher, ZKUtil.joinZNode(watcher.assignmentZNode,
54          HRegionInfo.FIRST_META_REGIONINFO.getEncodedName()), abortable);
55      this.catalogTracker = catalogTracker;
56    }
57  
58    @Override
59    public void nodeDeleted(String path) {
60      super.nodeDeleted(path);
61      if (!path.equals(node)) return;
62      LOG.info("Detected completed assignment of META, notifying catalog tracker");
63      try {
64        this.catalogTracker.waitForMetaServerConnectionDefault();
65      } catch (IOException e) {
66        LOG.warn("Tried to reset META server location after seeing the " +
67          "completion of a new META assignment but got an IOE", e);
68      }
69    }
70  }