Repository: hbase
Updated Branches:
  refs/heads/branch-1 366d7028e -> 4468f3ce9


HBASE-13829 Add more ThrottleType (Guanghao Zhang)


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/4468f3ce
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/4468f3ce
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/4468f3ce

Branch: refs/heads/branch-1
Commit: 4468f3ce952a485afc9ca5ac92ef30ac95a97e76
Parents: 366d702
Author: tedyu <[email protected]>
Authored: Sat Jun 13 06:30:26 2015 -0700
Committer: tedyu <[email protected]>
Committed: Sat Jun 13 06:30:26 2015 -0700

----------------------------------------------------------------------
 .../hadoop/hbase/protobuf/ProtobufUtil.java     |  16 ++
 .../hbase/quotas/QuotaSettingsFactory.java      |  16 ++
 .../hadoop/hbase/quotas/ThrottleSettings.java   |   4 +
 .../hadoop/hbase/quotas/ThrottleType.java       |  14 +-
 .../hadoop/hbase/quotas/TestQuotaAdmin.java     |  53 +++++-
 .../hadoop/hbase/quotas/TestQuotaThrottle.java  | 174 +++++++++++++++++++
 hbase-shell/src/main/ruby/hbase/quotas.rb       |   5 +-
 .../src/main/ruby/shell/commands/set_quota.rb   |  16 +-
 8 files changed, 289 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
index fca3ca4..f6d08bb 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
@@ -2928,6 +2928,14 @@ public final class ProtobufUtil {
       return ThrottleType.REQUEST_NUMBER;
     case REQUEST_SIZE:
       return ThrottleType.REQUEST_SIZE;
+    case WRITE_NUMBER:
+      return ThrottleType.WRITE_NUMBER;
+    case WRITE_SIZE:
+      return ThrottleType.WRITE_SIZE;
+    case READ_NUMBER:
+      return ThrottleType.READ_NUMBER;
+    case READ_SIZE:
+      return ThrottleType.READ_SIZE;
     default:
       throw new RuntimeException("Invalid ThrottleType " + proto);
     }
