HADOOP-2261 HTable.abort no longer throws exception if there is no active update.

HADOOP-2287 Make hbase unit tests take less time to complete.
HADOOP-2262 Retry n times instead of n**2 times.


git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk/src/contrib/hbase@599138 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jim Kellerman 2007-11-28 20:38:00 +00:00
parent 3bff065d34
commit 72414e6c91
4 changed files with 78 additions and 57 deletions

View File

@ -51,9 +51,10 @@ Trunk (unreleased changes)
HADOOP-2139 (phase 2) Make region server more event driven HADOOP-2139 (phase 2) Make region server more event driven
HADOOP-2289 Useless efforts of looking for the non-existant table in select HADOOP-2289 Useless efforts of looking for the non-existant table in select
command. command.
HADOOP-2262 HADOOP-2261 fail fast on non-existing table, change abort to
function after commit even if commit was successful
HADOOP-2257 Show a total of all requests and regions on the web ui HADOOP-2257 Show a total of all requests and regions on the web ui
HADOOP-2261 HTable.abort no longer throws exception if there is no active update.
HADOOP-2287 Make hbase unit tests take less time to complete.
HADOOP-2262 Retry n times instead of n**2 times.
Release 0.15.1 Release 0.15.1
Branch 0.15 Branch 0.15

View File

@ -503,9 +503,6 @@ public class HConnectionManager implements HConstants {
} }
if (!waited) { if (!waited) {
try { try {
for (int tries = 0; tries < numRetries; tries++) {
boolean success = true; // assume this works
SortedMap<Text, HRegionLocation> metaServers = SortedMap<Text, HRegionLocation> metaServers =
this.tablesToServers.get(META_TABLE_NAME); this.tablesToServers.get(META_TABLE_NAME);
if (metaServers == null) { if (metaServers == null) {
@ -515,22 +512,9 @@ public class HConnectionManager implements HConstants {
metaServers = metaServers.tailMap(firstMetaRegion); metaServers = metaServers.tailMap(firstMetaRegion);
for (HRegionLocation t: metaServers.values()) { for (HRegionLocation t: metaServers.values()) {
try {
srvrs.putAll(scanOneMetaRegion(t, tableName)); srvrs.putAll(scanOneMetaRegion(t, tableName));
}
} catch (IOException e) {
if (tries < numRetries - 1) {
metaServers = findServersForTable(META_TABLE_NAME);
success = false;
break;
}
throw e;
}
}
if (success) {
break;
}
}
} finally { } finally {
synchronized (this.tablesBeingLocated) { synchronized (this.tablesBeingLocated) {
// Wake up the threads waiting for us to find the table // Wake up the threads waiting for us to find the table
@ -738,9 +722,6 @@ public class HConnectionManager implements HConstants {
regionInfo, new HServerAddress(serverAddress))); regionInfo, new HServerAddress(serverAddress)));
} }
} catch (IOException e) { } catch (IOException e) {
if (e instanceof TableNotFoundException) {
throw e; // don't retry
}
if (tries == numRetries - 1) { // no retries left if (tries == numRetries - 1) { // no retries left
if (e instanceof RemoteException) { if (e instanceof RemoteException) {
e = RemoteExceptionHandler.decodeRemoteException((RemoteException) e); e = RemoteExceptionHandler.decodeRemoteException((RemoteException) e);

View File

@ -1296,39 +1296,45 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
String serverName = serverInfo.getServerAddress().toString().trim(); String serverName = serverInfo.getServerAddress().toString().trim();
long serverLabel = getServerLabel(serverName); long serverLabel = getServerLabel(serverName);
if (msgs.length > 0 && msgs[0].getMsg() == HMsg.MSG_REPORT_EXITING) { if (msgs.length > 0 && msgs[0].getMsg() == HMsg.MSG_REPORT_EXITING) {
// HRegionServer is shutting down. Cancel the server's lease. synchronized (serversToServerInfo) {
// Note that canceling the server's lease takes care of updating try {
// serversToServerInfo, etc. // HRegionServer is shutting down. Cancel the server's lease.
if (LOG.isDebugEnabled()) { // Note that canceling the server's lease takes care of updating
LOG.debug("Region server " + serverName + // serversToServerInfo, etc.
if (LOG.isDebugEnabled()) {
LOG.debug("Region server " + serverName +
": MSG_REPORT_EXITING -- cancelling lease"); ": MSG_REPORT_EXITING -- cancelling lease");
}
if (cancelLease(serverName, serverLabel)) {
// Only process the exit message if the server still has a lease.
// Otherwise we could end up processing the server exit twice.
LOG.info("Region server " + serverName +
": MSG_REPORT_EXITING -- lease cancelled");
// Get all the regions the server was serving reassigned
// (if we are not shutting down).
if (!closed.get()) {
for (int i = 1; i < msgs.length; i++) {
HRegionInfo info = msgs[i].getRegionInfo();
if (info.getTableDesc().getName().equals(ROOT_TABLE_NAME)) {
rootRegionLocation.set(null);
} else if (info.getTableDesc().getName().equals(META_TABLE_NAME)) {
onlineMetaRegions.remove(info.getStartKey());
}
this.unassignedRegions.put(info.getRegionName(), info);
this.assignAttempts.put(info.getRegionName(), Long.valueOf(0L));
} }
if (cancelLease(serverName, serverLabel)) {
// Only process the exit message if the server still has a lease.
// Otherwise we could end up processing the server exit twice.
LOG.info("Region server " + serverName +
": MSG_REPORT_EXITING -- lease cancelled");
// Get all the regions the server was serving reassigned
// (if we are not shutting down).
if (!closed.get()) {
for (int i = 1; i < msgs.length; i++) {
HRegionInfo info = msgs[i].getRegionInfo();
if (info.getTableDesc().getName().equals(ROOT_TABLE_NAME)) {
rootRegionLocation.set(null);
} else if (info.getTableDesc().getName().equals(META_TABLE_NAME)) {
onlineMetaRegions.remove(info.getStartKey());
}
this.unassignedRegions.put(info.getRegionName(), info);
this.assignAttempts.put(info.getRegionName(), Long.valueOf(0L));
}
}
}
// We don't need to return anything to the server because it isn't
// going to do any more work.
return new HMsg[0];
} finally {
serversToServerInfo.notifyAll();
} }
} }
// We don't need to return anything to the server because it isn't
// going to do any more work.
return new HMsg[0];
} }
if (closed.get()) { if (closed.get()) {
@ -1434,9 +1440,6 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
} }
} }
} }
synchronized (serversToServerInfo) {
serversToServerInfo.notifyAll();
}
return leaseCancelled; return leaseCancelled;
} }

