You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ji...@apache.org on 2008/10/16 21:45:19 UTC
svn commit: r705338 - in /hadoop/hbase/trunk: ./
src/java/org/apache/hadoop/hbase/client/
src/java/org/apache/hadoop/hbase/ipc/
src/java/org/apache/hadoop/hbase/master/
src/java/org/apache/hadoop/hbase/regionserver/
Author: jimk
Date: Thu Oct 16 12:45:17 2008
New Revision: 705338
URL: http://svn.apache.org/viewvc?rev=705338&view=rev
Log:
HBASE-919 Master and Region Server need to provide root region location if they are using HTable
Added:
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/ServerConnection.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/ServerConnectionManager.java
Modified:
hadoop/hbase/trunk/CHANGES.txt
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterRegionInterface.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=705338&r1=705337&r2=705338&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Thu Oct 16 12:45:17 2008
@@ -31,6 +31,8 @@
log java.io.IOException: Could not get block locations. Aborting...
HBASE-926 If no master, regionservers should hang out rather than fail on
connection and shut themselves down
+ HBASE-919 Master and Region Server need to provide root region location if
+ they are using HTable
IMPROVEMENTS
HBASE-901 Add a limit to key length, check key and value length on client side
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java?rev=705338&r1=705337&r2=705338&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/HConnectionManager.java Thu Oct 16 12:45:17 2008
@@ -62,11 +62,9 @@
*/
public class HConnectionManager implements HConstants {
/*
- * Private. Not instantiable.
+ * Not instantiable.
*/
- private HConnectionManager() {
- super();
- }
+ protected HConnectionManager() {}
// A Map of master HServerAddress -> connection information for that instance
// Note that although the Map is synchronized, the objects it contains
@@ -109,7 +107,7 @@
}
/* Encapsulates finding the servers for an HBase instance */
- private static class TableServers implements HConnection, HConstants {
+ private static class TableServers implements ServerConnection, HConstants {
private static final Log LOG = LogFactory.getLog(TableServers.class);
private final Class<? extends HRegionInterface> serverInterfaceClass;
private final long pause;
@@ -168,11 +166,16 @@
}
private long getPauseTime(int tries) {
- if (tries >= HConstants.RETRY_BACKOFF.length)
- tries = HConstants.RETRY_BACKOFF.length - 1;
- return this.pause * HConstants.RETRY_BACKOFF[tries];
+ int ntries = tries;
+ if (ntries >= HConstants.RETRY_BACKOFF.length)
+ ntries = HConstants.RETRY_BACKOFF.length - 1;
+ return this.pause * HConstants.RETRY_BACKOFF[ntries];
}
+ public void setRootRegionLocation(HRegionLocation rootRegion) {
+ this.rootRegionLocation = rootRegion;
+ }
+
public HMasterInterface getMaster() throws MasterNotRunningException {
HServerAddress masterLocation = null;
synchronized (this.masterLock) {
@@ -366,8 +369,7 @@
implements MetaScanner.MetaScannerVisitor {
byte[] tableName;
HTableDescriptor result;
- //TODO: change visibility to protected
- public HTableDescriptorFinder(byte[] tableName) {
+ protected HTableDescriptorFinder(byte[] tableName) {
this.tableName = tableName;
}
public boolean processRow(RowResult rowResult) throws IOException {
Added: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/ServerConnection.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/ServerConnection.java?rev=705338&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/ServerConnection.java (added)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/ServerConnection.java Thu Oct 16 12:45:17 2008
@@ -0,0 +1,36 @@
+/**
+ * Copyright 2008 The Apache Software Foundation
+ *
+ * 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.client;
+
+import org.apache.hadoop.hbase.HRegionLocation;
+
+/**
+ * Used by master and region server, so that they do not need to wait for the
+ * cluster to be up to get a connection.
+ */
+public interface ServerConnection extends HConnection {
+
+ /**
+ * Set root region location in connection
+ * @param rootRegion
+ */
+ public void setRootRegionLocation(HRegionLocation rootRegion);
+}
Added: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/ServerConnectionManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/ServerConnectionManager.java?rev=705338&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/ServerConnectionManager.java (added)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/ServerConnectionManager.java Thu Oct 16 12:45:17 2008
@@ -0,0 +1,44 @@
+/**
+ * Copyright 2008 The Apache Software Foundation
+ *
+ * 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.client;
+
+import org.apache.hadoop.hbase.HBaseConfiguration;
+
+/**
+ * Used by server processes to expose HServerConnection method
+ * setRootRegionLocation
+ */
+public class ServerConnectionManager extends HConnectionManager {
+ /*
+ * Not instantiable
+ */
+ private ServerConnectionManager() {}
+
+ /**
+ * Get the connection object for the instance specified by the configuration
+ * If no current connection exists, create a new connection for that instance
+ * @param conf
+ * @return HConnection object for the instance specified by the configuration
+ */
+ public static ServerConnection getConnection(HBaseConfiguration conf) {
+ return (ServerConnection) HConnectionManager.getConnection(conf);
+ }
+}
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterRegionInterface.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterRegionInterface.java?rev=705338&r1=705337&r2=705338&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterRegionInterface.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/ipc/HMasterRegionInterface.java Thu Oct 16 12:45:17 2008
@@ -26,6 +26,7 @@
import org.apache.hadoop.hbase.HServerInfo;
import org.apache.hadoop.hbase.HMsg;
import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HServerAddress;
/**
* HRegionServers interact with the HMasterRegionInterface to report on local
@@ -67,4 +68,11 @@
public HMsg[] regionServerReport(HServerInfo info, HMsg msgs[],
HRegionInfo mostLoadedRegions[])
throws IOException;
+
+ /**
+ * @return Root region region server address. Unlike
+ * HMasterInterface.findRootRegion, does not wait until all regions are
+ * assigned.
+ */
+ public HServerAddress getRootRegionLocation();
}
\ No newline at end of file
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java?rev=705338&r1=705337&r2=705338&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java Thu Oct 16 12:45:17 2008
@@ -52,8 +52,8 @@
import org.apache.hadoop.hbase.RemoteExceptionHandler;
import org.apache.hadoop.hbase.TableExistsException;
import org.apache.hadoop.hbase.client.HBaseAdmin;
-import org.apache.hadoop.hbase.client.HConnection;
-import org.apache.hadoop.hbase.client.HConnectionManager;
+import org.apache.hadoop.hbase.client.ServerConnection;
+import org.apache.hadoop.hbase.client.ServerConnectionManager;
import org.apache.hadoop.hbase.io.Cell;
import org.apache.hadoop.hbase.io.RowResult;
import org.apache.hadoop.hbase.ipc.HMasterInterface;
@@ -116,7 +116,7 @@
private final Server server;
private final HServerAddress address;
- final HConnection connection;
+ final ServerConnection connection;
final int metaRescanInterval;
@@ -224,7 +224,7 @@
this.address = new HServerAddress(server.getListenerAddress());
conf.set(MASTER_ADDRESS, address.toString());
- this.connection = HConnectionManager.getConnection(conf);
+ this.connection = ServerConnectionManager.getConnection(conf);
this.metaRescanInterval =
conf.getInt("hbase.master.meta.thread.rescanfrequency", 60 * 1000);
@@ -679,7 +679,11 @@
}
public HServerAddress findRootRegion() {
- return regionManager.getRootRegionLocation();
+ HServerAddress rootServer = null;
+ if (regionManager.allRegionsAssigned()) {
+ rootServer = regionManager.getRootRegionLocation();
+ }
+ return rootServer;
}
/*
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java?rev=705338&r1=705337&r2=705338&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java Thu Oct 16 12:45:17 2008
@@ -43,6 +43,7 @@
import org.apache.hadoop.hbase.Leases;
import org.apache.hadoop.hbase.LeaseListener;
import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.HRegionLocation;
/**
* The ServerManager class manages info about region servers - HServerInfo,
@@ -444,7 +445,10 @@
if (region.isRootRegion()) {
// Store the Root Region location (in memory)
- master.regionManager.setRootRegionLocation(serverInfo.getServerAddress());
+ HServerAddress rootServer = serverInfo.getServerAddress();
+ master.connection.setRootRegionLocation(
+ new HRegionLocation(region, rootServer));
+ master.regionManager.setRootRegionLocation(rootServer);
} else {
// Note that the table has been assigned and is waiting for the
// meta table to be updated.
@@ -470,6 +474,7 @@
LOG.fatal("root region is marked offline");
master.shutdown();
}
+ master.connection.setRootRegionLocation(null);
master.regionManager.unassignRootRegion();
} else {
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=705338&r1=705337&r2=705338&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Thu Oct 16 12:45:17 2008
@@ -57,6 +57,7 @@
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.HMsg;
import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HRegionLocation;
import org.apache.hadoop.hbase.HServerAddress;
import org.apache.hadoop.hbase.HServerInfo;
import org.apache.hadoop.hbase.HServerLoad;
@@ -72,6 +73,8 @@
import org.apache.hadoop.hbase.UnknownRowLockException;
import org.apache.hadoop.hbase.ValueOverMaxLengthException;
import org.apache.hadoop.hbase.Leases.LeaseStillHeldException;
+import org.apache.hadoop.hbase.client.ServerConnection;
+import org.apache.hadoop.hbase.client.ServerConnectionManager;
import org.apache.hadoop.hbase.filter.RowFilterInterface;
import org.apache.hadoop.hbase.io.BatchOperation;
import org.apache.hadoop.hbase.io.BatchUpdate;
@@ -117,6 +120,9 @@
protected final HServerInfo serverInfo;
protected final HBaseConfiguration conf;
+
+ private final ServerConnection connection;
+ private final AtomicBoolean haveRootRegion = new AtomicBoolean(false);
private FileSystem fs;
private Path rootDir;
private final Random rand = new Random();
@@ -226,6 +232,7 @@
this.abortRequested = false;
this.fsOk = true;
this.conf = conf;
+ this.connection = ServerConnectionManager.getConnection(conf);
this.isOnline = false;
@@ -486,7 +493,7 @@
join();
LOG.info(Thread.currentThread().getName() + " exiting");
}
-
+
/*
* Run init. Sets up hlog and starts up all server threads.
* @param c Extra configuration.
@@ -626,6 +633,17 @@
* the end of the main HRegionServer run loop.
*/
private void housekeeping() {
+ // Try to get the root region location from the master.
+ if (!haveRootRegion.get()) {
+ HServerAddress rootServer = hbaseMaster.getRootRegionLocation();
+ if (rootServer != null) {
+ // By setting the root region location, we bypass the wait imposed on
+ // HTable for all regions being assigned.
+ this.connection.setRootRegionLocation(
+ new HRegionLocation(HRegionInfo.ROOT_REGIONINFO, rootServer));
+ haveRootRegion.set(true);
+ }
+ }
// If the todo list has > 0 messages, iterate looking for open region
// messages. Send the master a message that we're working on its
// processing so it doesn't assign the region elsewhere.