@@ -2944,6 +2952,14 @@ public final class ProtobufUtil {
       return QuotaProtos.ThrottleType.REQUEST_NUMBER;
     case REQUEST_SIZE:
       return QuotaProtos.ThrottleType.REQUEST_SIZE;
+    case WRITE_NUMBER:
+      return QuotaProtos.ThrottleType.WRITE_NUMBER;
+    case WRITE_SIZE:
+      return QuotaProtos.ThrottleType.WRITE_SIZE;
+    case READ_NUMBER:
+      return QuotaProtos.ThrottleType.READ_NUMBER;
+    case READ_SIZE:
+      return QuotaProtos.ThrottleType.READ_SIZE;
     default:
       throw new RuntimeException("Invalid ThrottleType " + type);
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java
 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java
index 2499e06..f78c7f8 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java
@@ -103,6 +103,22 @@ public class QuotaSettingsFactory {
       settings.add(ThrottleSettings.fromTimedQuota(userName, tableName, 
namespace,
         ThrottleType.REQUEST_SIZE, throttle.getReqSize()));
     }
+    if (throttle.hasWriteNum()) {
+      settings.add(ThrottleSettings.fromTimedQuota(userName, tableName, 
namespace,
+          ThrottleType.WRITE_NUMBER, throttle.getWriteNum()));
+    }
+    if (throttle.hasWriteSize()) {
+      settings.add(ThrottleSettings.fromTimedQuota(userName, tableName, 
namespace,
+          ThrottleType.WRITE_SIZE, throttle.getWriteSize()));
+    }
+    if (throttle.hasReadNum()) {
+      settings.add(ThrottleSettings.fromTimedQuota(userName, tableName, 
namespace,
+          ThrottleType.READ_NUMBER, throttle.getReadNum()));
+    }
+    if (throttle.hasReadSize()) {
+      settings.add(ThrottleSettings.fromTimedQuota(userName, tableName, 
namespace,
+          ThrottleType.READ_SIZE, throttle.getReadSize()));
+    }
     return settings;
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleSettings.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleSettings.java
 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleSettings.java
index dc036b4..0665fe1 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleSettings.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleSettings.java
@@ -67,9 +67,13 @@ class ThrottleSettings extends QuotaSettings {
       if (timedQuota.hasSoftLimit()) {
         switch (getThrottleType()) {
         case REQUEST_NUMBER:
+        case WRITE_NUMBER:
+        case READ_NUMBER:
           builder.append(String.format("%dreq", timedQuota.getSoftLimit()));
           break;
         case REQUEST_SIZE:
+        case WRITE_SIZE:
+        case READ_SIZE:
           builder.append(sizeToString(timedQuota.getSoftLimit()));
           break;
         default:

http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleType.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleType.java 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleType.java
index bb5c093..9b456c2 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleType.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/quotas/ThrottleType.java
@@ -26,9 +26,21 @@ import 
org.apache.hadoop.hbase.classification.InterfaceStability;
 @InterfaceAudience.Public
 @InterfaceStability.Evolving
 public enum ThrottleType {
-  /** Throttling based on the number of request per time-unit */
+  /** Throttling based on the number of requests per time-unit */
   REQUEST_NUMBER,
 
   /** Throttling based on the read+write data size */
   REQUEST_SIZE,
+
+  /** Throttling based on the number of write requests per time-unit */
+  WRITE_NUMBER,
+
+  /** Throttling based on the write data size */
+  WRITE_SIZE,
+
+  /** Throttling based on the number of read requests per time-unit */
+  READ_NUMBER,
+
+  /** Throttling based on the read data size */
+  READ_SIZE,
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java
index 6b92443..f3aa1ff 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java
@@ -57,6 +57,54 @@ public class TestQuotaAdmin {
   }
 
   @Test
+  public void testThrottleType() throws Exception {
+    Admin admin = TEST_UTIL.getHBaseAdmin();
+    String userName = User.getCurrent().getShortName();
+
+    admin.setQuota(QuotaSettingsFactory
+      .throttleUser(userName, ThrottleType.READ_NUMBER, 6, TimeUnit.MINUTES));
+    admin.setQuota(QuotaSettingsFactory
+      .throttleUser(userName, ThrottleType.WRITE_NUMBER, 12, 
TimeUnit.MINUTES));
+    admin.setQuota(QuotaSettingsFactory.bypassGlobals(userName, true));
+
+    try (QuotaRetriever scanner = 
QuotaRetriever.open(TEST_UTIL.getConfiguration())) {
+      int countThrottle = 0;
+      int countGlobalBypass = 0;
+      for (QuotaSettings settings: scanner) {
+        switch (settings.getQuotaType()) {
+          case THROTTLE:
+            ThrottleSettings throttle = (ThrottleSettings)settings;
+            if (throttle.getSoftLimit() == 6) {
+              assertEquals(ThrottleType.READ_NUMBER, 
throttle.getThrottleType());
+            } else if (throttle.getSoftLimit() == 12) {
+              assertEquals(ThrottleType.WRITE_NUMBER, 
throttle.getThrottleType());
+            } else {
+              fail("should not come here, because don't set quota with this 
limit");
+            }
+            assertEquals(userName, throttle.getUserName());
+            assertEquals(null, throttle.getTableName());
+            assertEquals(null, throttle.getNamespace());
+            assertEquals(TimeUnit.MINUTES, throttle.getTimeUnit());
+            countThrottle++;
+            break;
+          case GLOBAL_BYPASS:
+            countGlobalBypass++;
+            break;
+          default:
+            fail("unexpected settings type: " + settings.getQuotaType());
+        }
+      }
+      assertEquals(2, countThrottle);
+      assertEquals(1, countGlobalBypass);
+    }
+
+    admin.setQuota(QuotaSettingsFactory.unthrottleUser(userName));
+    assertNumResults(1, null);
+    admin.setQuota(QuotaSettingsFactory.bypassGlobals(userName, false));
+    assertNumResults(0, null);
+  }
+
+  @Test
   public void testSimpleScan() throws Exception {
     Admin admin = TEST_UTIL.getHBaseAdmin();
     String userName = User.getCurrent().getShortName();
@@ -65,8 +113,7 @@ public class TestQuotaAdmin {
       TimeUnit.MINUTES));
     admin.setQuota(QuotaSettingsFactory.bypassGlobals(userName, true));
 
-    QuotaRetriever scanner = QuotaRetriever.open(TEST_UTIL.getConfiguration());
-    try {
+    try (QuotaRetriever scanner = 
QuotaRetriever.open(TEST_UTIL.getConfiguration())) {
       int countThrottle = 0;
       int countGlobalBypass = 0;
       for (QuotaSettings settings : scanner) {
@@ -90,8 +137,6 @@ public class TestQuotaAdmin {
       }
       assertEquals(1, countThrottle);
       assertEquals(1, countGlobalBypass);
-    } finally {
-      scanner.close();
     }
 
     admin.setQuota(QuotaSettingsFactory.unthrottleUser(userName));

http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java
index 4bb0d35..4605663 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java
@@ -118,6 +118,38 @@ public class TestQuotaThrottle {
     assertEquals(60, doGets(60, tables));
   }
 
+  @Test(timeout=60000)
+  public void testUserGlobalReadAndWriteThrottle() throws Exception {
+    final Admin admin = TEST_UTIL.getHBaseAdmin();
+    final String userName = User.getCurrent().getShortName();
+
+    // Add 6req/min limit for read request
+    admin.setQuota(QuotaSettingsFactory
+      .throttleUser(userName, ThrottleType.READ_NUMBER, 6, TimeUnit.MINUTES));
+    triggerUserCacheRefresh(false, TABLE_NAMES);
+
+    // not limit for write request and should execute at max 6 read requests
+    assertEquals(60, doPuts(60, tables));
+    assertEquals(6, doGets(100, tables));
+
+    waitMinuteQuota();
+
+    // Add 6req/min limit for write request
+    admin.setQuota(QuotaSettingsFactory
+      .throttleUser(userName, ThrottleType.WRITE_NUMBER, 6, TimeUnit.MINUTES));
+    triggerUserCacheRefresh(false, TABLE_NAMES);
+
+    // should execute at max 6 read requests and at max 6 write write requests
+    assertEquals(6, doGets(100, tables));
+    assertEquals(6, doPuts(60, tables));
+
+    // Remove all the limits
+    admin.setQuota(QuotaSettingsFactory.unthrottleUser(userName));
+    triggerUserCacheRefresh(true, TABLE_NAMES);
+    assertEquals(60, doPuts(60, tables));
+    assertEquals(60, doGets(60, tables));
+  }
+
   @Test(timeout = 60000)
   public void testUserTableThrottle() throws Exception {
     final Admin admin = TEST_UTIL.getHBaseAdmin();
@@ -143,6 +175,47 @@ public class TestQuotaThrottle {
     assertEquals(60, doGets(60, tables));
   }
 
+  @Test(timeout=60000)
+  public void testUserTableReadAndWriteThrottle() throws Exception {
+    final Admin admin = TEST_UTIL.getHBaseAdmin();
+    final String userName = User.getCurrent().getShortName();
+
+    // Add 6req/min limit for write request on tables[0]
+    admin.setQuota(QuotaSettingsFactory
+      .throttleUser(userName, TABLE_NAMES[0], ThrottleType.WRITE_NUMBER, 6, 
TimeUnit.MINUTES));
+    triggerUserCacheRefresh(false, TABLE_NAMES[0]);
+
+    // should execute at max 6 write requests and have no limit for read 
request
+    assertEquals(6, doPuts(100, tables[0]));
+    assertEquals(60, doGets(60, tables[0]));
+
+    // no limit on tables[1]
+    assertEquals(60, doPuts(60, tables[1]));
+    assertEquals(60, doGets(60, tables[1]));
+
+    // wait a minute and you should get other 6  write requests executed
+    waitMinuteQuota();
+
+    // Add 6req/min limit for read request on tables[0]
+    admin.setQuota(QuotaSettingsFactory
+      .throttleUser(userName, TABLE_NAMES[0], ThrottleType.READ_NUMBER, 6, 
TimeUnit.MINUTES));
+    triggerUserCacheRefresh(false, TABLE_NAMES[0]);
+
+    // should execute at max 6 read requests and at max 6 write requests
+    assertEquals(6, doPuts(100, tables[0]));
+    assertEquals(6, doGets(60, tables[0]));
+
+    // no limit on tables[1]
+    assertEquals(30, doPuts(30, tables[1]));
+    assertEquals(30, doGets(30, tables[1]));
+
+    // Remove all the limits
+    admin.setQuota(QuotaSettingsFactory.unthrottleUser(userName, 
TABLE_NAMES[0]));
+    triggerUserCacheRefresh(true, TABLE_NAMES);
+    assertEquals(60, doPuts(60, tables));
+    assertEquals(60, doGets(60, tables));
+  }
+
   @Test(timeout = 60000)
   public void testUserNamespaceThrottle() throws Exception {
     final Admin admin = TEST_UTIL.getHBaseAdmin();
@@ -168,6 +241,39 @@ public class TestQuotaThrottle {
     assertEquals(60, doGets(60, tables));
   }
 
+  @Test(timeout=60000)
+  public void testUserNamespaceReadAndWriteThrottle() throws Exception {
+    final Admin admin = TEST_UTIL.getHBaseAdmin();
+    final String userName = User.getCurrent().getShortName();
+    final String NAMESPACE = "default";
+
+    // Add 6req/min limit for read request
+    admin.setQuota(QuotaSettingsFactory
+      .throttleUser(userName, NAMESPACE, ThrottleType.READ_NUMBER, 6, 
TimeUnit.MINUTES));
+    triggerUserCacheRefresh(false, TABLE_NAMES[0]);
+
+    // should execute at max 6 read requests and have no limit for write 
request
+    assertEquals(6, doGets(60, tables[0]));
+    assertEquals(60, doPuts(60, tables[0]));
+
+    waitMinuteQuota();
+
+    // Add 6req/min limit for write request, too
+    admin.setQuota(QuotaSettingsFactory
+      .throttleUser(userName, NAMESPACE, ThrottleType.WRITE_NUMBER, 6, 
TimeUnit.MINUTES));
+    triggerUserCacheRefresh(false, TABLE_NAMES[0]);
+
+    // should execute at max 6 read requests and at max 6 write requests
+    assertEquals(6, doGets(60, tables[0]));
+    assertEquals(6, doPuts(60, tables[0]));
+
+    // Remove all the limits
+    admin.setQuota(QuotaSettingsFactory.unthrottleUser(userName, NAMESPACE));
+    triggerUserCacheRefresh(true, TABLE_NAMES);
+    assertEquals(60, doPuts(60, tables));
+    assertEquals(60, doGets(60, tables));
+  }
+
   @Test(timeout = 60000)
   public void testTableGlobalThrottle() throws Exception {
     final Admin admin = TEST_UTIL.getHBaseAdmin();
@@ -192,6 +298,43 @@ public class TestQuotaThrottle {
     assertEquals(80, doGets(80, tables[0], tables[1]));
   }
 
+  @Test(timeout=60000)
+  public void testTableGlobalReadAndWriteThrottle() throws Exception {
+    final Admin admin = TEST_UTIL.getHBaseAdmin();
+
+    // Add 6req/min limit for read request
+    admin.setQuota(QuotaSettingsFactory
+      .throttleTable(TABLE_NAMES[0], ThrottleType.READ_NUMBER, 6, 
TimeUnit.MINUTES));
+    triggerTableCacheRefresh(false, TABLE_NAMES[0]);
+
+    // should execute at max 6 read requests and have no limit for write 
request
+    assertEquals(6, doGets(100, tables[0]));
+    assertEquals(100, doPuts(100, tables[0]));
+    // should have no limits on tables[1]
+    assertEquals(30, doPuts(30, tables[1]));
+    assertEquals(30, doGets(30, tables[1]));
+
+    // wait a minute and you should get other 6 requests executed
+    waitMinuteQuota();
+
+    // Add 6req/min limit for write request, too
+    admin.setQuota(QuotaSettingsFactory
+      .throttleTable(TABLE_NAMES[0], ThrottleType.WRITE_NUMBER, 6, 
TimeUnit.MINUTES));
+    triggerTableCacheRefresh(false, TABLE_NAMES[0]);
+
+    // should execute at max 6 read requests and at max 6 write requests
+    assertEquals(6, doGets(100, tables[0]));
+    assertEquals(6, doPuts(100, tables[0]));
+    // should have no limits on tables[1]
+    assertEquals(30, doPuts(30, tables[1]));
+    assertEquals(30, doGets(30, tables[1]));
+
+    // Remove all the limits
+    admin.setQuota(QuotaSettingsFactory.unthrottleTable(TABLE_NAMES[0]));
+    triggerTableCacheRefresh(true, TABLE_NAMES[0]);
+    assertEquals(80, doGets(80, tables[0], tables[1]));
+  }
+
   @Test(timeout = 60000)
   public void testNamespaceGlobalThrottle() throws Exception {
     final Admin admin = TEST_UTIL.getHBaseAdmin();
@@ -214,6 +357,37 @@ public class TestQuotaThrottle {
     assertEquals(40, doPuts(40, tables[0]));
   }
 
+  @Test(timeout=60000)
+  public void testNamespaceGlobalReadAndWriteThrottle() throws Exception {
+    final Admin admin = TEST_UTIL.getHBaseAdmin();
+    final String NAMESPACE = "default";
+
+    // Add 6req/min limit for write request
+    admin.setQuota(QuotaSettingsFactory
+      .throttleNamespace(NAMESPACE, ThrottleType.WRITE_NUMBER, 6, 
TimeUnit.MINUTES));
+    triggerNamespaceCacheRefresh(false, TABLE_NAMES[0]);
+
+    // should execute at max 6 write requests and no limit for read request
+    assertEquals(6, doPuts(100, tables[0]));
+    assertEquals(100, doGets(100, tables[0]));
+
+    // wait a minute and you should get other 6 requests executed
+    waitMinuteQuota();
+
+    // Add 6req/min limit for read request, too
+    admin.setQuota(QuotaSettingsFactory
+      .throttleNamespace(NAMESPACE, ThrottleType.READ_NUMBER, 6, 
TimeUnit.MINUTES));
+    triggerNamespaceCacheRefresh(false, TABLE_NAMES[0]);
+
+    // should execute at max 6 write requests and at max 6 read requests
+    assertEquals(6, doPuts(100, tables[0]));
+    assertEquals(6, doGets(100, tables[0]));
+
+    admin.setQuota(QuotaSettingsFactory.unthrottleNamespace(NAMESPACE));
+    triggerNamespaceCacheRefresh(true, TABLE_NAMES[0]);
+    assertEquals(40, doPuts(40, tables[0]));
+  }
+
   @Test(timeout = 60000)
   public void testUserAndTableThrottle() throws Exception {
     final Admin admin = TEST_UTIL.getHBaseAdmin();

http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-shell/src/main/ruby/hbase/quotas.rb
----------------------------------------------------------------------
diff --git a/hbase-shell/src/main/ruby/hbase/quotas.rb 
b/hbase-shell/src/main/ruby/hbase/quotas.rb
index fa076a5..0be428d 100644
--- a/hbase-shell/src/main/ruby/hbase/quotas.rb
+++ b/hbase-shell/src/main/ruby/hbase/quotas.rb
@@ -30,6 +30,8 @@ module HBaseQuotasConstants
   THROTTLE_TYPE = 'THROTTLE_TYPE'
   THROTTLE = 'THROTTLE'
   REQUEST = 'REQUEST'
+  WRITE = 'WRITE'
+  READ = 'READ'
 end
 
 module Hbase
@@ -46,6 +48,7 @@ module Hbase
     def throttle(args)
       raise(ArgumentError, "Arguments should be a Hash") unless 
args.kind_of?(Hash)
       type = args.fetch(THROTTLE_TYPE, REQUEST)
+      args.delete(THROTTLE_TYPE)
       type, limit, time_unit = _parse_limit(args.delete(LIMIT), ThrottleType, 
type)
       if args.has_key?(USER)
         user = args.delete(USER)
@@ -213,4 +216,4 @@ module Hbase
       return value
     end
   end
-end
\ No newline at end of file
+end

http://git-wip-us.apache.org/repos/asf/hbase/blob/4468f3ce/hbase-shell/src/main/ruby/shell/commands/set_quota.rb
----------------------------------------------------------------------
diff --git a/hbase-shell/src/main/ruby/shell/commands/set_quota.rb 
b/hbase-shell/src/main/ruby/shell/commands/set_quota.rb
index 40e8a10..a638b93 100644
--- a/hbase-shell/src/main/ruby/shell/commands/set_quota.rb
+++ b/hbase-shell/src/main/ruby/shell/commands/set_quota.rb
@@ -26,21 +26,31 @@ Set a quota for a user, table, or namespace.
 Syntax : set_quota TYPE => <type>, <args>
 
 TYPE => THROTTLE
-The request limit can be expressed using the form 100req/sec, 100req/min
-and the size limit can be expressed using the form 100k/sec, 100M/min
-with (B, K, M, G, T, P) as valid size unit and (sec, min, hour, day) as valid 
time unit.
+User can either set quota on read, write or on both the requests 
together(i.e., read+write)
+The read, write, or read+write(default throttle type) request limit can be 
expressed using
+the form 100req/sec, 100req/min and the read, write, read+write(default 
throttle type) limit
+can be expressed using the form 100k/sec, 100M/min with (B, K, M, G, T, P) as 
valid size unit
+and (sec, min, hour, day) as valid time unit.
 Currently the throttle limit is per machine - a limit of 100req/min
 means that each machine can execute 100req/min.
 
 For example:
 
     hbase> set_quota TYPE => THROTTLE, USER => 'u1', LIMIT => '10req/sec'
+    hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => READ, USER => 'u1', 
LIMIT => '10req/sec'
+
     hbase> set_quota TYPE => THROTTLE, USER => 'u1', LIMIT => '10M/sec'
+    hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => WRITE, USER => 'u1', 
LIMIT => '10M/sec'
+
     hbase> set_quota TYPE => THROTTLE, USER => 'u1', TABLE => 't2', LIMIT => 
'5K/min'
     hbase> set_quota TYPE => THROTTLE, USER => 'u1', NAMESPACE => 'ns2', LIMIT 
=> NONE
+
     hbase> set_quota TYPE => THROTTLE, NAMESPACE => 'ns1', LIMIT => '10req/sec'
     hbase> set_quota TYPE => THROTTLE, TABLE => 't1', LIMIT => '10M/sec'
+    hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => WRITE, TABLE => 't1', 
LIMIT => '10M/sec'
     hbase> set_quota TYPE => THROTTLE, USER => 'u1', LIMIT => NONE
+    hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => WRITE, USER => 'u1', 
LIMIT => NONE
+
     hbase> set_quota USER => 'u1', GLOBAL_BYPASS => true
 EOF
       end

Reply via email to