View File

@ -574,6 +574,32 @@ public class HTable implements HConstants {
* call to commit() returns. A call to abort() will abandon any updates in * call to commit() returns. A call to abort() will abandon any updates in
* progress. * progress.
* *
* <p>
* Example:
* <br>
* <pre><span style="font-family: monospace;">
* long lockid = table.startUpdate(new Text(article.getName()));
* for (File articleInfo: article.listFiles(new NonDirectories())) {
* String article = null;
* try {
* DataInputStream in = new DataInputStream(new FileInputStream(articleInfo));
* article = in.readUTF();
* } catch (IOException e) {
* // Input error - abandon update
* table.abort(lockid);
* throw e;
* }
* try {
* table.put(lockid, columnName(articleInfo.getName()), article.getBytes());
* } catch (RuntimeException e) {
* // Put failed - abandon update
* table.abort(lockid);
* throw e;
* }
* }
* table.commit(lockid);
* </span></pre>
*
* *
* @param row Name of row to start update against. Note, choose row names * @param row Name of row to start update against. Note, choose row names
* with care. Rows are sorted lexicographically (comparison is done * with care. Rows are sorted lexicographically (comparison is done
@ -686,7 +712,12 @@ public class HTable implements HConstants {
} }
/** /**
* Abort a row mutation * Abort a row mutation.
*
* This method should be called only when an update has been started and it
* is determined that the update should not be committed.
*
* Releases resources being held by the update in progress.
* *
* @param lockid lock id returned from startUpdate * @param lockid lock id returned from startUpdate
*/ */
@ -699,12 +730,16 @@ public class HTable implements HConstants {
} }
/** /**
* Finalize a row mutation * Finalize a row mutation.
*
* When this method is specified, we pass the server a value that says use * When this method is specified, we pass the server a value that says use
* the 'latest' timestamp. If we are doing a put, on the server-side, cells * the 'latest' timestamp. If we are doing a put, on the server-side, cells
* will be given the servers's current timestamp. If the we are commiting * will be given the servers's current timestamp. If the we are commiting
* deletes, then delete removes the most recently modified cell of stipulated * deletes, then delete removes the most recently modified cell of stipulated
* column. * column.
*
* @see #commit(long, long)
*
* @param lockid lock id returned from startUpdate * @param lockid lock id returned from startUpdate
* @throws IOException * @throws IOException
*/ */
@ -713,7 +748,8 @@ public class HTable implements HConstants {
} }
/** /**
* Finalize a row mutation * Finalize a row mutation and release any resources associated with the update.
*
* @param lockid lock id returned from startUpdate * @param lockid lock id returned from startUpdate
* @param timestamp time to associate with the change * @param timestamp time to associate with the change
* @throws IOException * @throws IOException