HBASE-919 Master and Region Server need to provide root region location if they are using HTable

git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@705338 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jim Kellerman 2008-10-16 19:45:17 +00:00
parent a171d57765
commit f5ded90780
8 changed files with 136 additions and 17 deletions

View File

@ -31,6 +31,8 @@ Release 0.19.0 - Unreleased
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

View File

@ -62,11 +62,9 @@ import org.apache.hadoop.ipc.RemoteException;
*/
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 @@ public class HConnectionManager implements HConstants {
}
/* 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,9 +166,14 @@ public class HConnectionManager implements HConstants {
}
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 {
@ -366,8 +369,7 @@ public class HConnectionManager implements HConstants {
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 {

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -26,6 +26,7 @@ import org.apache.hadoop.ipc.VersionedProtocol;
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 interface HMasterRegionInterface extends VersionedProtocol {
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();
}

View File

@ -52,8 +52,8 @@ import org.apache.hadoop.hbase.RegionHistorian;
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 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
private final Server server;
private final HServerAddress address;
final HConnection connection;
final ServerConnection connection;
final int metaRescanInterval;
@ -224,7 +224,7 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
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 class HMaster extends Thread implements HConstants, HMasterInterface,
}
public HServerAddress findRootRegion() {
return regionManager.getRootRegionLocation();
HServerAddress rootServer = null;
if (regionManager.allRegionsAssigned()) {
rootServer = regionManager.getRootRegionLocation();
}
return rootServer;
}
/*

View File

@ -43,6 +43,7 @@ import org.apache.hadoop.hbase.LeaseException;
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 @@ class ServerManager implements HConstants {
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 @@ class ServerManager implements HConstants {
LOG.fatal("root region is marked offline");
master.shutdown();
}
master.connection.setRootRegionLocation(null);
master.regionManager.unassignRootRegion();
} else {

View File

@ -57,6 +57,7 @@ import org.apache.hadoop.hbase.HColumnDescriptor;
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.UnknownScannerException;
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 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
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 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
this.abortRequested = false;
this.fsOk = true;
this.conf = conf;
this.connection = ServerConnectionManager.getConnection(conf);
this.isOnline = false;
@ -626,6 +633,17 @@ public class HRegionServer implements HConstants, HRegionInterface, Runnable {
* 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.