From 59857a41ead6e935d5115a759949e63ae4ac0011 Mon Sep 17 00:00:00 2001 From: Guanghao Zhang Date: Thu, 20 Oct 2016 12:04:20 +0800 Subject: [PATCH] HBASE-16870 ADDENDUM fix failed TestReplicationSmallTests --- .../regionserver/ReplicationLoad.java | 4 + .../TestReplicationSmallTests.java | 66 ----------- .../replication/TestReplicationStatus.java | 104 ++++++++++++++++++ 3 files changed, 108 insertions(+), 66 deletions(-) create mode 100644 hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationStatus.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationLoad.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationLoad.java index 5772dd27bd7..b02b2121653 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationLoad.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationLoad.java @@ -71,7 +71,11 @@ public class ReplicationLoad { Map replicationLoadSourceMap = new HashMap(); for (MetricsSource sm : this.sourceMetricsList) { + // Get the actual peer id String peerId = sm.getPeerID(); + String[] parts = peerId.split("-", 2); + peerId = parts.length != 1 ? parts[0] : peerId; + long ageOfLastShippedOp = sm.getAgeOfLastShippedOp(); int sizeOfLogQueue = sm.getSizeOfLogQueue(); long timeStampOfLastShippedOp = sm.getTimeStampOfLastShippedOp(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationSmallTests.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationSmallTests.java index f915dd50cb6..1a02ff19c7d 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationSmallTests.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationSmallTests.java @@ -707,72 +707,6 @@ public class TestReplicationSmallTests extends TestReplicationBase { hadmin.close(); } - /** - * Test for HBASE-9531 - * put a few rows into htable1, which should be replicated to htable2 - * create a ClusterStatus instance 'status' from HBaseAdmin - * test : status.getLoad(server).getReplicationLoadSourceList() - * test : status.getLoad(server).getReplicationLoadSink() - * * @throws Exception - */ - @Test(timeout = 300000) - public void testReplicationStatus() throws Exception { - LOG.info("testReplicationStatus"); - - try (Admin hbaseAdmin = utility1.getConnection().getAdmin()) { - // Wait roll log request in setUp() to finish - Thread.sleep(5000); - - // disable peer - admin.disablePeer(PEER_ID); - - final byte[] qualName = Bytes.toBytes("q"); - Put p; - - for (int i = 0; i < NB_ROWS_IN_BATCH; i++) { - p = new Put(Bytes.toBytes("row" + i)); - p.addColumn(famName, qualName, Bytes.toBytes("val" + i)); - htable1.put(p); - } - - ClusterStatus status = hbaseAdmin.getClusterStatus(); - long globalSizeOfLogQueue = 0; - - for (JVMClusterUtil.RegionServerThread thread : - utility1.getHBaseCluster().getRegionServerThreads()) { - ServerName server = thread.getRegionServer().getServerName(); - ServerLoad sl = status.getLoad(server); - List rLoadSourceList = sl.getReplicationLoadSourceList(); - ReplicationLoadSink rLoadSink = sl.getReplicationLoadSink(); - - // check SourceList only has one entry - assertTrue("failed to get ReplicationLoadSourceList", (rLoadSourceList.size() == 1)); - globalSizeOfLogQueue += rLoadSourceList.get(0).getSizeOfLogQueue(); - - // check Sink exist only as it is difficult to verify the value on the fly - assertTrue("failed to get ReplicationLoadSink.AgeOfLastShippedOp ", - (rLoadSink.getAgeOfLastAppliedOp() >= 0)); - assertTrue("failed to get ReplicationLoadSink.TimeStampsOfLastAppliedOp ", - (rLoadSink.getTimeStampsOfLastAppliedOp() >= 0)); - } - - // Stop one rs - utility1.getHBaseCluster().getRegionServer(1).stop("Stop RegionServer"); - Thread.sleep(5000); - status = hbaseAdmin.getClusterStatus(); - ServerName server = utility1.getHBaseCluster().getRegionServer(0).getServerName(); - ServerLoad sl = status.getLoad(server); - List rLoadSourceList = sl.getReplicationLoadSourceList(); - // check SourceList only has one entry - assertTrue("failed to get ReplicationLoadSourceList", (rLoadSourceList.size() == 1)); - // Another rs has one queue and one recovery queue from died rs - assertEquals(globalSizeOfLogQueue, rLoadSourceList.get(0).getSizeOfLogQueue()); - } finally { - utility1.getHBaseCluster().getRegionServer(1).start(); - admin.enablePeer(PEER_ID); - } - } - /** * Test for HBase-15259 WALEdits under replay will also be replicated * */ diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationStatus.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationStatus.java new file mode 100644 index 00000000000..4dd06a9d6d6 --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/TestReplicationStatus.java @@ -0,0 +1,104 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.replication; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hbase.ClusterStatus; +import org.apache.hadoop.hbase.ServerLoad; +import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.client.Admin; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.testclassification.MediumTests; +import org.apache.hadoop.hbase.testclassification.ReplicationTests; +import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.JVMClusterUtil; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +@Category({ReplicationTests.class, MediumTests.class}) +public class TestReplicationStatus extends TestReplicationBase { + private static final Log LOG = LogFactory.getLog(TestReplicationStatus.class); + private static final String PEER_ID = "2"; + + /** + * Test for HBASE-9531 + * put a few rows into htable1, which should be replicated to htable2 + * create a ClusterStatus instance 'status' from HBaseAdmin + * test : status.getLoad(server).getReplicationLoadSourceList() + * test : status.getLoad(server).getReplicationLoadSink() + * * @throws Exception + */ + @Test(timeout = 300000) + public void testReplicationStatus() throws Exception { + LOG.info("testReplicationStatus"); + + try (Admin hbaseAdmin = utility1.getConnection().getAdmin()) { + // disable peer + admin.disablePeer(PEER_ID); + + final byte[] qualName = Bytes.toBytes("q"); + Put p; + + for (int i = 0; i < NB_ROWS_IN_BATCH; i++) { + p = new Put(Bytes.toBytes("row" + i)); + p.addColumn(famName, qualName, Bytes.toBytes("val" + i)); + htable1.put(p); + } + + ClusterStatus status = hbaseAdmin.getClusterStatus(); + + for (JVMClusterUtil.RegionServerThread thread : utility1.getHBaseCluster() + .getRegionServerThreads()) { + ServerName server = thread.getRegionServer().getServerName(); + ServerLoad sl = status.getLoad(server); + List rLoadSourceList = sl.getReplicationLoadSourceList(); + ReplicationLoadSink rLoadSink = sl.getReplicationLoadSink(); + + // check SourceList only has one entry, beacuse only has one peer + assertTrue("failed to get ReplicationLoadSourceList", (rLoadSourceList.size() == 1)); + assertEquals(PEER_ID, rLoadSourceList.get(0).getPeerID()); + + // check Sink exist only as it is difficult to verify the value on the fly + assertTrue("failed to get ReplicationLoadSink.AgeOfLastShippedOp ", + (rLoadSink.getAgeOfLastAppliedOp() >= 0)); + assertTrue("failed to get ReplicationLoadSink.TimeStampsOfLastAppliedOp ", + (rLoadSink.getTimeStampsOfLastAppliedOp() >= 0)); + } + + // Stop rs1, then the queue of rs1 will be transfered to rs0 + utility1.getHBaseCluster().getRegionServer(1).stop("Stop RegionServer"); + Thread.sleep(10000); + status = hbaseAdmin.getClusterStatus(); + ServerName server = utility1.getHBaseCluster().getRegionServer(0).getServerName(); + ServerLoad sl = status.getLoad(server); + List rLoadSourceList = sl.getReplicationLoadSourceList(); + // check SourceList still only has one entry + assertTrue("failed to get ReplicationLoadSourceList", (rLoadSourceList.size() == 1)); + assertEquals(PEER_ID, rLoadSourceList.get(0).getPeerID()); + } finally { + admin.enablePeer(PEER_ID); + utility1.getHBaseCluster().getRegionServer(1).start(); + } + } +}