You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2019/01/31 11:47:17 UTC

[hbase] branch branch-2.2 updated: HBASE-21644 Modify table procedure runs infinitely for a table having region replication > 1

This is an automated email from the ASF dual-hosted git repository.

zhangduo pushed a commit to branch branch-2.2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2.2 by this push:
     new 983c58a  HBASE-21644 Modify table procedure runs infinitely for a table having region replication > 1
983c58a is described below

commit 983c58ac9319e33f290ee247912a2fd8b1a28183
Author: Nihal Jain <ni...@gmail.com>
AuthorDate: Mon Jan 21 12:33:01 2019 +0530

    HBASE-21644 Modify table procedure runs infinitely for a table having region replication > 1
    
    Signed-off-by: zhangduo <zh...@apache.org>
---
 .../apache/hadoop/hbase/regionserver/HRegion.java  | 15 ++++++++++++-
 .../org/apache/hadoop/hbase/client/TestAdmin1.java | 20 +++++++++++++++++
 .../TestReplicationAdminWithClusters.java          | 26 ++++++++++++++++++++++
 3 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
index ad49401..3b2f780 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
@@ -999,7 +999,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
     // Use maximum of log sequenceid or that which was found in stores
     // (particularly if no recovered edits, seqid will be -1).
     long maxSeqIdFromFile =
-      WALSplitter.getMaxRegionSequenceId(getWalFileSystem(), getWALRegionDir());
+        WALSplitter.getMaxRegionSequenceId(getWalFileSystem(), getWALRegionDirOfDefaultReplica());
     long nextSeqId = Math.max(maxSeqId, maxSeqIdFromFile) + 1;
     // The openSeqNum will always be increase even for read only region, as we rely on it to
     // determine whether a region has been successfully reopend, so here we always need to update
@@ -1931,6 +1931,19 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
     return regionDir;
   }
 
+  /**
+   * @return the Region directory under WALRootDirectory; in case of secondary replica return the
+   *         region directory corresponding to its default replica
+   * @throws IOException if there is an error getting WALRootDir
+   */
+  private Path getWALRegionDirOfDefaultReplica() throws IOException {
+    RegionInfo regionInfo = getRegionInfo();
+    if (!RegionReplicaUtil.isDefaultReplica(regionInfo)) {
+      regionInfo = RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo);
+    }
+    return FSUtils.getWALRegionDir(conf, regionInfo.getTable(), regionInfo.getEncodedName());
+  }
+
   @Override
   public long getEarliestFlushTimeForAllStores() {
     return Collections.min(lastStoreFlushTimeMap.values());
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java
index 40de30a..dfc3a2c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java
@@ -1555,4 +1555,24 @@ public class TestAdmin1 {
       // expected
     }
   }
+
+  @Test
+  public void testModifyTableOnTableWithRegionReplicas() throws Exception {
+    TableName tableName = TableName.valueOf(name.getMethodName());
+    TableDescriptor desc = TableDescriptorBuilder.newBuilder(tableName)
+        .setColumnFamily(ColumnFamilyDescriptorBuilder.of(Bytes.toBytes("cf")))
+        .setRegionReplication(5)
+        .build();
+
+    admin.createTable(desc);
+
+    int maxFileSize = 10000000;
+    TableDescriptor newDesc = TableDescriptorBuilder.newBuilder(desc)
+        .setMaxFileSize(maxFileSize)
+        .build();
+
+    admin.modifyTable(newDesc);
+    TableDescriptor newTableDesc = admin.getDescriptor(tableName);
+    assertEquals(maxFileSize, newTableDesc.getMaxFileSize());
+  }
 }
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 e5743a8..0ff757e 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
@@ -33,8 +33,12 @@ import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.TableNotFoundException;
 import org.apache.hadoop.hbase.client.Admin;
+import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
+import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
 import org.apache.hadoop.hbase.client.Connection;
 import org.apache.hadoop.hbase.client.ConnectionFactory;
+import org.apache.hadoop.hbase.client.TableDescriptor;
+import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.hadoop.hbase.replication.BaseReplicationEndpoint;
 import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;
 import org.apache.hadoop.hbase.replication.TestReplicationBase;
@@ -178,6 +182,28 @@ public class TestReplicationAdminWithClusters extends TestReplicationBase {
     }
   }
 
+  @Test
+  public void testEnableReplicationForTableWithRegionReplica() throws Exception {
+    TableName tn = TableName.valueOf(name.getMethodName());
+    TableDescriptor td = TableDescriptorBuilder.newBuilder(tn)
+        .setRegionReplication(5)
+        .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(noRepfamName).build())
+        .build();
+
+    admin1.createTable(td);
+
+    try {
+      admin1.enableTableReplication(tn);
+      td = admin1.getDescriptor(tn);
+      for (ColumnFamilyDescriptor fam : td.getColumnFamilies()) {
+        assertEquals(HConstants.REPLICATION_SCOPE_GLOBAL, fam.getScope());
+      }
+    } finally {
+      utility1.deleteTable(tn);
+      utility2.deleteTable(tn);
+    }
+  }
+
   @Test(expected = TableNotFoundException.class)
   public void testDisableReplicationForNonExistingTable() throws Exception {
     admin1.disableTableReplication(TableName.valueOf(name.getMethodName()));