You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by nk...@apache.org on 2014/04/07 18:55:46 UTC

svn commit: r1585518 - in /hbase/trunk: bin/ hbase-client/src/main/java/org/apache/hadoop/hbase/client/ hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ hbase-common/src/main/java/org/apache/hadoop/hbase/ hbase-server/src/main/java/org/apac...

Author: nkeywal
Date: Mon Apr  7 16:55:45 2014
New Revision: 1585518

URL: http://svn.apache.org/r1585518
Log:
HBASE-10018 Change the location prefetch

Modified:
    hbase/trunk/bin/region_mover.rb
    hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java
    hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java
    hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionKey.java
    hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
    hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTableInterface.java
    hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java
    hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetaScanner.java
    hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
    hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
    hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HTableWrapper.java
    hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientTimeouts.java
    hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
    hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java
    hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java

Modified: hbase/trunk/bin/region_mover.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/bin/region_mover.rb?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/bin/region_mover.rb (original)
+++ hbase/trunk/bin/region_mover.rb Mon Apr  7 16:55:45 2014
@@ -270,7 +270,7 @@ end
 # Get configuration instance
 def getConfiguration()
   config = HBaseConfiguration.create()
-  # No prefetching on .META.
+  # No prefetching on .META. This is for versions pre 0.99. Newer versions do not prefetch.
   config.setInt("hbase.client.prefetch.limit", 1)
   # Make a config that retries at short intervals many times
   config.setInt("hbase.client.pause", 500)

Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java Mon Apr  7 16:55:45 2014
@@ -36,7 +36,6 @@ import java.util.concurrent.ConcurrentHa
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.ConcurrentSkipListSet;
-import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -421,39 +420,6 @@ class ConnectionManager {
     }
   }
 
-  /**
-   * It is provided for unit test cases which verify the behavior of region
-   * location cache prefetch.
-   * @return Number of cached regions for the table.
-   * @throws ZooKeeperConnectionException
-   */
-  static int getCachedRegionCount(Configuration conf, final TableName tableName)
-  throws IOException {
-    return execute(new HConnectable<Integer>(conf) {
-      @Override
-      public Integer connect(HConnection connection) {
-        return ((HConnectionImplementation)connection).getNumberOfCachedRegionLocations(tableName);
-      }
-    });
-  }
-
-  /**
-   * It's provided for unit test cases which verify the behavior of region
-   * location cache prefetch.
-   * @return true if the region where the table and row reside is cached.
-   * @throws ZooKeeperConnectionException
-   */
-  static boolean isRegionCached(Configuration conf,
-                                final TableName tableName,
-                                final byte[] row)
-  throws IOException {
-    return execute(new HConnectable<Boolean>(conf) {
-      @Override
-      public Boolean connect(HConnection connection) {
-        return ((HConnectionImplementation) connection).isRegionCached(tableName, row);
-      }
-    });
-  }
 
   /**
    * This convenience method invokes the given {@link HConnectable#connect}
@@ -500,7 +466,6 @@ class ConnectionManager {
     private final int numTries;
     final int rpcTimeout;
     private NonceGenerator nonceGenerator = null;
-    private final int prefetchRegionLimit;
     private final AsyncProcess asyncProcess;
 
     private volatile boolean closed;
@@ -546,11 +511,6 @@ class ConnectionManager {
     // The access to this attribute must be protected by a lock on cachedRegionLocations
     private final Set<ServerName> cachedServers = new ConcurrentSkipListSet<ServerName>();
 
-    // region cache prefetch is enabled by default. this set contains all
-    // tables whose region cache prefetch are disabled.
-    private final Set<Integer> regionCachePrefetchDisabledTables =
-      new CopyOnWriteArraySet<Integer>();
-
     private int refCount;
 
     // indicates whether this connection's life cycle is managed (by us)
@@ -637,10 +597,6 @@ class ConnectionManager {
         this.nonceGenerator = new NoNonceGenerator();
       }
       this.asyncProcess = createAsyncProcess(this.conf);
-
-      this.prefetchRegionLimit = conf.getInt(
-          HConstants.HBASE_CLIENT_PREFETCH_LIMIT,
-          HConstants.DEFAULT_HBASE_CLIENT_PREFETCH_LIMIT);
     }
 
     @Override
@@ -1029,62 +985,7 @@ class ConnectionManager {
         return this.registry.getMetaRegionLocation();
       } else {
         // Region not in the cache - have to go to the meta RS
-        return locateRegionInMeta(TableName.META_TABLE_NAME, tableName, row,
-          useCache, userRegionLock, retry);
-      }
-    }
-
-    /*
-     * Search hbase:meta for the HRegionLocation info that contains the table and
-     * row we're seeking. It will prefetch certain number of regions info and
-     * save them to the global region cache.
-     */
-    private void prefetchRegionCache(final TableName tableName,
-        final byte[] row) {
-      // Implement a new visitor for MetaScanner, and use it to walk through
-      // the hbase:meta
-      MetaScannerVisitor visitor = new MetaScannerVisitorBase() {
-        public boolean processRow(Result result) throws IOException {
-          try {
-            HRegionInfo regionInfo = MetaScanner.getHRegionInfo(result);
-            if (regionInfo == null) {
-              return true;
-            }
-
-            // possible we got a region of a different table...
-            if (!regionInfo.getTable().equals(tableName)) {
-              return false; // stop scanning
-            }
-            if (regionInfo.isOffline()) {
-              // don't cache offline regions
-              return true;
-            }
-
-            ServerName serverName = HRegionInfo.getServerName(result);
-            if (serverName == null) {
-              return true; // don't cache it
-            }
-            // instantiate the location
-            long seqNum = HRegionInfo.getSeqNumDuringOpen(result);
-            HRegionLocation loc = new HRegionLocation(regionInfo, serverName, seqNum);
-            // cache this meta entry
-            cacheLocation(tableName, null, loc);
-            return true;
-          } catch (RuntimeException e) {
-            throw new IOException(e);
-          }
-        }
-      };
-      try {
-        // pre-fetch certain number of regions info at region cache.
-        MetaScanner.metaScan(conf, this, visitor, tableName, row,
-            this.prefetchRegionLimit, TableName.META_TABLE_NAME);
-      } catch (IOException e) {
-        if (ExceptionUtil.isInterrupt(e)) {
-          Thread.currentThread().interrupt();
-        } else {
-          LOG.warn("Encountered problems when prefetch hbase:meta table: ", e);
-        }
+        return locateRegionInMeta(tableName, row, useCache, retry);
       }
     }
 
