HBASE-511 Do exponential backoff in clients on NSRE, WRE, ISE, etc.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@680902 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jim Kellerman 2008-07-30 01:45:44 +00:00
parent 0a9f7e62f6
commit e4449cfc8f
5 changed files with 2085 additions and 2056 deletions

View File

@ -344,6 +344,7 @@ Release 0.2.0
Cryans via JimK) Cryans via JimK)
HBASE-733 Enhance Cell so that it can contain multiple values at multiple HBASE-733 Enhance Cell so that it can contain multiple values at multiple
timestamps timestamps
HBASE-511 Do exponential backoff in clients on NSRE, WRE, ISE, etc.
OPTIMIZATIONS OPTIMIZATIONS
HBASE-430 Performance: Scanners and getRow return maps with duplicate data HBASE-430 Performance: Scanners and getRow return maps with duplicate data

View File

@ -112,11 +112,11 @@
</property> </property>
<property> <property>
<name>hbase.client.retries.number</name> <name>hbase.client.retries.number</name>
<value>5</value> <value>10</value>
<description>Maximum retries. Used as maximum for all retryable <description>Maximum retries. Used as maximum for all retryable
operations such as fetching of the root region from root region operations such as fetching of the root region from root region
server, getting a cell's value, starting a row update, etc. server, getting a cell's value, starting a row update, etc.
Default: 5. Default: 10.
</description> </description>
</property> </property>
<property> <property>

View File

@ -226,4 +226,10 @@ public interface HConstants {
public static final String NAME = "NAME"; public static final String NAME = "NAME";
public static final String VERSIONS = "VERSIONS"; public static final String VERSIONS = "VERSIONS";
public static final String IN_MEMORY = "IN_MEMORY"; public static final String IN_MEMORY = "IN_MEMORY";
/**
* This is a retry backoff multiplier table similar to the BSD TCP syn
* backoff table, a bit more aggressive than simple exponential backoff.
*/
public static int RETRY_BACKOFF[] = { 1, 1, 1, 1, 2, 4, 8, 16, 32, 64 };
} }

View File

