Repository: hbase
Updated Branches:
  refs/heads/branch-1 c97905a96 -> 318298047


HBASE-17779 disable_table_replication returns misleading message and does not 
turn off replication (Janos Gub)


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

Branch: refs/heads/branch-1
Commit: 318298047be788143405cfb101e1b0401f9e6b7a
Parents: c97905a
Author: tedyu <yuzhih...@gmail.com>
Authored: Tue Mar 14 12:34:04 2017 -0700
Committer: tedyu <yuzhih...@gmail.com>
Committed: Tue Mar 14 12:34:04 2017 -0700

----------------------------------------------------------------------
 .../client/replication/ReplicationAdmin.java    | 35 +++++++++++++++-----
 .../TestReplicationAdminWithClusters.java       | 17 ++++++++++
 2 files changed, 44 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/31829804/hbase-client/src/main/java/org/apache/hadoop/hbase/client/replication/ReplicationAdmin.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/replication/ReplicationAdmin.java
 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/replication/ReplicationAdmin.java
index f9cf6b3..80f6e10 100644
--- 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/replication/ReplicationAdmin.java
+++ 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/replication/ReplicationAdmin.java
@@ -647,15 +647,17 @@ public class ReplicationAdmin implements Closeable {
   /**
    * Set the table's replication switch if the table's replication switch is 
already not set.
    * @param tableName name of the table
-   * @param isRepEnabled is replication switch enable or disable
+   * @param enableRep is replication switch enable or disable
    * @throws IOException if a remote or network exception occurs
    */
-  private void setTableRep(final TableName tableName, boolean isRepEnabled) 
throws IOException {
+  private void setTableRep(final TableName tableName, boolean enableRep) 
throws IOException {
     Admin admin = null;
     try {
       admin = this.connection.getAdmin();
       HTableDescriptor htd = admin.getTableDescriptor(tableName);
-      if (isTableRepEnabled(htd) ^ isRepEnabled) {
+      ReplicationState currentReplicationState = getTableReplicationState(htd);
+      if (enableRep && currentReplicationState != ReplicationState.ENABLED
+          || !enableRep && currentReplicationState != 
ReplicationState.DISABLED) {
         boolean isOnlineSchemaUpdateEnabled =
             this.connection.getConfiguration()
                 .getBoolean("hbase.online.schema.update.enable", true);
@@ -663,7 +665,7 @@ public class ReplicationAdmin implements Closeable {
           admin.disableTable(tableName);
         }
         for (HColumnDescriptor hcd : htd.getFamilies()) {
-          hcd.setScope(isRepEnabled ? HConstants.REPLICATION_SCOPE_GLOBAL
+          hcd.setScope(enableRep ? HConstants.REPLICATION_SCOPE_GLOBAL
               : HConstants.REPLICATION_SCOPE_LOCAL);
         }
         admin.modifyTable(tableName, htd);
@@ -684,17 +686,34 @@ public class ReplicationAdmin implements Closeable {
   }
 
   /**
+   * This enum indicates the current state of the replication for a given 
table.
+   */
+  private enum ReplicationState {
+    ENABLED, // all column families enabled
+    MIXED, // some column families enabled, some disabled
+    DISABLED // all column families disabled
+  }
+
+  /**
    * @param htd table descriptor details for the table to check
-   * @return true if table's replication switch is enabled
+   * @return ReplicationState the current state of the table.
    */
-  private boolean isTableRepEnabled(HTableDescriptor htd) {
+  private ReplicationState getTableReplicationState(HTableDescriptor htd) {
+    boolean hasEnabled = false;
+    boolean hasDisabled = false;
+
     for (HColumnDescriptor hcd : htd.getFamilies()) {
       if (hcd.getScope() != HConstants.REPLICATION_SCOPE_GLOBAL
           && hcd.getScope() != HConstants.REPLICATION_SCOPE_SERIAL) {
-        return false;
+        hasDisabled = true;
+      } else {
+        hasEnabled = true;
       }
     }
-    return true;
+
+    if (hasEnabled && hasDisabled) return ReplicationState.MIXED;
+    if (hasEnabled) return ReplicationState.ENABLED;
+    return ReplicationState.DISABLED;
   }
 
   private void checkConfiguredWALEntryFilters(ReplicationPeerConfig peerConfig)

http://git-wip-us.apache.org/repos/asf/hbase/blob/31829804/hbase-server/src/test/java/org/apache/hadoop/hbase/client/replication/TestReplicationAdminWithClusters.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/replication/TestReplicationAdminWithClusters.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/replication/TestReplicationAdminWithClusters.java
index 26ed7a7..1c2c36d 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/replication/TestReplicationAdminWithClusters.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/replication/TestReplicationAdminWithClusters.java
@@ -70,6 +70,23 @@ public class TestReplicationAdminWithClusters extends 
TestReplicationBase {
   }
 
   @Test(timeout = 300000)
+  public void disableNotFullReplication() throws Exception {
+    HTableDescriptor table = admin2.getTableDescriptor(tableName);
+    HColumnDescriptor f = new HColumnDescriptor("notReplicatedFamily");
+    table.addFamily(f);
+    admin1.disableTable(tableName);
+    admin1.modifyTable(tableName, table);
+    admin1.enableTable(tableName);
+
+
+    admin.disableTableRep(tableName);
+    table = admin1.getTableDescriptor(tableName);
+    for (HColumnDescriptor fam : table.getColumnFamilies()) {
+      assertEquals(fam.getScope(), HConstants.REPLICATION_SCOPE_LOCAL);
+    }
+  }
+
+  @Test(timeout = 300000)
   public void testEnableReplicationWhenSlaveClusterDoesntHaveTable() throws 
Exception {
     admin.disableTableRep(tableName);
     admin2.disableTable(tableName);

Reply via email to