You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2014/07/18 06:34:23 UTC
git commit: HBASE-11471 Move TableStateManager and
ZkTableStateManager and Server to hbase-server (Alex Newman)
Repository: hbase
Updated Branches:
refs/heads/branch-1 553c86d7d -> 4fb32de39
HBASE-11471 Move TableStateManager and ZkTableStateManager and Server to hbase-server (Alex Newman)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/4fb32de3
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/4fb32de3
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/4fb32de3
Branch: refs/heads/branch-1
Commit: 4fb32de394f4e14908c6ee7cce64216b0537db98
Parents: 553c86d
Author: Ted Yu <te...@apache.org>
Authored: Fri Jul 18 04:34:11 2014 +0000
Committer: Ted Yu <te...@apache.org>
Committed: Fri Jul 18 04:34:11 2014 +0000
----------------------------------------------------------------------
.../hadoop/hbase/CoordinatedStateManager.java | 66 ----
.../java/org/apache/hadoop/hbase/Server.java | 72 ----
.../apache/hadoop/hbase/TableStateManager.java | 115 -------
.../hbase/zookeeper/ZKTableStateManager.java | 330 -------------------
.../hadoop/hbase/CoordinatedStateManager.java | 66 ++++
.../java/org/apache/hadoop/hbase/Server.java | 72 ++++
.../apache/hadoop/hbase/TableStateManager.java | 115 +++++++
.../hbase/zookeeper/ZKTableStateManager.java | 330 +++++++++++++++++++
8 files changed, 583 insertions(+), 583 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/4fb32de3/hbase-client/src/main/java/org/apache/hadoop/hbase/CoordinatedStateManager.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/CoordinatedStateManager.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/CoordinatedStateManager.java
deleted file mode 100644
index 2642e29..0000000
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/CoordinatedStateManager.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.hbase;
-
-import org.apache.hadoop.classification.InterfaceAudience;
-
-/**
- * Implementations of this interface will keep and return to clients
- * implementations of classes providing API to execute
- * coordinated operations. This interface is client-side, so it does NOT
- * include methods to retrieve the particular interface implementations.
- *
- * For each coarse-grained area of operations there will be a separate
- * interface with implementation, providing API for relevant operations
- * requiring coordination.
- *
- * Property hbase.coordinated.state.manager.class in hbase-site.xml controls
- * which provider to use.
- */
-@InterfaceAudience.Private
-public interface CoordinatedStateManager {
-
- /**
- * Initialize coordinated state management service.
- * @param server server instance to run within.
- */
- void initialize(Server server);
-
- /**
- * Starts service.
- */
- void start();
-
- /**
- * Stops service.
- */
- void stop();
-
- /**
- * @return instance of Server coordinated state manager runs within
- */
- Server getServer();
-
- /**
- * Returns implementation of TableStateManager.
- * @throws InterruptedException if operation is interrupted
- * @throws CoordinatedStateException if error happens in underlying coordination mechanism
- */
- TableStateManager getTableStateManager() throws InterruptedException,
- CoordinatedStateException;
-}
http://git-wip-us.apache.org/repos/asf/hbase/blob/4fb32de3/hbase-client/src/main/java/org/apache/hadoop/hbase/Server.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/Server.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/Server.java
deleted file mode 100644
index 8f1a004..0000000
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/Server.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.hbase;
-
-import org.apache.hadoop.classification.InterfaceAudience;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.client.HConnection;
-import org.apache.hadoop.hbase.zookeeper.MetaTableLocator;
-import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
-
-/**
- * Defines the set of shared functions implemented by HBase servers (Masters
- * and RegionServers).
- */
-@InterfaceAudience.Private
-public interface Server extends Abortable, Stoppable {
- /**
- * Gets the configuration object for this server.
- */
- Configuration getConfiguration();
-
- /**
- * Gets the ZooKeeper instance for this server.
- */
- ZooKeeperWatcher getZooKeeper();
-
- /**
- * Returns reference to wrapped short-circuit (i.e. local, bypassing RPC layer entirely)
- * HConnection to this server, which may be used for miscellaneous needs.
- *
- * Important note: this method returns reference to connection which is managed
- * by Server itself, so callers must NOT attempt to close connection obtained.
- *
- * See {@link org.apache.hadoop.hbase.client.ConnectionUtils#createShortCircuitHConnection}
- * for details on short-circuit connections.
- */
- HConnection getShortCircuitConnection();
-
- /**
- * Returns instance of {@link org.apache.hadoop.hbase.zookeeper.MetaTableLocator}
- * running inside this server. This MetaServerLocator is started and stopped by server, clients
- * shouldn't manage it's lifecycle.
- * @return instance of {@link MetaTableLocator} associated with this server.
- */
- MetaTableLocator getMetaTableLocator();
-
- /**
- * @return The unique server name for this server.
- */
- ServerName getServerName();
-
- /**
- * Get CoordinatedStateManager instance for this server.
- */
- CoordinatedStateManager getCoordinatedStateManager();
-}
http://git-wip-us.apache.org/repos/asf/hbase/blob/4fb32de3/hbase-client/src/main/java/org/apache/hadoop/hbase/TableStateManager.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/TableStateManager.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/TableStateManager.java
deleted file mode 100644
index 56cd4ae..0000000
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/TableStateManager.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.hbase;
-
-import org.apache.hadoop.classification.InterfaceAudience;
-import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos;
-
-import java.io.InterruptedIOException;
-import java.util.Set;
-
-/**
- * Helper class for table state management for operations running inside
- * RegionServer or HMaster.
- * Depending on implementation, fetches information from HBase system table,
- * local data store, ZooKeeper ensemble or somewhere else.
- * Code running on client side (with no coordinated state context) shall instead use
- * {@link org.apache.hadoop.hbase.zookeeper.ZKTableStateClientSideReader}
- */
-@InterfaceAudience.Private
-public interface TableStateManager {
-
- /**
- * Sets the table into desired state. Fails silently if the table is already in this state.
- * @param tableName table to process
- * @param state new state of this table
- * @throws CoordinatedStateException if error happened when trying to set table state
- */
- void setTableState(TableName tableName, ZooKeeperProtos.Table.State state)
- throws CoordinatedStateException;
-
- /**
- * Sets the specified table into the newState, but only if the table is already in
- * one of the possibleCurrentStates (otherwise no operation is performed).
- * @param tableName table to process
- * @param newState new state for the table
- * @param states table should be in one of these states for the operation
- * to be performed
- * @throws CoordinatedStateException if error happened while performing operation
- * @return true if operation succeeded, false otherwise
- */
- boolean setTableStateIfInStates(TableName tableName, ZooKeeperProtos.Table.State newState,
- ZooKeeperProtos.Table.State... states)
- throws CoordinatedStateException;
-
- /**
- * Sets the specified table into the newState, but only if the table is NOT in
- * one of the possibleCurrentStates (otherwise no operation is performed).
- * @param tableName table to process
- * @param newState new state for the table
- * @param states table should NOT be in one of these states for the operation
- * to be performed
- * @throws CoordinatedStateException if error happened while performing operation
- * @return true if operation succeeded, false otherwise
- */
- boolean setTableStateIfNotInStates(TableName tableName, ZooKeeperProtos.Table.State newState,
- ZooKeeperProtos.Table.State... states)
- throws CoordinatedStateException;
-
- /**
- * @return true if the table is in any one of the listed states, false otherwise.
- */
- boolean isTableState(TableName tableName, ZooKeeperProtos.Table.State... states);
-
- /**
- * Mark table as deleted. Fails silently if the table is not currently marked as disabled.
- * @param tableName table to be deleted
- * @throws CoordinatedStateException if error happened while performing operation
- */
- void setDeletedTable(TableName tableName) throws CoordinatedStateException;
-
- /**
- * Checks if table is present.
- *
- * @param tableName table we're checking
- * @return true if the table is present, false otherwise
- */
- boolean isTablePresent(TableName tableName);
-
- /**
- * @return set of tables which are in any one of the listed states, empty Set if none
- */
- Set<TableName> getTablesInStates(ZooKeeperProtos.Table.State... states)
- throws InterruptedIOException, CoordinatedStateException;
-
- /**
- * If the table is found in the given state the in-memory state is removed. This
- * helps in cases where CreateTable is to be retried by the client in case of
- * failures. If deletePermanentState is true - the flag kept permanently is
- * also reset.
- *
- * @param tableName table we're working on
- * @param states if table isn't in any one of these states, operation aborts
- * @param deletePermanentState if true, reset the permanent flag
- * @throws CoordinatedStateException if error happened in underlying coordination engine
- */
- void checkAndRemoveTableState(TableName tableName, ZooKeeperProtos.Table.State states,
- boolean deletePermanentState)
- throws CoordinatedStateException;
-}
http://git-wip-us.apache.org/repos/asf/hbase/blob/4fb32de3/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTableStateManager.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTableStateManager.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTableStateManager.java
deleted file mode 100644
index 1aff12f..0000000
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTableStateManager.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.hbase.zookeeper;
-
-import com.google.protobuf.InvalidProtocolBufferException;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.classification.InterfaceAudience;
-import org.apache.hadoop.hbase.CoordinatedStateException;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.TableStateManager;
-import org.apache.hadoop.hbase.exceptions.DeserializationException;
-import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
-import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos;
-import org.apache.zookeeper.KeeperException;
-
-import java.io.InterruptedIOException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Implementation of TableStateManager which reads, caches and sets state
- * up in ZooKeeper. If multiple read/write clients, will make for confusion.
- * Code running on client side without consensus context should use
- * {@link ZKTableStateClientSideReader} instead.
- *
- * <p>To save on trips to the zookeeper ensemble, internally we cache table
- * state.
- */
-@InterfaceAudience.Private
-public class ZKTableStateManager implements TableStateManager {
- // A znode will exist under the table directory if it is in any of the
- // following states: {@link TableState#ENABLING} , {@link TableState#DISABLING},
- // or {@link TableState#DISABLED}. If {@link TableState#ENABLED}, there will
- // be no entry for a table in zk. Thats how it currently works.
-
- private static final Log LOG = LogFactory.getLog(ZKTableStateManager.class);
- private final ZooKeeperWatcher watcher;
-
- /**
- * Cache of what we found in zookeeper so we don't have to go to zk ensemble
- * for every query. Synchronize access rather than use concurrent Map because
- * synchronization needs to span query of zk.
- */
- private final Map<TableName, ZooKeeperProtos.Table.State> cache =
- new HashMap<TableName, ZooKeeperProtos.Table.State>();
-
- public ZKTableStateManager(final ZooKeeperWatcher zkw) throws KeeperException,
- InterruptedException {
- super();
- this.watcher = zkw;
- populateTableStates();
- }
-
- /**
- * Gets a list of all the tables set as disabled in zookeeper.
- * @throws KeeperException, InterruptedException
- */
- private void populateTableStates() throws KeeperException, InterruptedException {
- synchronized (this.cache) {
- List<String> children = ZKUtil.listChildrenNoWatch(this.watcher, this.watcher.tableZNode);
- if (children == null) return;
- for (String child: children) {
- TableName tableName = TableName.valueOf(child);
- ZooKeeperProtos.Table.State state = getTableState(this.watcher, tableName);
- if (state != null) this.cache.put(tableName, state);
- }
- }
- }
-
- /**
- * Sets table state in ZK. Sets no watches.
- *
- * {@inheritDoc}
- */
- @Override
- public void setTableState(TableName tableName, ZooKeeperProtos.Table.State state)
- throws CoordinatedStateException {
- synchronized (this.cache) {
- LOG.warn("Moving table " + tableName + " state from " + this.cache.get(tableName)
- + " to " + state);
- try {
- setTableStateInZK(tableName, state);
- } catch (KeeperException e) {
- throw new CoordinatedStateException(e);
- }
- }
- }
-
- /**
- * Checks and sets table state in ZK. Sets no watches.
- * {@inheritDoc}
- */
- @Override
- public boolean setTableStateIfInStates(TableName tableName,
- ZooKeeperProtos.Table.State newState,
- ZooKeeperProtos.Table.State... states)
- throws CoordinatedStateException {
- synchronized (this.cache) {
- // Transition ENABLED->DISABLING has to be performed with a hack, because
- // we treat empty state as enabled in this case because 0.92- clusters.
- if (
- (newState == ZooKeeperProtos.Table.State.DISABLING) &&
- this.cache.get(tableName) != null && !isTableState(tableName, states) ||
- (newState != ZooKeeperProtos.Table.State.DISABLING &&
- !isTableState(tableName, states) )) {
- return false;
- }
- try {
- setTableStateInZK(tableName, newState);
- } catch (KeeperException e) {
- throw new CoordinatedStateException(e);
- }
- return true;
- }
- }
-
- /**
- * Checks and sets table state in ZK. Sets no watches.
- * {@inheritDoc}
- */
- @Override
- public boolean setTableStateIfNotInStates(TableName tableName,
- ZooKeeperProtos.Table.State newState,
- ZooKeeperProtos.Table.State... states)
- throws CoordinatedStateException {
- synchronized (this.cache) {
- if (isTableState(tableName, states)) {
- return false;
- }
- try {
- setTableStateInZK(tableName, newState);
- } catch (KeeperException e) {
- throw new CoordinatedStateException(e);
- }
- return true;
- }
- }
-
- private void setTableStateInZK(final TableName tableName,
- final ZooKeeperProtos.Table.State state)
- throws KeeperException {
- String znode = ZKUtil.joinZNode(this.watcher.tableZNode, tableName.getNameAsString());
- if (ZKUtil.checkExists(this.watcher, znode) == -1) {
- ZKUtil.createAndFailSilent(this.watcher, znode);
- }
- synchronized (this.cache) {
- ZooKeeperProtos.Table.Builder builder = ZooKeeperProtos.Table.newBuilder();
- builder.setState(state);
- byte [] data = ProtobufUtil.prependPBMagic(builder.build().toByteArray());
- ZKUtil.setData(this.watcher, znode, data);
- this.cache.put(tableName, state);
- }
- }
-
- /**
- * Checks if table is marked in specified state in ZK.
- *
- * {@inheritDoc}
- */
- @Override
- public boolean isTableState(final TableName tableName,
- final ZooKeeperProtos.Table.State... states) {
- synchronized (this.cache) {
- ZooKeeperProtos.Table.State currentState = this.cache.get(tableName);
- return isTableInState(Arrays.asList(states), currentState);
- }
- }
-
- /**
- * Deletes the table in zookeeper. Fails silently if the
- * table is not currently disabled in zookeeper. Sets no watches.
- *
- * {@inheritDoc}
- */
- @Override
- public void setDeletedTable(final TableName tableName)
- throws CoordinatedStateException {
- synchronized (this.cache) {
- if (this.cache.remove(tableName) == null) {
- LOG.warn("Moving table " + tableName + " state to deleted but was " +
- "already deleted");
- }
- try {
- ZKUtil.deleteNodeFailSilent(this.watcher,
- ZKUtil.joinZNode(this.watcher.tableZNode, tableName.getNameAsString()));
- } catch (KeeperException e) {
- throw new CoordinatedStateException(e);
- }
- }
- }
-
- /**
- * check if table is present.
- *
- * @param tableName table we're working on
- * @return true if the table is present
- */
- @Override
- public boolean isTablePresent(final TableName tableName) {
- synchronized (this.cache) {
- ZooKeeperProtos.Table.State state = this.cache.get(tableName);
- return !(state == null);
- }
- }
-
- /**
- * Gets a list of all the tables set as disabling in zookeeper.
- * @return Set of disabling tables, empty Set if none
- * @throws CoordinatedStateException if error happened in underlying coordination engine
- */
- @Override
- public Set<TableName> getTablesInStates(ZooKeeperProtos.Table.State... states)
- throws InterruptedIOException, CoordinatedStateException {
- try {
- return getAllTables(states);
- } catch (KeeperException e) {
- throw new CoordinatedStateException(e);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void checkAndRemoveTableState(TableName tableName, ZooKeeperProtos.Table.State states,
- boolean deletePermanentState)
- throws CoordinatedStateException {
- synchronized (this.cache) {
- if (isTableState(tableName, states)) {
- this.cache.remove(tableName);
- if (deletePermanentState) {
- try {
- ZKUtil.deleteNodeFailSilent(this.watcher,
- ZKUtil.joinZNode(this.watcher.tableZNode, tableName.getNameAsString()));
- } catch (KeeperException e) {
- throw new CoordinatedStateException(e);
- }
- }
- }
- }
- }
-
- /**
- * Gets a list of all the tables of specified states in zookeeper.
- * @return Set of tables of specified states, empty Set if none
- * @throws KeeperException
- */
- Set<TableName> getAllTables(final ZooKeeperProtos.Table.State... states)
- throws KeeperException, InterruptedIOException {
-
- Set<TableName> allTables = new HashSet<TableName>();
- List<String> children =
- ZKUtil.listChildrenNoWatch(watcher, watcher.tableZNode);
- if(children == null) return allTables;
- for (String child: children) {
- TableName tableName = TableName.valueOf(child);
- ZooKeeperProtos.Table.State state;
- try {
- state = getTableState(watcher, tableName);
- } catch (InterruptedException e) {
- throw new InterruptedIOException();
- }
- for (ZooKeeperProtos.Table.State expectedState: states) {
- if (state == expectedState) {
- allTables.add(tableName);
- break;
- }
- }
- }
- return allTables;
- }
-
- /**
- * Gets table state from ZK.
- * @param zkw ZooKeeperWatcher instance to use
- * @param tableName table we're checking
- * @return Null or {@link ZooKeeperProtos.Table.State} found in znode.
- * @throws KeeperException
- */
- private ZooKeeperProtos.Table.State getTableState(final ZooKeeperWatcher zkw,
- final TableName tableName)
- throws KeeperException, InterruptedException {
- String znode = ZKUtil.joinZNode(zkw.tableZNode, tableName.getNameAsString());
- byte [] data = ZKUtil.getData(zkw, znode);
- if (data == null || data.length <= 0) return null;
- try {
- ProtobufUtil.expectPBMagicPrefix(data);
- ZooKeeperProtos.Table.Builder builder = ZooKeeperProtos.Table.newBuilder();
- int magicLen = ProtobufUtil.lengthOfPBMagic();
- ZooKeeperProtos.Table t = builder.mergeFrom(data, magicLen, data.length - magicLen).build();
- return t.getState();
- } catch (InvalidProtocolBufferException e) {
- KeeperException ke = new KeeperException.DataInconsistencyException();
- ke.initCause(e);
- throw ke;
- } catch (DeserializationException e) {
- throw ZKUtil.convert(e);
- }
- }
-
- /**
- * @return true if current state isn't null and is contained
- * in the list of expected states.
- */
- private boolean isTableInState(final List<ZooKeeperProtos.Table.State> expectedStates,
- final ZooKeeperProtos.Table.State currentState) {
- return currentState != null && expectedStates.contains(currentState);
- }
-}
http://git-wip-us.apache.org/repos/asf/hbase/blob/4fb32de3/hbase-server/src/main/java/org/apache/hadoop/hbase/CoordinatedStateManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/CoordinatedStateManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/CoordinatedStateManager.java
new file mode 100644
index 0000000..2642e29
--- /dev/null
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/CoordinatedStateManager.java
@@ -0,0 +1,66 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+
+/**
+ * Implementations of this interface will keep and return to clients
+ * implementations of classes providing API to execute
+ * coordinated operations. This interface is client-side, so it does NOT
+ * include methods to retrieve the particular interface implementations.
+ *
+ * For each coarse-grained area of operations there will be a separate
+ * interface with implementation, providing API for relevant operations
+ * requiring coordination.
+ *
+ * Property hbase.coordinated.state.manager.class in hbase-site.xml controls
+ * which provider to use.
+ */
+@InterfaceAudience.Private
+public interface CoordinatedStateManager {
+
+ /**
+ * Initialize coordinated state management service.
+ * @param server server instance to run within.
+ */
+ void initialize(Server server);
+
+ /**
+ * Starts service.
+ */
+ void start();
+
+ /**
+ * Stops service.
+ */
+ void stop();
+
+ /**
+ * @return instance of Server coordinated state manager runs within
+ */
+ Server getServer();
+
+ /**
+ * Returns implementation of TableStateManager.
+ * @throws InterruptedException if operation is interrupted
+ * @throws CoordinatedStateException if error happens in underlying coordination mechanism
+ */
+ TableStateManager getTableStateManager() throws InterruptedException,
+ CoordinatedStateException;
+}
http://git-wip-us.apache.org/repos/asf/hbase/blob/4fb32de3/hbase-server/src/main/java/org/apache/hadoop/hbase/Server.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/Server.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/Server.java
new file mode 100644
index 0000000..8f1a004
--- /dev/null
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/Server.java
@@ -0,0 +1,72 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.client.HConnection;
+import org.apache.hadoop.hbase.zookeeper.MetaTableLocator;
+import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
+
+/**
+ * Defines the set of shared functions implemented by HBase servers (Masters
+ * and RegionServers).
+ */
+@InterfaceAudience.Private
+public interface Server extends Abortable, Stoppable {
+ /**
+ * Gets the configuration object for this server.
+ */
+ Configuration getConfiguration();
+
+ /**
+ * Gets the ZooKeeper instance for this server.
+ */
+ ZooKeeperWatcher getZooKeeper();
+
+ /**
+ * Returns reference to wrapped short-circuit (i.e. local, bypassing RPC layer entirely)
+ * HConnection to this server, which may be used for miscellaneous needs.
+ *
+ * Important note: this method returns reference to connection which is managed
+ * by Server itself, so callers must NOT attempt to close connection obtained.
+ *
+ * See {@link org.apache.hadoop.hbase.client.ConnectionUtils#createShortCircuitHConnection}
+ * for details on short-circuit connections.
+ */
+ HConnection getShortCircuitConnection();
+
+ /**
+ * Returns instance of {@link org.apache.hadoop.hbase.zookeeper.MetaTableLocator}
+ * running inside this server. This MetaServerLocator is started and stopped by server, clients
+ * shouldn't manage it's lifecycle.
+ * @return instance of {@link MetaTableLocator} associated with this server.
+ */
+ MetaTableLocator getMetaTableLocator();
+
+ /**
+ * @return The unique server name for this server.
+ */
+ ServerName getServerName();
+
+ /**
+ * Get CoordinatedStateManager instance for this server.
+ */
+ CoordinatedStateManager getCoordinatedStateManager();
+}
http://git-wip-us.apache.org/repos/asf/hbase/blob/4fb32de3/hbase-server/src/main/java/org/apache/hadoop/hbase/TableStateManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/TableStateManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/TableStateManager.java
new file mode 100644
index 0000000..56cd4ae
--- /dev/null
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/TableStateManager.java
@@ -0,0 +1,115 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos;
+
+import java.io.InterruptedIOException;
+import java.util.Set;
+
+/**
+ * Helper class for table state management for operations running inside
+ * RegionServer or HMaster.
+ * Depending on implementation, fetches information from HBase system table,
+ * local data store, ZooKeeper ensemble or somewhere else.
+ * Code running on client side (with no coordinated state context) shall instead use
+ * {@link org.apache.hadoop.hbase.zookeeper.ZKTableStateClientSideReader}
+ */
+@InterfaceAudience.Private
+public interface TableStateManager {
+
+ /**
+ * Sets the table into desired state. Fails silently if the table is already in this state.
+ * @param tableName table to process
+ * @param state new state of this table
+ * @throws CoordinatedStateException if error happened when trying to set table state
+ */
+ void setTableState(TableName tableName, ZooKeeperProtos.Table.State state)
+ throws CoordinatedStateException;
+
+ /**
+ * Sets the specified table into the newState, but only if the table is already in
+ * one of the possibleCurrentStates (otherwise no operation is performed).
+ * @param tableName table to process
+ * @param newState new state for the table
+ * @param states table should be in one of these states for the operation
+ * to be performed
+ * @throws CoordinatedStateException if error happened while performing operation
+ * @return true if operation succeeded, false otherwise
+ */
+ boolean setTableStateIfInStates(TableName tableName, ZooKeeperProtos.Table.State newState,
+ ZooKeeperProtos.Table.State... states)
+ throws CoordinatedStateException;
+
+ /**
+ * Sets the specified table into the newState, but only if the table is NOT in
+ * one of the possibleCurrentStates (otherwise no operation is performed).
+ * @param tableName table to process
+ * @param newState new state for the table
+ * @param states table should NOT be in one of these states for the operation
+ * to be performed
+ * @throws CoordinatedStateException if error happened while performing operation
+ * @return true if operation succeeded, false otherwise
+ */
+ boolean setTableStateIfNotInStates(TableName tableName, ZooKeeperProtos.Table.State newState,
+ ZooKeeperProtos.Table.State... states)
+ throws CoordinatedStateException;
+
+ /**
+ * @return true if the table is in any one of the listed states, false otherwise.
+ */
+ boolean isTableState(TableName tableName, ZooKeeperProtos.Table.State... states);
+
+ /**
+ * Mark table as deleted. Fails silently if the table is not currently marked as disabled.
+ * @param tableName table to be deleted
+ * @throws CoordinatedStateException if error happened while performing operation
+ */
+ void setDeletedTable(TableName tableName) throws CoordinatedStateException;
+
+ /**
+ * Checks if table is present.
+ *
+ * @param tableName table we're checking
+ * @return true if the table is present, false otherwise
+ */
+ boolean isTablePresent(TableName tableName);
+
+ /**
+ * @return set of tables which are in any one of the listed states, empty Set if none
+ */
+ Set<TableName> getTablesInStates(ZooKeeperProtos.Table.State... states)
+ throws InterruptedIOException, CoordinatedStateException;
+
+ /**
+ * If the table is found in the given state the in-memory state is removed. This
+ * helps in cases where CreateTable is to be retried by the client in case of
+ * failures. If deletePermanentState is true - the flag kept permanently is
+ * also reset.
+ *
+ * @param tableName table we're working on
+ * @param states if table isn't in any one of these states, operation aborts
+ * @param deletePermanentState if true, reset the permanent flag
+ * @throws CoordinatedStateException if error happened in underlying coordination engine
+ */
+ void checkAndRemoveTableState(TableName tableName, ZooKeeperProtos.Table.State states,
+ boolean deletePermanentState)
+ throws CoordinatedStateException;
+}
http://git-wip-us.apache.org/repos/asf/hbase/blob/4fb32de3/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTableStateManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTableStateManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTableStateManager.java
new file mode 100644
index 0000000..1aff12f
--- /dev/null
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTableStateManager.java
@@ -0,0 +1,330 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.zookeeper;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.hbase.CoordinatedStateException;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.TableStateManager;
+import org.apache.hadoop.hbase.exceptions.DeserializationException;
+import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
+import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos;
+import org.apache.zookeeper.KeeperException;
+
+import java.io.InterruptedIOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Implementation of TableStateManager which reads, caches and sets state
+ * up in ZooKeeper. If multiple read/write clients, will make for confusion.
+ * Code running on client side without consensus context should use
+ * {@link ZKTableStateClientSideReader} instead.
+ *
+ * <p>To save on trips to the zookeeper ensemble, internally we cache table
+ * state.
+ */
+@InterfaceAudience.Private
+public class ZKTableStateManager implements TableStateManager {
+ // A znode will exist under the table directory if it is in any of the
+ // following states: {@link TableState#ENABLING} , {@link TableState#DISABLING},
+ // or {@link TableState#DISABLED}. If {@link TableState#ENABLED}, there will
+ // be no entry for a table in zk. Thats how it currently works.
+
+ private static final Log LOG = LogFactory.getLog(ZKTableStateManager.class);
+ private final ZooKeeperWatcher watcher;
+
+ /**
+ * Cache of what we found in zookeeper so we don't have to go to zk ensemble
+ * for every query. Synchronize access rather than use concurrent Map because
+ * synchronization needs to span query of zk.
+ */
+ private final Map<TableName, ZooKeeperProtos.Table.State> cache =
+ new HashMap<TableName, ZooKeeperProtos.Table.State>();
+
+ public ZKTableStateManager(final ZooKeeperWatcher zkw) throws KeeperException,
+ InterruptedException {
+ super();
+ this.watcher = zkw;
+ populateTableStates();
+ }
+
+ /**
+ * Gets a list of all the tables set as disabled in zookeeper.
+ * @throws KeeperException, InterruptedException
+ */
+ private void populateTableStates() throws KeeperException, InterruptedException {
+ synchronized (this.cache) {
+ List<String> children = ZKUtil.listChildrenNoWatch(this.watcher, this.watcher.tableZNode);
+ if (children == null) return;
+ for (String child: children) {
+ TableName tableName = TableName.valueOf(child);
+ ZooKeeperProtos.Table.State state = getTableState(this.watcher, tableName);
+ if (state != null) this.cache.put(tableName, state);
+ }
+ }
+ }
+
+ /**
+ * Sets table state in ZK. Sets no watches.
+ *
+ * {@inheritDoc}
+ */
+ @Override
+ public void setTableState(TableName tableName, ZooKeeperProtos.Table.State state)
+ throws CoordinatedStateException {
+ synchronized (this.cache) {
+ LOG.warn("Moving table " + tableName + " state from " + this.cache.get(tableName)
+ + " to " + state);
+ try {
+ setTableStateInZK(tableName, state);
+ } catch (KeeperException e) {
+ throw new CoordinatedStateException(e);
+ }
+ }
+ }
+
+ /**
+ * Checks and sets table state in ZK. Sets no watches.
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean setTableStateIfInStates(TableName tableName,
+ ZooKeeperProtos.Table.State newState,
+ ZooKeeperProtos.Table.State... states)
+ throws CoordinatedStateException {
+ synchronized (this.cache) {
+ // Transition ENABLED->DISABLING has to be performed with a hack, because
+ // we treat empty state as enabled in this case because 0.92- clusters.
+ if (
+ (newState == ZooKeeperProtos.Table.State.DISABLING) &&
+ this.cache.get(tableName) != null && !isTableState(tableName, states) ||
+ (newState != ZooKeeperProtos.Table.State.DISABLING &&
+ !isTableState(tableName, states) )) {
+ return false;
+ }
+ try {
+ setTableStateInZK(tableName, newState);
+ } catch (KeeperException e) {
+ throw new CoordinatedStateException(e);
+ }
+ return true;
+ }
+ }
+
+ /**
+ * Checks and sets table state in ZK. Sets no watches.
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean setTableStateIfNotInStates(TableName tableName,
+ ZooKeeperProtos.Table.State newState,
+ ZooKeeperProtos.Table.State... states)
+ throws CoordinatedStateException {
+ synchronized (this.cache) {
+ if (isTableState(tableName, states)) {
+ return false;
+ }
+ try {
+ setTableStateInZK(tableName, newState);
+ } catch (KeeperException e) {
+ throw new CoordinatedStateException(e);
+ }
+ return true;
+ }
+ }
+
+ private void setTableStateInZK(final TableName tableName,
+ final ZooKeeperProtos.Table.State state)
+ throws KeeperException {
+ String znode = ZKUtil.joinZNode(this.watcher.tableZNode, tableName.getNameAsString());
+ if (ZKUtil.checkExists(this.watcher, znode) == -1) {
+ ZKUtil.createAndFailSilent(this.watcher, znode);
+ }
+ synchronized (this.cache) {
+ ZooKeeperProtos.Table.Builder builder = ZooKeeperProtos.Table.newBuilder();
+ builder.setState(state);
+ byte [] data = ProtobufUtil.prependPBMagic(builder.build().toByteArray());
+ ZKUtil.setData(this.watcher, znode, data);
+ this.cache.put(tableName, state);
+ }
+ }
+
+ /**
+ * Checks if table is marked in specified state in ZK.
+ *
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isTableState(final TableName tableName,
+ final ZooKeeperProtos.Table.State... states) {
+ synchronized (this.cache) {
+ ZooKeeperProtos.Table.State currentState = this.cache.get(tableName);
+ return isTableInState(Arrays.asList(states), currentState);
+ }
+ }
+
+ /**
+ * Deletes the table in zookeeper. Fails silently if the
+ * table is not currently disabled in zookeeper. Sets no watches.
+ *
+ * {@inheritDoc}
+ */
+ @Override
+ public void setDeletedTable(final TableName tableName)
+ throws CoordinatedStateException {
+ synchronized (this.cache) {
+ if (this.cache.remove(tableName) == null) {
+ LOG.warn("Moving table " + tableName + " state to deleted but was " +
+ "already deleted");
+ }
+ try {
+ ZKUtil.deleteNodeFailSilent(this.watcher,
+ ZKUtil.joinZNode(this.watcher.tableZNode, tableName.getNameAsString()));
+ } catch (KeeperException e) {
+ throw new CoordinatedStateException(e);
+ }
+ }
+ }
+
+ /**
+ * check if table is present.
+ *
+ * @param tableName table we're working on
+ * @return true if the table is present
+ */
+ @Override
+ public boolean isTablePresent(final TableName tableName) {
+ synchronized (this.cache) {
+ ZooKeeperProtos.Table.State state = this.cache.get(tableName);
+ return !(state == null);
+ }
+ }
+
+ /**
+ * Gets a list of all the tables set as disabling in zookeeper.
+ * @return Set of disabling tables, empty Set if none
+ * @throws CoordinatedStateException if error happened in underlying coordination engine
+ */
+ @Override
+ public Set<TableName> getTablesInStates(ZooKeeperProtos.Table.State... states)
+ throws InterruptedIOException, CoordinatedStateException {
+ try {
+ return getAllTables(states);
+ } catch (KeeperException e) {
+ throw new CoordinatedStateException(e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void checkAndRemoveTableState(TableName tableName, ZooKeeperProtos.Table.State states,
+ boolean deletePermanentState)
+ throws CoordinatedStateException {
+ synchronized (this.cache) {
+ if (isTableState(tableName, states)) {
+ this.cache.remove(tableName);
+ if (deletePermanentState) {
+ try {
+ ZKUtil.deleteNodeFailSilent(this.watcher,
+ ZKUtil.joinZNode(this.watcher.tableZNode, tableName.getNameAsString()));
+ } catch (KeeperException e) {
+ throw new CoordinatedStateException(e);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Gets a list of all the tables of specified states in zookeeper.
+ * @return Set of tables of specified states, empty Set if none
+ * @throws KeeperException
+ */
+ Set<TableName> getAllTables(final ZooKeeperProtos.Table.State... states)
+ throws KeeperException, InterruptedIOException {
+
+ Set<TableName> allTables = new HashSet<TableName>();
+ List<String> children =
+ ZKUtil.listChildrenNoWatch(watcher, watcher.tableZNode);
+ if(children == null) return allTables;
+ for (String child: children) {
+ TableName tableName = TableName.valueOf(child);
+ ZooKeeperProtos.Table.State state;
+ try {
+ state = getTableState(watcher, tableName);
+ } catch (InterruptedException e) {
+ throw new InterruptedIOException();
+ }
+ for (ZooKeeperProtos.Table.State expectedState: states) {
+ if (state == expectedState) {
+ allTables.add(tableName);
+ break;
+ }
+ }
+ }
+ return allTables;
+ }
+
+ /**
+ * Gets table state from ZK.
+ * @param zkw ZooKeeperWatcher instance to use
+ * @param tableName table we're checking
+ * @return Null or {@link ZooKeeperProtos.Table.State} found in znode.
+ * @throws KeeperException
+ */
+ private ZooKeeperProtos.Table.State getTableState(final ZooKeeperWatcher zkw,
+ final TableName tableName)
+ throws KeeperException, InterruptedException {
+ String znode = ZKUtil.joinZNode(zkw.tableZNode, tableName.getNameAsString());
+ byte [] data = ZKUtil.getData(zkw, znode);
+ if (data == null || data.length <= 0) return null;
+ try {
+ ProtobufUtil.expectPBMagicPrefix(data);
+ ZooKeeperProtos.Table.Builder builder = ZooKeeperProtos.Table.newBuilder();
+ int magicLen = ProtobufUtil.lengthOfPBMagic();
+ ZooKeeperProtos.Table t = builder.mergeFrom(data, magicLen, data.length - magicLen).build();
+ return t.getState();
+ } catch (InvalidProtocolBufferException e) {
+ KeeperException ke = new KeeperException.DataInconsistencyException();
+ ke.initCause(e);
+ throw ke;
+ } catch (DeserializationException e) {
+ throw ZKUtil.convert(e);
+ }
+ }
+
+ /**
+ * @return true if current state isn't null and is contained
+ * in the list of expected states.
+ */
+ private boolean isTableInState(final List<ZooKeeperProtos.Table.State> expectedStates,
+ final ZooKeeperProtos.Table.State currentState) {
+ return currentState != null && expectedStates.contains(currentState);
+ }
+}