@ -126,6 +126,12 @@ public class HBaseAdmin {
return this.connection.listTables(); return this.connection.listTables();
} }
private long getPauseTime(int tries) {
if (tries >= HConstants.RETRY_BACKOFF.length)
tries = HConstants.RETRY_BACKOFF.length - 1;
return this.pause * HConstants.RETRY_BACKOFF[tries];
}
/** /**
* Creates a new table * Creates a new table
* *
@ -155,7 +161,7 @@ public class HBaseAdmin {
} }
} }
try { try {
Thread.sleep(pause); Thread.sleep(getPauseTime(tries));
} catch (InterruptedException e) { } catch (InterruptedException e) {
// continue // continue
} }
@ -274,7 +280,7 @@ public class HBaseAdmin {
} }
try { try {
Thread.sleep(pause); Thread.sleep(getPauseTime(tries));
} catch (InterruptedException e) { } catch (InterruptedException e) {
// continue // continue
} }
@ -320,14 +326,15 @@ public class HBaseAdmin {
// Wait until all regions are enabled // Wait until all regions are enabled
while (!isTableEnabled(tableName)) { for (int tries = 0;
(tries < numRetries) && (!isTableEnabled(tableName));
tries++) {
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("Sleep. Waiting for all regions to be enabled from " + LOG.debug("Sleep. Waiting for all regions to be enabled from " +
Bytes.toString(tableName)); Bytes.toString(tableName));
} }
try { try {
Thread.sleep(pause); Thread.sleep(getPauseTime(tries));
} catch (InterruptedException e) { } catch (InterruptedException e) {
// continue // continue
} }
@ -336,6 +343,9 @@ public class HBaseAdmin {
Bytes.toString(tableName)); Bytes.toString(tableName));
} }
} }
if (!isTableEnabled(tableName))
throw new IOException("unable to enable table " +
Bytes.toString(tableName));
LOG.info("Enabled table " + Bytes.toString(tableName)); LOG.info("Enabled table " + Bytes.toString(tableName));
} }
@ -379,13 +389,15 @@ public class HBaseAdmin {
} }
// Wait until all regions are disabled // Wait until all regions are disabled
while (isTableEnabled(tableName)) { for (int tries = 0;
(tries < numRetries) && (isTableEnabled(tableName));
tries++) {
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("Sleep. Waiting for all regions to be disabled from " + LOG.debug("Sleep. Waiting for all regions to be disabled from " +
Bytes.toString(tableName)); Bytes.toString(tableName));
} }
try { try {
Thread.sleep(pause); Thread.sleep(getPauseTime(tries));
} catch (InterruptedException e) { } catch (InterruptedException e) {
// continue // continue
} }
@ -394,6 +406,9 @@ public class HBaseAdmin {
Bytes.toString(tableName)); Bytes.toString(tableName));
} }
} }
if (isTableEnabled(tableName))
throw new IOException("unable to disable table " +
Bytes.toString(tableName));
LOG.info("Disabled " + Bytes.toString(tableName)); LOG.info("Disabled " + Bytes.toString(tableName));
} }

View File

@ -163,14 +163,20 @@ public class HConnectionManager implements HConstants {
"Unable to find region server interface " + serverClassName, e); "Unable to find region server interface " + serverClassName, e);
} }
this.pause = conf.getLong("hbase.client.pause", 30 * 1000); this.pause = conf.getLong("hbase.client.pause", 10 * 1000);
this.numRetries = conf.getInt("hbase.client.retries.number", 5); this.numRetries = conf.getInt("hbase.client.retries.number", 10);
this.maxRPCAttempts = conf.getInt("hbase.client.rpc.maxattempts", 1); this.maxRPCAttempts = conf.getInt("hbase.client.rpc.maxattempts", 1);
this.master = null; this.master = null;
this.masterChecked = false; this.masterChecked = false;
} }
private long getPauseTime(int tries) {
if (tries >= HConstants.RETRY_BACKOFF.length)
tries = HConstants.RETRY_BACKOFF.length - 1;
return this.pause * HConstants.RETRY_BACKOFF[tries];
}
/** {@inheritDoc} */ /** {@inheritDoc} */
public HMasterInterface getMaster() throws MasterNotRunningException { public HMasterInterface getMaster() throws MasterNotRunningException {
HServerAddress masterLocation = null; HServerAddress masterLocation = null;
@ -199,13 +205,14 @@ public class HConnectionManager implements HConstants {
break; break;
} }
LOG.info("Attempt " + tries + " of " + this.numRetries + LOG.info("Attempt " + tries + " of " + this.numRetries +
" failed with <" + e + ">. Retrying after sleep of " + this.pause); " failed with <" + e + ">. Retrying after sleep of " +
getPauseTime(tries));
} }
// We either cannot connect to master or it is not running. Sleep & retry // We either cannot connect to master or it is not running. Sleep & retry
try { try {
Thread.sleep(this.pause); Thread.sleep(getPauseTime(tries));
} catch (InterruptedException e) { } catch (InterruptedException e) {
// continue // continue
} }
@ -578,7 +585,7 @@ public class HConnectionManager implements HConstants {
} }
try{ try{
Thread.sleep(pause); Thread.sleep(getPauseTime(tries));
} catch (InterruptedException e){ } catch (InterruptedException e){
// continue // continue
} }
@ -795,7 +802,7 @@ public class HConnectionManager implements HConstants {
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("Sleeping. Waiting for root region."); LOG.debug("Sleeping. Waiting for root region.");
} }
Thread.sleep(pause); Thread.sleep(getPauseTime(tries));
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("Wake. Retry finding root region."); LOG.debug("Wake. Retry finding root region.");
} }
@ -837,7 +844,7 @@ public class HConnectionManager implements HConstants {
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("Root region location changed. Sleeping."); LOG.debug("Root region location changed. Sleeping.");
} }
Thread.sleep(pause); Thread.sleep(getPauseTime(tries));
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("Wake. Retry finding root region."); LOG.debug("Wake. Retry finding root region.");
} }
@ -890,7 +897,7 @@ public class HConnectionManager implements HConstants {
} }
} }
try { try {
Thread.sleep(pause); Thread.sleep(getPauseTime(tries));
} catch (InterruptedException e) { } catch (InterruptedException e) {
// continue // continue
} }