You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by ji...@apache.org on 2007/06/26 00:54:57 UTC
svn commit: r550634 - in /lucene/hadoop/trunk/src/contrib/hbase: ./ conf/
src/java/org/apache/hadoop/hbase/
Author: jimk
Date: Mon Jun 25 15:54:56 2007
New Revision: 550634
URL: http://svn.apache.org/viewvc?view=rev&rev=550634
Log:
HADOOP-1509 Open HRegionServer/HClient for extension
Modified:
lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt
lucene/hadoop/trunk/src/contrib/hbase/conf/hbase-default.xml
lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HClient.java
lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HConstants.java
lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMaster.java
lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegion.java
lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionInfo.java
lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionServer.java
Modified: lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt?view=diff&rev=550634&r1=550633&r2=550634
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt Mon Jun 25 15:54:56 2007
@@ -35,3 +35,8 @@
20. HADOOP-1465 Add cluster stop/start scripts for hbase
21. HADOOP-1415 Provide configurable per-column bloom filters - part 2.
22. HADOOP-1498. Replace boxed types with primitives in many places.
+ 23. HADOOP-1509. Made methods/inner classes in HRegionServer and HClient protected
+ instead of private for easier extension. Also made HRegion and HRegionInfo public too.
+ Added an hbase-default.xml property for specifying what HRegionInterface extension to use
+ for proxy server connection.
+
Modified: lucene/hadoop/trunk/src/contrib/hbase/conf/hbase-default.xml
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/conf/hbase-default.xml?view=diff&rev=550634&r1=550633&r2=550634
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/conf/hbase-default.xml (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/conf/hbase-default.xml Mon Jun 25 15:54:56 2007
@@ -15,6 +15,13 @@
</description>
</property>
<property>
+ <name>hbase.regionserver.class</name>
+ <value>org.apache.hadoop.hbase.HRegionInterface</value>
+ <description>An interface that is assignable to HRegionInterface. Used in HClient for
+ opening proxy to remote region server.
+ </description>
+ </property>
+ <property>
<name>hbase.rootdir</name>
<value>${hadoop.tmp.dir}/hbase</value>
<description>The directory shared by region servers.
Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HClient.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HClient.java?view=diff&rev=550634&r1=550633&r2=550634
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HClient.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HClient.java Mon Jun 25 15:54:56 2007
@@ -58,11 +58,12 @@
int numRetries;
private HMasterInterface master;
private final Configuration conf;
+ private Class<? extends HRegionInterface> serverInterfaceClass;
/*
* Data structure that holds current location for a region and its info.
*/
- static class RegionLocation {
+ protected static class RegionLocation {
HRegionInfo regionInfo;
HServerAddress serverAddress;
@@ -76,6 +77,14 @@
return "address: " + this.serverAddress.toString() + ", regioninfo: " +
this.regionInfo;
}
+
+ public HRegionInfo getRegionInfo(){
+ return regionInfo;
+ }
+
+ public HServerAddress getServerAddress(){
+ return serverAddress;
+ }
}
// Map tableName -> (Map startRow -> (HRegionInfo, HServerAddress)
@@ -94,6 +103,7 @@
Random rand;
long clientid;
+
/**
* Creates a new HClient
* @param conf - Configuration object
@@ -116,7 +126,7 @@
this.rand = new Random();
}
- private void handleRemoteException(RemoteException e) throws IOException {
+ protected void handleRemoteException(RemoteException e) throws IOException {
String msg = e.getMessage();
if(e.getClassName().equals("org.apache.hadoop.hbase.InvalidColumnNameException")) {
throw new InvalidColumnNameException(msg);
@@ -143,7 +153,7 @@
/* Find the address of the master and connect to it
*/
- private void checkMaster() throws MasterNotRunningException {
+ protected void checkMaster() throws MasterNotRunningException {
if (this.master != null) {
return;
}
@@ -531,7 +541,7 @@
* @param tableName - the table name to be checked
* @throws IllegalArgumentException - if the table name is reserved
*/
- private void checkReservedTableName(Text tableName) {
+ protected void checkReservedTableName(Text tableName) {
if(tableName.equals(ROOT_TABLE_NAME)
|| tableName.equals(META_TABLE_NAME)) {
@@ -547,7 +557,7 @@
//////////////////////////////////////////////////////////////////////////////
// Client API
//////////////////////////////////////////////////////////////////////////////
-
+
/**
* Loads information so that a table can be manipulated.
*
@@ -558,15 +568,29 @@
if(tableName == null || tableName.getLength() == 0) {
throw new IllegalArgumentException("table name cannot be null or zero length");
}
- this.tableServers = tablesToServers.get(tableName);
- if (this.tableServers == null ) {
+ this.tableServers = getTableServers(tableName);
+ }
+
+ /**
+ * Gets the servers of the given table.
+ *
+ * @param tableName - the table to be located
+ * @throws IOException - if the table can not be located after retrying
+ */
+ protected synchronized SortedMap<Text, RegionLocation> getTableServers(Text tableName) throws IOException {
+ if(tableName == null || tableName.getLength() == 0) {
+ throw new IllegalArgumentException("table name cannot be null or zero length");
+ }
+ SortedMap<Text, RegionLocation> serverResult = tablesToServers.get(tableName);
+ if (serverResult == null ) {
if (LOG.isDebugEnabled()) {
LOG.debug("No servers for " + tableName + ". Doing a find...");
}
// We don't know where the table is.
// Load the information from meta.
- this.tableServers = findServersForTable(tableName);
+ serverResult = findServersForTable(tableName);
}
+ return serverResult;
}
/*
@@ -832,24 +856,39 @@
return servers;
}
- /*
- * Establishes a connection to the region server at the specified address
+ /**
+ * Establishes a connection to the region server at the specified address.
* @param regionServer - the server to connect to
* @throws IOException
*/
- synchronized HRegionInterface getHRegionConnection(HServerAddress regionServer)
- throws IOException {
+ protected synchronized HRegionInterface getHRegionConnection(
+ HServerAddress regionServer) throws IOException{
- // See if we already have a connection
+ getRegionServerInterface();
+ // See if we already have a connection
HRegionInterface server = this.servers.get(regionServer.toString());
-
- if(server == null) { // Get a connection
-
- server = (HRegionInterface)RPC.waitForProxy(HRegionInterface.class,
- HRegionInterface.versionID, regionServer.getInetSocketAddress(),
- this.conf);
-
+
+ if (server == null) { // Get a connection
+ long versionId = 0;
+ try {
+ versionId = serverInterfaceClass.getDeclaredField("versionID").getLong(server);
+ } catch (IllegalAccessException e) {
+ // Should never happen unless visibility of versionID changes
+ throw new UnsupportedOperationException(
+ "Unable to open a connection to a " + serverInterfaceClass.getName() + " server.", e);
+ } catch (NoSuchFieldException e) {
+ // Should never happen unless versionID field name changes in HRegionInterface
+ throw new UnsupportedOperationException(
+ "Unable to open a connection to a " + serverInterfaceClass.getName() + " server.", e);
+ }
+
+ server = (HRegionInterface) RPC.waitForProxy(
+ serverInterfaceClass,
+ versionId,
+ regionServer.getInetSocketAddress(),
+ this.conf);
+
this.servers.put(regionServer.toString(), server);
}
return server;
@@ -917,7 +956,7 @@
* @param row Row to find.
* @return Location of row.
*/
- synchronized RegionLocation getRegionLocation(Text row) {
+ protected synchronized RegionLocation getRegionLocation(Text row) {
if(this.tableServers == null) {
throw new IllegalStateException("Must open table first");
}
@@ -1547,6 +1586,35 @@
}
return errCode;
+ }
+
+ /**
+ * Determine the region server interface to use from configuration properties.
+ *
+ */
+ @SuppressWarnings("unchecked")
+ private void getRegionServerInterface() {
+ if (this.serverInterfaceClass != null) {
+ return;
+ }
+
+ String serverClassName = this.conf.get(REGION_SERVER_CLASS,
+ DEFAULT_REGION_SERVER_CLASS);
+
+ try {
+ this.serverInterfaceClass = (Class<? extends HRegionInterface>) Class
+ .forName(serverClassName);
+ } catch (ClassNotFoundException e) {
+ throw new UnsupportedOperationException(
+ "Unable to find region server interface " + serverClassName, e);
+ }
+ }
+
+ /**
+ * @return the configuration for this client
+ */
+ protected Configuration getConf(){
+ return conf;
}
/**
@@ -1558,4 +1626,5 @@
int errCode = (new HClient(c)).doCommandLine(args);
System.exit(errCode);
}
+
}
Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HConstants.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HConstants.java?view=diff&rev=550634&r1=550633&r2=550634
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HConstants.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HConstants.java Mon Jun 25 15:54:56 2007
@@ -47,7 +47,13 @@
static final String REGIONSERVER_ADDRESS = "hbase.regionserver";
/** Default region server address */
- static final String DEFAULT_REGIONSERVER_ADDRESS = DEFAULT_HOST + ":60010";
+ static final String DEFAULT_REGIONSERVER_ADDRESS = DEFAULT_HOST + ":60010";
+
+ /** Parameter name for what region server interface to use. */
+ static final String REGION_SERVER_CLASS = "hbase.regionserver.class";
+
+ /** Default region server interface class name. */
+ static final String DEFAULT_REGION_SERVER_CLASS = HRegionInterface.class.getName();
/** Parameter name for how often threads should wake up */
static final String THREAD_WAKE_FREQUENCY = "hbase.server.thread.wakefrequency";
Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMaster.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMaster.java?view=diff&rev=550634&r1=550633&r2=550634
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMaster.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HMaster.java Mon Jun 25 15:54:56 2007
@@ -659,7 +659,7 @@
/**
* @return HServerAddress of the master server
*/
- HServerAddress getMasterAddress() {
+ public HServerAddress getMasterAddress() {
return address;
}
Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegion.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegion.java?view=diff&rev=550634&r1=550633&r2=550634
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegion.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegion.java Mon Jun 25 15:54:56 2007
@@ -55,7 +55,7 @@
* regionName is a unique identifier for this HRegion. (startKey, endKey]
* defines the keyspace for this HRegion.
*/
-class HRegion implements HConstants {
+public class HRegion implements HConstants {
static String SPLITDIR = "splits";
static String MERGEDIR = "merges";
static String TMPREGION_PREFIX = "tmpregion_";
@@ -289,7 +289,6 @@
* the supplied path.
*
* @param rootDir root directory for HBase instance
- * @param log HLog where changes should be committed
* @param fs is the filesystem.
* @param conf is global configuration settings.
* @param regionInfo - HRegionInfo that describes the region
@@ -298,7 +297,7 @@
*
* @throws IOException
*/
- HRegion(Path rootDir, HLog log, FileSystem fs, Configuration conf,
+ public HRegion(Path rootDir, HLog log, FileSystem fs, Configuration conf,
HRegionInfo regionInfo, Path initialFiles)
throws IOException {
@@ -386,7 +385,7 @@
* This method could take some time to execute, so don't call it from a
* time-sensitive thread.
*/
- Vector<HStoreFile> close() throws IOException {
+ public Vector<HStoreFile> close() throws IOException {
lock.obtainWriteLock();
try {
boolean shouldClose = false;
@@ -548,43 +547,43 @@
// HRegion accessors
//////////////////////////////////////////////////////////////////////////////
- Text getStartKey() {
+ public Text getStartKey() {
return regionInfo.startKey;
}
- Text getEndKey() {
+ public Text getEndKey() {
return regionInfo.endKey;
}
- long getRegionId() {
+ public long getRegionId() {
return regionInfo.regionId;
}
- Text getRegionName() {
+ public Text getRegionName() {
return regionInfo.regionName;
}
- Path getRootDir() {
+ public Path getRootDir() {
return rootDir;
}
- HTableDescriptor getTableDesc() {
+ public HTableDescriptor getTableDesc() {
return regionInfo.tableDesc;
}
- HLog getLog() {
+ public HLog getLog() {
return log;
}
- Configuration getConf() {
+ public Configuration getConf() {
return conf;
}
- Path getRegionDir() {
+ public Path getRegionDir() {
return regiondir;
}
- FileSystem getFilesystem() {
+ public FileSystem getFilesystem() {
return fs;
}
@@ -973,7 +972,7 @@
* Return an iterator that scans over the HRegion, returning the indicated
* columns. This Iterator must be closed by the caller.
*/
- HInternalScannerInterface getScanner(Text[] cols, Text firstRow)
+ public HInternalScannerInterface getScanner(Text[] cols, Text firstRow)
throws IOException {
lock.obtainReadLock();
try {
@@ -1009,9 +1008,9 @@
*
* @param row Row to update
* @return lockid
- * @see #put(long, Text, BytesWritable)
+ * @see #put(long, Text, byte[])
*/
- long startUpdate(Text row) throws IOException {
+ public long startUpdate(Text row) throws IOException {
// We obtain a per-row lock, so other clients will block while one client
// performs an update. The read lock is released by the client calling
// #commit or #abort or if the HRegionServer lease on the lock expires.
@@ -1029,7 +1028,7 @@
* This method really just tests the input, then calls an internal localput()
* method.
*/
- void put(long lockid, Text targetCol, byte [] val) throws IOException {
+ public void put(long lockid, Text targetCol, byte [] val) throws IOException {
if (DELETE_BYTES.compareTo(val) == 0) {
throw new IOException("Cannot insert value: " + val);
}
@@ -1039,7 +1038,7 @@
/**
* Delete a value or write a value. This is a just a convenience method for put().
*/
- void delete(long lockid, Text targetCol) throws IOException {
+ public void delete(long lockid, Text targetCol) throws IOException {
localput(lockid, targetCol, DELETE_BYTES.get());
}
@@ -1090,7 +1089,7 @@
* writes associated with the given row-lock. These values have not yet
* been placed in memcache or written to the log.
*/
- void abort(long lockid) throws IOException {
+ public void abort(long lockid) throws IOException {
Text row = getRowFromLock(lockid);
if(row == null) {
throw new LockException("No write lock for lockid " + lockid);
@@ -1124,7 +1123,7 @@
* @param lockid Lock for row we're to commit.
* @throws IOException
*/
- void commit(final long lockid) throws IOException {
+ public void commit(final long lockid) throws IOException {
// Remove the row from the pendingWrites list so
// that repeated executions won't screw this up.
Text row = getRowFromLock(lockid);
Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionInfo.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionInfo.java?view=diff&rev=550634&r1=550633&r2=550634
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionInfo.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionInfo.java Mon Jun 25 15:54:56 2007
@@ -139,6 +139,41 @@
this.regionName.readFields(in);
this.offLine = in.readBoolean();
}
+
+ /**
+ * @return the endKey
+ */
+ public Text getEndKey(){
+ return endKey;
+ }
+
+ /**
+ * @return the regionId
+ */
+ public long getRegionId(){
+ return regionId;
+ }
+
+ /**
+ * @return the regionName
+ */
+ public Text getRegionName(){
+ return regionName;
+ }
+
+ /**
+ * @return the startKey
+ */
+ public Text getStartKey(){
+ return startKey;
+ }
+
+ /**
+ * @return the tableDesc
+ */
+ public HTableDescriptor getTableDesc(){
+ return tableDesc;
+ }
//////////////////////////////////////////////////////////////////////////////
// Comparable
Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionServer.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionServer.java?view=diff&rev=550634&r1=550633&r2=550634
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionServer.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/HRegionServer.java Mon Jun 25 15:54:56 2007
@@ -468,7 +468,7 @@
* Sets a flag that will cause all the HRegionServer threads to shut down
* in an orderly fashion.
*/
- synchronized void stop() {
+ public synchronized void stop() {
stopRequested = true;
notifyAll(); // Wakes run() if it is sleeping
}
@@ -1079,25 +1079,25 @@
}
/**
- * Private utility method for safely obtaining an HRegion handle.
+ * Protected utility method for safely obtaining an HRegion handle.
* @param regionName Name of online {@link HRegion} to return
* @return {@link HRegion} for <code>regionName</code>
* @throws NotServingRegionException
*/
- private HRegion getRegion(final Text regionName)
+ protected HRegion getRegion(final Text regionName)
throws NotServingRegionException {
return getRegion(regionName, false);
}
/**
- * Private utility method for safely obtaining an HRegion handle.
+ * Protected utility method for safely obtaining an HRegion handle.
* @param regionName Name of online {@link HRegion} to return
* @param checkRetiringRegions Set true if we're to check retiring regions
* as well as online regions.
* @return {@link HRegion} for <code>regionName</code>
* @throws NotServingRegionException
*/
- private HRegion getRegion(final Text regionName,
+ protected HRegion getRegion(final Text regionName,
final boolean checkRetiringRegions)
throws NotServingRegionException {
HRegion region = null;