@@ -1092,73 +993,58 @@ class ConnectionManager {
       * Search the hbase:meta table for the HRegionLocation
       * info that contains the table and row we're seeking.
       */
-    private HRegionLocation locateRegionInMeta(final TableName parentTable,
-      final TableName tableName, final byte [] row, boolean useCache,
-      Object regionLockObject, boolean retry)
-    throws IOException {
-      HRegionLocation location;
+    private HRegionLocation locateRegionInMeta(TableName tableName, byte[] row,
+                   boolean useCache, boolean retry) throws IOException {
+
       // If we are supposed to be using the cache, look in the cache to see if
       // we already have the region.
       if (useCache) {
-        location = getCachedLocation(tableName, row);
+        HRegionLocation location = getCachedLocation(tableName, row);
         if (location != null) {
           return location;
         }
       }
-      int localNumRetries = retry ? numTries : 1;
+
       // build the key of the meta region we should be looking for.
       // the extra 9's on the end are necessary to allow "exact" matches
       // without knowing the precise region names.
-      byte [] metaKey = HRegionInfo.createRegionName(tableName, row,
-        HConstants.NINES, false);
+      byte[] metaKey = HRegionInfo.createRegionName(tableName, row, HConstants.NINES, false);
+
+      Scan s = new Scan();
+      s.setReversed(true);
+      s.setStartRow(metaKey);
+      s.setSmall(true);
+      s.setCaching(1);
+
+      HConnection connection = ConnectionManager.getConnectionInternal(conf);
+      int localNumRetries = (retry ? numTries : 1);
+
       for (int tries = 0; true; tries++) {
         if (tries >= localNumRetries) {
           throw new NoServerForRegionException("Unable to find region for "
-            + Bytes.toStringBinary(row) + " after " + numTries + " tries.");
+              + Bytes.toStringBinary(row) + " in " + tableName +
+              " after " + localNumRetries + " tries.");
+        }
+        if (useCache) {
+          HRegionLocation location = getCachedLocation(tableName, row);
+          if (location != null) {
+            return location;
+          }
         }
 
-        HRegionLocation metaLocation = null;
+        // Query the meta region
         try {
-          // locate the meta region
-          metaLocation = locateRegion(parentTable, metaKey, true, false);
-          // If null still, go around again.
-          if (metaLocation == null) continue;
-          ClientService.BlockingInterface service = getClient(metaLocation.getServerName());
-
-          Result regionInfoRow;
-          // This block guards against two threads trying to load the meta
-          // region at the same time. The first will load the meta region and
-          // the second will use the value that the first one found.
-          if (useCache) {
-            if (TableName.META_TABLE_NAME.equals(parentTable) &&
-                getRegionCachePrefetch(tableName)) {
-              synchronized (regionLockObject) {
-                // Check the cache again for a hit in case some other thread made the
-                // same query while we were waiting on the lock.
-                location = getCachedLocation(tableName, row);
-                if (location != null) {
-                  return location;
-                }
-                // If the parent table is META, we may want to pre-fetch some
-                // region info into the global region cache for this table.
-                prefetchRegionCache(tableName, row);
-              }
-            }
-            location = getCachedLocation(tableName, row);
-            if (location != null) {
-              return location;
+          Result regionInfoRow = null;
+          ReversedClientScanner rcs = null;
+          try {
+            rcs = new ClientSmallReversedScanner(conf, s, TableName.META_TABLE_NAME, connection);
+            regionInfoRow = rcs.next();
+          } finally {
+            if (rcs != null) {
+              rcs.close();
             }
-          } else {
-            // If we are not supposed to be using the cache, delete any existing cached location
-            // so it won't interfere.
-            forceDeleteCachedLocation(tableName, row);
           }
 
-          // Query the meta region for the location of the meta region
-          regionInfoRow = ProtobufUtil.getRowOrBefore(service,
-              metaLocation.getRegionInfo().getRegionName(), metaKey,
-              HConstants.CATALOG_FAMILY);
-
           if (regionInfoRow == null) {
             throw new TableNotFoundException(tableName);
           }
@@ -1167,7 +1053,7 @@ class ConnectionManager {
           HRegionInfo regionInfo = MetaScanner.getHRegionInfo(regionInfoRow);
           if (regionInfo == null) {
             throw new IOException("HRegionInfo was null or empty in " +
-              parentTable + ", row=" + regionInfoRow);
+              TableName.META_TABLE_NAME + ", row=" + regionInfoRow);
           }
 
           // possible we got a region of a different table...
@@ -1191,7 +1077,7 @@ class ConnectionManager {
           ServerName serverName = HRegionInfo.getServerName(regionInfoRow);
           if (serverName == null) {
             throw new NoServerForRegionException("No server address listed " +
-              "in " + parentTable + " for region " +
+              "in " + TableName.META_TABLE_NAME + " for region " +
               regionInfo.getRegionNameAsString() + " containing row " +
               Bytes.toStringBinary(row));
           }
@@ -1203,10 +1089,11 @@ class ConnectionManager {
           }
 
           // Instantiate the location
-          location = new HRegionLocation(regionInfo, serverName,
+          HRegionLocation location = new HRegionLocation(regionInfo, serverName,
             HRegionInfo.getSeqNumDuringOpen(regionInfoRow));
           cacheLocation(tableName, null, location);
           return location;
+
         } catch (TableNotFoundException e) {
           // if we got this error, probably means the table just plain doesn't
           // exist. rethrow the error immediately. this should always be coming
@@ -1218,13 +1105,12 @@ class ConnectionManager {
           if (e instanceof RemoteException) {
             e = ((RemoteException)e).unwrapRemoteException();
           }
-          if (tries < numTries - 1) {
+          if (tries < localNumRetries - 1) {
             if (LOG.isDebugEnabled()) {
               LOG.debug("locateRegionInMeta parentTable=" +
-                parentTable + ", metaLocation=" +
-                ((metaLocation == null)? "null": "{" + metaLocation + "}") +
+                  TableName.META_TABLE_NAME + ", metaLocation=" +
                 ", attempt=" + tries + " of " +
-                this.numTries + " failed; retrying after sleep of " +
+                localNumRetries + " failed; retrying after sleep of " +
                 ConnectionUtils.getPauseTime(this.pause, tries) + " because: " + e.getMessage());
             }
           } else {
@@ -1233,7 +1119,7 @@ class ConnectionManager {
           // Only relocate the parent region if necessary
           if(!(e instanceof RegionOfflineException ||
               e instanceof NoServerForRegionException)) {
-            relocateRegion(parentTable, metaKey);
+            relocateRegion(TableName.META_TABLE_NAME, metaKey);
           }
         }
         try{
@@ -2336,30 +2222,26 @@ class ConnectionManager {
     }
 
     @Override
-    public void setRegionCachePrefetch(final TableName tableName,
-        final boolean enable) {
-      if (!enable) {
-        regionCachePrefetchDisabledTables.add(Bytes.mapKey(tableName.getName()));
-      }
-      else {
-        regionCachePrefetchDisabledTables.remove(Bytes.mapKey(tableName.getName()));
-      }
+    @Deprecated
+    public void setRegionCachePrefetch(final TableName tableName, final boolean enable) {
     }
 
     @Override
+    @Deprecated
     public void setRegionCachePrefetch(final byte[] tableName,
         final boolean enable) {
-      setRegionCachePrefetch(TableName.valueOf(tableName), enable);
     }
 
     @Override
+    @Deprecated
     public boolean getRegionCachePrefetch(TableName tableName) {
-      return !regionCachePrefetchDisabledTables.contains(Bytes.mapKey(tableName.getName()));
+      return false;
     }
 
     @Override
+    @Deprecated
     public boolean getRegionCachePrefetch(byte[] tableName) {
-      return getRegionCachePrefetch(TableName.valueOf(tableName));
+      return false;
     }
 
     @Override

Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java Mon Apr  7 16:55:45 2014
@@ -35,7 +35,6 @@ import org.apache.hadoop.hbase.ServerNam
 import org.apache.hadoop.hbase.ZooKeeperConnectionException;
 import org.apache.hadoop.hbase.catalog.CatalogTracker;
 import org.apache.hadoop.hbase.client.coprocessor.Batch;
-import org.apache.hadoop.hbase.client.coprocessor.Batch.Callback;
 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.AdminService;
 import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ClientService;
 import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.MasterService;
@@ -466,27 +465,28 @@ public interface HConnection extends Abo
       Batch.Callback<R> callback) throws IOException, InterruptedException;
 
   /**
-   * Enable or disable region cache prefetch for the table. It will be
-   * applied for the given table's all HTable instances within this
-   * connection. By default, the cache prefetch is enabled.
-   * @param tableName name of table to configure.
-   * @param enable Set to true to enable region cache prefetch.
-   */
+   * @deprecated does nothing since since 0.99
+   **/
+  @Deprecated
   public void setRegionCachePrefetch(final TableName tableName,
       final boolean enable);
 
+  /**
+   * @deprecated does nothing since 0.99
+   **/
   @Deprecated
   public void setRegionCachePrefetch(final byte[] tableName,
       final boolean enable);
 
   /**
-   * Check whether region cache prefetch is enabled or not.
-   * @param tableName name of table to check
-   * @return true if table's region cache prefetch is enabled. Otherwise
-   * it is disabled.
-   */
+   * @deprecated always return false since 0.99
+   **/
+  @Deprecated
   boolean getRegionCachePrefetch(final TableName tableName);
 
+  /**
+   * @deprecated always return false since 0.99
+   **/
   @Deprecated
   boolean getRegionCachePrefetch(final byte[] tableName);
 

Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionKey.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionKey.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionKey.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionKey.java Mon Apr  7 16:55:45 2014
@@ -45,7 +45,6 @@ class HConnectionKey {
       HConstants.ZOOKEEPER_RECOVERABLE_WAITTIME,
       HConstants.HBASE_CLIENT_PAUSE, HConstants.HBASE_CLIENT_RETRIES_NUMBER,
       HConstants.HBASE_RPC_TIMEOUT_KEY,
-      HConstants.HBASE_CLIENT_PREFETCH_LIMIT,
       HConstants.HBASE_META_SCANNER_CACHING,
       HConstants.HBASE_CLIENT_INSTANCE_ID,
       HConstants.RPC_CODEC_CONF_KEY };

Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java Mon Apr  7 16:55:45 2014
@@ -716,8 +716,10 @@ public class HTable implements HTableInt
 
   /**
    * {@inheritDoc}
+   * @deprecated Use reversed scan instead.
    */
    @Override
+   @Deprecated
    public Result getRowOrBefore(final byte[] row, final byte[] family)
        throws IOException {
      RegionServerCallable<Result> callable = new RegionServerCallable<Result>(this.connection,
@@ -1492,22 +1494,20 @@ public class HTable implements HTableInt
    * @param enable Set to true to enable region cache prefetch. Or set to
    * false to disable it.
    * @throws IOException
+   * @deprecated does nothing since 0.99
    */
+  @Deprecated
   public static void setRegionCachePrefetch(final byte[] tableName,
-      final boolean enable) throws IOException {
-    setRegionCachePrefetch(TableName.valueOf(tableName), enable);
+      final boolean enable)  throws IOException {
   }
 
+  /**
+   * @deprecated does nothing since 0.99
+   */
+  @Deprecated
   public static void setRegionCachePrefetch(
       final TableName tableName,
       final boolean enable) throws IOException {
-    HConnectionManager.execute(new HConnectable<Void>(HBaseConfiguration.create()) {
-      @Override
-      public Void connect(HConnection connection) throws IOException {
-        connection.setRegionCachePrefetch(tableName, enable);
-        return null;
-      }
-    });
   }
 
   /**
@@ -1519,22 +1519,20 @@ public class HTable implements HTableInt
    * @param enable Set to true to enable region cache prefetch. Or set to
    * false to disable it.
    * @throws IOException
+   * @deprecated does nothing since 0.99
    */
+  @Deprecated
   public static void setRegionCachePrefetch(final Configuration conf,
       final byte[] tableName, final boolean enable) throws IOException {
-    setRegionCachePrefetch(conf, TableName.valueOf(tableName), enable);
   }
 
+  /**
+   * @deprecated does nothing since 0.99
+   */
+  @Deprecated
   public static void setRegionCachePrefetch(final Configuration conf,
       final TableName tableName,
       final boolean enable) throws IOException {
-    HConnectionManager.execute(new HConnectable<Void>(conf) {
-      @Override
-      public Void connect(HConnection connection) throws IOException {
-        connection.setRegionCachePrefetch(tableName, enable);
-        return null;
-      }
-    });
   }
 
   /**
@@ -1544,20 +1542,21 @@ public class HTable implements HTableInt
    * @return true if table's region cache prefecth is enabled. Otherwise
    * it is disabled.
    * @throws IOException
+   * @deprecated always return false since 0.99
    */
+  @Deprecated
   public static boolean getRegionCachePrefetch(final Configuration conf,
       final byte[] tableName) throws IOException {
-    return getRegionCachePrefetch(conf, TableName.valueOf(tableName));
+    return false;
   }
 
+  /**
+   * @deprecated always return false since 0.99
+   */
+  @Deprecated
   public static boolean getRegionCachePrefetch(final Configuration conf,
       final TableName tableName) throws IOException {
-    return HConnectionManager.execute(new HConnectable<Boolean>(conf) {
-      @Override
-      public Boolean connect(HConnection connection) throws IOException {
-        return connection.getRegionCachePrefetch(tableName);
-      }
-    });
+    return false;
   }
 
   /**
@@ -1566,20 +1565,20 @@ public class HTable implements HTableInt
    * @return true if table's region cache prefecth is enabled. Otherwise
    * it is disabled.
    * @throws IOException
+   * @deprecated always return false since 0.99
    */
+  @Deprecated
   public static boolean getRegionCachePrefetch(final byte[] tableName) throws IOException {
-    return getRegionCachePrefetch(TableName.valueOf(tableName));
+    return false;
   }
 
+  /**
+   * @deprecated always return false since 0.99
+   */
+  @Deprecated
   public static boolean getRegionCachePrefetch(
       final TableName tableName) throws IOException {
-    return HConnectionManager.execute(new HConnectable<Boolean>(
-        HBaseConfiguration.create()) {
-      @Override
-      public Boolean connect(HConnection connection) throws IOException {
-        return connection.getRegionCachePrefetch(tableName);
-      }
-    });
+    return false;
   }
 
   /**

Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTableInterface.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTableInterface.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTableInterface.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTableInterface.java Mon Apr  7 16:55:45 2014
@@ -196,7 +196,7 @@ public interface HTableInterface extends
    * @since 0.20.0
    * 
    * @deprecated As of version 0.92 this method is deprecated without
-   * replacement.   
+   * replacement. Since version 0.96+, you can use reversed scan.
    * getRowOrBefore is used internally to find entries in hbase:meta and makes
    * various assumptions about the table (which are true for hbase:meta but not
    * in general) to be efficient.

Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java Mon Apr  7 16:55:45 2014
@@ -407,6 +407,7 @@ public class HTablePool implements Close
 
     @Override
     @SuppressWarnings("deprecation")
+    @Deprecated
     public Result getRowOrBefore(byte[] row, byte[] family) throws IOException {
       checkState();
       return table.getRowOrBefore(row, family);

Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetaScanner.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetaScanner.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetaScanner.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetaScanner.java Mon Apr  7 16:55:45 2014
@@ -127,21 +127,24 @@ public class MetaScanner {
       final MetaScannerVisitor visitor, final TableName tableName,
       final byte[] row, final int rowLimit, final TableName metaTableName)
     throws IOException {
-    int rowUpperLimit = rowLimit > 0 ? rowLimit: Integer.MAX_VALUE;
-    HTable metaTable;
-    if (connection == null) {
-      metaTable = new HTable(configuration, TableName.META_TABLE_NAME, null);
-    } else {
-      metaTable = new HTable(TableName.META_TABLE_NAME, connection, null);
+
+    if (connection == null){
+      connection = ConnectionManager.getConnectionInternal(configuration);
     }
+
+    int rowUpperLimit = rowLimit > 0 ? rowLimit: Integer.MAX_VALUE;
     // Calculate startrow for scan.
     byte[] startRow;
     ResultScanner scanner = null;
+
     try {
       if (row != null) {
         // Scan starting at a particular row in a particular table
         byte[] searchRow = HRegionInfo.createRegionName(tableName, row, HConstants.NINES, false);
+        HTable metaTable;
+        metaTable = new HTable(TableName.META_TABLE_NAME, connection, null);
         Result startRowResult = metaTable.getRowOrBefore(searchRow, HConstants.CATALOG_FAMILY);
+        metaTable.close();
         if (startRowResult == null) {
           throw new TableNotFoundException("Cannot find row in "+ TableName
               .META_TABLE_NAME.getNameAsString()+" for table: "
@@ -175,8 +178,10 @@ public class MetaScanner {
           Bytes.toStringBinary(startRow) + " for max=" + rowUpperLimit + " with caching=" + rows);
       }
       // Run the scan
-      scanner = metaTable.getScanner(scan);
-      Result result = null;
+      scanner = (scan.isSmall() ?
+          new ClientSmallScanner(configuration, scan, TableName.META_TABLE_NAME, connection) :
+          new ClientScanner(configuration, scan, TableName.META_TABLE_NAME, connection));
+      Result result;
       int processedRows = 0;
       while ((result = scanner.next()) != null) {
         if (visitor != null) {
@@ -202,14 +207,6 @@ public class MetaScanner {
           LOG.debug("Got exception in closing the meta scanner visitor", t);
         }
       }
-      if (metaTable != null) {
-        try {
-          metaTable.close();
-        } catch (Throwable t) {
-          ExceptionUtil.rethrowIfInterrupt(t);
-          LOG.debug("Got exception in closing the meta table", t);
-        }
-      }
     }
   }
 

Modified: hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java (original)
+++ hbase/trunk/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java Mon Apr  7 16:55:45 2014
@@ -1437,7 +1437,9 @@ public final class ProtobufUtil {
    * @param family
    * @return the row or the closestRowBefore if it doesn't exist
    * @throws IOException
+   * @deprecated since 0.99 - use reversed scanner instead.
    */
+  @Deprecated
   public static Result getRowOrBefore(final ClientService.BlockingInterface client,
       final byte[] regionName, final byte[] row,
       final byte[] family) throws IOException {

Modified: hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java (original)
+++ hbase/trunk/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java Mon Apr  7 16:55:45 2014
@@ -629,17 +629,6 @@ public final class HConstants {
   public static int DEFAULT_HBASE_CLIENT_RETRIES_NUMBER = 31;
 
   /**
-   * Parameter name for client prefetch limit, used as the maximum number of regions
-   * info that will be prefetched.
-   */
-  public static String HBASE_CLIENT_PREFETCH_LIMIT = "hbase.client.prefetch.limit";
-
-  /**
-   * Default value of {@link #HBASE_CLIENT_PREFETCH_LIMIT}.
-   */
-  public static int DEFAULT_HBASE_CLIENT_PREFETCH_LIMIT = 10;
-
-  /**
    * Parameter name to set the default scanner caching for all clients.
    */
   public static String HBASE_CLIENT_SCANNER_CACHING = "hbase.client.scanner.caching";

Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HTableWrapper.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HTableWrapper.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HTableWrapper.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HTableWrapper.java Mon Apr  7 16:55:45 2014
@@ -126,6 +126,7 @@ public class HTableWrapper implements HT
     }
   }
 
+  @Deprecated
   public Result getRowOrBefore(byte[] row, byte[] family)
       throws IOException {
     return table.getRowOrBefore(row, family);

Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientTimeouts.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientTimeouts.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientTimeouts.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientTimeouts.java Mon Apr  7 16:55:45 2014
@@ -77,7 +77,6 @@ public class TestClientTimeouts {
    */
   @Test
   public void testAdminTimeout() throws Exception {
-    long lastLimit = HConstants.DEFAULT_HBASE_CLIENT_PREFETCH_LIMIT;
     HConnection lastConnection = null;
     boolean lastFailed = false;
     int initialInvocations = RandomTimeoutBlockingRpcChannel.invokations.get();
@@ -87,7 +86,7 @@ public class TestClientTimeouts {
         lastFailed = false;
         // Ensure the HBaseAdmin uses a new connection by changing Configuration.
         Configuration conf = HBaseConfiguration.create(TEST_UTIL.getConfiguration());
-        conf.setLong(HConstants.HBASE_CLIENT_PREFETCH_LIMIT, ++lastLimit);
+        conf.set(HConstants.HBASE_CLIENT_INSTANCE_ID, String.valueOf(-1));
         HBaseAdmin admin = null;
         try {
           admin = new HBaseAdmin(conf);

Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java Mon Apr  7 16:55:45 2014
@@ -372,84 +372,6 @@ public class TestFromClientSide {
      }
    }
 
-  /**
-   * HBASE-2468 use case 3:
-   */
-  @Test
-  public void testRegionCachePreWarm() throws Exception {
-    LOG.info("Starting testRegionCachePreWarm");
-    final TableName TABLENAME =
-        TableName.valueOf("testCachePrewarm");
-    Configuration conf = TEST_UTIL.getConfiguration();
-
-    // Set up test table:
-    // Create table:
-    TEST_UTIL.createTable(TABLENAME, FAMILY);
-
-    // disable region cache for the table.
-    HTable.setRegionCachePrefetch(conf, TABLENAME, false);
-    assertFalse("The table is disabled for region cache prefetch",
-        HTable.getRegionCachePrefetch(conf, TABLENAME));
-
-    HTable table = new HTable(conf, TABLENAME);
-
-    // create many regions for the table.
-    TEST_UTIL.createMultiRegions(table, FAMILY);
-    // This count effectively waits until the regions have been
-    // fully assigned
-    TEST_UTIL.countRows(table);
-    table.getConnection().clearRegionCache();
-    assertEquals("Clearing cache should have 0 cached ", 0,
-        ConnectionManager.getCachedRegionCount(conf, TABLENAME));
-
-    // A Get is suppose to do a region lookup request
-    Get g = new Get(Bytes.toBytes("aaa"));
-    table.get(g);
-
-    // only one region should be cached if the cache prefetch is disabled.
-    assertEquals("Number of cached region is incorrect ", 1,
-        ConnectionManager.getCachedRegionCount(conf, TABLENAME));
-
-    // now we enable cached prefetch.
-    HTable.setRegionCachePrefetch(conf, TABLENAME, true);
-    assertTrue("The table is enabled for region cache prefetch",
-        HTable.getRegionCachePrefetch(conf, TABLENAME));
-
-    HTable.setRegionCachePrefetch(conf, TABLENAME, false);
-    assertFalse("The table is disabled for region cache prefetch",
-        HTable.getRegionCachePrefetch(conf, TABLENAME));
-
-    HTable.setRegionCachePrefetch(conf, TABLENAME, true);
-    assertTrue("The table is enabled for region cache prefetch",
-        HTable.getRegionCachePrefetch(conf, TABLENAME));
-
-    table.getConnection().clearRegionCache();
-
-    assertEquals("Number of cached region is incorrect ", 0,
-        ConnectionManager.getCachedRegionCount(conf, TABLENAME));
-
-    // if there is a cache miss, some additional regions should be prefetched.
-    Get g2 = new Get(Bytes.toBytes("bbb"));
-    table.get(g2);
-
-    // Get the configured number of cache read-ahead regions.
-    int prefetchRegionNumber = conf.getInt("hbase.client.prefetch.limit", 10);
-
-    // the total number of cached regions == region('aaa") + prefeched regions.
-    LOG.info("Testing how many regions cached");
-    assertEquals("Number of cached region is incorrect ", prefetchRegionNumber,
-        ConnectionManager.getCachedRegionCount(conf, TABLENAME));
-
-    table.getConnection().clearRegionCache();
-
-    Get g3 = new Get(Bytes.toBytes("abc"));
-    table.get(g3);
-    assertEquals("Number of cached region is incorrect ", prefetchRegionNumber,
-        ConnectionManager.getCachedRegionCount(conf, TABLENAME));
-
-    LOG.info("Finishing testRegionCachePreWarm");
-  }
-
 
   /**
    * Verifies that getConfiguration returns the same Configuration object used

Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java Mon Apr  7 16:55:45 2014
@@ -281,16 +281,21 @@ public class TestCoprocessorScanPolicy {
     public KeyValueScanner preStoreScannerOpen(
         final ObserverContext<RegionCoprocessorEnvironment> c, Store store, final Scan scan,
         final NavigableSet<byte[]> targetCols, KeyValueScanner s) throws IOException {
-      Long newTtl = ttls.get(store.getTableName());
-      Integer newVersions = versions.get(store.getTableName());
-      ScanInfo oldSI = store.getScanInfo();
-      HColumnDescriptor family = store.getFamily();
-      ScanInfo scanInfo = new ScanInfo(family.getName(), family.getMinVersions(),
-          newVersions == null ? family.getMaxVersions() : newVersions,
-          newTtl == null ? oldSI.getTtl() : newTtl, family.getKeepDeletedCells(),
-          oldSI.getTimeToPurgeDeletes(), oldSI.getComparator());
-      return new StoreScanner(store, scanInfo, scan, targetCols,
-        ((HStore)store).getHRegion().getReadpoint(IsolationLevel.READ_COMMITTED));
+      TableName tn = store.getTableName();
+      if (!tn.isSystemTable()) {
+        Long newTtl = ttls.get(store.getTableName());
+        Integer newVersions = versions.get(store.getTableName());
+        ScanInfo oldSI = store.getScanInfo();
+        HColumnDescriptor family = store.getFamily();
+        ScanInfo scanInfo = new ScanInfo(family.getName(), family.getMinVersions(),
+            newVersions == null ? family.getMaxVersions() : newVersions,
+            newTtl == null ? oldSI.getTtl() : newTtl, family.getKeepDeletedCells(),
+            oldSI.getTimeToPurgeDeletes(), oldSI.getComparator());
+        return new StoreScanner(store, scanInfo, scan, targetCols,
+            ((HStore) store).getHRegion().getReadpoint(IsolationLevel.READ_COMMITTED));
+      } else {
+        return s;
+      }
     }
   }
 

Modified: hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java?rev=1585518&r1=1585517&r2=1585518&view=diff
==============================================================================
--- hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java (original)
+++ hbase/trunk/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java Mon Apr  7 16:55:45 2014
@@ -1396,6 +1396,7 @@ public class ThriftServerRunner implemen
       }
     }
 
+    @Deprecated
     @Override
     public List<TCell> getRowOrBefore(ByteBuffer tableName, ByteBuffer row,
         ByteBuffer family) throws IOError {