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);