You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2018/06/15 21:45:56 UTC
[01/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Repository: hbase-site
Updated Branches:
refs/heads/asf-site 4de5b06b2 -> 49626fc19
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html
index 43a87b6..819e491 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html
@@ -31,517 +31,537 @@
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.UUID;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.concurrent.Callable;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.Cell;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Waiter;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Put;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Table;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.junit.AfterClass;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.junit.Assert;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.junit.Before;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.BeforeClass;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.ClassRule;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.Test;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.experimental.categories.Category;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.slf4j.Logger;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.slf4j.LoggerFactory;<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.66"></a>
-<span class="sourceLineNo">067</span> */<a name="line.67"></a>
-<span class="sourceLineNo">068</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.68"></a>
-<span class="sourceLineNo">069</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span> @ClassRule<a name="line.71"></a>
-<span class="sourceLineNo">072</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.72"></a>
-<span class="sourceLineNo">073</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.75"></a>
+<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Map;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.UUID;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.Callable;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Cell;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Waiter;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Put;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Table;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.AfterClass;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.Assert;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.Before;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.BeforeClass;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.ClassRule;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.experimental.categories.Category;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.slf4j.Logger;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.slf4j.LoggerFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>/**<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.68"></a>
+<span class="sourceLineNo">069</span> */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.70"></a>
+<span class="sourceLineNo">071</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span> @ClassRule<a name="line.73"></a>
+<span class="sourceLineNo">074</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.74"></a>
+<span class="sourceLineNo">075</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.75"></a>
<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span> static int numRegionServers;<a name="line.77"></a>
+<span class="sourceLineNo">077</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.77"></a>
<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span> @BeforeClass<a name="line.79"></a>
-<span class="sourceLineNo">080</span> public static void setUpBeforeClass() throws Exception {<a name="line.80"></a>
-<span class="sourceLineNo">081</span> TestReplicationBase.setUpBeforeClass();<a name="line.81"></a>
-<span class="sourceLineNo">082</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.82"></a>
-<span class="sourceLineNo">083</span> }<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span> @AfterClass<a name="line.85"></a>
-<span class="sourceLineNo">086</span> public static void tearDownAfterClass() throws Exception {<a name="line.86"></a>
-<span class="sourceLineNo">087</span> TestReplicationBase.tearDownAfterClass();<a name="line.87"></a>
-<span class="sourceLineNo">088</span> // check stop is called<a name="line.88"></a>
-<span class="sourceLineNo">089</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.89"></a>
-<span class="sourceLineNo">090</span> }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span> @Before<a name="line.92"></a>
-<span class="sourceLineNo">093</span> public void setup() throws Exception {<a name="line.93"></a>
-<span class="sourceLineNo">094</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.94"></a>
-<span class="sourceLineNo">095</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.95"></a>
-<span class="sourceLineNo">096</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.96"></a>
-<span class="sourceLineNo">097</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.97"></a>
-<span class="sourceLineNo">098</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> final List<RegionServerThread> rsThreads =<a name="line.99"></a>
-<span class="sourceLineNo">100</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.100"></a>
-<span class="sourceLineNo">101</span> for (RegionServerThread rs : rsThreads) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.102"></a>
-<span class="sourceLineNo">103</span> }<a name="line.103"></a>
-<span class="sourceLineNo">104</span> // Wait for all log roll to finish<a name="line.104"></a>
-<span class="sourceLineNo">105</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.105"></a>
-<span class="sourceLineNo">106</span> @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span> public boolean evaluate() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span> for (RegionServerThread rs : rsThreads) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span> return false;<a name="line.110"></a>
-<span class="sourceLineNo">111</span> }<a name="line.111"></a>
-<span class="sourceLineNo">112</span> }<a name="line.112"></a>
-<span class="sourceLineNo">113</span> return true;<a name="line.113"></a>
-<span class="sourceLineNo">114</span> }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span> @Override<a name="line.116"></a>
-<span class="sourceLineNo">117</span> public String explainFailure() throws Exception {<a name="line.117"></a>
-<span class="sourceLineNo">118</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.118"></a>
-<span class="sourceLineNo">119</span> for (RegionServerThread rs : rsThreads) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.121"></a>
-<span class="sourceLineNo">122</span> }<a name="line.122"></a>
-<span class="sourceLineNo">123</span> }<a name="line.123"></a>
-<span class="sourceLineNo">124</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.124"></a>
-<span class="sourceLineNo">125</span> }<a name="line.125"></a>
-<span class="sourceLineNo">126</span> });<a name="line.126"></a>
-<span class="sourceLineNo">127</span> }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span> @Test<a name="line.129"></a>
-<span class="sourceLineNo">130</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.130"></a>
-<span class="sourceLineNo">131</span> // test installing a custom replication endpoint other than the default one.<a name="line.131"></a>
-<span class="sourceLineNo">132</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.132"></a>
-<span class="sourceLineNo">133</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.133"></a>
-<span class="sourceLineNo">134</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span> // check whether the class has been constructed and started<a name="line.136"></a>
-<span class="sourceLineNo">137</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.137"></a>
-<span class="sourceLineNo">138</span> @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span> public boolean evaluate() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.140"></a>
-<span class="sourceLineNo">141</span> }<a name="line.141"></a>
-<span class="sourceLineNo">142</span> });<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span> @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span> public boolean evaluate() throws Exception {<a name="line.146"></a>
-<span class="sourceLineNo">147</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.147"></a>
-<span class="sourceLineNo">148</span> }<a name="line.148"></a>
-<span class="sourceLineNo">149</span> });<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.151"></a>
+<span class="sourceLineNo">079</span> static int numRegionServers;<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span> @BeforeClass<a name="line.81"></a>
+<span class="sourceLineNo">082</span> public static void setUpBeforeClass() throws Exception {<a name="line.82"></a>
+<span class="sourceLineNo">083</span> TestReplicationBase.setUpBeforeClass();<a name="line.83"></a>
+<span class="sourceLineNo">084</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.84"></a>
+<span class="sourceLineNo">085</span> }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span> @AfterClass<a name="line.87"></a>
+<span class="sourceLineNo">088</span> public static void tearDownAfterClass() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span> TestReplicationBase.tearDownAfterClass();<a name="line.89"></a>
+<span class="sourceLineNo">090</span> // check stop is called<a name="line.90"></a>
+<span class="sourceLineNo">091</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.91"></a>
+<span class="sourceLineNo">092</span> }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span> @Before<a name="line.94"></a>
+<span class="sourceLineNo">095</span> public void setup() throws Exception {<a name="line.95"></a>
+<span class="sourceLineNo">096</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.96"></a>
+<span class="sourceLineNo">097</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.97"></a>
+<span class="sourceLineNo">098</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.98"></a>
+<span class="sourceLineNo">099</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.99"></a>
+<span class="sourceLineNo">100</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> final List<RegionServerThread> rsThreads =<a name="line.101"></a>
+<span class="sourceLineNo">102</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.102"></a>
+<span class="sourceLineNo">103</span> for (RegionServerThread rs : rsThreads) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.104"></a>
+<span class="sourceLineNo">105</span> }<a name="line.105"></a>
+<span class="sourceLineNo">106</span> // Wait for all log roll to finish<a name="line.106"></a>
+<span class="sourceLineNo">107</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.107"></a>
+<span class="sourceLineNo">108</span> @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span> public boolean evaluate() throws Exception {<a name="line.109"></a>
+<span class="sourceLineNo">110</span> for (RegionServerThread rs : rsThreads) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span> return false;<a name="line.112"></a>
+<span class="sourceLineNo">113</span> }<a name="line.113"></a>
+<span class="sourceLineNo">114</span> }<a name="line.114"></a>
+<span class="sourceLineNo">115</span> return true;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span> @Override<a name="line.118"></a>
+<span class="sourceLineNo">119</span> public String explainFailure() throws Exception {<a name="line.119"></a>
+<span class="sourceLineNo">120</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.120"></a>
+<span class="sourceLineNo">121</span> for (RegionServerThread rs : rsThreads) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.123"></a>
+<span class="sourceLineNo">124</span> }<a name="line.124"></a>
+<span class="sourceLineNo">125</span> }<a name="line.125"></a>
+<span class="sourceLineNo">126</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.126"></a>
+<span class="sourceLineNo">127</span> }<a name="line.127"></a>
+<span class="sourceLineNo">128</span> });<a name="line.128"></a>
+<span class="sourceLineNo">129</span> }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span> @Test<a name="line.131"></a>
+<span class="sourceLineNo">132</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.132"></a>
+<span class="sourceLineNo">133</span> // test installing a custom replication endpoint other than the default one.<a name="line.133"></a>
+<span class="sourceLineNo">134</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.134"></a>
+<span class="sourceLineNo">135</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.135"></a>
+<span class="sourceLineNo">136</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span> // check whether the class has been constructed and started<a name="line.138"></a>
+<span class="sourceLineNo">139</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.139"></a>
+<span class="sourceLineNo">140</span> @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span> public boolean evaluate() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.142"></a>
+<span class="sourceLineNo">143</span> }<a name="line.143"></a>
+<span class="sourceLineNo">144</span> });<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span> @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span> public boolean evaluate() throws Exception {<a name="line.148"></a>
+<span class="sourceLineNo">149</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.149"></a>
+<span class="sourceLineNo">150</span> }<a name="line.150"></a>
+<span class="sourceLineNo">151</span> });<a name="line.151"></a>
<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span> // now replicate some data.<a name="line.153"></a>
-<span class="sourceLineNo">154</span> doPut(Bytes.toBytes("row42"));<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span> @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span> public boolean evaluate() throws Exception {<a name="line.158"></a>
-<span class="sourceLineNo">159</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.159"></a>
-<span class="sourceLineNo">160</span> }<a name="line.160"></a>
-<span class="sourceLineNo">161</span> });<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span> doAssert(Bytes.toBytes("row42"));<a name="line.163"></a>
+<span class="sourceLineNo">153</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span> // now replicate some data.<a name="line.155"></a>
+<span class="sourceLineNo">156</span> doPut(Bytes.toBytes("row42"));<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span> @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span> public boolean evaluate() throws Exception {<a name="line.160"></a>
+<span class="sourceLineNo">161</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.161"></a>
+<span class="sourceLineNo">162</span> }<a name="line.162"></a>
+<span class="sourceLineNo">163</span> });<a name="line.163"></a>
<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.165"></a>
-<span class="sourceLineNo">166</span> }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span> @Test<a name="line.168"></a>
-<span class="sourceLineNo">169</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.169"></a>
-<span class="sourceLineNo">170</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.170"></a>
-<span class="sourceLineNo">171</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.171"></a>
-<span class="sourceLineNo">172</span> int peerCount = admin.getPeersCount();<a name="line.172"></a>
-<span class="sourceLineNo">173</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.173"></a>
-<span class="sourceLineNo">174</span> admin.addPeer(id,<a name="line.174"></a>
-<span class="sourceLineNo">175</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.175"></a>
-<span class="sourceLineNo">176</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.176"></a>
-<span class="sourceLineNo">177</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.177"></a>
-<span class="sourceLineNo">178</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.178"></a>
-<span class="sourceLineNo">179</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.179"></a>
-<span class="sourceLineNo">180</span> if (admin.getPeersCount() <= peerCount) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.181"></a>
-<span class="sourceLineNo">182</span> Threads.sleep(100);<a name="line.182"></a>
-<span class="sourceLineNo">183</span> }<a name="line.183"></a>
-<span class="sourceLineNo">184</span> // now replicate some data<a name="line.184"></a>
-<span class="sourceLineNo">185</span> doPut(row);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.187"></a>
-<span class="sourceLineNo">188</span> @Override<a name="line.188"></a>
-<span class="sourceLineNo">189</span> public boolean evaluate() throws Exception {<a name="line.189"></a>
-<span class="sourceLineNo">190</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.190"></a>
-<span class="sourceLineNo">191</span> // only send over one edit.<a name="line.191"></a>
-<span class="sourceLineNo">192</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.192"></a>
-<span class="sourceLineNo">193</span> LOG.info("count=" + count);<a name="line.193"></a>
-<span class="sourceLineNo">194</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.194"></a>
-<span class="sourceLineNo">195</span> }<a name="line.195"></a>
-<span class="sourceLineNo">196</span> });<a name="line.196"></a>
-<span class="sourceLineNo">197</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.198"></a>
-<span class="sourceLineNo">199</span> }<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.201"></a>
-<span class="sourceLineNo">202</span> }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span> @Test<a name="line.204"></a>
-<span class="sourceLineNo">205</span> public void testInterClusterReplication() throws Exception {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> final String id = "testInterClusterReplication";<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> int totEdits = 0;<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> // Make sure edits are spread across regions because we do region based batching<a name="line.211"></a>
-<span class="sourceLineNo">212</span> // before shipping edits.<a name="line.212"></a>
-<span class="sourceLineNo">213</span> for(HRegion region: regions) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span> RegionInfo hri = region.getRegionInfo();<a name="line.214"></a>
-<span class="sourceLineNo">215</span> byte[] row = hri.getStartKey();<a name="line.215"></a>
-<span class="sourceLineNo">216</span> for (int i = 0; i < 100; i++) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span> if (row.length > 0) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span> Put put = new Put(row);<a name="line.218"></a>
-<span class="sourceLineNo">219</span> put.addColumn(famName, row, row);<a name="line.219"></a>
-<span class="sourceLineNo">220</span> region.put(put);<a name="line.220"></a>
-<span class="sourceLineNo">221</span> totEdits++;<a name="line.221"></a>
-<span class="sourceLineNo">222</span> }<a name="line.222"></a>
-<span class="sourceLineNo">223</span> }<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> admin.addPeer(id,<a name="line.226"></a>
-<span class="sourceLineNo">227</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.227"></a>
-<span class="sourceLineNo">228</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.228"></a>
-<span class="sourceLineNo">229</span> null);<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span> final int numEdits = totEdits;<a name="line.231"></a>
-<span class="sourceLineNo">232</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.232"></a>
-<span class="sourceLineNo">233</span> @Override<a name="line.233"></a>
-<span class="sourceLineNo">234</span> public boolean evaluate() throws Exception {<a name="line.234"></a>
-<span class="sourceLineNo">235</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.235"></a>
-<span class="sourceLineNo">236</span> }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span> @Override<a name="line.238"></a>
-<span class="sourceLineNo">239</span> public String explainFailure() throws Exception {<a name="line.239"></a>
-<span class="sourceLineNo">240</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.240"></a>
-<span class="sourceLineNo">241</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.241"></a>
-<span class="sourceLineNo">242</span> return failure;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> }<a name="line.243"></a>
-<span class="sourceLineNo">244</span> });<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> admin.removePeer("testInterClusterReplication");<a name="line.246"></a>
-<span class="sourceLineNo">247</span> utility1.deleteTableData(tableName);<a name="line.247"></a>
-<span class="sourceLineNo">248</span> }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span> @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.252"></a>
-<span class="sourceLineNo">253</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.253"></a>
-<span class="sourceLineNo">254</span> //test that we can create mutliple WALFilters reflectively<a name="line.254"></a>
-<span class="sourceLineNo">255</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.256"></a>
-<span class="sourceLineNo">257</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.257"></a>
-<span class="sourceLineNo">258</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.258"></a>
-<span class="sourceLineNo">259</span> // now replicate some data.<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.261"></a>
-<span class="sourceLineNo">262</span> doPut(connection, row);<a name="line.262"></a>
-<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span> }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.266"></a>
-<span class="sourceLineNo">267</span> @Override<a name="line.267"></a>
-<span class="sourceLineNo">268</span> public boolean evaluate() throws Exception {<a name="line.268"></a>
-<span class="sourceLineNo">269</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> }<a name="line.270"></a>
-<span class="sourceLineNo">271</span> });<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.273"></a>
-<span class="sourceLineNo">274</span> //make sure our reflectively created filter is in the filter chain<a name="line.274"></a>
-<span class="sourceLineNo">275</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.275"></a>
-<span class="sourceLineNo">276</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.276"></a>
-<span class="sourceLineNo">277</span> }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span> @Test (expected=IOException.class)<a name="line.279"></a>
-<span class="sourceLineNo">280</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.281"></a>
-<span class="sourceLineNo">282</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span> //test that we can create mutliple WALFilters reflectively<a name="line.283"></a>
-<span class="sourceLineNo">284</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.284"></a>
-<span class="sourceLineNo">285</span> "IAmNotARealWalEntryFilter");<a name="line.285"></a>
-<span class="sourceLineNo">286</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.286"></a>
-<span class="sourceLineNo">287</span> }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span> @Test (expected=IOException.class)<a name="line.289"></a>
-<span class="sourceLineNo">290</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.290"></a>
-<span class="sourceLineNo">291</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.292"></a>
-<span class="sourceLineNo">293</span> //test that we can create mutliple WALFilters reflectively<a name="line.293"></a>
-<span class="sourceLineNo">294</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.294"></a>
-<span class="sourceLineNo">295</span> "IAmNotARealWalEntryFilter");<a name="line.295"></a>
-<span class="sourceLineNo">296</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span> @Test<a name="line.300"></a>
-<span class="sourceLineNo">301</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.301"></a>
-<span class="sourceLineNo">302</span> /*<a name="line.302"></a>
-<span class="sourceLineNo">303</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.303"></a>
-<span class="sourceLineNo">304</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.304"></a>
-<span class="sourceLineNo">305</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.305"></a>
-<span class="sourceLineNo">306</span> allows for custom JMX metrics.<a name="line.306"></a>
-<span class="sourceLineNo">307</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.307"></a>
-<span class="sourceLineNo">308</span> the two layers of wrapping to the actual BaseSource.<a name="line.308"></a>
-<span class="sourceLineNo">309</span> */<a name="line.309"></a>
-<span class="sourceLineNo">310</span> String id = "id";<a name="line.310"></a>
-<span class="sourceLineNo">311</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.312"></a>
-<span class="sourceLineNo">313</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.313"></a>
-<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
-<span class="sourceLineNo">315</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.317"></a>
-<span class="sourceLineNo">318</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.318"></a>
-<span class="sourceLineNo">319</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource);<a name="line.319"></a>
-<span class="sourceLineNo">320</span> String gaugeName = "gauge";<a name="line.320"></a>
-<span class="sourceLineNo">321</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.321"></a>
-<span class="sourceLineNo">322</span> String globalGaugeName = "source." + gaugeName;<a name="line.322"></a>
-<span class="sourceLineNo">323</span> long delta = 1;<a name="line.323"></a>
-<span class="sourceLineNo">324</span> String counterName = "counter";<a name="line.324"></a>
-<span class="sourceLineNo">325</span> String singleCounterName = "source.id." + counterName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span> String globalCounterName = "source." + counterName;<a name="line.326"></a>
-<span class="sourceLineNo">327</span> long count = 2;<a name="line.327"></a>
-<span class="sourceLineNo">328</span> source.decGauge(gaugeName, delta);<a name="line.328"></a>
-<span class="sourceLineNo">329</span> source.getMetricsContext();<a name="line.329"></a>
-<span class="sourceLineNo">330</span> source.getMetricsDescription();<a name="line.330"></a>
-<span class="sourceLineNo">331</span> source.getMetricsJmxContext();<a name="line.331"></a>
-<span class="sourceLineNo">332</span> source.getMetricsName();<a name="line.332"></a>
-<span class="sourceLineNo">333</span> source.incCounters(counterName, count);<a name="line.333"></a>
-<span class="sourceLineNo">334</span> source.incGauge(gaugeName, delta);<a name="line.334"></a>
-<span class="sourceLineNo">335</span> source.init();<a name="line.335"></a>
-<span class="sourceLineNo">336</span> source.removeMetric(gaugeName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span> source.setGauge(gaugeName, delta);<a name="line.337"></a>
-<span class="sourceLineNo">338</span> source.updateHistogram(counterName, count);<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.340"></a>
-<span class="sourceLineNo">341</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.341"></a>
-<span class="sourceLineNo">342</span> verify(globalRms).getMetricsContext();<a name="line.342"></a>
-<span class="sourceLineNo">343</span> verify(globalRms).getMetricsJmxContext();<a name="line.343"></a>
-<span class="sourceLineNo">344</span> verify(globalRms).getMetricsName();<a name="line.344"></a>
-<span class="sourceLineNo">345</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.345"></a>
-<span class="sourceLineNo">346</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.346"></a>
-<span class="sourceLineNo">347</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.347"></a>
-<span class="sourceLineNo">348</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.348"></a>
-<span class="sourceLineNo">349</span> verify(globalRms).init();<a name="line.349"></a>
-<span class="sourceLineNo">350</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.350"></a>
-<span class="sourceLineNo">351</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.352"></a>
-<span class="sourceLineNo">353</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.353"></a>
-<span class="sourceLineNo">354</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.354"></a>
-<span class="sourceLineNo">355</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.355"></a>
-<span class="sourceLineNo">356</span> }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span> private void doPut(byte[] row) throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span> doPut(connection, row);<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span> }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.364"></a>
-<span class="sourceLineNo">365</span> try (Table t = connection.getTable(tableName)) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span> Put put = new Put(row);<a name="line.366"></a>
-<span class="sourceLineNo">367</span> put.addColumn(famName, row, row);<a name="line.367"></a>
-<span class="sourceLineNo">368</span> t.put(put);<a name="line.368"></a>
-<span class="sourceLineNo">369</span> }<a name="line.369"></a>
-<span class="sourceLineNo">370</span> }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span> private static void doAssert(byte[] row) throws Exception {<a name="line.372"></a>
-<span class="sourceLineNo">373</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span> return; // first call<a name="line.374"></a>
-<span class="sourceLineNo">375</span> }<a name="line.375"></a>
-<span class="sourceLineNo">376</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.376"></a>
-<span class="sourceLineNo">377</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.377"></a>
-<span class="sourceLineNo">378</span> Assert.assertEquals(1, cells.size());<a name="line.378"></a>
-<span class="sourceLineNo">379</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.379"></a>
-<span class="sourceLineNo">380</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.380"></a>
-<span class="sourceLineNo">381</span> }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.383"></a>
-<span class="sourceLineNo">384</span> static UUID uuid = UUID.randomUUID();<a name="line.384"></a>
-<span class="sourceLineNo">385</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.385"></a>
-<span class="sourceLineNo">386</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.386"></a>
-<span class="sourceLineNo">387</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.387"></a>
-<span class="sourceLineNo">388</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.388"></a>
-<span class="sourceLineNo">389</span> static volatile List<Entry> lastEntries = null;<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span> public ReplicationEndpointForTest() {<a name="line.391"></a>
-<span class="sourceLineNo">392</span> replicateCount.set(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span> contructedCount.incrementAndGet();<a name="line.393"></a>
-<span class="sourceLineNo">394</span> }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span> @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span> public UUID getPeerUUID() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span> return uuid;<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span> @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span> replicateCount.incrementAndGet();<a name="line.403"></a>
-<span class="sourceLineNo">404</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.404"></a>
-<span class="sourceLineNo">405</span> return true;<a name="line.405"></a>
-<span class="sourceLineNo">406</span> }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span> @Override<a name="line.408"></a>
-<span class="sourceLineNo">409</span> public void start() {<a name="line.409"></a>
-<span class="sourceLineNo">410</span> startAsync();<a name="line.410"></a>
-<span class="sourceLineNo">411</span> }<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span> @Override<a name="line.413"></a>
-<span class="sourceLineNo">414</span> public void stop() {<a name="line.414"></a>
-<span class="sourceLineNo">415</span> stopAsync();<a name="line.415"></a>
-<span class="sourceLineNo">416</span> }<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span> @Override<a name="line.418"></a>
-<span class="sourceLineNo">419</span> protected void doStart() {<a name="line.419"></a>
-<span class="sourceLineNo">420</span> startedCount.incrementAndGet();<a name="line.420"></a>
-<span class="sourceLineNo">421</span> notifyStarted();<a name="line.421"></a>
-<span class="sourceLineNo">422</span> }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span> @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span> protected void doStop() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span> stoppedCount.incrementAndGet();<a name="line.426"></a>
-<span class="sourceLineNo">427</span> notifyStopped();<a name="line.427"></a>
-<span class="sourceLineNo">428</span> }<a name="line.428"></a>
-<span class="sourceLineNo">429</span> }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span> public static class InterClusterReplicationEndpointForTest<a name="line.431"></a>
-<span class="sourceLineNo">432</span> extends HBaseInterClusterReplicationEndpoint {<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.434"></a>
-<span class="sourceLineNo">435</span> static boolean failedOnce;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span> public InterClusterReplicationEndpointForTest() {<a name="line.437"></a>
-<span class="sourceLineNo">438</span> replicateCount.set(0);<a name="line.438"></a>
-<span class="sourceLineNo">439</span> }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span> @Override<a name="line.441"></a>
-<span class="sourceLineNo">442</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span> boolean success = super.replicate(replicateContext);<a name="line.443"></a>
-<span class="sourceLineNo">444</span> if (success) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span> replicateCount.addAndGet(replicateContext.entries.size());<a name="line.445"></a>
-<span class="sourceLineNo">446</span> }<a name="line.446"></a>
-<span class="sourceLineNo">447</span> return success;<a name="line.447"></a>
+<span class="sourceLineNo">165</span> doAssert(Bytes.toBytes("row42"));<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.167"></a>
+<span class="sourceLineNo">168</span> }<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span> @Test<a name="line.170"></a>
+<span class="sourceLineNo">171</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.171"></a>
+<span class="sourceLineNo">172</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.172"></a>
+<span class="sourceLineNo">173</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.173"></a>
+<span class="sourceLineNo">174</span> int peerCount = admin.getPeersCount();<a name="line.174"></a>
+<span class="sourceLineNo">175</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.175"></a>
+<span class="sourceLineNo">176</span> admin.addPeer(id,<a name="line.176"></a>
+<span class="sourceLineNo">177</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.177"></a>
+<span class="sourceLineNo">178</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.178"></a>
+<span class="sourceLineNo">179</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.179"></a>
+<span class="sourceLineNo">180</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.180"></a>
+<span class="sourceLineNo">181</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.181"></a>
+<span class="sourceLineNo">182</span> if (admin.getPeersCount() <= peerCount) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.183"></a>
+<span class="sourceLineNo">184</span> Threads.sleep(100);<a name="line.184"></a>
+<span class="sourceLineNo">185</span> }<a name="line.185"></a>
+<span class="sourceLineNo">186</span> // now replicate some data<a name="line.186"></a>
+<span class="sourceLineNo">187</span> doPut(row);<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.189"></a>
+<span class="sourceLineNo">190</span> @Override<a name="line.190"></a>
+<span class="sourceLineNo">191</span> public boolean evaluate() throws Exception {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.192"></a>
+<span class="sourceLineNo">193</span> // only send over one edit.<a name="line.193"></a>
+<span class="sourceLineNo">194</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.194"></a>
+<span class="sourceLineNo">195</span> LOG.info("count=" + count);<a name="line.195"></a>
+<span class="sourceLineNo">196</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.196"></a>
+<span class="sourceLineNo">197</span> }<a name="line.197"></a>
+<span class="sourceLineNo">198</span> });<a name="line.198"></a>
+<span class="sourceLineNo">199</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.200"></a>
+<span class="sourceLineNo">201</span> }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.203"></a>
+<span class="sourceLineNo">204</span> }<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span> @Test<a name="line.206"></a>
+<span class="sourceLineNo">207</span> public void testInterClusterReplication() throws Exception {<a name="line.207"></a>
+<span class="sourceLineNo">208</span> final String id = "testInterClusterReplication";<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.210"></a>
+<span class="sourceLineNo">211</span> int totEdits = 0;<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> // Make sure edits are spread across regions because we do region based batching<a name="line.213"></a>
+<span class="sourceLineNo">214</span> // before shipping edits.<a name="line.214"></a>
+<span class="sourceLineNo">215</span> for(HRegion region: regions) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span> RegionInfo hri = region.getRegionInfo();<a name="line.216"></a>
+<span class="sourceLineNo">217</span> byte[] row = hri.getStartKey();<a name="line.217"></a>
+<span class="sourceLineNo">218</span> for (int i = 0; i < 100; i++) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span> if (row.length > 0) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span> Put put = new Put(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span> put.addColumn(famName, row, row);<a name="line.221"></a>
+<span class="sourceLineNo">222</span> region.put(put);<a name="line.222"></a>
+<span class="sourceLineNo">223</span> totEdits++;<a name="line.223"></a>
+<span class="sourceLineNo">224</span> }<a name="line.224"></a>
+<span class="sourceLineNo">225</span> }<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span> admin.addPeer(id,<a name="line.228"></a>
+<span class="sourceLineNo">229</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.229"></a>
+<span class="sourceLineNo">230</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.230"></a>
+<span class="sourceLineNo">231</span> null);<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> final int numEdits = totEdits;<a name="line.233"></a>
+<span class="sourceLineNo">234</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> public boolean evaluate() throws Exception {<a name="line.236"></a>
+<span class="sourceLineNo">237</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.237"></a>
+<span class="sourceLineNo">238</span> }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span> @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span> public String explainFailure() throws Exception {<a name="line.241"></a>
+<span class="sourceLineNo">242</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.242"></a>
+<span class="sourceLineNo">243</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.243"></a>
+<span class="sourceLineNo">244</span> return failure;<a name="line.244"></a>
+<span class="sourceLineNo">245</span> }<a name="line.245"></a>
+<span class="sourceLineNo">246</span> });<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> admin.removePeer("testInterClusterReplication");<a name="line.248"></a>
+<span class="sourceLineNo">249</span> utility1.deleteTableData(tableName);<a name="line.249"></a>
+<span class="sourceLineNo">250</span> }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span> @Test<a name="line.252"></a>
+<span class="sourceLineNo">253</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.253"></a>
+<span class="sourceLineNo">254</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.254"></a>
+<span class="sourceLineNo">255</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.255"></a>
+<span class="sourceLineNo">256</span> //test that we can create mutliple WALFilters reflectively<a name="line.256"></a>
+<span class="sourceLineNo">257</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.257"></a>
+<span class="sourceLineNo">258</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.258"></a>
+<span class="sourceLineNo">259</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.259"></a>
+<span class="sourceLineNo">260</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> // now replicate some data.<a name="line.261"></a>
+<span class="sourceLineNo">262</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.263"></a>
+<span class="sourceLineNo">264</span> doPut(connection, row);<a name="line.264"></a>
+<span class="sourceLineNo">265</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.265"></a>
+<span class="sourceLineNo">266</span> }<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span> @Override<a name="line.269"></a>
+<span class="sourceLineNo">270</span> public boolean evaluate() throws Exception {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.271"></a>
+<span class="sourceLineNo">272</span> }<a name="line.272"></a>
+<span class="sourceLineNo">273</span> });<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.275"></a>
+<span class="sourceLineNo">276</span> //make sure our reflectively created filter is in the filter chain<a name="line.276"></a>
+<span class="sourceLineNo">277</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.277"></a>
+<span class="sourceLineNo">278</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.278"></a>
+<span class="sourceLineNo">279</span> }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span> @Test (expected=IOException.class)<a name="line.281"></a>
+<span class="sourceLineNo">282</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.283"></a>
+<span class="sourceLineNo">284</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span> //test that we can create mutliple WALFilters reflectively<a name="line.285"></a>
+<span class="sourceLineNo">286</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.286"></a>
+<span class="sourceLineNo">287</span> "IAmNotARealWalEntryFilter");<a name="line.287"></a>
+<span class="sourceLineNo">288</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.288"></a>
+<span class="sourceLineNo">289</span> }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span> @Test (expected=IOException.class)<a name="line.291"></a>
+<span class="sourceLineNo">292</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.292"></a>
+<span class="sourceLineNo">293</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.293"></a>
+<span class="sourceLineNo">294</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.294"></a>
+<span class="sourceLineNo">295</span> //test that we can create mutliple WALFilters reflectively<a name="line.295"></a>
+<span class="sourceLineNo">296</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.296"></a>
+<span class="sourceLineNo">297</span> "IAmNotARealWalEntryFilter");<a name="line.297"></a>
+<span class="sourceLineNo">298</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.298"></a>
+<span class="sourceLineNo">299</span> }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span> @Test<a name="line.302"></a>
+<span class="sourceLineNo">303</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.303"></a>
+<span class="sourceLineNo">304</span> /*<a name="line.304"></a>
+<span class="sourceLineNo">305</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.305"></a>
+<span class="sourceLineNo">306</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.306"></a>
+<span class="sourceLineNo">307</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.307"></a>
+<span class="sourceLineNo">308</span> allows for custom JMX metrics.<a name="line.308"></a>
+<span class="sourceLineNo">309</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.309"></a>
+<span class="sourceLineNo">310</span> the two layers of wrapping to the actual BaseSource.<a name="line.310"></a>
+<span class="sourceLineNo">311</span> */<a name="line.311"></a>
+<span class="sourceLineNo">312</span> String id = "id";<a name="line.312"></a>
+<span class="sourceLineNo">313</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.313"></a>
+<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
+<span class="sourceLineNo">315</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
+<span class="sourceLineNo">316</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.316"></a>
+<span class="sourceLineNo">317</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.319"></a>
+<span class="sourceLineNo">320</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.320"></a>
+<span class="sourceLineNo">321</span> Map<String, MetricsReplicationSourceSource> singleSourceSourceByTable = new HashMap<>();<a name="line.321"></a>
+<span class="sourceLineNo">322</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource,<a name="line.322"></a>
+<span class="sourceLineNo">323</span> singleSourceSourceByTable);<a name="line.323"></a>
+<span class="sourceLineNo">324</span> String gaugeName = "gauge";<a name="line.324"></a>
+<span class="sourceLineNo">325</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.325"></a>
+<span class="sourceLineNo">326</span> String globalGaugeName = "source." + gaugeName;<a name="line.326"></a>
+<span class="sourceLineNo">327</span> long delta = 1;<a name="line.327"></a>
+<span class="sourceLineNo">328</span> String counterName = "counter";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> String singleCounterName = "source.id." + counterName;<a name="line.329"></a>
+<span class="sourceLineNo">330</span> String globalCounterName = "source." + counterName;<a name="line.330"></a>
+<span class="sourceLineNo">331</span> long count = 2;<a name="line.331"></a>
+<span class="sourceLineNo">332</span> source.decGauge(gaugeName, delta);<a name="line.332"></a>
+<span class="sourceLineNo">333</span> source.getMetricsContext();<a name="line.333"></a>
+<span class="sourceLineNo">334</span> source.getMetricsDescription();<a name="line.334"></a>
+<span class="sourceLineNo">335</span> source.getMetricsJmxContext();<a name="line.335"></a>
+<span class="sourceLineNo">336</span> source.getMetricsName();<a name="line.336"></a>
+<span class="sourceLineNo">337</span> source.incCounters(counterName, count);<a name="line.337"></a>
+<span class="sourceLineNo">338</span> source.incGauge(gaugeName, delta);<a name="line.338"></a>
+<span class="sourceLineNo">339</span> source.init();<a name="line.339"></a>
+<span class="sourceLineNo">340</span> source.removeMetric(gaugeName);<a name="line.340"></a>
+<span class="sourceLineNo">341</span> source.setGauge(gaugeName, delta);<a name="line.341"></a>
+<span class="sourceLineNo">342</span> source.updateHistogram(counterName, count);<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.344"></a>
+<span class="sourceLineNo">345</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.345"></a>
+<span class="sourceLineNo">346</span> verify(globalRms).getMetricsContext();<a name="line.346"></a>
+<span class="sourceLineNo">347</span> verify(globalRms).getMetricsJmxContext();<a name="line.347"></a>
+<span class="sourceLineNo">348</span> verify(globalRms).getMetricsName();<a name="line.348"></a>
+<span class="sourceLineNo">349</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.349"></a>
+<span class="sourceLineNo">350</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.350"></a>
+<span class="sourceLineNo">351</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.351"></a>
+<span class="sourceLineNo">352</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.352"></a>
+<span class="sourceLineNo">353</span> verify(globalRms).init();<a name="line.353"></a>
+<span class="sourceLineNo">354</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.354"></a>
+<span class="sourceLineNo">355</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.355"></a>
+<span class="sourceLineNo">356</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.356"></a>
+<span class="sourceLineNo">357</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.357"></a>
+<span class="sourceLineNo">358</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.358"></a>
+<span class="sourceLineNo">359</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span> //check singleSourceSourceByTable metrics.<a name="line.361"></a>
+<span class="sourceLineNo">362</span> // singleSourceSourceByTable map entry will be created only<a name="line.362"></a>
+<span class="sourceLineNo">363</span> // after calling #setAgeOfLastShippedOpByTable<a name="line.363"></a>
+<span class="sourceLineNo">364</span> boolean containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.364"></a>
+<span class="sourceLineNo">365</span> .containsKey("RandomNewTable");<a name="line.365"></a>
+<span class="sourceLineNo">366</span> Assert.assertEquals(false, containsRandomNewTable);<a name="line.366"></a>
+<span class="sourceLineNo">367</span> source.setAgeOfLastShippedOpByTable(123L, "RandomNewTable");<a name="line.367"></a>
+<span class="sourceLineNo">368</span> containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.368"></a>
+<span class="sourceLineNo">369</span> .containsKey("RandomNewTable");<a name="line.369"></a>
+<span class="sourceLineNo">370</span> Assert.assertEquals(true, containsRandomNewTable);<a name="line.370"></a>
+<span class="sourceLineNo">371</span> MetricsReplicationSourceSource msr = source.getSingleSourceSourceByTable()<a name="line.371"></a>
+<span class="sourceLineNo">372</span> .get("RandomNewTable");<a name="line.372"></a>
+<span class="sourceLineNo">373</span> // cannot put more concreate value here to verify because the age is arbitrary.<a name="line.373"></a>
+<span class="sourceLineNo">374</span> // as long as it's greater than 0, we see it as correct answer.<a name="line.374"></a>
+<span class="sourceLineNo">375</span> Assert.assertTrue(msr.getLastShippedAge() > 0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span> }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span> private void doPut(byte[] row) throws IOException {<a name="line.378"></a>
+<span class="sourceLineNo">379</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span> doPut(connection, row);<a name="line.380"></a>
+<span class="sourceLineNo">381</span> }<a name="line.381"></a>
+<span class="sourceLineNo">382</span> }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.384"></a>
+<span class="sourceLineNo">385</span> try (Table t = connection.getTable(tableName)) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span> Put put = new Put(row);<a name="line.386"></a>
+<span class="sourceLineNo">387</span> put.addColumn(famName, row, row);<a name="line.387"></a>
+<span class="sourceLineNo">388</span> t.put(put);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<a name="line.389"></a>
+<span class="sourceLineNo">390</span> }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span> private static void doAssert(byte[] row) throws Exception {<a name="line.392"></a>
+<span class="sourceLineNo">393</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span> return; // first call<a name="line.394"></a>
+<span class="sourceLineNo">395</span> }<a name="line.395"></a>
+<span class="sourceLineNo">396</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.396"></a>
+<span class="sourceLineNo">397</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.397"></a>
+<span class="sourceLineNo">398</span> Assert.assertEquals(1, cells.size());<a name="line.398"></a>
+<span class="sourceLineNo">399</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.399"></a>
+<span class="sourceLineNo">400</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.400"></a>
+<span class="sourceLineNo">401</span> }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.403"></a>
+<span class="sourceLineNo">404</span> static UUID uuid = UUID.randomUUID();<a name="line.404"></a>
+<span class="sourceLineNo">405</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.405"></a>
+<span class="sourceLineNo">406</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.406"></a>
+<span class="sourceLineNo">407</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.407"></a>
+<span class="sourceLineNo">408</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.408"></a>
+<span class="sourceLineNo">409</span> static volatile List<Entry> lastEntries = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span> public ReplicationEndpointForTest() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span> replicateCount.set(0);<a name="line.412"></a>
+<span class="sourceLineNo">413</span> contructedCount.incrementAndGet();<a name="line.413"></a>
+<span class="sourceLineNo">414</span> }<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span> @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span> public UUID getPeerUUID() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span> return uuid;<a name="line.418"></a>
+<span class="sourceLineNo">419</span> }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span> @Override<a name="line.421"></a>
+<span class="sourceLineNo">422</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span> replicateCount.incrementAndGet();<a name="line.423"></a>
+<span class="sourceLineNo">424</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.424"></a>
+<span class="sourceLineNo">425</span> return true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span> }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span> @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span> public void start() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span> startAsync();<a name="line.430"></a>
+<span class="sourceLineNo">431</span> }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span> @Override<a name="line.433"></a>
+<span class="sourceLineNo">434</span> public void stop() {<a name="line.434"></a>
+<span class="sourceLineNo">435</span> stopAsync();<a name="line.435"></a>
+<span class="sourceLineNo">436</span> }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span> @Override<a name="line.438"></a>
+<span class="sourceLineNo">439</span> protected void doStart() {<a name="line.439"></a>
+<span class="sourceLineNo">440</span> startedCount.incrementAndGet();<a name="line.440"></a>
+<span class="sourceLineNo">441</span> notifyStarted();<a name="line.441"></a>
+<span class="sourceLineNo">442</span> }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span> @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span> protected void doStop() {<a name="line.445"></a>
+<span class="sourceLineNo">446</span> stoppedCount.incrementAndGet();<a name="line.446"></a>
+<span class="sourceLineNo">447</span> notifyStopped();<a name="line.447"></a>
<span class="sourceLineNo">448</span> }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span> @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span> protected Callable<Integer> createReplicator(List<Entry> entries, int ordinal) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span> // Fail only once, we don't want to slow down the test.<a name="line.452"></a>
-<span class="sourceLineNo">453</span> if (failedOnce) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span> return () -> ordinal;<a name="line.454"></a>
-<span class="sourceLineNo">455</span> } else {<a name="line.455"></a>
-<span class="sourceLineNo">456</span> failedOnce = true;<a name="line.456"></a>
-<span class="sourceLineNo">457</span> return () -> {<a name="line.457"></a>
-<span class="sourceLineNo">458</span> throw new IOException("Sample Exception: Failed to replicate.");<a name="line.458"></a>
-<span class="sourceLineNo">459</span> };<a name="line.459"></a>
-<span class="sourceLineNo">460</span> }<a name="line.460"></a>
-<span class="sourceLineNo">461</span> }<a name="line.461"></a>
-<span class="sourceLineNo">462</span> }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span> public static class ReplicationEndpointReturningFalse extends ReplicationEndpointForTest {<a name="line.464"></a>
-<span class="sourceLineNo">465</span> static int COUNT = 10;<a name="line.465"></a>
-<span class="sourceLineNo">466</span> static AtomicReference<Exception> ex = new AtomicReference<>(null);<a name="line.466"></a>
-<span class="sourceLineNo">467</span> static AtomicBoolean replicated = new AtomicBoolean(false);<a name="line.467"></a>
-<span class="sourceLineNo">468</span> @Override<a name="line.468"></a>
-<span class="sourceLineNo">469</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span> try {<a name="line.470"></a>
-<span class="sourceLineNo">471</span> // check row<a name="line.471"></a>
-<span class="sourceLineNo">472</span> doAssert(row);<a name="line.472"></a>
-<span class="sourceLineNo">473</span> } catch (Exception e) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span> ex.set(e);<a name="line.474"></a>
-<span class="sourceLineNo">475</span> }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span> super.replicate(replicateContext);<a name="line.477"></a>
-<span class="sourceLineNo">478</span> LOG.info("Replicated " + Bytes.toString(row) + ", count=" + replicateCount.get());<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="so
<TRUNCATED>
[05/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html
index 43a87b6..819e491 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html
@@ -31,517 +31,537 @@
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.UUID;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.concurrent.Callable;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.Cell;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Waiter;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Put;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Table;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.junit.AfterClass;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.junit.Assert;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.junit.Before;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.BeforeClass;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.ClassRule;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.Test;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.experimental.categories.Category;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.slf4j.Logger;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.slf4j.LoggerFactory;<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.66"></a>
-<span class="sourceLineNo">067</span> */<a name="line.67"></a>
-<span class="sourceLineNo">068</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.68"></a>
-<span class="sourceLineNo">069</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span> @ClassRule<a name="line.71"></a>
-<span class="sourceLineNo">072</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.72"></a>
-<span class="sourceLineNo">073</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.75"></a>
+<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Map;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.UUID;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.Callable;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Cell;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Waiter;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Put;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Table;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.AfterClass;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.Assert;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.Before;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.BeforeClass;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.ClassRule;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.experimental.categories.Category;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.slf4j.Logger;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.slf4j.LoggerFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>/**<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.68"></a>
+<span class="sourceLineNo">069</span> */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.70"></a>
+<span class="sourceLineNo">071</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span> @ClassRule<a name="line.73"></a>
+<span class="sourceLineNo">074</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.74"></a>
+<span class="sourceLineNo">075</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.75"></a>
<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span> static int numRegionServers;<a name="line.77"></a>
+<span class="sourceLineNo">077</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.77"></a>
<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span> @BeforeClass<a name="line.79"></a>
-<span class="sourceLineNo">080</span> public static void setUpBeforeClass() throws Exception {<a name="line.80"></a>
-<span class="sourceLineNo">081</span> TestReplicationBase.setUpBeforeClass();<a name="line.81"></a>
-<span class="sourceLineNo">082</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.82"></a>
-<span class="sourceLineNo">083</span> }<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span> @AfterClass<a name="line.85"></a>
-<span class="sourceLineNo">086</span> public static void tearDownAfterClass() throws Exception {<a name="line.86"></a>
-<span class="sourceLineNo">087</span> TestReplicationBase.tearDownAfterClass();<a name="line.87"></a>
-<span class="sourceLineNo">088</span> // check stop is called<a name="line.88"></a>
-<span class="sourceLineNo">089</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.89"></a>
-<span class="sourceLineNo">090</span> }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span> @Before<a name="line.92"></a>
-<span class="sourceLineNo">093</span> public void setup() throws Exception {<a name="line.93"></a>
-<span class="sourceLineNo">094</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.94"></a>
-<span class="sourceLineNo">095</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.95"></a>
-<span class="sourceLineNo">096</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.96"></a>
-<span class="sourceLineNo">097</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.97"></a>
-<span class="sourceLineNo">098</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> final List<RegionServerThread> rsThreads =<a name="line.99"></a>
-<span class="sourceLineNo">100</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.100"></a>
-<span class="sourceLineNo">101</span> for (RegionServerThread rs : rsThreads) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.102"></a>
-<span class="sourceLineNo">103</span> }<a name="line.103"></a>
-<span class="sourceLineNo">104</span> // Wait for all log roll to finish<a name="line.104"></a>
-<span class="sourceLineNo">105</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.105"></a>
-<span class="sourceLineNo">106</span> @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span> public boolean evaluate() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span> for (RegionServerThread rs : rsThreads) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span> return false;<a name="line.110"></a>
-<span class="sourceLineNo">111</span> }<a name="line.111"></a>
-<span class="sourceLineNo">112</span> }<a name="line.112"></a>
-<span class="sourceLineNo">113</span> return true;<a name="line.113"></a>
-<span class="sourceLineNo">114</span> }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span> @Override<a name="line.116"></a>
-<span class="sourceLineNo">117</span> public String explainFailure() throws Exception {<a name="line.117"></a>
-<span class="sourceLineNo">118</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.118"></a>
-<span class="sourceLineNo">119</span> for (RegionServerThread rs : rsThreads) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.121"></a>
-<span class="sourceLineNo">122</span> }<a name="line.122"></a>
-<span class="sourceLineNo">123</span> }<a name="line.123"></a>
-<span class="sourceLineNo">124</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.124"></a>
-<span class="sourceLineNo">125</span> }<a name="line.125"></a>
-<span class="sourceLineNo">126</span> });<a name="line.126"></a>
-<span class="sourceLineNo">127</span> }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span> @Test<a name="line.129"></a>
-<span class="sourceLineNo">130</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.130"></a>
-<span class="sourceLineNo">131</span> // test installing a custom replication endpoint other than the default one.<a name="line.131"></a>
-<span class="sourceLineNo">132</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.132"></a>
-<span class="sourceLineNo">133</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.133"></a>
-<span class="sourceLineNo">134</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span> // check whether the class has been constructed and started<a name="line.136"></a>
-<span class="sourceLineNo">137</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.137"></a>
-<span class="sourceLineNo">138</span> @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span> public boolean evaluate() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.140"></a>
-<span class="sourceLineNo">141</span> }<a name="line.141"></a>
-<span class="sourceLineNo">142</span> });<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span> @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span> public boolean evaluate() throws Exception {<a name="line.146"></a>
-<span class="sourceLineNo">147</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.147"></a>
-<span class="sourceLineNo">148</span> }<a name="line.148"></a>
-<span class="sourceLineNo">149</span> });<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.151"></a>
+<span class="sourceLineNo">079</span> static int numRegionServers;<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span> @BeforeClass<a name="line.81"></a>
+<span class="sourceLineNo">082</span> public static void setUpBeforeClass() throws Exception {<a name="line.82"></a>
+<span class="sourceLineNo">083</span> TestReplicationBase.setUpBeforeClass();<a name="line.83"></a>
+<span class="sourceLineNo">084</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.84"></a>
+<span class="sourceLineNo">085</span> }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span> @AfterClass<a name="line.87"></a>
+<span class="sourceLineNo">088</span> public static void tearDownAfterClass() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span> TestReplicationBase.tearDownAfterClass();<a name="line.89"></a>
+<span class="sourceLineNo">090</span> // check stop is called<a name="line.90"></a>
+<span class="sourceLineNo">091</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.91"></a>
+<span class="sourceLineNo">092</span> }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span> @Before<a name="line.94"></a>
+<span class="sourceLineNo">095</span> public void setup() throws Exception {<a name="line.95"></a>
+<span class="sourceLineNo">096</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.96"></a>
+<span class="sourceLineNo">097</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.97"></a>
+<span class="sourceLineNo">098</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.98"></a>
+<span class="sourceLineNo">099</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.99"></a>
+<span class="sourceLineNo">100</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> final List<RegionServerThread> rsThreads =<a name="line.101"></a>
+<span class="sourceLineNo">102</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.102"></a>
+<span class="sourceLineNo">103</span> for (RegionServerThread rs : rsThreads) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.104"></a>
+<span class="sourceLineNo">105</span> }<a name="line.105"></a>
+<span class="sourceLineNo">106</span> // Wait for all log roll to finish<a name="line.106"></a>
+<span class="sourceLineNo">107</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.107"></a>
+<span class="sourceLineNo">108</span> @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span> public boolean evaluate() throws Exception {<a name="line.109"></a>
+<span class="sourceLineNo">110</span> for (RegionServerThread rs : rsThreads) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span> return false;<a name="line.112"></a>
+<span class="sourceLineNo">113</span> }<a name="line.113"></a>
+<span class="sourceLineNo">114</span> }<a name="line.114"></a>
+<span class="sourceLineNo">115</span> return true;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span> @Override<a name="line.118"></a>
+<span class="sourceLineNo">119</span> public String explainFailure() throws Exception {<a name="line.119"></a>
+<span class="sourceLineNo">120</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.120"></a>
+<span class="sourceLineNo">121</span> for (RegionServerThread rs : rsThreads) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.123"></a>
+<span class="sourceLineNo">124</span> }<a name="line.124"></a>
+<span class="sourceLineNo">125</span> }<a name="line.125"></a>
+<span class="sourceLineNo">126</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.126"></a>
+<span class="sourceLineNo">127</span> }<a name="line.127"></a>
+<span class="sourceLineNo">128</span> });<a name="line.128"></a>
+<span class="sourceLineNo">129</span> }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span> @Test<a name="line.131"></a>
+<span class="sourceLineNo">132</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.132"></a>
+<span class="sourceLineNo">133</span> // test installing a custom replication endpoint other than the default one.<a name="line.133"></a>
+<span class="sourceLineNo">134</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.134"></a>
+<span class="sourceLineNo">135</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.135"></a>
+<span class="sourceLineNo">136</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span> // check whether the class has been constructed and started<a name="line.138"></a>
+<span class="sourceLineNo">139</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.139"></a>
+<span class="sourceLineNo">140</span> @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span> public boolean evaluate() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.142"></a>
+<span class="sourceLineNo">143</span> }<a name="line.143"></a>
+<span class="sourceLineNo">144</span> });<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span> @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span> public boolean evaluate() throws Exception {<a name="line.148"></a>
+<span class="sourceLineNo">149</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.149"></a>
+<span class="sourceLineNo">150</span> }<a name="line.150"></a>
+<span class="sourceLineNo">151</span> });<a name="line.151"></a>
<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span> // now replicate some data.<a name="line.153"></a>
-<span class="sourceLineNo">154</span> doPut(Bytes.toBytes("row42"));<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span> @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span> public boolean evaluate() throws Exception {<a name="line.158"></a>
-<span class="sourceLineNo">159</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.159"></a>
-<span class="sourceLineNo">160</span> }<a name="line.160"></a>
-<span class="sourceLineNo">161</span> });<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span> doAssert(Bytes.toBytes("row42"));<a name="line.163"></a>
+<span class="sourceLineNo">153</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span> // now replicate some data.<a name="line.155"></a>
+<span class="sourceLineNo">156</span> doPut(Bytes.toBytes("row42"));<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span> @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span> public boolean evaluate() throws Exception {<a name="line.160"></a>
+<span class="sourceLineNo">161</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.161"></a>
+<span class="sourceLineNo">162</span> }<a name="line.162"></a>
+<span class="sourceLineNo">163</span> });<a name="line.163"></a>
<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.165"></a>
-<span class="sourceLineNo">166</span> }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span> @Test<a name="line.168"></a>
-<span class="sourceLineNo">169</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.169"></a>
-<span class="sourceLineNo">170</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.170"></a>
-<span class="sourceLineNo">171</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.171"></a>
-<span class="sourceLineNo">172</span> int peerCount = admin.getPeersCount();<a name="line.172"></a>
-<span class="sourceLineNo">173</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.173"></a>
-<span class="sourceLineNo">174</span> admin.addPeer(id,<a name="line.174"></a>
-<span class="sourceLineNo">175</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.175"></a>
-<span class="sourceLineNo">176</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.176"></a>
-<span class="sourceLineNo">177</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.177"></a>
-<span class="sourceLineNo">178</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.178"></a>
-<span class="sourceLineNo">179</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.179"></a>
-<span class="sourceLineNo">180</span> if (admin.getPeersCount() <= peerCount) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.181"></a>
-<span class="sourceLineNo">182</span> Threads.sleep(100);<a name="line.182"></a>
-<span class="sourceLineNo">183</span> }<a name="line.183"></a>
-<span class="sourceLineNo">184</span> // now replicate some data<a name="line.184"></a>
-<span class="sourceLineNo">185</span> doPut(row);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.187"></a>
-<span class="sourceLineNo">188</span> @Override<a name="line.188"></a>
-<span class="sourceLineNo">189</span> public boolean evaluate() throws Exception {<a name="line.189"></a>
-<span class="sourceLineNo">190</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.190"></a>
-<span class="sourceLineNo">191</span> // only send over one edit.<a name="line.191"></a>
-<span class="sourceLineNo">192</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.192"></a>
-<span class="sourceLineNo">193</span> LOG.info("count=" + count);<a name="line.193"></a>
-<span class="sourceLineNo">194</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.194"></a>
-<span class="sourceLineNo">195</span> }<a name="line.195"></a>
-<span class="sourceLineNo">196</span> });<a name="line.196"></a>
-<span class="sourceLineNo">197</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.198"></a>
-<span class="sourceLineNo">199</span> }<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.201"></a>
-<span class="sourceLineNo">202</span> }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span> @Test<a name="line.204"></a>
-<span class="sourceLineNo">205</span> public void testInterClusterReplication() throws Exception {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> final String id = "testInterClusterReplication";<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> int totEdits = 0;<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> // Make sure edits are spread across regions because we do region based batching<a name="line.211"></a>
-<span class="sourceLineNo">212</span> // before shipping edits.<a name="line.212"></a>
-<span class="sourceLineNo">213</span> for(HRegion region: regions) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span> RegionInfo hri = region.getRegionInfo();<a name="line.214"></a>
-<span class="sourceLineNo">215</span> byte[] row = hri.getStartKey();<a name="line.215"></a>
-<span class="sourceLineNo">216</span> for (int i = 0; i < 100; i++) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span> if (row.length > 0) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span> Put put = new Put(row);<a name="line.218"></a>
-<span class="sourceLineNo">219</span> put.addColumn(famName, row, row);<a name="line.219"></a>
-<span class="sourceLineNo">220</span> region.put(put);<a name="line.220"></a>
-<span class="sourceLineNo">221</span> totEdits++;<a name="line.221"></a>
-<span class="sourceLineNo">222</span> }<a name="line.222"></a>
-<span class="sourceLineNo">223</span> }<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> admin.addPeer(id,<a name="line.226"></a>
-<span class="sourceLineNo">227</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.227"></a>
-<span class="sourceLineNo">228</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.228"></a>
-<span class="sourceLineNo">229</span> null);<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span> final int numEdits = totEdits;<a name="line.231"></a>
-<span class="sourceLineNo">232</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.232"></a>
-<span class="sourceLineNo">233</span> @Override<a name="line.233"></a>
-<span class="sourceLineNo">234</span> public boolean evaluate() throws Exception {<a name="line.234"></a>
-<span class="sourceLineNo">235</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.235"></a>
-<span class="sourceLineNo">236</span> }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span> @Override<a name="line.238"></a>
-<span class="sourceLineNo">239</span> public String explainFailure() throws Exception {<a name="line.239"></a>
-<span class="sourceLineNo">240</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.240"></a>
-<span class="sourceLineNo">241</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.241"></a>
-<span class="sourceLineNo">242</span> return failure;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> }<a name="line.243"></a>
-<span class="sourceLineNo">244</span> });<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> admin.removePeer("testInterClusterReplication");<a name="line.246"></a>
-<span class="sourceLineNo">247</span> utility1.deleteTableData(tableName);<a name="line.247"></a>
-<span class="sourceLineNo">248</span> }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span> @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.252"></a>
-<span class="sourceLineNo">253</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.253"></a>
-<span class="sourceLineNo">254</span> //test that we can create mutliple WALFilters reflectively<a name="line.254"></a>
-<span class="sourceLineNo">255</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.256"></a>
-<span class="sourceLineNo">257</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.257"></a>
-<span class="sourceLineNo">258</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.258"></a>
-<span class="sourceLineNo">259</span> // now replicate some data.<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.261"></a>
-<span class="sourceLineNo">262</span> doPut(connection, row);<a name="line.262"></a>
-<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span> }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.266"></a>
-<span class="sourceLineNo">267</span> @Override<a name="line.267"></a>
-<span class="sourceLineNo">268</span> public boolean evaluate() throws Exception {<a name="line.268"></a>
-<span class="sourceLineNo">269</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> }<a name="line.270"></a>
-<span class="sourceLineNo">271</span> });<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.273"></a>
-<span class="sourceLineNo">274</span> //make sure our reflectively created filter is in the filter chain<a name="line.274"></a>
-<span class="sourceLineNo">275</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.275"></a>
-<span class="sourceLineNo">276</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.276"></a>
-<span class="sourceLineNo">277</span> }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span> @Test (expected=IOException.class)<a name="line.279"></a>
-<span class="sourceLineNo">280</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.281"></a>
-<span class="sourceLineNo">282</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span> //test that we can create mutliple WALFilters reflectively<a name="line.283"></a>
-<span class="sourceLineNo">284</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.284"></a>
-<span class="sourceLineNo">285</span> "IAmNotARealWalEntryFilter");<a name="line.285"></a>
-<span class="sourceLineNo">286</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.286"></a>
-<span class="sourceLineNo">287</span> }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span> @Test (expected=IOException.class)<a name="line.289"></a>
-<span class="sourceLineNo">290</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.290"></a>
-<span class="sourceLineNo">291</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.292"></a>
-<span class="sourceLineNo">293</span> //test that we can create mutliple WALFilters reflectively<a name="line.293"></a>
-<span class="sourceLineNo">294</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.294"></a>
-<span class="sourceLineNo">295</span> "IAmNotARealWalEntryFilter");<a name="line.295"></a>
-<span class="sourceLineNo">296</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span> @Test<a name="line.300"></a>
-<span class="sourceLineNo">301</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.301"></a>
-<span class="sourceLineNo">302</span> /*<a name="line.302"></a>
-<span class="sourceLineNo">303</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.303"></a>
-<span class="sourceLineNo">304</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.304"></a>
-<span class="sourceLineNo">305</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.305"></a>
-<span class="sourceLineNo">306</span> allows for custom JMX metrics.<a name="line.306"></a>
-<span class="sourceLineNo">307</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.307"></a>
-<span class="sourceLineNo">308</span> the two layers of wrapping to the actual BaseSource.<a name="line.308"></a>
-<span class="sourceLineNo">309</span> */<a name="line.309"></a>
-<span class="sourceLineNo">310</span> String id = "id";<a name="line.310"></a>
-<span class="sourceLineNo">311</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.312"></a>
-<span class="sourceLineNo">313</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.313"></a>
-<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
-<span class="sourceLineNo">315</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.317"></a>
-<span class="sourceLineNo">318</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.318"></a>
-<span class="sourceLineNo">319</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource);<a name="line.319"></a>
-<span class="sourceLineNo">320</span> String gaugeName = "gauge";<a name="line.320"></a>
-<span class="sourceLineNo">321</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.321"></a>
-<span class="sourceLineNo">322</span> String globalGaugeName = "source." + gaugeName;<a name="line.322"></a>
-<span class="sourceLineNo">323</span> long delta = 1;<a name="line.323"></a>
-<span class="sourceLineNo">324</span> String counterName = "counter";<a name="line.324"></a>
-<span class="sourceLineNo">325</span> String singleCounterName = "source.id." + counterName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span> String globalCounterName = "source." + counterName;<a name="line.326"></a>
-<span class="sourceLineNo">327</span> long count = 2;<a name="line.327"></a>
-<span class="sourceLineNo">328</span> source.decGauge(gaugeName, delta);<a name="line.328"></a>
-<span class="sourceLineNo">329</span> source.getMetricsContext();<a name="line.329"></a>
-<span class="sourceLineNo">330</span> source.getMetricsDescription();<a name="line.330"></a>
-<span class="sourceLineNo">331</span> source.getMetricsJmxContext();<a name="line.331"></a>
-<span class="sourceLineNo">332</span> source.getMetricsName();<a name="line.332"></a>
-<span class="sourceLineNo">333</span> source.incCounters(counterName, count);<a name="line.333"></a>
-<span class="sourceLineNo">334</span> source.incGauge(gaugeName, delta);<a name="line.334"></a>
-<span class="sourceLineNo">335</span> source.init();<a name="line.335"></a>
-<span class="sourceLineNo">336</span> source.removeMetric(gaugeName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span> source.setGauge(gaugeName, delta);<a name="line.337"></a>
-<span class="sourceLineNo">338</span> source.updateHistogram(counterName, count);<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.340"></a>
-<span class="sourceLineNo">341</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.341"></a>
-<span class="sourceLineNo">342</span> verify(globalRms).getMetricsContext();<a name="line.342"></a>
-<span class="sourceLineNo">343</span> verify(globalRms).getMetricsJmxContext();<a name="line.343"></a>
-<span class="sourceLineNo">344</span> verify(globalRms).getMetricsName();<a name="line.344"></a>
-<span class="sourceLineNo">345</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.345"></a>
-<span class="sourceLineNo">346</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.346"></a>
-<span class="sourceLineNo">347</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.347"></a>
-<span class="sourceLineNo">348</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.348"></a>
-<span class="sourceLineNo">349</span> verify(globalRms).init();<a name="line.349"></a>
-<span class="sourceLineNo">350</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.350"></a>
-<span class="sourceLineNo">351</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.352"></a>
-<span class="sourceLineNo">353</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.353"></a>
-<span class="sourceLineNo">354</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.354"></a>
-<span class="sourceLineNo">355</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.355"></a>
-<span class="sourceLineNo">356</span> }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span> private void doPut(byte[] row) throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span> doPut(connection, row);<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span> }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.364"></a>
-<span class="sourceLineNo">365</span> try (Table t = connection.getTable(tableName)) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span> Put put = new Put(row);<a name="line.366"></a>
-<span class="sourceLineNo">367</span> put.addColumn(famName, row, row);<a name="line.367"></a>
-<span class="sourceLineNo">368</span> t.put(put);<a name="line.368"></a>
-<span class="sourceLineNo">369</span> }<a name="line.369"></a>
-<span class="sourceLineNo">370</span> }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span> private static void doAssert(byte[] row) throws Exception {<a name="line.372"></a>
-<span class="sourceLineNo">373</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span> return; // first call<a name="line.374"></a>
-<span class="sourceLineNo">375</span> }<a name="line.375"></a>
-<span class="sourceLineNo">376</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.376"></a>
-<span class="sourceLineNo">377</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.377"></a>
-<span class="sourceLineNo">378</span> Assert.assertEquals(1, cells.size());<a name="line.378"></a>
-<span class="sourceLineNo">379</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.379"></a>
-<span class="sourceLineNo">380</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.380"></a>
-<span class="sourceLineNo">381</span> }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.383"></a>
-<span class="sourceLineNo">384</span> static UUID uuid = UUID.randomUUID();<a name="line.384"></a>
-<span class="sourceLineNo">385</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.385"></a>
-<span class="sourceLineNo">386</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.386"></a>
-<span class="sourceLineNo">387</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.387"></a>
-<span class="sourceLineNo">388</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.388"></a>
-<span class="sourceLineNo">389</span> static volatile List<Entry> lastEntries = null;<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span> public ReplicationEndpointForTest() {<a name="line.391"></a>
-<span class="sourceLineNo">392</span> replicateCount.set(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span> contructedCount.incrementAndGet();<a name="line.393"></a>
-<span class="sourceLineNo">394</span> }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span> @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span> public UUID getPeerUUID() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span> return uuid;<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span> @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span> replicateCount.incrementAndGet();<a name="line.403"></a>
-<span class="sourceLineNo">404</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.404"></a>
-<span class="sourceLineNo">405</span> return true;<a name="line.405"></a>
-<span class="sourceLineNo">406</span> }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span> @Override<a name="line.408"></a>
-<span class="sourceLineNo">409</span> public void start() {<a name="line.409"></a>
-<span class="sourceLineNo">410</span> startAsync();<a name="line.410"></a>
-<span class="sourceLineNo">411</span> }<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span> @Override<a name="line.413"></a>
-<span class="sourceLineNo">414</span> public void stop() {<a name="line.414"></a>
-<span class="sourceLineNo">415</span> stopAsync();<a name="line.415"></a>
-<span class="sourceLineNo">416</span> }<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span> @Override<a name="line.418"></a>
-<span class="sourceLineNo">419</span> protected void doStart() {<a name="line.419"></a>
-<span class="sourceLineNo">420</span> startedCount.incrementAndGet();<a name="line.420"></a>
-<span class="sourceLineNo">421</span> notifyStarted();<a name="line.421"></a>
-<span class="sourceLineNo">422</span> }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span> @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span> protected void doStop() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span> stoppedCount.incrementAndGet();<a name="line.426"></a>
-<span class="sourceLineNo">427</span> notifyStopped();<a name="line.427"></a>
-<span class="sourceLineNo">428</span> }<a name="line.428"></a>
-<span class="sourceLineNo">429</span> }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span> public static class InterClusterReplicationEndpointForTest<a name="line.431"></a>
-<span class="sourceLineNo">432</span> extends HBaseInterClusterReplicationEndpoint {<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.434"></a>
-<span class="sourceLineNo">435</span> static boolean failedOnce;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span> public InterClusterReplicationEndpointForTest() {<a name="line.437"></a>
-<span class="sourceLineNo">438</span> replicateCount.set(0);<a name="line.438"></a>
-<span class="sourceLineNo">439</span> }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span> @Override<a name="line.441"></a>
-<span class="sourceLineNo">442</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span> boolean success = super.replicate(replicateContext);<a name="line.443"></a>
-<span class="sourceLineNo">444</span> if (success) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span> replicateCount.addAndGet(replicateContext.entries.size());<a name="line.445"></a>
-<span class="sourceLineNo">446</span> }<a name="line.446"></a>
-<span class="sourceLineNo">447</span> return success;<a name="line.447"></a>
+<span class="sourceLineNo">165</span> doAssert(Bytes.toBytes("row42"));<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.167"></a>
+<span class="sourceLineNo">168</span> }<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span> @Test<a name="line.170"></a>
+<span class="sourceLineNo">171</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.171"></a>
+<span class="sourceLineNo">172</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.172"></a>
+<span class="sourceLineNo">173</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.173"></a>
+<span class="sourceLineNo">174</span> int peerCount = admin.getPeersCount();<a name="line.174"></a>
+<span class="sourceLineNo">175</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.175"></a>
+<span class="sourceLineNo">176</span> admin.addPeer(id,<a name="line.176"></a>
+<span class="sourceLineNo">177</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.177"></a>
+<span class="sourceLineNo">178</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.178"></a>
+<span class="sourceLineNo">179</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.179"></a>
+<span class="sourceLineNo">180</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.180"></a>
+<span class="sourceLineNo">181</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.181"></a>
+<span class="sourceLineNo">182</span> if (admin.getPeersCount() <= peerCount) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.183"></a>
+<span class="sourceLineNo">184</span> Threads.sleep(100);<a name="line.184"></a>
+<span class="sourceLineNo">185</span> }<a name="line.185"></a>
+<span class="sourceLineNo">186</span> // now replicate some data<a name="line.186"></a>
+<span class="sourceLineNo">187</span> doPut(row);<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.189"></a>
+<span class="sourceLineNo">190</span> @Override<a name="line.190"></a>
+<span class="sourceLineNo">191</span> public boolean evaluate() throws Exception {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.192"></a>
+<span class="sourceLineNo">193</span> // only send over one edit.<a name="line.193"></a>
+<span class="sourceLineNo">194</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.194"></a>
+<span class="sourceLineNo">195</span> LOG.info("count=" + count);<a name="line.195"></a>
+<span class="sourceLineNo">196</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.196"></a>
+<span class="sourceLineNo">197</span> }<a name="line.197"></a>
+<span class="sourceLineNo">198</span> });<a name="line.198"></a>
+<span class="sourceLineNo">199</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.200"></a>
+<span class="sourceLineNo">201</span> }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.203"></a>
+<span class="sourceLineNo">204</span> }<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span> @Test<a name="line.206"></a>
+<span class="sourceLineNo">207</span> public void testInterClusterReplication() throws Exception {<a name="line.207"></a>
+<span class="sourceLineNo">208</span> final String id = "testInterClusterReplication";<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.210"></a>
+<span class="sourceLineNo">211</span> int totEdits = 0;<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> // Make sure edits are spread across regions because we do region based batching<a name="line.213"></a>
+<span class="sourceLineNo">214</span> // before shipping edits.<a name="line.214"></a>
+<span class="sourceLineNo">215</span> for(HRegion region: regions) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span> RegionInfo hri = region.getRegionInfo();<a name="line.216"></a>
+<span class="sourceLineNo">217</span> byte[] row = hri.getStartKey();<a name="line.217"></a>
+<span class="sourceLineNo">218</span> for (int i = 0; i < 100; i++) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span> if (row.length > 0) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span> Put put = new Put(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span> put.addColumn(famName, row, row);<a name="line.221"></a>
+<span class="sourceLineNo">222</span> region.put(put);<a name="line.222"></a>
+<span class="sourceLineNo">223</span> totEdits++;<a name="line.223"></a>
+<span class="sourceLineNo">224</span> }<a name="line.224"></a>
+<span class="sourceLineNo">225</span> }<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span> admin.addPeer(id,<a name="line.228"></a>
+<span class="sourceLineNo">229</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.229"></a>
+<span class="sourceLineNo">230</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.230"></a>
+<span class="sourceLineNo">231</span> null);<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> final int numEdits = totEdits;<a name="line.233"></a>
+<span class="sourceLineNo">234</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> public boolean evaluate() throws Exception {<a name="line.236"></a>
+<span class="sourceLineNo">237</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.237"></a>
+<span class="sourceLineNo">238</span> }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span> @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span> public String explainFailure() throws Exception {<a name="line.241"></a>
+<span class="sourceLineNo">242</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.242"></a>
+<span class="sourceLineNo">243</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.243"></a>
+<span class="sourceLineNo">244</span> return failure;<a name="line.244"></a>
+<span class="sourceLineNo">245</span> }<a name="line.245"></a>
+<span class="sourceLineNo">246</span> });<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> admin.removePeer("testInterClusterReplication");<a name="line.248"></a>
+<span class="sourceLineNo">249</span> utility1.deleteTableData(tableName);<a name="line.249"></a>
+<span class="sourceLineNo">250</span> }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span> @Test<a name="line.252"></a>
+<span class="sourceLineNo">253</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.253"></a>
+<span class="sourceLineNo">254</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.254"></a>
+<span class="sourceLineNo">255</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.255"></a>
+<span class="sourceLineNo">256</span> //test that we can create mutliple WALFilters reflectively<a name="line.256"></a>
+<span class="sourceLineNo">257</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.257"></a>
+<span class="sourceLineNo">258</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.258"></a>
+<span class="sourceLineNo">259</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.259"></a>
+<span class="sourceLineNo">260</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> // now replicate some data.<a name="line.261"></a>
+<span class="sourceLineNo">262</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.263"></a>
+<span class="sourceLineNo">264</span> doPut(connection, row);<a name="line.264"></a>
+<span class="sourceLineNo">265</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.265"></a>
+<span class="sourceLineNo">266</span> }<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span> @Override<a name="line.269"></a>
+<span class="sourceLineNo">270</span> public boolean evaluate() throws Exception {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.271"></a>
+<span class="sourceLineNo">272</span> }<a name="line.272"></a>
+<span class="sourceLineNo">273</span> });<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.275"></a>
+<span class="sourceLineNo">276</span> //make sure our reflectively created filter is in the filter chain<a name="line.276"></a>
+<span class="sourceLineNo">277</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.277"></a>
+<span class="sourceLineNo">278</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.278"></a>
+<span class="sourceLineNo">279</span> }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span> @Test (expected=IOException.class)<a name="line.281"></a>
+<span class="sourceLineNo">282</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.283"></a>
+<span class="sourceLineNo">284</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span> //test that we can create mutliple WALFilters reflectively<a name="line.285"></a>
+<span class="sourceLineNo">286</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.286"></a>
+<span class="sourceLineNo">287</span> "IAmNotARealWalEntryFilter");<a name="line.287"></a>
+<span class="sourceLineNo">288</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.288"></a>
+<span class="sourceLineNo">289</span> }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span> @Test (expected=IOException.class)<a name="line.291"></a>
+<span class="sourceLineNo">292</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.292"></a>
+<span class="sourceLineNo">293</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.293"></a>
+<span class="sourceLineNo">294</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.294"></a>
+<span class="sourceLineNo">295</span> //test that we can create mutliple WALFilters reflectively<a name="line.295"></a>
+<span class="sourceLineNo">296</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.296"></a>
+<span class="sourceLineNo">297</span> "IAmNotARealWalEntryFilter");<a name="line.297"></a>
+<span class="sourceLineNo">298</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.298"></a>
+<span class="sourceLineNo">299</span> }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span> @Test<a name="line.302"></a>
+<span class="sourceLineNo">303</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.303"></a>
+<span class="sourceLineNo">304</span> /*<a name="line.304"></a>
+<span class="sourceLineNo">305</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.305"></a>
+<span class="sourceLineNo">306</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.306"></a>
+<span class="sourceLineNo">307</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.307"></a>
+<span class="sourceLineNo">308</span> allows for custom JMX metrics.<a name="line.308"></a>
+<span class="sourceLineNo">309</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.309"></a>
+<span class="sourceLineNo">310</span> the two layers of wrapping to the actual BaseSource.<a name="line.310"></a>
+<span class="sourceLineNo">311</span> */<a name="line.311"></a>
+<span class="sourceLineNo">312</span> String id = "id";<a name="line.312"></a>
+<span class="sourceLineNo">313</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.313"></a>
+<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
+<span class="sourceLineNo">315</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
+<span class="sourceLineNo">316</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.316"></a>
+<span class="sourceLineNo">317</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.319"></a>
+<span class="sourceLineNo">320</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.320"></a>
+<span class="sourceLineNo">321</span> Map<String, MetricsReplicationSourceSource> singleSourceSourceByTable = new HashMap<>();<a name="line.321"></a>
+<span class="sourceLineNo">322</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource,<a name="line.322"></a>
+<span class="sourceLineNo">323</span> singleSourceSourceByTable);<a name="line.323"></a>
+<span class="sourceLineNo">324</span> String gaugeName = "gauge";<a name="line.324"></a>
+<span class="sourceLineNo">325</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.325"></a>
+<span class="sourceLineNo">326</span> String globalGaugeName = "source." + gaugeName;<a name="line.326"></a>
+<span class="sourceLineNo">327</span> long delta = 1;<a name="line.327"></a>
+<span class="sourceLineNo">328</span> String counterName = "counter";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> String singleCounterName = "source.id." + counterName;<a name="line.329"></a>
+<span class="sourceLineNo">330</span> String globalCounterName = "source." + counterName;<a name="line.330"></a>
+<span class="sourceLineNo">331</span> long count = 2;<a name="line.331"></a>
+<span class="sourceLineNo">332</span> source.decGauge(gaugeName, delta);<a name="line.332"></a>
+<span class="sourceLineNo">333</span> source.getMetricsContext();<a name="line.333"></a>
+<span class="sourceLineNo">334</span> source.getMetricsDescription();<a name="line.334"></a>
+<span class="sourceLineNo">335</span> source.getMetricsJmxContext();<a name="line.335"></a>
+<span class="sourceLineNo">336</span> source.getMetricsName();<a name="line.336"></a>
+<span class="sourceLineNo">337</span> source.incCounters(counterName, count);<a name="line.337"></a>
+<span class="sourceLineNo">338</span> source.incGauge(gaugeName, delta);<a name="line.338"></a>
+<span class="sourceLineNo">339</span> source.init();<a name="line.339"></a>
+<span class="sourceLineNo">340</span> source.removeMetric(gaugeName);<a name="line.340"></a>
+<span class="sourceLineNo">341</span> source.setGauge(gaugeName, delta);<a name="line.341"></a>
+<span class="sourceLineNo">342</span> source.updateHistogram(counterName, count);<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.344"></a>
+<span class="sourceLineNo">345</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.345"></a>
+<span class="sourceLineNo">346</span> verify(globalRms).getMetricsContext();<a name="line.346"></a>
+<span class="sourceLineNo">347</span> verify(globalRms).getMetricsJmxContext();<a name="line.347"></a>
+<span class="sourceLineNo">348</span> verify(globalRms).getMetricsName();<a name="line.348"></a>
+<span class="sourceLineNo">349</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.349"></a>
+<span class="sourceLineNo">350</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.350"></a>
+<span class="sourceLineNo">351</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.351"></a>
+<span class="sourceLineNo">352</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.352"></a>
+<span class="sourceLineNo">353</span> verify(globalRms).init();<a name="line.353"></a>
+<span class="sourceLineNo">354</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.354"></a>
+<span class="sourceLineNo">355</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.355"></a>
+<span class="sourceLineNo">356</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.356"></a>
+<span class="sourceLineNo">357</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.357"></a>
+<span class="sourceLineNo">358</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.358"></a>
+<span class="sourceLineNo">359</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span> //check singleSourceSourceByTable metrics.<a name="line.361"></a>
+<span class="sourceLineNo">362</span> // singleSourceSourceByTable map entry will be created only<a name="line.362"></a>
+<span class="sourceLineNo">363</span> // after calling #setAgeOfLastShippedOpByTable<a name="line.363"></a>
+<span class="sourceLineNo">364</span> boolean containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.364"></a>
+<span class="sourceLineNo">365</span> .containsKey("RandomNewTable");<a name="line.365"></a>
+<span class="sourceLineNo">366</span> Assert.assertEquals(false, containsRandomNewTable);<a name="line.366"></a>
+<span class="sourceLineNo">367</span> source.setAgeOfLastShippedOpByTable(123L, "RandomNewTable");<a name="line.367"></a>
+<span class="sourceLineNo">368</span> containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.368"></a>
+<span class="sourceLineNo">369</span> .containsKey("RandomNewTable");<a name="line.369"></a>
+<span class="sourceLineNo">370</span> Assert.assertEquals(true, containsRandomNewTable);<a name="line.370"></a>
+<span class="sourceLineNo">371</span> MetricsReplicationSourceSource msr = source.getSingleSourceSourceByTable()<a name="line.371"></a>
+<span class="sourceLineNo">372</span> .get("RandomNewTable");<a name="line.372"></a>
+<span class="sourceLineNo">373</span> // cannot put more concreate value here to verify because the age is arbitrary.<a name="line.373"></a>
+<span class="sourceLineNo">374</span> // as long as it's greater than 0, we see it as correct answer.<a name="line.374"></a>
+<span class="sourceLineNo">375</span> Assert.assertTrue(msr.getLastShippedAge() > 0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span> }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span> private void doPut(byte[] row) throws IOException {<a name="line.378"></a>
+<span class="sourceLineNo">379</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span> doPut(connection, row);<a name="line.380"></a>
+<span class="sourceLineNo">381</span> }<a name="line.381"></a>
+<span class="sourceLineNo">382</span> }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.384"></a>
+<span class="sourceLineNo">385</span> try (Table t = connection.getTable(tableName)) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span> Put put = new Put(row);<a name="line.386"></a>
+<span class="sourceLineNo">387</span> put.addColumn(famName, row, row);<a name="line.387"></a>
+<span class="sourceLineNo">388</span> t.put(put);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<a name="line.389"></a>
+<span class="sourceLineNo">390</span> }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span> private static void doAssert(byte[] row) throws Exception {<a name="line.392"></a>
+<span class="sourceLineNo">393</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span> return; // first call<a name="line.394"></a>
+<span class="sourceLineNo">395</span> }<a name="line.395"></a>
+<span class="sourceLineNo">396</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.396"></a>
+<span class="sourceLineNo">397</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.397"></a>
+<span class="sourceLineNo">398</span> Assert.assertEquals(1, cells.size());<a name="line.398"></a>
+<span class="sourceLineNo">399</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.399"></a>
+<span class="sourceLineNo">400</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.400"></a>
+<span class="sourceLineNo">401</span> }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.403"></a>
+<span class="sourceLineNo">404</span> static UUID uuid = UUID.randomUUID();<a name="line.404"></a>
+<span class="sourceLineNo">405</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.405"></a>
+<span class="sourceLineNo">406</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.406"></a>
+<span class="sourceLineNo">407</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.407"></a>
+<span class="sourceLineNo">408</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.408"></a>
+<span class="sourceLineNo">409</span> static volatile List<Entry> lastEntries = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span> public ReplicationEndpointForTest() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span> replicateCount.set(0);<a name="line.412"></a>
+<span class="sourceLineNo">413</span> contructedCount.incrementAndGet();<a name="line.413"></a>
+<span class="sourceLineNo">414</span> }<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span> @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span> public UUID getPeerUUID() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span> return uuid;<a name="line.418"></a>
+<span class="sourceLineNo">419</span> }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span> @Override<a name="line.421"></a>
+<span class="sourceLineNo">422</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span> replicateCount.incrementAndGet();<a name="line.423"></a>
+<span class="sourceLineNo">424</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.424"></a>
+<span class="sourceLineNo">425</span> return true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span> }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span> @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span> public void start() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span> startAsync();<a name="line.430"></a>
+<span class="sourceLineNo">431</span> }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span> @Override<a name="line.433"></a>
+<span class="sourceLineNo">434</span> public void stop() {<a name="line.434"></a>
+<span class="sourceLineNo">435</span> stopAsync();<a name="line.435"></a>
+<span class="sourceLineNo">436</span> }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span> @Override<a name="line.438"></a>
+<span class="sourceLineNo">439</span> protected void doStart() {<a name="line.439"></a>
+<span class="sourceLineNo">440</span> startedCount.incrementAndGet();<a name="line.440"></a>
+<span class="sourceLineNo">441</span> notifyStarted();<a name="line.441"></a>
+<span class="sourceLineNo">442</span> }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span> @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span> protected void doStop() {<a name="line.445"></a>
+<span class="sourceLineNo">446</span> stoppedCount.incrementAndGet();<a name="line.446"></a>
+<span class="sourceLineNo">447</span> notifyStopped();<a name="line.447"></a>
<span class="sourceLineNo">448</span> }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span> @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span> protected Callable<Integer> createReplicator(List<Entry> entries, int ordinal) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span> // Fail only once, we don't want to slow down the test.<a name="line.452"></a>
-<span class="sourceLineNo">453</span> if (failedOnce) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span> return () -> ordinal;<a name="line.454"></a>
-<span class="sourceLineNo">455</span> } else {<a name="line.455"></a>
-<span class="sourceLineNo">456</span> failedOnce = true;<a name="line.456"></a>
-<span class="sourceLineNo">457</span> return () -> {<a name="line.457"></a>
-<span class="sourceLineNo">458</span> throw new IOException("Sample Exception: Failed to replicate.");<a name="line.458"></a>
-<span class="sourceLineNo">459</span> };<a name="line.459"></a>
-<span class="sourceLineNo">460</span> }<a name="line.460"></a>
-<span class="sourceLineNo">461</span> }<a name="line.461"></a>
-<span class="sourceLineNo">462</span> }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span> public static class ReplicationEndpointReturningFalse extends ReplicationEndpointForTest {<a name="line.464"></a>
-<span class="sourceLineNo">465</span> static int COUNT = 10;<a name="line.465"></a>
-<span class="sourceLineNo">466</span> static AtomicReference<Exception> ex = new AtomicReference<>(null);<a name="line.466"></a>
-<span class="sourceLineNo">467</span> static AtomicBoolean replicated = new AtomicBoolean(false);<a name="line.467"></a>
-<span class="sourceLineNo">468</span> @Override<a name="line.468"></a>
-<span class="sourceLineNo">469</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span> try {<a name="line.470"></a>
-<span class="sourceLineNo">471</span> // check row<a name="line.471"></a>
-<span class="sourceLineNo">472</span> doAssert(row);<a name="line.472"></a>
-<span class="sourceLineNo">473</span> } catch (Exception e) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span> ex.set(e);<a name="line.474"></a>
-<span class="sourceLineNo">475</span> }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span> super.replicate(replicateContext);<a name="line.477"></a>
-<span class="sourceLineNo">478</
<TRUNCATED>
[11/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html
index 4b63f5c..3a7a5fd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html
@@ -37,327 +37,350 @@
<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.metrics.BaseSource;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.30"></a>
<span class="sourceLineNo">031</span><a name="line.31"></a>
-<span class="sourceLineNo">032</span>/**<a name="line.32"></a>
-<span class="sourceLineNo">033</span> * This class is for maintaining the various replication statistics for a source and publishing them<a name="line.33"></a>
-<span class="sourceLineNo">034</span> * through the metrics interfaces.<a name="line.34"></a>
-<span class="sourceLineNo">035</span> */<a name="line.35"></a>
-<span class="sourceLineNo">036</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.REPLICATION)<a name="line.36"></a>
-<span class="sourceLineNo">037</span>public class MetricsSource implements BaseSource {<a name="line.37"></a>
-<span class="sourceLineNo">038</span><a name="line.38"></a>
-<span class="sourceLineNo">039</span> private static final Logger LOG = LoggerFactory.getLogger(MetricsSource.class);<a name="line.39"></a>
+<span class="sourceLineNo">032</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>/**<a name="line.34"></a>
+<span class="sourceLineNo">035</span> * This class is for maintaining the various replication statistics for a source and publishing them<a name="line.35"></a>
+<span class="sourceLineNo">036</span> * through the metrics interfaces.<a name="line.36"></a>
+<span class="sourceLineNo">037</span> */<a name="line.37"></a>
+<span class="sourceLineNo">038</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.REPLICATION)<a name="line.38"></a>
+<span class="sourceLineNo">039</span>public class MetricsSource implements BaseSource {<a name="line.39"></a>
<span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span> // tracks last shipped timestamp for each wal group<a name="line.41"></a>
-<span class="sourceLineNo">042</span> private Map<String, Long> lastTimestamps = new HashMap<>();<a name="line.42"></a>
-<span class="sourceLineNo">043</span> private long lastHFileRefsQueueSize = 0;<a name="line.43"></a>
-<span class="sourceLineNo">044</span> private String id;<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span> private final MetricsReplicationSourceSource singleSourceSource;<a name="line.46"></a>
-<span class="sourceLineNo">047</span> private final MetricsReplicationSourceSource globalSourceSource;<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span> /**<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * Constructor used to register the metrics<a name="line.51"></a>
-<span class="sourceLineNo">052</span> *<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * @param id Name of the source this class is monitoring<a name="line.53"></a>
-<span class="sourceLineNo">054</span> */<a name="line.54"></a>
-<span class="sourceLineNo">055</span> public MetricsSource(String id) {<a name="line.55"></a>
-<span class="sourceLineNo">056</span> this.id = id;<a name="line.56"></a>
-<span class="sourceLineNo">057</span> singleSourceSource =<a name="line.57"></a>
-<span class="sourceLineNo">058</span> CompatibilitySingletonFactory.getInstance(MetricsReplicationSourceFactory.class)<a name="line.58"></a>
-<span class="sourceLineNo">059</span> .getSource(id);<a name="line.59"></a>
-<span class="sourceLineNo">060</span> globalSourceSource = CompatibilitySingletonFactory.getInstance(MetricsReplicationSourceFactory.class).getGlobalSource();<a name="line.60"></a>
-<span class="sourceLineNo">061</span> }<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span> /**<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * Constructor for injecting custom (or test) MetricsReplicationSourceSources<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * @param id Name of the source this class is monitoring<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * @param singleSourceSource Class to monitor id-scoped metrics<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * @param globalSourceSource Class to monitor global-scoped metrics<a name="line.67"></a>
-<span class="sourceLineNo">068</span> */<a name="line.68"></a>
-<span class="sourceLineNo">069</span> public MetricsSource(String id, MetricsReplicationSourceSource singleSourceSource,<a name="line.69"></a>
-<span class="sourceLineNo">070</span> MetricsReplicationSourceSource globalSourceSource) {<a name="line.70"></a>
-<span class="sourceLineNo">071</span> this.id = id;<a name="line.71"></a>
-<span class="sourceLineNo">072</span> this.singleSourceSource = singleSourceSource;<a name="line.72"></a>
-<span class="sourceLineNo">073</span> this.globalSourceSource = globalSourceSource;<a name="line.73"></a>
-<span class="sourceLineNo">074</span> }<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span> /**<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * Set the age of the last edit that was shipped<a name="line.77"></a>
-<span class="sourceLineNo">078</span> * @param timestamp write time of the edit<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * @param walGroup which group we are setting<a name="line.79"></a>
-<span class="sourceLineNo">080</span> */<a name="line.80"></a>
-<span class="sourceLineNo">081</span> public void setAgeOfLastShippedOp(long timestamp, String walGroup) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span> long age = EnvironmentEdgeManager.currentTime() - timestamp;<a name="line.82"></a>
-<span class="sourceLineNo">083</span> singleSourceSource.setLastShippedAge(age);<a name="line.83"></a>
-<span class="sourceLineNo">084</span> globalSourceSource.setLastShippedAge(age);<a name="line.84"></a>
-<span class="sourceLineNo">085</span> this.lastTimestamps.put(walGroup, timestamp);<a name="line.85"></a>
-<span class="sourceLineNo">086</span> }<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span> /**<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * Convenience method to use the last given timestamp to refresh the age of the last edit. Used<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * when replication fails and need to keep that metric accurate.<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * @param walGroupId id of the group to update<a name="line.91"></a>
-<span class="sourceLineNo">092</span> */<a name="line.92"></a>
-<span class="sourceLineNo">093</span> public void refreshAgeOfLastShippedOp(String walGroupId) {<a name="line.93"></a>
-<span class="sourceLineNo">094</span> Long lastTimestamp = this.lastTimestamps.get(walGroupId);<a name="line.94"></a>
-<span class="sourceLineNo">095</span> if (lastTimestamp == null) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span> this.lastTimestamps.put(walGroupId, 0L);<a name="line.96"></a>
-<span class="sourceLineNo">097</span> lastTimestamp = 0L;<a name="line.97"></a>
-<span class="sourceLineNo">098</span> }<a name="line.98"></a>
-<span class="sourceLineNo">099</span> if (lastTimestamp > 0) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span> setAgeOfLastShippedOp(lastTimestamp, walGroupId);<a name="line.100"></a>
-<span class="sourceLineNo">101</span> }<a name="line.101"></a>
-<span class="sourceLineNo">102</span> }<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span> /**<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * Increment size of the log queue.<a name="line.105"></a>
-<span class="sourceLineNo">106</span> */<a name="line.106"></a>
-<span class="sourceLineNo">107</span> public void incrSizeOfLogQueue() {<a name="line.107"></a>
-<span class="sourceLineNo">108</span> singleSourceSource.incrSizeOfLogQueue(1);<a name="line.108"></a>
-<span class="sourceLineNo">109</span> globalSourceSource.incrSizeOfLogQueue(1);<a name="line.109"></a>
-<span class="sourceLineNo">110</span> }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span> public void decrSizeOfLogQueue() {<a name="line.112"></a>
-<span class="sourceLineNo">113</span> singleSourceSource.decrSizeOfLogQueue(1);<a name="line.113"></a>
-<span class="sourceLineNo">114</span> globalSourceSource.decrSizeOfLogQueue(1);<a name="line.114"></a>
-<span class="sourceLineNo">115</span> }<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span> /**<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * Add on the the number of log edits read<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * @param delta the number of log edits read.<a name="line.120"></a>
-<span class="sourceLineNo">121</span> */<a name="line.121"></a>
-<span class="sourceLineNo">122</span> private void incrLogEditsRead(long delta) {<a name="line.122"></a>
-<span class="sourceLineNo">123</span> singleSourceSource.incrLogReadInEdits(delta);<a name="line.123"></a>
-<span class="sourceLineNo">124</span> globalSourceSource.incrLogReadInEdits(delta);<a name="line.124"></a>
-<span class="sourceLineNo">125</span> }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span> /** Increment the number of log edits read by one. */<a name="line.127"></a>
-<span class="sourceLineNo">128</span> public void incrLogEditsRead() {<a name="line.128"></a>
-<span class="sourceLineNo">129</span> incrLogEditsRead(1);<a name="line.129"></a>
-<span class="sourceLineNo">130</span> }<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span> /**<a name="line.132"></a>
-<span class="sourceLineNo">133</span> * Add on the number of log edits filtered<a name="line.133"></a>
-<span class="sourceLineNo">134</span> *<a name="line.134"></a>
-<span class="sourceLineNo">135</span> * @param delta the number filtered.<a name="line.135"></a>
-<span class="sourceLineNo">136</span> */<a name="line.136"></a>
-<span class="sourceLineNo">137</span> public void incrLogEditsFiltered(long delta) {<a name="line.137"></a>
-<span class="sourceLineNo">138</span> singleSourceSource.incrLogEditsFiltered(delta);<a name="line.138"></a>
-<span class="sourceLineNo">139</span> globalSourceSource.incrLogEditsFiltered(delta);<a name="line.139"></a>
-<span class="sourceLineNo">140</span> }<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span> /** The number of log edits filtered out. */<a name="line.142"></a>
-<span class="sourceLineNo">143</span> public void incrLogEditsFiltered() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span> incrLogEditsFiltered(1);<a name="line.144"></a>
-<span class="sourceLineNo">145</span> }<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span> /**<a name="line.147"></a>
-<span class="sourceLineNo">148</span> * Convience method to apply changes to metrics do to shipping a batch of logs.<a name="line.148"></a>
-<span class="sourceLineNo">149</span> *<a name="line.149"></a>
-<span class="sourceLineNo">150</span> * @param batchSize the size of the batch that was shipped to sinks.<a name="line.150"></a>
-<span class="sourceLineNo">151</span> */<a name="line.151"></a>
-<span class="sourceLineNo">152</span> public void shipBatch(long batchSize, int sizeInBytes) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span> singleSourceSource.incrBatchesShipped(1);<a name="line.153"></a>
-<span class="sourceLineNo">154</span> globalSourceSource.incrBatchesShipped(1);<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span> singleSourceSource.incrOpsShipped(batchSize);<a name="line.156"></a>
-<span class="sourceLineNo">157</span> globalSourceSource.incrOpsShipped(batchSize);<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span> singleSourceSource.incrShippedBytes(sizeInBytes);<a name="line.159"></a>
-<span class="sourceLineNo">160</span> globalSourceSource.incrShippedBytes(sizeInBytes);<a name="line.160"></a>
-<span class="sourceLineNo">161</span> }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span> /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span> * Convience method to apply changes to metrics do to shipping a batch of logs.<a name="line.164"></a>
-<span class="sourceLineNo">165</span> *<a name="line.165"></a>
-<span class="sourceLineNo">166</span> * @param batchSize the size of the batch that was shipped to sinks.<a name="line.166"></a>
-<span class="sourceLineNo">167</span> * @param hfiles total number of hfiles shipped to sinks.<a name="line.167"></a>
-<span class="sourceLineNo">168</span> */<a name="line.168"></a>
-<span class="sourceLineNo">169</span> public void shipBatch(long batchSize, int sizeInBytes, long hfiles) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span> shipBatch(batchSize, sizeInBytes);<a name="line.170"></a>
-<span class="sourceLineNo">171</span> singleSourceSource.incrHFilesShipped(hfiles);<a name="line.171"></a>
-<span class="sourceLineNo">172</span> globalSourceSource.incrHFilesShipped(hfiles);<a name="line.172"></a>
-<span class="sourceLineNo">173</span> }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span> /** increase the byte number read by source from log file */<a name="line.175"></a>
-<span class="sourceLineNo">176</span> public void incrLogReadInBytes(long readInBytes) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span> singleSourceSource.incrLogReadInBytes(readInBytes);<a name="line.177"></a>
-<span class="sourceLineNo">178</span> globalSourceSource.incrLogReadInBytes(readInBytes);<a name="line.178"></a>
+<span class="sourceLineNo">041</span> private static final Logger LOG = LoggerFactory.getLogger(MetricsSource.class);<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span> // tracks last shipped timestamp for each wal group<a name="line.43"></a>
+<span class="sourceLineNo">044</span> private Map<String, Long> lastTimestamps = new HashMap<>();<a name="line.44"></a>
+<span class="sourceLineNo">045</span> private long lastHFileRefsQueueSize = 0;<a name="line.45"></a>
+<span class="sourceLineNo">046</span> private String id;<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span> private final MetricsReplicationSourceSource singleSourceSource;<a name="line.48"></a>
+<span class="sourceLineNo">049</span> private final MetricsReplicationSourceSource globalSourceSource;<a name="line.49"></a>
+<span class="sourceLineNo">050</span> private Map<String, MetricsReplicationSourceSource> singleSourceSourceByTable;<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span> /**<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * Constructor used to register the metrics<a name="line.53"></a>
+<span class="sourceLineNo">054</span> *<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * @param id Name of the source this class is monitoring<a name="line.55"></a>
+<span class="sourceLineNo">056</span> */<a name="line.56"></a>
+<span class="sourceLineNo">057</span> public MetricsSource(String id) {<a name="line.57"></a>
+<span class="sourceLineNo">058</span> this.id = id;<a name="line.58"></a>
+<span class="sourceLineNo">059</span> singleSourceSource =<a name="line.59"></a>
+<span class="sourceLineNo">060</span> CompatibilitySingletonFactory.getInstance(MetricsReplicationSourceFactory.class)<a name="line.60"></a>
+<span class="sourceLineNo">061</span> .getSource(id);<a name="line.61"></a>
+<span class="sourceLineNo">062</span> globalSourceSource = CompatibilitySingletonFactory.getInstance(MetricsReplicationSourceFactory.class).getGlobalSource();<a name="line.62"></a>
+<span class="sourceLineNo">063</span> singleSourceSourceByTable = new HashMap<>();<a name="line.63"></a>
+<span class="sourceLineNo">064</span> }<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span> /**<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * Constructor for injecting custom (or test) MetricsReplicationSourceSources<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * @param id Name of the source this class is monitoring<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * @param singleSourceSource Class to monitor id-scoped metrics<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * @param globalSourceSource Class to monitor global-scoped metrics<a name="line.70"></a>
+<span class="sourceLineNo">071</span> */<a name="line.71"></a>
+<span class="sourceLineNo">072</span> public MetricsSource(String id, MetricsReplicationSourceSource singleSourceSource,<a name="line.72"></a>
+<span class="sourceLineNo">073</span> MetricsReplicationSourceSource globalSourceSource,<a name="line.73"></a>
+<span class="sourceLineNo">074</span> Map<String, MetricsReplicationSourceSource> singleSourceSourceByTable) {<a name="line.74"></a>
+<span class="sourceLineNo">075</span> this.id = id;<a name="line.75"></a>
+<span class="sourceLineNo">076</span> this.singleSourceSource = singleSourceSource;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> this.globalSourceSource = globalSourceSource;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> this.singleSourceSourceByTable = singleSourceSourceByTable;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> }<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span> /**<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * Set the age of the last edit that was shipped<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * @param timestamp write time of the edit<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * @param walGroup which group we are setting<a name="line.84"></a>
+<span class="sourceLineNo">085</span> */<a name="line.85"></a>
+<span class="sourceLineNo">086</span> public void setAgeOfLastShippedOp(long timestamp, String walGroup) {<a name="line.86"></a>
+<span class="sourceLineNo">087</span> long age = EnvironmentEdgeManager.currentTime() - timestamp;<a name="line.87"></a>
+<span class="sourceLineNo">088</span> singleSourceSource.setLastShippedAge(age);<a name="line.88"></a>
+<span class="sourceLineNo">089</span> globalSourceSource.setLastShippedAge(age);<a name="line.89"></a>
+<span class="sourceLineNo">090</span> this.lastTimestamps.put(walGroup, timestamp);<a name="line.90"></a>
+<span class="sourceLineNo">091</span> }<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span> /**<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * Set the age of the last edit that was shipped group by table<a name="line.94"></a>
+<span class="sourceLineNo">095</span> * @param timestamp write time of the edit<a name="line.95"></a>
+<span class="sourceLineNo">096</span> * @param tableName String as group and tableName<a name="line.96"></a>
+<span class="sourceLineNo">097</span> */<a name="line.97"></a>
+<span class="sourceLineNo">098</span> public void setAgeOfLastShippedOpByTable(long timestamp, String tableName) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span> long age = EnvironmentEdgeManager.currentTime() - timestamp;<a name="line.99"></a>
+<span class="sourceLineNo">100</span> this.getSingleSourceSourceByTable().computeIfAbsent(<a name="line.100"></a>
+<span class="sourceLineNo">101</span> tableName, t -> CompatibilitySingletonFactory<a name="line.101"></a>
+<span class="sourceLineNo">102</span> .getInstance(MetricsReplicationSourceFactory.class).getSource(t))<a name="line.102"></a>
+<span class="sourceLineNo">103</span> .setLastShippedAge(age);<a name="line.103"></a>
+<span class="sourceLineNo">104</span> }<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span> /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * Convenience method to use the last given timestamp to refresh the age of the last edit. Used<a name="line.107"></a>
+<span class="sourceLineNo">108</span> * when replication fails and need to keep that metric accurate.<a name="line.108"></a>
+<span class="sourceLineNo">109</span> * @param walGroupId id of the group to update<a name="line.109"></a>
+<span class="sourceLineNo">110</span> */<a name="line.110"></a>
+<span class="sourceLineNo">111</span> public void refreshAgeOfLastShippedOp(String walGroupId) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span> Long lastTimestamp = this.lastTimestamps.get(walGroupId);<a name="line.112"></a>
+<span class="sourceLineNo">113</span> if (lastTimestamp == null) {<a name="line.113"></a>
+<span class="sourceLineNo">114</span> this.lastTimestamps.put(walGroupId, 0L);<a name="line.114"></a>
+<span class="sourceLineNo">115</span> lastTimestamp = 0L;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> }<a name="line.116"></a>
+<span class="sourceLineNo">117</span> if (lastTimestamp > 0) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span> setAgeOfLastShippedOp(lastTimestamp, walGroupId);<a name="line.118"></a>
+<span class="sourceLineNo">119</span> }<a name="line.119"></a>
+<span class="sourceLineNo">120</span> }<a name="line.120"></a>
+<span class="sourceLineNo">121</span><a name="line.121"></a>
+<span class="sourceLineNo">122</span> /**<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * Increment size of the log queue.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> */<a name="line.124"></a>
+<span class="sourceLineNo">125</span> public void incrSizeOfLogQueue() {<a name="line.125"></a>
+<span class="sourceLineNo">126</span> singleSourceSource.incrSizeOfLogQueue(1);<a name="line.126"></a>
+<span class="sourceLineNo">127</span> globalSourceSource.incrSizeOfLogQueue(1);<a name="line.127"></a>
+<span class="sourceLineNo">128</span> }<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span> public void decrSizeOfLogQueue() {<a name="line.130"></a>
+<span class="sourceLineNo">131</span> singleSourceSource.decrSizeOfLogQueue(1);<a name="line.131"></a>
+<span class="sourceLineNo">132</span> globalSourceSource.decrSizeOfLogQueue(1);<a name="line.132"></a>
+<span class="sourceLineNo">133</span> }<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span> /**<a name="line.135"></a>
+<span class="sourceLineNo">136</span> * Add on the the number of log edits read<a name="line.136"></a>
+<span class="sourceLineNo">137</span> *<a name="line.137"></a>
+<span class="sourceLineNo">138</span> * @param delta the number of log edits read.<a name="line.138"></a>
+<span class="sourceLineNo">139</span> */<a name="line.139"></a>
+<span class="sourceLineNo">140</span> private void incrLogEditsRead(long delta) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span> singleSourceSource.incrLogReadInEdits(delta);<a name="line.141"></a>
+<span class="sourceLineNo">142</span> globalSourceSource.incrLogReadInEdits(delta);<a name="line.142"></a>
+<span class="sourceLineNo">143</span> }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span> /** Increment the number of log edits read by one. */<a name="line.145"></a>
+<span class="sourceLineNo">146</span> public void incrLogEditsRead() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span> incrLogEditsRead(1);<a name="line.147"></a>
+<span class="sourceLineNo">148</span> }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span> /**<a name="line.150"></a>
+<span class="sourceLineNo">151</span> * Add on the number of log edits filtered<a name="line.151"></a>
+<span class="sourceLineNo">152</span> *<a name="line.152"></a>
+<span class="sourceLineNo">153</span> * @param delta the number filtered.<a name="line.153"></a>
+<span class="sourceLineNo">154</span> */<a name="line.154"></a>
+<span class="sourceLineNo">155</span> public void incrLogEditsFiltered(long delta) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span> singleSourceSource.incrLogEditsFiltered(delta);<a name="line.156"></a>
+<span class="sourceLineNo">157</span> globalSourceSource.incrLogEditsFiltered(delta);<a name="line.157"></a>
+<span class="sourceLineNo">158</span> }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span> /** The number of log edits filtered out. */<a name="line.160"></a>
+<span class="sourceLineNo">161</span> public void incrLogEditsFiltered() {<a name="line.161"></a>
+<span class="sourceLineNo">162</span> incrLogEditsFiltered(1);<a name="line.162"></a>
+<span class="sourceLineNo">163</span> }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span> /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span> * Convience method to apply changes to metrics do to shipping a batch of logs.<a name="line.166"></a>
+<span class="sourceLineNo">167</span> *<a name="line.167"></a>
+<span class="sourceLineNo">168</span> * @param batchSize the size of the batch that was shipped to sinks.<a name="line.168"></a>
+<span class="sourceLineNo">169</span> */<a name="line.169"></a>
+<span class="sourceLineNo">170</span> public void shipBatch(long batchSize, int sizeInBytes) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span> singleSourceSource.incrBatchesShipped(1);<a name="line.171"></a>
+<span class="sourceLineNo">172</span> globalSourceSource.incrBatchesShipped(1);<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span> singleSourceSource.incrOpsShipped(batchSize);<a name="line.174"></a>
+<span class="sourceLineNo">175</span> globalSourceSource.incrOpsShipped(batchSize);<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span> singleSourceSource.incrShippedBytes(sizeInBytes);<a name="line.177"></a>
+<span class="sourceLineNo">178</span> globalSourceSource.incrShippedBytes(sizeInBytes);<a name="line.178"></a>
<span class="sourceLineNo">179</span> }<a name="line.179"></a>
<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span> /** Removes all metrics about this Source. */<a name="line.181"></a>
-<span class="sourceLineNo">182</span> public void clear() {<a name="line.182"></a>
-<span class="sourceLineNo">183</span> int lastQueueSize = singleSourceSource.getSizeOfLogQueue();<a name="line.183"></a>
-<span class="sourceLineNo">184</span> globalSourceSource.decrSizeOfLogQueue(lastQueueSize);<a name="line.184"></a>
-<span class="sourceLineNo">185</span> singleSourceSource.decrSizeOfLogQueue(lastQueueSize);<a name="line.185"></a>
-<span class="sourceLineNo">186</span> singleSourceSource.clear();<a name="line.186"></a>
-<span class="sourceLineNo">187</span> globalSourceSource.decrSizeOfHFileRefsQueue(lastHFileRefsQueueSize);<a name="line.187"></a>
-<span class="sourceLineNo">188</span> lastTimestamps.clear();<a name="line.188"></a>
-<span class="sourceLineNo">189</span> lastHFileRefsQueueSize = 0;<a name="line.189"></a>
-<span class="sourceLineNo">190</span> }<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span> /**<a name="line.192"></a>
-<span class="sourceLineNo">193</span> * Get AgeOfLastShippedOp<a name="line.193"></a>
-<span class="sourceLineNo">194</span> * @return AgeOfLastShippedOp<a name="line.194"></a>
-<span class="sourceLineNo">195</span> */<a name="line.195"></a>
-<span class="sourceLineNo">196</span> public Long getAgeOfLastShippedOp() {<a name="line.196"></a>
-<span class="sourceLineNo">197</span> return singleSourceSource.getLastShippedAge();<a name="line.197"></a>
-<span class="sourceLineNo">198</span> }<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span> /**<a name="line.200"></a>
-<span class="sourceLineNo">201</span> * Get the sizeOfLogQueue<a name="line.201"></a>
-<span class="sourceLineNo">202</span> * @return sizeOfLogQueue<a name="line.202"></a>
-<span class="sourceLineNo">203</span> */<a name="line.203"></a>
-<span class="sourceLineNo">204</span> public int getSizeOfLogQueue() {<a name="line.204"></a>
-<span class="sourceLineNo">205</span> return singleSourceSource.getSizeOfLogQueue();<a name="line.205"></a>
-<span class="sourceLineNo">206</span> }<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span> /**<a name="line.208"></a>
-<span class="sourceLineNo">209</span> * Get the timeStampsOfLastShippedOp, if there are multiple groups, return the latest one<a name="line.209"></a>
-<span class="sourceLineNo">210</span> * @return lastTimestampForAge<a name="line.210"></a>
-<span class="sourceLineNo">211</span> * @deprecated Since 2.0.0. Removed in 3.0.0.<a name="line.211"></a>
-<span class="sourceLineNo">212</span> * @see #getTimestampOfLastShippedOp()<a name="line.212"></a>
+<span class="sourceLineNo">181</span> /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span> * Convience method to apply changes to metrics do to shipping a batch of logs.<a name="line.182"></a>
+<span class="sourceLineNo">183</span> *<a name="line.183"></a>
+<span class="sourceLineNo">184</span> * @param batchSize the size of the batch that was shipped to sinks.<a name="line.184"></a>
+<span class="sourceLineNo">185</span> * @param hfiles total number of hfiles shipped to sinks.<a name="line.185"></a>
+<span class="sourceLineNo">186</span> */<a name="line.186"></a>
+<span class="sourceLineNo">187</span> public void shipBatch(long batchSize, int sizeInBytes, long hfiles) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span> shipBatch(batchSize, sizeInBytes);<a name="line.188"></a>
+<span class="sourceLineNo">189</span> singleSourceSource.incrHFilesShipped(hfiles);<a name="line.189"></a>
+<span class="sourceLineNo">190</span> globalSourceSource.incrHFilesShipped(hfiles);<a name="line.190"></a>
+<span class="sourceLineNo">191</span> }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span> /** increase the byte number read by source from log file */<a name="line.193"></a>
+<span class="sourceLineNo">194</span> public void incrLogReadInBytes(long readInBytes) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span> singleSourceSource.incrLogReadInBytes(readInBytes);<a name="line.195"></a>
+<span class="sourceLineNo">196</span> globalSourceSource.incrLogReadInBytes(readInBytes);<a name="line.196"></a>
+<span class="sourceLineNo">197</span> }<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span> /** Removes all metrics about this Source. */<a name="line.199"></a>
+<span class="sourceLineNo">200</span> public void clear() {<a name="line.200"></a>
+<span class="sourceLineNo">201</span> int lastQueueSize = singleSourceSource.getSizeOfLogQueue();<a name="line.201"></a>
+<span class="sourceLineNo">202</span> globalSourceSource.decrSizeOfLogQueue(lastQueueSize);<a name="line.202"></a>
+<span class="sourceLineNo">203</span> singleSourceSource.decrSizeOfLogQueue(lastQueueSize);<a name="line.203"></a>
+<span class="sourceLineNo">204</span> singleSourceSource.clear();<a name="line.204"></a>
+<span class="sourceLineNo">205</span> globalSourceSource.decrSizeOfHFileRefsQueue(lastHFileRefsQueueSize);<a name="line.205"></a>
+<span class="sourceLineNo">206</span> lastTimestamps.clear();<a name="line.206"></a>
+<span class="sourceLineNo">207</span> lastHFileRefsQueueSize = 0;<a name="line.207"></a>
+<span class="sourceLineNo">208</span> }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> /**<a name="line.210"></a>
+<span class="sourceLineNo">211</span> * Get AgeOfLastShippedOp<a name="line.211"></a>
+<span class="sourceLineNo">212</span> * @return AgeOfLastShippedOp<a name="line.212"></a>
<span class="sourceLineNo">213</span> */<a name="line.213"></a>
-<span class="sourceLineNo">214</span> @Deprecated<a name="line.214"></a>
-<span class="sourceLineNo">215</span> public long getTimeStampOfLastShippedOp() {<a name="line.215"></a>
-<span class="sourceLineNo">216</span> return getTimestampOfLastShippedOp();<a name="line.216"></a>
-<span class="sourceLineNo">217</span> }<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span> /**<a name="line.219"></a>
-<span class="sourceLineNo">220</span> * Get the timestampsOfLastShippedOp, if there are multiple groups, return the latest one<a name="line.220"></a>
-<span class="sourceLineNo">221</span> * @return lastTimestampForAge<a name="line.221"></a>
-<span class="sourceLineNo">222</span> */<a name="line.222"></a>
-<span class="sourceLineNo">223</span> public long getTimestampOfLastShippedOp() {<a name="line.223"></a>
-<span class="sourceLineNo">224</span> long lastTimestamp = 0L;<a name="line.224"></a>
-<span class="sourceLineNo">225</span> for (long ts : lastTimestamps.values()) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span> if (ts > lastTimestamp) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span> lastTimestamp = ts;<a name="line.227"></a>
-<span class="sourceLineNo">228</span> }<a name="line.228"></a>
-<span class="sourceLineNo">229</span> }<a name="line.229"></a>
-<span class="sourceLineNo">230</span> return lastTimestamp;<a name="line.230"></a>
-<span class="sourceLineNo">231</span> }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span> /**<a name="line.233"></a>
-<span class="sourceLineNo">234</span> * Get the slave peer ID<a name="line.234"></a>
-<span class="sourceLineNo">235</span> * @return peerID<a name="line.235"></a>
-<span class="sourceLineNo">236</span> */<a name="line.236"></a>
-<span class="sourceLineNo">237</span> public String getPeerID() {<a name="line.237"></a>
-<span class="sourceLineNo">238</span> return id;<a name="line.238"></a>
-<span class="sourceLineNo">239</span> }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span> public void incrSizeOfHFileRefsQueue(long size) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span> singleSourceSource.incrSizeOfHFileRefsQueue(size);<a name="line.242"></a>
-<span class="sourceLineNo">243</span> globalSourceSource.incrSizeOfHFileRefsQueue(size);<a name="line.243"></a>
-<span class="sourceLineNo">244</span> lastHFileRefsQueueSize = size;<a name="line.244"></a>
-<span class="sourceLineNo">245</span> }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span> public void decrSizeOfHFileRefsQueue(int size) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span> singleSourceSource.decrSizeOfHFileRefsQueue(size);<a name="line.248"></a>
-<span class="sourceLineNo">249</span> globalSourceSource.decrSizeOfHFileRefsQueue(size);<a name="line.249"></a>
-<span class="sourceLineNo">250</span> lastHFileRefsQueueSize -= size;<a name="line.250"></a>
-<span class="sourceLineNo">251</span> if (lastHFileRefsQueueSize < 0) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span> lastHFileRefsQueueSize = 0;<a name="line.252"></a>
-<span class="sourceLineNo">253</span> }<a name="line.253"></a>
-<span class="sourceLineNo">254</span> }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span> public void incrUnknownFileLengthForClosedWAL() {<a name="line.256"></a>
-<span class="sourceLineNo">257</span> singleSourceSource.incrUnknownFileLengthForClosedWAL();<a name="line.257"></a>
-<span class="sourceLineNo">258</span> globalSourceSource.incrUnknownFileLengthForClosedWAL();<a name="line.258"></a>
-<span class="sourceLineNo">259</span> }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span> public void incrUncleanlyClosedWALs() {<a name="line.261"></a>
-<span class="sourceLineNo">262</span> singleSourceSource.incrUncleanlyClosedWALs();<a name="line.262"></a>
-<span class="sourceLineNo">263</span> globalSourceSource.incrUncleanlyClosedWALs();<a name="line.263"></a>
-<span class="sourceLineNo">264</span> }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span> public void incrBytesSkippedInUncleanlyClosedWALs(final long bytes) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span> singleSourceSource.incrBytesSkippedInUncleanlyClosedWALs(bytes);<a name="line.267"></a>
-<span class="sourceLineNo">268</span> globalSourceSource.incrBytesSkippedInUncleanlyClosedWALs(bytes);<a name="line.268"></a>
-<span class="sourceLineNo">269</span> }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span> public void incrRestartedWALReading() {<a name="line.271"></a>
-<span class="sourceLineNo">272</span> singleSourceSource.incrRestartedWALReading();<a name="line.272"></a>
-<span class="sourceLineNo">273</span> globalSourceSource.incrRestartedWALReading();<a name="line.273"></a>
-<span class="sourceLineNo">274</span> }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span> public void incrRepeatedFileBytes(final long bytes) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span> singleSourceSource.incrRepeatedFileBytes(bytes);<a name="line.277"></a>
-<span class="sourceLineNo">278</span> globalSourceSource.incrRepeatedFileBytes(bytes);<a name="line.278"></a>
-<span class="sourceLineNo">279</span> }<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span> public void incrCompletedWAL() {<a name="line.281"></a>
-<span class="sourceLineNo">282</span> singleSourceSource.incrCompletedWAL();<a name="line.282"></a>
-<span class="sourceLineNo">283</span> globalSourceSource.incrCompletedWAL();<a name="line.283"></a>
-<span class="sourceLineNo">284</span> }<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span> public void incrCompletedRecoveryQueue() {<a name="line.286"></a>
-<span class="sourceLineNo">287</span> singleSourceSource.incrCompletedRecoveryQueue();<a name="line.287"></a>
-<span class="sourceLineNo">288</span> globalSourceSource.incrCompletedRecoveryQueue();<a name="line.288"></a>
-<span class="sourceLineNo">289</span> }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span> @Override<a name="line.291"></a>
-<span class="sourceLineNo">292</span> public void init() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span> singleSourceSource.init();<a name="line.293"></a>
-<span class="sourceLineNo">294</span> globalSourceSource.init();<a name="line.294"></a>
-<span class="sourceLineNo">295</span> }<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span> @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span> public void setGauge(String gaugeName, long value) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span> singleSourceSource.setGauge(gaugeName, value);<a name="line.299"></a>
-<span class="sourceLineNo">300</span> globalSourceSource.setGauge(gaugeName, value);<a name="line.300"></a>
-<span class="sourceLineNo">301</span> }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span> @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span> public void incGauge(String gaugeName, long delta) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span> singleSourceSource.incGauge(gaugeName, delta);<a name="line.305"></a>
-<span class="sourceLineNo">306</span> globalSourceSource.incGauge(gaugeName, delta);<a name="line.306"></a>
+<span class="sourceLineNo">214</span> public Long getAgeOfLastShippedOp() {<a name="line.214"></a>
+<span class="sourceLineNo">215</span> return singleSourceSource.getLastShippedAge();<a name="line.215"></a>
+<span class="sourceLineNo">216</span> }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span> /**<a name="line.218"></a>
+<span class="sourceLineNo">219</span> * Get the sizeOfLogQueue<a name="line.219"></a>
+<span class="sourceLineNo">220</span> * @return sizeOfLogQueue<a name="line.220"></a>
+<span class="sourceLineNo">221</span> */<a name="line.221"></a>
+<span class="sourceLineNo">222</span> public int getSizeOfLogQueue() {<a name="line.222"></a>
+<span class="sourceLineNo">223</span> return singleSourceSource.getSizeOfLogQueue();<a name="line.223"></a>
+<span class="sourceLineNo">224</span> }<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span> /**<a name="line.226"></a>
+<span class="sourceLineNo">227</span> * Get the timeStampsOfLastShippedOp, if there are multiple groups, return the latest one<a name="line.227"></a>
+<span class="sourceLineNo">228</span> * @return lastTimestampForAge<a name="line.228"></a>
+<span class="sourceLineNo">229</span> * @deprecated Since 2.0.0. Removed in 3.0.0.<a name="line.229"></a>
+<span class="sourceLineNo">230</span> * @see #getTimestampOfLastShippedOp()<a name="line.230"></a>
+<span class="sourceLineNo">231</span> */<a name="line.231"></a>
+<span class="sourceLineNo">232</span> @Deprecated<a name="line.232"></a>
+<span class="sourceLineNo">233</span> public long getTimeStampOfLastShippedOp() {<a name="line.233"></a>
+<span class="sourceLineNo">234</span> return getTimestampOfLastShippedOp();<a name="line.234"></a>
+<span class="sourceLineNo">235</span> }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span> /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span> * Get the timestampsOfLastShippedOp, if there are multiple groups, return the latest one<a name="line.238"></a>
+<span class="sourceLineNo">239</span> * @return lastTimestampForAge<a name="line.239"></a>
+<span class="sourceLineNo">240</span> */<a name="line.240"></a>
+<span class="sourceLineNo">241</span> public long getTimestampOfLastShippedOp() {<a name="line.241"></a>
+<span class="sourceLineNo">242</span> long lastTimestamp = 0L;<a name="line.242"></a>
+<span class="sourceLineNo">243</span> for (long ts : lastTimestamps.values()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span> if (ts > lastTimestamp) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span> lastTimestamp = ts;<a name="line.245"></a>
+<span class="sourceLineNo">246</span> }<a name="line.246"></a>
+<span class="sourceLineNo">247</span> }<a name="line.247"></a>
+<span class="sourceLineNo">248</span> return lastTimestamp;<a name="line.248"></a>
+<span class="sourceLineNo">249</span> }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span> /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span> * Get the slave peer ID<a name="line.252"></a>
+<span class="sourceLineNo">253</span> * @return peerID<a name="line.253"></a>
+<span class="sourceLineNo">254</span> */<a name="line.254"></a>
+<span class="sourceLineNo">255</span> public String getPeerID() {<a name="line.255"></a>
+<span class="sourceLineNo">256</span> return id;<a name="line.256"></a>
+<span class="sourceLineNo">257</span> }<a name="line.257"></a>
+<span class="sourceLineNo">258</span><a name="line.258"></a>
+<span class="sourceLineNo">259</span> public void incrSizeOfHFileRefsQueue(long size) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span> singleSourceSource.incrSizeOfHFileRefsQueue(size);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> globalSourceSource.incrSizeOfHFileRefsQueue(size);<a name="line.261"></a>
+<span class="sourceLineNo">262</span> lastHFileRefsQueueSize = size;<a name="line.262"></a>
+<span class="sourceLineNo">263</span> }<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span> public void decrSizeOfHFileRefsQueue(int size) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span> singleSourceSource.decrSizeOfHFileRefsQueue(size);<a name="line.266"></a>
+<span class="sourceLineNo">267</span> globalSourceSource.decrSizeOfHFileRefsQueue(size);<a name="line.267"></a>
+<span class="sourceLineNo">268</span> lastHFileRefsQueueSize -= size;<a name="line.268"></a>
+<span class="sourceLineNo">269</span> if (lastHFileRefsQueueSize < 0) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span> lastHFileRefsQueueSize = 0;<a name="line.270"></a>
+<span class="sourceLineNo">271</span> }<a name="line.271"></a>
+<span class="sourceLineNo">272</span> }<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span> public void incrUnknownFileLengthForClosedWAL() {<a name="line.274"></a>
+<span class="sourceLineNo">275</span> singleSourceSource.incrUnknownFileLengthForClosedWAL();<a name="line.275"></a>
+<span class="sourceLineNo">276</span> globalSourceSource.incrUnknownFileLengthForClosedWAL();<a name="line.276"></a>
+<span class="sourceLineNo">277</span> }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span> public void incrUncleanlyClosedWALs() {<a name="line.279"></a>
+<span class="sourceLineNo">280</span> singleSourceSource.incrUncleanlyClosedWALs();<a name="line.280"></a>
+<span class="sourceLineNo">281</span> globalSourceSource.incrUncleanlyClosedWALs();<a name="line.281"></a>
+<span class="sourceLineNo">282</span> }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span> public void incrBytesSkippedInUncleanlyClosedWALs(final long bytes) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span> singleSourceSource.incrBytesSkippedInUncleanlyClosedWALs(bytes);<a name="line.285"></a>
+<span class="sourceLineNo">286</span> globalSourceSource.incrBytesSkippedInUncleanlyClosedWALs(bytes);<a name="line.286"></a>
+<span class="sourceLineNo">287</span> }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span> public void incrRestartedWALReading() {<a name="line.289"></a>
+<span class="sourceLineNo">290</span> singleSourceSource.incrRestartedWALReading();<a name="line.290"></a>
+<span class="sourceLineNo">291</span> globalSourceSource.incrRestartedWALReading();<a name="line.291"></a>
+<span class="sourceLineNo">292</span> }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span> public void incrRepeatedFileBytes(final long bytes) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span> singleSourceSource.incrRepeatedFileBytes(bytes);<a name="line.295"></a>
+<span class="sourceLineNo">296</span> globalSourceSource.incrRepeatedFileBytes(bytes);<a name="line.296"></a>
+<span class="sourceLineNo">297</span> }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span> public void incrCompletedWAL() {<a name="line.299"></a>
+<span class="sourceLineNo">300</span> singleSourceSource.incrCompletedWAL();<a name="line.300"></a>
+<span class="sourceLineNo">301</span> globalSourceSource.incrCompletedWAL();<a name="line.301"></a>
+<span class="sourceLineNo">302</span> }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span> public void incrCompletedRecoveryQueue() {<a name="line.304"></a>
+<span class="sourceLineNo">305</span> singleSourceSource.incrCompletedRecoveryQueue();<a name="line.305"></a>
+<span class="sourceLineNo">306</span> globalSourceSource.incrCompletedRecoveryQueue();<a name="line.306"></a>
<span class="sourceLineNo">307</span> }<a name="line.307"></a>
<span class="sourceLineNo">308</span><a name="line.308"></a>
<span class="sourceLineNo">309</span> @Override<a name="line.309"></a>
-<span class="sourceLineNo">310</span> public void decGauge(String gaugeName, long delta) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span> singleSourceSource.decGauge(gaugeName, delta);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> globalSourceSource.decGauge(gaugeName, delta);<a name="line.312"></a>
+<span class="sourceLineNo">310</span> public void init() {<a name="line.310"></a>
+<span class="sourceLineNo">311</span> singleSourceSource.init();<a name="line.311"></a>
+<span class="sourceLineNo">312</span> globalSourceSource.init();<a name="line.312"></a>
<span class="sourceLineNo">313</span> }<a name="line.313"></a>
<span class="sourceLineNo">314</span><a name="line.314"></a>
<span class="sourceLineNo">315</span> @Override<a name="line.315"></a>
-<span class="sourceLineNo">316</span> public void removeMetric(String key) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span> singleSourceSource.removeMetric(key);<a name="line.317"></a>
-<span class="sourceLineNo">318</span> globalSourceSource.removeMetric(key);<a name="line.318"></a>
+<span class="sourceLineNo">316</span> public void setGauge(String gaugeName, long value) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span> singleSourceSource.setGauge(gaugeName, value);<a name="line.317"></a>
+<span class="sourceLineNo">318</span> globalSourceSource.setGauge(gaugeName, value);<a name="line.318"></a>
<span class="sourceLineNo">319</span> }<a name="line.319"></a>
<span class="sourceLineNo">320</span><a name="line.320"></a>
<span class="sourceLineNo">321</span> @Override<a name="line.321"></a>
-<span class="sourceLineNo">322</span> public void incCounters(String counterName, long delta) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span> singleSourceSource.incCounters(counterName, delta);<a name="line.323"></a>
-<span class="sourceLineNo">324</span> globalSourceSource.incCounters(counterName, delta);<a name="line.324"></a>
+<span class="sourceLineNo">322</span> public void incGauge(String gaugeName, long delta) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span> singleSourceSource.incGauge(gaugeName, delta);<a name="line.323"></a>
+<span class="sourceLineNo">324</span> globalSourceSource.incGauge(gaugeName, delta);<a name="line.324"></a>
<span class="sourceLineNo">325</span> }<a name="line.325"></a>
<span class="sourceLineNo">326</span><a name="line.326"></a>
<span class="sourceLineNo">327</span> @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span> public void updateHistogram(String name, long value) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span> singleSourceSource.updateHistogram(name, value);<a name="line.329"></a>
-<span class="sourceLineNo">330</span> globalSourceSource.updateHistogram(name, value);<a name="line.330"></a>
+<span class="sourceLineNo">328</span> public void decGauge(String gaugeName, long delta) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span> singleSourceSource.decGauge(gaugeName, delta);<a name="line.329"></a>
+<span class="sourceLineNo">330</span> globalSourceSource.decGauge(gaugeName, delta);<a name="line.330"></a>
<span class="sourceLineNo">331</span> }<a name="line.331"></a>
<span class="sourceLineNo">332</span><a name="line.332"></a>
<span class="sourceLineNo">333</span> @Override<a name="line.333"></a>
-<span class="sourceLineNo">334</span> public String getMetricsContext() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span> return globalSourceSource.getMetricsContext();<a name="line.335"></a>
-<span class="sourceLineNo">336</span> }<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span> @Override<a name="line.338"></a>
-<span class="sourceLineNo">339</span> public String getMetricsDescription() {<a name="line.339"></a>
-<span class="sourceLineNo">340</span> return globalSourceSource.getMetricsDescription();<a name="line.340"></a>
-<span class="sourceLineNo">341</span> }<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span> @Override<a name="line.343"></a>
-<span class="sourceLineNo">344</span> public String getMetricsJmxContext() {<a name="line.344"></a>
-<span class="sourceLineNo">345</span> return globalSourceSource.getMetricsJmxContext();<a name="line.345"></a>
-<span class="sourceLineNo">346</span> }<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span> @Override<a name="line.348"></a>
-<span class="sourceLineNo">349</span> public String getMetricsName() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span> return globalSourceSource.getMetricsName();<a name="line.350"></a>
-<span class="sourceLineNo">351</span> }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>}<a name="line.352"></a>
+<span class="sourceLineNo">334</span> public void removeMetric(String key) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span> singleSourceSource.removeMetric(key);<a name="line.335"></a>
+<span class="sourceLineNo">336</span> globalSourceSource.removeMetric(key);<a name="line.336"></a>
+<span class="sourceLineNo">337</span> }<a name="line.337"></a>
+<span class="sourceLineNo">338</span><a name="line.338"></a>
+<span class="sourceLineNo">339</span> @Override<a name="line.339"></a>
+<span class="sourceLineNo">340</span> public void incCounters(String counterName, long delta) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span> singleSourceSource.incCounters(counterName, delta);<a name="line.341"></a>
+<span class="sourceLineNo">342</span> globalSourceSource.incCounters(counterName, delta);<a name="line.342"></a>
+<span class="sourceLineNo">343</span> }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span> @Override<a name="line.345"></a>
+<span class="sourceLineNo">346</span> public void updateHistogram(String name, long value) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span> singleSourceSource.updateHistogram(name, value);<a name="line.347"></a>
+<span class="sourceLineNo">348</span> globalSourceSource.updateHistogram(name, value);<a name="line.348"></a>
+<span class="sourceLineNo">349</span> }<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span> @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span> public String getMetricsContext() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span> return globalSourceSource.getMetricsContext();<a name="line.353"></a>
+<span class="sourceLineNo">354</span> }<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span> @Override<a name="line.356"></a>
+<span class="sourceLineNo">357</span> public String getMetricsDescription() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span> return globalSourceSource.getMetricsDescription();<a name="line.358"></a>
+<span class="sourceLineNo">359</span> }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span> @Override<a name="line.361"></a>
+<span class="sourceLineNo">362</span> public String getMetricsJmxContext() {<a name="line.362"></a>
+<span class="sourceLineNo">363</span> return globalSourceSource.getMetricsJmxContext();<a name="line.363"></a>
+<span class="sourceLineNo">364</span> }<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span> @Override<a name="line.366"></a>
+<span class="sourceLineNo">367</span> public String getMetricsName() {<a name="line.367"></a>
+<span class="sourceLineNo">368</span> return globalSourceSource.getMetricsName();<a name="line.368"></a>
+<span class="sourceLineNo">369</span> }<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span> @VisibleForTesting<a name="line.371"></a>
+<span class="sourceLineNo">372</span> public Map<String, MetricsReplicationSourceSource> getSingleSourceSourceByTable() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span> return singleSourceSourceByTable;<a name="line.373"></a>
+<span class="sourceLineNo">374</span> }<a name="line.374"></a>
+<span class="sourceLineNo">375</span>}<a name="line.375"></a>
[15/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 242350b..a5de1cb 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -219,11 +219,11 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index 3d7a909..325e178 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -230,12 +230,12 @@
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index add27c6..29857ee 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -705,19 +705,19 @@
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
index 858ccf6..b377318 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -130,9 +130,9 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index 78e6261..b49dc4d 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -241,9 +241,9 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html
index 36435f1..08779bf 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html
@@ -18,7 +18,7 @@
catch(err) {
}
//-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":42,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":42,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
<hr>
<br>
<pre>@InterfaceAudience.LimitedPrivate(value="Replication")
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.37">MetricsSource</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.39">MetricsSource</a>
extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html" title="interface in org.apache.hadoop.hbase.metrics">BaseSource</a></pre>
<div class="block">This class is for maintaining the various replication statistics for a source and publishing them
@@ -161,6 +161,10 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#singleSourceSource">singleSourceSource</a></span></code> </td>
</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a>></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#singleSourceSourceByTable">singleSourceSourceByTable</a></span></code> </td>
+</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.metrics.BaseSource">
@@ -188,9 +192,10 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
</td>
</tr>
<tr class="rowColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#MetricsSource-java.lang.String-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-">MetricsSource</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> id,
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#MetricsSource-java.lang.String-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-java.util.Map-">MetricsSource</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> id,
<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> singleSourceSource,
- <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> globalSourceSource)</code>
+ <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> globalSourceSource,
+ <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a>> singleSourceSourceByTable)</code>
<div class="block">Constructor for injecting custom (or test) MetricsReplicationSourceSources</div>
</td>
</tr>
@@ -267,18 +272,22 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
</td>
</tr>
<tr id="i10" class="altColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a>></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#getSingleSourceSourceByTable--">getSingleSourceSourceByTable</a></span>()</code> </td>
+</tr>
+<tr id="i11" class="rowColor">
<td class="colFirst"><code>int</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#getSizeOfLogQueue--">getSizeOfLogQueue</a></span>()</code>
<div class="block">Get the sizeOfLogQueue</div>
</td>
</tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
<td class="colFirst"><code>long</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#getTimestampOfLastShippedOp--">getTimestampOfLastShippedOp</a></span>()</code>
<div class="block">Get the timestampsOfLastShippedOp, if there are multiple groups, return the latest one</div>
</td>
</tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
<td class="colFirst"><code>long</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#getTimeStampOfLastShippedOp--">getTimeStampOfLastShippedOp</a></span>()</code>
<div class="block"><span class="deprecatedLabel">Deprecated.</span>
@@ -286,128 +295,135 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
</div>
</td>
</tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incCounters-java.lang.String-long-">incCounters</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> counterName,
long delta)</code>
<div class="block">Add some amount to a counter.</div>
</td>
</tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incGauge-java.lang.String-long-">incGauge</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> gaugeName,
long delta)</code>
<div class="block">Add some amount to a gauge.</div>
</td>
</tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrBytesSkippedInUncleanlyClosedWALs-long-">incrBytesSkippedInUncleanlyClosedWALs</a></span>(long bytes)</code> </td>
</tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrCompletedRecoveryQueue--">incrCompletedRecoveryQueue</a></span>()</code> </td>
</tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrCompletedWAL--">incrCompletedWAL</a></span>()</code> </td>
</tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrLogEditsFiltered--">incrLogEditsFiltered</a></span>()</code>
<div class="block">The number of log edits filtered out.</div>
</td>
</tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrLogEditsFiltered-long-">incrLogEditsFiltered</a></span>(long delta)</code>
<div class="block">Add on the number of log edits filtered</div>
</td>
</tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrLogEditsRead--">incrLogEditsRead</a></span>()</code>
<div class="block">Increment the number of log edits read by one.</div>
</td>
</tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
<td class="colFirst"><code>private void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrLogEditsRead-long-">incrLogEditsRead</a></span>(long delta)</code>
<div class="block">Add on the the number of log edits read</div>
</td>
</tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrLogReadInBytes-long-">incrLogReadInBytes</a></span>(long readInBytes)</code>
<div class="block">increase the byte number read by source from log file</div>
</td>
</tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrRepeatedFileBytes-long-">incrRepeatedFileBytes</a></span>(long bytes)</code> </td>
</tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrRestartedWALReading--">incrRestartedWALReading</a></span>()</code> </td>
</tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrSizeOfHFileRefsQueue-long-">incrSizeOfHFileRefsQueue</a></span>(long size)</code> </td>
</tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrSizeOfLogQueue--">incrSizeOfLogQueue</a></span>()</code>
<div class="block">Increment size of the log queue.</div>
</td>
</tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrUncleanlyClosedWALs--">incrUncleanlyClosedWALs</a></span>()</code> </td>
</tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#incrUnknownFileLengthForClosedWAL--">incrUnknownFileLengthForClosedWAL</a></span>()</code> </td>
</tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#init--">init</a></span>()</code>
<div class="block">Clear out the metrics and re-prepare the source.</div>
</td>
</tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#refreshAgeOfLastShippedOp-java.lang.String-">refreshAgeOfLastShippedOp</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> walGroupId)</code>
<div class="block">Convenience method to use the last given timestamp to refresh the age of the last edit.</div>
</td>
</tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#removeMetric-java.lang.String-">removeMetric</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> key)</code>
<div class="block">Remove a metric and no longer announce it.</div>
</td>
</tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#setAgeOfLastShippedOp-long-java.lang.String-">setAgeOfLastShippedOp</a></span>(long timestamp,
<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> walGroup)</code>
<div class="block">Set the age of the last edit that was shipped</div>
</td>
</tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#setAgeOfLastShippedOpByTable-long-java.lang.String-">setAgeOfLastShippedOpByTable</a></span>(long timestamp,
+ <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> tableName)</code>
+<div class="block">Set the age of the last edit that was shipped group by table</div>
+</td>
+</tr>
+<tr id="i35" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#setGauge-java.lang.String-long-">setGauge</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> gaugeName,
long value)</code>
<div class="block">Set a gauge to a specific value.</div>
</td>
</tr>
-<tr id="i34" class="altColor">
+<tr id="i36" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#shipBatch-long-int-">shipBatch</a></span>(long batchSize,
int sizeInBytes)</code>
<div class="block">Convience method to apply changes to metrics do to shipping a batch of logs.</div>
</td>
</tr>
-<tr id="i35" class="rowColor">
+<tr id="i37" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#shipBatch-long-int-long-">shipBatch</a></span>(long batchSize,
int sizeInBytes,
@@ -415,7 +431,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<div class="block">Convience method to apply changes to metrics do to shipping a batch of logs.</div>
</td>
</tr>
-<tr id="i36" class="altColor">
+<tr id="i38" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#updateHistogram-java.lang.String-long-">updateHistogram</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> name,
long value)</code>
@@ -457,7 +473,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>LOG</h4>
-<pre>private static final org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.39">LOG</a></pre>
+<pre>private static final org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.41">LOG</a></pre>
</li>
</ul>
<a name="lastTimestamps">
@@ -466,7 +482,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>lastTimestamps</h4>
-<pre>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.42">lastTimestamps</a></pre>
+<pre>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.44">lastTimestamps</a></pre>
</li>
</ul>
<a name="lastHFileRefsQueueSize">
@@ -475,7 +491,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>lastHFileRefsQueueSize</h4>
-<pre>private long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.43">lastHFileRefsQueueSize</a></pre>
+<pre>private long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.45">lastHFileRefsQueueSize</a></pre>
</li>
</ul>
<a name="id">
@@ -484,7 +500,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>id</h4>
-<pre>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.44">id</a></pre>
+<pre>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.46">id</a></pre>
</li>
</ul>
<a name="singleSourceSource">
@@ -493,16 +509,25 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>singleSourceSource</h4>
-<pre>private final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.46">singleSourceSource</a></pre>
+<pre>private final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.48">singleSourceSource</a></pre>
</li>
</ul>
<a name="globalSourceSource">
<!-- -->
</a>
-<ul class="blockListLast">
+<ul class="blockList">
<li class="blockList">
<h4>globalSourceSource</h4>
-<pre>private final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.47">globalSourceSource</a></pre>
+<pre>private final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.49">globalSourceSource</a></pre>
+</li>
+</ul>
+<a name="singleSourceSourceByTable">
+<!-- -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>singleSourceSourceByTable</h4>
+<pre>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.50">singleSourceSourceByTable</a></pre>
</li>
</ul>
</li>
@@ -519,7 +544,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>MetricsSource</h4>
-<pre>public <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.55">MetricsSource</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> id)</pre>
+<pre>public <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.57">MetricsSource</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> id)</pre>
<div class="block">Constructor used to register the metrics</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
@@ -527,15 +552,16 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
</dl>
</li>
</ul>
-<a name="MetricsSource-java.lang.String-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-">
+<a name="MetricsSource-java.lang.String-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-java.util.Map-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>MetricsSource</h4>
-<pre>public <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.69">MetricsSource</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> id,
+<pre>public <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.72">MetricsSource</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> id,
<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> singleSourceSource,
- <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> globalSourceSource)</pre>
+ <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> globalSourceSource,
+ <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a>> singleSourceSourceByTable)</pre>
<div class="block">Constructor for injecting custom (or test) MetricsReplicationSourceSources</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
@@ -559,7 +585,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>setAgeOfLastShippedOp</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.81">setAgeOfLastShippedOp</a>(long timestamp,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.86">setAgeOfLastShippedOp</a>(long timestamp,
<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> walGroup)</pre>
<div class="block">Set the age of the last edit that was shipped</div>
<dl>
@@ -569,13 +595,29 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
</dl>
</li>
</ul>
+<a name="setAgeOfLastShippedOpByTable-long-java.lang.String-">
+<!-- -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setAgeOfLastShippedOpByTable</h4>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.98">setAgeOfLastShippedOpByTable</a>(long timestamp,
+ <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> tableName)</pre>
+<div class="block">Set the age of the last edit that was shipped group by table</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>timestamp</code> - write time of the edit</dd>
+<dd><code>tableName</code> - String as group and tableName</dd>
+</dl>
+</li>
+</ul>
<a name="refreshAgeOfLastShippedOp-java.lang.String-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>refreshAgeOfLastShippedOp</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.93">refreshAgeOfLastShippedOp</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> walGroupId)</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.111">refreshAgeOfLastShippedOp</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> walGroupId)</pre>
<div class="block">Convenience method to use the last given timestamp to refresh the age of the last edit. Used
when replication fails and need to keep that metric accurate.</div>
<dl>
@@ -590,7 +632,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>incrSizeOfLogQueue</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.107">incrSizeOfLogQueue</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.125">incrSizeOfLogQueue</a>()</pre>
<div class="block">Increment size of the log queue.</div>
</li>
</ul>
@@ -600,7 +642,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>decrSizeOfLogQueue</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.112">decrSizeOfLogQueue</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.130">decrSizeOfLogQueue</a>()</pre>
</li>
</ul>
<a name="incrLogEditsRead-long-">
@@ -609,7 +651,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>incrLogEditsRead</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.122">incrLogEditsRead</a>(long delta)</pre>
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.140">incrLogEditsRead</a>(long delta)</pre>
<div class="block">Add on the the number of log edits read</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
@@ -623,7 +665,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>incrLogEditsRead</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.128">incrLogEditsRead</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.146">incrLogEditsRead</a>()</pre>
<div class="block">Increment the number of log edits read by one.</div>
</li>
</ul>
@@ -633,7 +675,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>incrLogEditsFiltered</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.137">incrLogEditsFiltered</a>(long delta)</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.155">incrLogEditsFiltered</a>(long delta)</pre>
<div class="block">Add on the number of log edits filtered</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
@@ -647,7 +689,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>incrLogEditsFiltered</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.143">incrLogEditsFiltered</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.161">incrLogEditsFiltered</a>()</pre>
<div class="block">The number of log edits filtered out.</div>
</li>
</ul>
@@ -657,7 +699,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>shipBatch</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.152">shipBatch</a>(long batchSize,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.170">shipBatch</a>(long batchSize,
int sizeInBytes)</pre>
<div class="block">Convience method to apply changes to metrics do to shipping a batch of logs.</div>
<dl>
@@ -672,7 +714,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>shipBatch</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.169">shipBatch</a>(long batchSize,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.187">shipBatch</a>(long batchSize,
int sizeInBytes,
long hfiles)</pre>
<div class="block">Convience method to apply changes to metrics do to shipping a batch of logs.</div>
@@ -689,7 +731,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>incrLogReadInBytes</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.176">incrLogReadInBytes</a>(long readInBytes)</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.194">incrLogReadInBytes</a>(long readInBytes)</pre>
<div class="block">increase the byte number read by source from log file</div>
</li>
</ul>
@@ -699,7 +741,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>clear</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.182">clear</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.200">clear</a>()</pre>
<div class="block">Removes all metrics about this Source.</div>
</li>
</ul>
@@ -709,7 +751,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>getAgeOfLastShippedOp</h4>
-<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.196">getAgeOfLastShippedOp</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.214">getAgeOfLastShippedOp</a>()</pre>
<div class="block">Get AgeOfLastShippedOp</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
@@ -723,7 +765,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<ul class="blockList">
<li class="blockList">
<h4>getSizeOfLogQueue</h4>
-<pre>public int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.204">getSizeOfLogQueue</a>()</pre>
+<pre>public int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.222">getSizeOfLogQueue</a>()</pre>
<div class="block">Get the sizeOfLogQueue</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
@@ -738,7 +780,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource
<li class="blockList">
<h4>getTimeStampOfLastShippedOp</h4>
<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.215">getTimeStampOfLastShippedOp</a>()</pre>
+public long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.233">getTimeStampOfLastShippedOp</a>()</pre>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> <span class="deprecationComment">Since 2.0.0. Removed in 3.0.0.</span></div>
<div class="block">Get the timeStampsOfLastShippedOp, if there are multiple groups, return the latest one</div>
<dl>
@@ -755,7 +797,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>getTimestampOfLastShippedOp</h4>
-<pre>public long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.223">getTimestampOfLastShippedOp</a>()</pre>
+<pre>public long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.241">getTimestampOfLastShippedOp</a>()</pre>
<div class="block">Get the timestampsOfLastShippedOp, if there are multiple groups, return the latest one</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
@@ -769,7 +811,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>getPeerID</h4>
-<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.237">getPeerID</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.255">getPeerID</a>()</pre>
<div class="block">Get the slave peer ID</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
@@ -783,7 +825,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>incrSizeOfHFileRefsQueue</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.241">incrSizeOfHFileRefsQueue</a>(long size)</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.259">incrSizeOfHFileRefsQueue</a>(long size)</pre>
</li>
</ul>
<a name="decrSizeOfHFileRefsQueue-int-">
@@ -792,7 +834,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>decrSizeOfHFileRefsQueue</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.247">decrSizeOfHFileRefsQueue</a>(int size)</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.265">decrSizeOfHFileRefsQueue</a>(int size)</pre>
</li>
</ul>
<a name="incrUnknownFileLengthForClosedWAL--">
@@ -801,7 +843,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>incrUnknownFileLengthForClosedWAL</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.256">incrUnknownFileLengthForClosedWAL</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.274">incrUnknownFileLengthForClosedWAL</a>()</pre>
</li>
</ul>
<a name="incrUncleanlyClosedWALs--">
@@ -810,7 +852,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>incrUncleanlyClosedWALs</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.261">incrUncleanlyClosedWALs</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.279">incrUncleanlyClosedWALs</a>()</pre>
</li>
</ul>
<a name="incrBytesSkippedInUncleanlyClosedWALs-long-">
@@ -819,7 +861,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>incrBytesSkippedInUncleanlyClosedWALs</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.266">incrBytesSkippedInUncleanlyClosedWALs</a>(long bytes)</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.284">incrBytesSkippedInUncleanlyClosedWALs</a>(long bytes)</pre>
</li>
</ul>
<a name="incrRestartedWALReading--">
@@ -828,7 +870,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>incrRestartedWALReading</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.271">incrRestartedWALReading</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.289">incrRestartedWALReading</a>()</pre>
</li>
</ul>
<a name="incrRepeatedFileBytes-long-">
@@ -837,7 +879,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>incrRepeatedFileBytes</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.276">incrRepeatedFileBytes</a>(long bytes)</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.294">incrRepeatedFileBytes</a>(long bytes)</pre>
</li>
</ul>
<a name="incrCompletedWAL--">
@@ -846,7 +888,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>incrCompletedWAL</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.281">incrCompletedWAL</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.299">incrCompletedWAL</a>()</pre>
</li>
</ul>
<a name="incrCompletedRecoveryQueue--">
@@ -855,7 +897,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>incrCompletedRecoveryQueue</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.286">incrCompletedRecoveryQueue</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.304">incrCompletedRecoveryQueue</a>()</pre>
</li>
</ul>
<a name="init--">
@@ -864,7 +906,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>init</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.292">init</a>()</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.310">init</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html#init--">BaseSource</a></code></span></div>
<div class="block">Clear out the metrics and re-prepare the source.</div>
<dl>
@@ -879,7 +921,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>setGauge</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.298">setGauge</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> gaugeName,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.316">setGauge</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> gaugeName,
long value)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html#setGauge-java.lang.String-long-">BaseSource</a></code></span></div>
<div class="block">Set a gauge to a specific value.</div>
@@ -898,7 +940,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>incGauge</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.304">incGauge</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> gaugeName,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.322">incGauge</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> gaugeName,
long delta)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html#incGauge-java.lang.String-long-">BaseSource</a></code></span></div>
<div class="block">Add some amount to a gauge.</div>
@@ -917,7 +959,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>decGauge</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.310">decGauge</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> gaugeName,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.328">decGauge</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> gaugeName,
long delta)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html#decGauge-java.lang.String-long-">BaseSource</a></code></span></div>
<div class="block">Subtract some amount from a gauge.</div>
@@ -936,7 +978,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>removeMetric</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.316">removeMetric</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> key)</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.334">removeMetric</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> key)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html#removeMetric-java.lang.String-">BaseSource</a></code></span></div>
<div class="block">Remove a metric and no longer announce it.</div>
<dl>
@@ -953,7 +995,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>incCounters</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.322">incCounters</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> counterName,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.340">incCounters</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> counterName,
long delta)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html#incCounters-java.lang.String-long-">BaseSource</a></code></span></div>
<div class="block">Add some amount to a counter.</div>
@@ -972,7 +1014,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>updateHistogram</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.328">updateHistogram</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> name,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.346">updateHistogram</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> name,
long value)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html#updateHistogram-java.lang.String-long-">BaseSource</a></code></span></div>
<div class="block">Add some value to a histogram.</div>
@@ -991,7 +1033,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>getMetricsContext</h4>
-<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.334">getMetricsContext</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.352">getMetricsContext</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html#getMetricsContext--">BaseSource</a></code></span></div>
<div class="block">Get the metrics context. For hadoop metrics2 system this is usually an all lowercased string.
eg. regionserver, master, thriftserver</div>
@@ -1009,7 +1051,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>getMetricsDescription</h4>
-<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.339">getMetricsDescription</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.357">getMetricsDescription</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html#getMetricsDescription--">BaseSource</a></code></span></div>
<div class="block">Get the description of what this source exposes.</div>
<dl>
@@ -1024,7 +1066,7 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<ul class="blockList">
<li class="blockList">
<h4>getMetricsJmxContext</h4>
-<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.344">getMetricsJmxContext</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.362">getMetricsJmxContext</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html#getMetricsJmxContext--">BaseSource</a></code></span></div>
<div class="block">Get the name of the context in JMX that this source will be exposed through.
This is in ObjectName format. With the default context being Hadoop -> HBase</div>
@@ -1037,10 +1079,10 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
<a name="getMetricsName--">
<!-- -->
</a>
-<ul class="blockListLast">
+<ul class="blockList">
<li class="blockList">
<h4>getMetricsName</h4>
-<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.349">getMetricsName</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.367">getMetricsName</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <code><a href="../../../../../../org/apache/hadoop/hbase/metrics/BaseSource.html#getMetricsName--">BaseSource</a></code></span></div>
<div class="block">Get the name of the metrics that are being exported by this source.
Eg. IPC, GC, WAL</div>
@@ -1050,6 +1092,15 @@ public long <a href="../../../../../../src-html/org/apache/hadoop/hbas
</dl>
</li>
</ul>
+<a name="getSingleSourceSourceByTable--">
+<!-- -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>getSingleSourceSourceByTable</h4>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#line.372">getSingleSourceSourceByTable</a>()</pre>
+</li>
+</ul>
</li>
</ul>
</li>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html
index df182b1..cc41ea4 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
</dl>
<hr>
<br>
-<pre>public static enum <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.48">ReplicationSourceShipper.WorkerState</a>
+<pre>public static enum <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.49">ReplicationSourceShipper.WorkerState</a>
extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a><<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a>></pre>
</li>
</ul>
@@ -213,7 +213,7 @@ the order they are declared.</div>
<ul class="blockList">
<li class="blockList">
<h4>RUNNING</h4>
-<pre>public static final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html#line.49">RUNNING</a></pre>
+<pre>public static final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html#line.50">RUNNING</a></pre>
</li>
</ul>
<a name="STOPPED">
@@ -222,7 +222,7 @@ the order they are declared.</div>
<ul class="blockList">
<li class="blockList">
<h4>STOPPED</h4>
-<pre>public static final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html#line.50">STOPPED</a></pre>
+<pre>public static final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html#line.51">STOPPED</a></pre>
</li>
</ul>
<a name="FINISHED">
@@ -231,7 +231,7 @@ the order they are declared.</div>
<ul class="blockListLast">
<li class="blockList">
<h4>FINISHED</h4>
-<pre>public static final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html#line.51">FINISHED</a></pre>
+<pre>public static final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html#line.52">FINISHED</a></pre>
</li>
</ul>
</li>
@@ -248,7 +248,7 @@ the order they are declared.</div>
<ul class="blockList">
<li class="blockList">
<h4>values</h4>
-<pre>public static <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html#line.48">values</a>()</pre>
+<pre>public static <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html#line.49">values</a>()</pre>
<div class="block">Returns an array containing the constants of this enum type, in
the order they are declared. This method may be used to iterate
over the constants as follows:
@@ -268,7 +268,7 @@ for (ReplicationSourceShipper.WorkerState c : ReplicationSourceShipper.WorkerSta
<ul class="blockListLast">
<li class="blockList">
<h4>valueOf</h4>
-<pre>public static <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html#line.48">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> name)</pre>
+<pre>public static <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html#line.49">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> name)</pre>
<div class="block">Returns the enum constant of this type with the specified name.
The string must match <i>exactly</i> an identifier used to declare an
enum constant in this type. (Extraneous whitespace characters are
[09/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html
index db9d94c..11e7195 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html
@@ -32,299 +32,304 @@
<span class="sourceLineNo">024</span>import org.apache.hadoop.fs.Path;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.Cell;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.replication.ReplicationEndpoint;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.slf4j.Logger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.slf4j.LoggerFactory;<a name="line.34"></a>
-<span class="sourceLineNo">035</span><a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.BulkLoadDescriptor;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.StoreDescriptor;<a name="line.37"></a>
-<span class="sourceLineNo">038</span><a name="line.38"></a>
-<span class="sourceLineNo">039</span>/**<a name="line.39"></a>
-<span class="sourceLineNo">040</span> * This thread reads entries from a queue and ships them. Entries are placed onto the queue by<a name="line.40"></a>
-<span class="sourceLineNo">041</span> * ReplicationSourceWALReaderThread<a name="line.41"></a>
-<span class="sourceLineNo">042</span> */<a name="line.42"></a>
-<span class="sourceLineNo">043</span>@InterfaceAudience.Private<a name="line.43"></a>
-<span class="sourceLineNo">044</span>public class ReplicationSourceShipper extends Thread {<a name="line.44"></a>
-<span class="sourceLineNo">045</span> private static final Logger LOG = LoggerFactory.getLogger(ReplicationSourceShipper.class);<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span> // Hold the state of a replication worker thread<a name="line.47"></a>
-<span class="sourceLineNo">048</span> public enum WorkerState {<a name="line.48"></a>
-<span class="sourceLineNo">049</span> RUNNING,<a name="line.49"></a>
-<span class="sourceLineNo">050</span> STOPPED,<a name="line.50"></a>
-<span class="sourceLineNo">051</span> FINISHED, // The worker is done processing a recovered queue<a name="line.51"></a>
-<span class="sourceLineNo">052</span> }<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span> private final Configuration conf;<a name="line.54"></a>
-<span class="sourceLineNo">055</span> protected final String walGroupId;<a name="line.55"></a>
-<span class="sourceLineNo">056</span> protected final PriorityBlockingQueue<Path> queue;<a name="line.56"></a>
-<span class="sourceLineNo">057</span> private final ReplicationSourceInterface source;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span> // Last position in the log that we sent to ZooKeeper<a name="line.59"></a>
-<span class="sourceLineNo">060</span> // It will be accessed by the stats thread so make it volatile<a name="line.60"></a>
-<span class="sourceLineNo">061</span> private volatile long currentPosition = -1;<a name="line.61"></a>
-<span class="sourceLineNo">062</span> // Path of the current log<a name="line.62"></a>
-<span class="sourceLineNo">063</span> private Path currentPath;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> // Current state of the worker thread<a name="line.64"></a>
-<span class="sourceLineNo">065</span> private volatile WorkerState state;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> protected ReplicationSourceWALReader entryReader;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span> // How long should we sleep for each retry<a name="line.68"></a>
-<span class="sourceLineNo">069</span> protected final long sleepForRetries;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> // Maximum number of retries before taking bold actions<a name="line.70"></a>
-<span class="sourceLineNo">071</span> protected final int maxRetriesMultiplier;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span> public ReplicationSourceShipper(Configuration conf, String walGroupId,<a name="line.73"></a>
-<span class="sourceLineNo">074</span> PriorityBlockingQueue<Path> queue, ReplicationSourceInterface source) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span> this.conf = conf;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> this.walGroupId = walGroupId;<a name="line.76"></a>
-<span class="sourceLineNo">077</span> this.queue = queue;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> this.source = source;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> this.sleepForRetries =<a name="line.79"></a>
-<span class="sourceLineNo">080</span> this.conf.getLong("replication.source.sleepforretries", 1000); // 1 second<a name="line.80"></a>
-<span class="sourceLineNo">081</span> this.maxRetriesMultiplier =<a name="line.81"></a>
-<span class="sourceLineNo">082</span> this.conf.getInt("replication.source.maxretriesmultiplier", 300); // 5 minutes @ 1 sec per<a name="line.82"></a>
-<span class="sourceLineNo">083</span> }<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span> @Override<a name="line.85"></a>
-<span class="sourceLineNo">086</span> public final void run() {<a name="line.86"></a>
-<span class="sourceLineNo">087</span> setWorkerState(WorkerState.RUNNING);<a name="line.87"></a>
-<span class="sourceLineNo">088</span> // Loop until we close down<a name="line.88"></a>
-<span class="sourceLineNo">089</span> while (isActive()) {<a name="line.89"></a>
-<span class="sourceLineNo">090</span> // Sleep until replication is enabled again<a name="line.90"></a>
-<span class="sourceLineNo">091</span> if (!source.isPeerEnabled()) {<a name="line.91"></a>
-<span class="sourceLineNo">092</span> // The peer enabled check is in memory, not expensive, so do not need to increase the<a name="line.92"></a>
-<span class="sourceLineNo">093</span> // sleep interval as it may cause a long lag when we enable the peer.<a name="line.93"></a>
-<span class="sourceLineNo">094</span> sleepForRetries("Replication is disabled", 1);<a name="line.94"></a>
-<span class="sourceLineNo">095</span> continue;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> }<a name="line.96"></a>
-<span class="sourceLineNo">097</span> try {<a name="line.97"></a>
-<span class="sourceLineNo">098</span> WALEntryBatch entryBatch = entryReader.take();<a name="line.98"></a>
-<span class="sourceLineNo">099</span> // the NO_MORE_DATA instance has no path so do not all shipEdits<a name="line.99"></a>
-<span class="sourceLineNo">100</span> if (entryBatch == WALEntryBatch.NO_MORE_DATA) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span> noMoreData();<a name="line.101"></a>
-<span class="sourceLineNo">102</span> } else {<a name="line.102"></a>
-<span class="sourceLineNo">103</span> shipEdits(entryBatch);<a name="line.103"></a>
-<span class="sourceLineNo">104</span> }<a name="line.104"></a>
-<span class="sourceLineNo">105</span> } catch (InterruptedException e) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span> LOG.trace("Interrupted while waiting for next replication entry batch", e);<a name="line.106"></a>
-<span class="sourceLineNo">107</span> Thread.currentThread().interrupt();<a name="line.107"></a>
-<span class="sourceLineNo">108</span> }<a name="line.108"></a>
-<span class="sourceLineNo">109</span> }<a name="line.109"></a>
-<span class="sourceLineNo">110</span> // If the worker exits run loop without finishing its task, mark it as stopped.<a name="line.110"></a>
-<span class="sourceLineNo">111</span> if (!isFinished()) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span> setWorkerState(WorkerState.STOPPED);<a name="line.112"></a>
-<span class="sourceLineNo">113</span> } else {<a name="line.113"></a>
-<span class="sourceLineNo">114</span> postFinish();<a name="line.114"></a>
-<span class="sourceLineNo">115</span> }<a name="line.115"></a>
-<span class="sourceLineNo">116</span> }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span> // To be implemented by recovered shipper<a name="line.118"></a>
-<span class="sourceLineNo">119</span> protected void noMoreData() {<a name="line.119"></a>
-<span class="sourceLineNo">120</span> }<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span> // To be implemented by recovered shipper<a name="line.122"></a>
-<span class="sourceLineNo">123</span> protected void postFinish() {<a name="line.123"></a>
-<span class="sourceLineNo">124</span> }<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span> /**<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * get batchEntry size excludes bulk load file sizes.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * Uses ReplicationSourceWALReader's static method.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span> private int getBatchEntrySizeExcludeBulkLoad(WALEntryBatch entryBatch) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span> int totalSize = 0;<a name="line.131"></a>
-<span class="sourceLineNo">132</span> for(Entry entry : entryBatch.getWalEntries()) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span> totalSize += entryReader.getEntrySizeExcludeBulkLoad(entry);<a name="line.133"></a>
-<span class="sourceLineNo">134</span> }<a name="line.134"></a>
-<span class="sourceLineNo">135</span> return totalSize;<a name="line.135"></a>
-<span class="sourceLineNo">136</span> }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span> /**<a name="line.138"></a>
-<span class="sourceLineNo">139</span> * Do the shipping logic<a name="line.139"></a>
-<span class="sourceLineNo">140</span> */<a name="line.140"></a>
-<span class="sourceLineNo">141</span> private void shipEdits(WALEntryBatch entryBatch) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span> List<Entry> entries = entryBatch.getWalEntries();<a name="line.142"></a>
-<span class="sourceLineNo">143</span> int sleepMultiplier = 0;<a name="line.143"></a>
-<span class="sourceLineNo">144</span> if (entries.isEmpty()) {<a name="line.144"></a>
-<span class="sourceLineNo">145</span> if (updateLogPosition(entryBatch)) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span> // if there was nothing to ship and it's not an error<a name="line.146"></a>
-<span class="sourceLineNo">147</span> // set "ageOfLastShippedOp" to <now> to indicate that we're current<a name="line.147"></a>
-<span class="sourceLineNo">148</span> source.getSourceMetrics().setAgeOfLastShippedOp(EnvironmentEdgeManager.currentTime(),<a name="line.148"></a>
-<span class="sourceLineNo">149</span> walGroupId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span> }<a name="line.150"></a>
-<span class="sourceLineNo">151</span> return;<a name="line.151"></a>
-<span class="sourceLineNo">152</span> }<a name="line.152"></a>
-<span class="sourceLineNo">153</span> int currentSize = (int) entryBatch.getHeapSize();<a name="line.153"></a>
-<span class="sourceLineNo">154</span> int sizeExcludeBulkLoad = getBatchEntrySizeExcludeBulkLoad(entryBatch);<a name="line.154"></a>
-<span class="sourceLineNo">155</span> while (isActive()) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span> try {<a name="line.156"></a>
-<span class="sourceLineNo">157</span> try {<a name="line.157"></a>
-<span class="sourceLineNo">158</span> source.tryThrottle(currentSize);<a name="line.158"></a>
-<span class="sourceLineNo">159</span> } catch (InterruptedException e) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span> LOG.debug("Interrupted while sleeping for throttling control");<a name="line.160"></a>
-<span class="sourceLineNo">161</span> Thread.currentThread().interrupt();<a name="line.161"></a>
-<span class="sourceLineNo">162</span> // current thread might be interrupted to terminate<a name="line.162"></a>
-<span class="sourceLineNo">163</span> // directly go back to while() for confirm this<a name="line.163"></a>
-<span class="sourceLineNo">164</span> continue;<a name="line.164"></a>
-<span class="sourceLineNo">165</span> }<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span> // create replicateContext here, so the entries can be GC'd upon return from this call<a name="line.167"></a>
-<span class="sourceLineNo">168</span> // stack<a name="line.168"></a>
-<span class="sourceLineNo">169</span> ReplicationEndpoint.ReplicateContext replicateContext =<a name="line.169"></a>
-<span class="sourceLineNo">170</span> new ReplicationEndpoint.ReplicateContext();<a name="line.170"></a>
-<span class="sourceLineNo">171</span> replicateContext.setEntries(entries).setSize(currentSize);<a name="line.171"></a>
-<span class="sourceLineNo">172</span> replicateContext.setWalGroupId(walGroupId);<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span> long startTimeNs = System.nanoTime();<a name="line.174"></a>
-<span class="sourceLineNo">175</span> // send the edits to the endpoint. Will block until the edits are shipped and acknowledged<a name="line.175"></a>
-<span class="sourceLineNo">176</span> boolean replicated = source.getReplicationEndpoint().replicate(replicateContext);<a name="line.176"></a>
-<span class="sourceLineNo">177</span> long endTimeNs = System.nanoTime();<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span> if (!replicated) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span> continue;<a name="line.180"></a>
-<span class="sourceLineNo">181</span> } else {<a name="line.181"></a>
-<span class="sourceLineNo">182</span> sleepMultiplier = Math.max(sleepMultiplier - 1, 0);<a name="line.182"></a>
-<span class="sourceLineNo">183</span> }<a name="line.183"></a>
-<span class="sourceLineNo">184</span> // Clean up hfile references<a name="line.184"></a>
-<span class="sourceLineNo">185</span> for (Entry entry : entries) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span> cleanUpHFileRefs(entry.getEdit());<a name="line.186"></a>
-<span class="sourceLineNo">187</span> }<a name="line.187"></a>
-<span class="sourceLineNo">188</span> // Log and clean up WAL logs<a name="line.188"></a>
-<span class="sourceLineNo">189</span> updateLogPosition(entryBatch);<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span> //offsets totalBufferUsed by deducting shipped batchSize (excludes bulk load size)<a name="line.191"></a>
-<span class="sourceLineNo">192</span> //this sizeExcludeBulkLoad has to use same calculation that when calling<a name="line.192"></a>
-<span class="sourceLineNo">193</span> //acquireBufferQuota() in ReplicatinoSourceWALReader because they maintain<a name="line.193"></a>
-<span class="sourceLineNo">194</span> //same variable: totalBufferUsed<a name="line.194"></a>
-<span class="sourceLineNo">195</span> source.postShipEdits(entries, sizeExcludeBulkLoad);<a name="line.195"></a>
-<span class="sourceLineNo">196</span> // FIXME check relationship between wal group and overall<a name="line.196"></a>
-<span class="sourceLineNo">197</span> source.getSourceMetrics().shipBatch(entryBatch.getNbOperations(), currentSize,<a name="line.197"></a>
-<span class="sourceLineNo">198</span> entryBatch.getNbHFiles());<a name="line.198"></a>
-<span class="sourceLineNo">199</span> source.getSourceMetrics().setAgeOfLastShippedOp(<a name="line.199"></a>
-<span class="sourceLineNo">200</span> entries.get(entries.size() - 1).getKey().getWriteTime(), walGroupId);<a name="line.200"></a>
-<span class="sourceLineNo">201</span> if (LOG.isTraceEnabled()) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span> LOG.trace("Replicated " + entries.size() + " entries or " + entryBatch.getNbOperations()<a name="line.202"></a>
-<span class="sourceLineNo">203</span> + " operations in " + ((endTimeNs - startTimeNs) / 1000000) + " ms");<a name="line.203"></a>
-<span class="sourceLineNo">204</span> }<a name="line.204"></a>
-<span class="sourceLineNo">205</span> break;<a name="line.205"></a>
-<span class="sourceLineNo">206</span> } catch (Exception ex) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span> LOG.warn("{} threw unknown exception:",<a name="line.207"></a>
-<span class="sourceLineNo">208</span> source.getReplicationEndpoint().getClass().getName(), ex);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> if (sleepForRetries("ReplicationEndpoint threw exception", sleepMultiplier)) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span> sleepMultiplier++;<a name="line.210"></a>
-<span class="sourceLineNo">211</span> }<a name="line.211"></a>
-<span class="sourceLineNo">212</span> }<a name="line.212"></a>
-<span class="sourceLineNo">213</span> }<a name="line.213"></a>
-<span class="sourceLineNo">214</span> }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span> private void cleanUpHFileRefs(WALEdit edit) throws IOException {<a name="line.216"></a>
-<span class="sourceLineNo">217</span> String peerId = source.getPeerId();<a name="line.217"></a>
-<span class="sourceLineNo">218</span> if (peerId.contains("-")) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span> // peerClusterZnode will be in the form peerId + "-" + rsZNode.<a name="line.219"></a>
-<span class="sourceLineNo">220</span> // A peerId will not have "-" in its name, see HBASE-11394<a name="line.220"></a>
-<span class="sourceLineNo">221</span> peerId = peerId.split("-")[0];<a name="line.221"></a>
-<span class="sourceLineNo">222</span> }<a name="line.222"></a>
-<span class="sourceLineNo">223</span> List<Cell> cells = edit.getCells();<a name="line.223"></a>
-<span class="sourceLineNo">224</span> int totalCells = cells.size();<a name="line.224"></a>
-<span class="sourceLineNo">225</span> for (int i = 0; i < totalCells; i++) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span> Cell cell = cells.get(i);<a name="line.226"></a>
-<span class="sourceLineNo">227</span> if (CellUtil.matchingQualifier(cell, WALEdit.BULK_LOAD)) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span> BulkLoadDescriptor bld = WALEdit.getBulkLoadDescriptor(cell);<a name="line.228"></a>
-<span class="sourceLineNo">229</span> List<StoreDescriptor> stores = bld.getStoresList();<a name="line.229"></a>
-<span class="sourceLineNo">230</span> int totalStores = stores.size();<a name="line.230"></a>
-<span class="sourceLineNo">231</span> for (int j = 0; j < totalStores; j++) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span> List<String> storeFileList = stores.get(j).getStoreFileList();<a name="line.232"></a>
-<span class="sourceLineNo">233</span> source.getSourceManager().cleanUpHFileRefs(peerId, storeFileList);<a name="line.233"></a>
-<span class="sourceLineNo">234</span> source.getSourceMetrics().decrSizeOfHFileRefsQueue(storeFileList.size());<a name="line.234"></a>
-<span class="sourceLineNo">235</span> }<a name="line.235"></a>
-<span class="sourceLineNo">236</span> }<a name="line.236"></a>
-<span class="sourceLineNo">237</span> }<a name="line.237"></a>
-<span class="sourceLineNo">238</span> }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span> private boolean updateLogPosition(WALEntryBatch batch) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span> boolean updated = false;<a name="line.241"></a>
-<span class="sourceLineNo">242</span> // if end of file is true, then the logPositionAndCleanOldLogs method will remove the file<a name="line.242"></a>
-<span class="sourceLineNo">243</span> // record on zk, so let's call it. The last wal position maybe zero if end of file is true and<a name="line.243"></a>
-<span class="sourceLineNo">244</span> // there is no entry in the batch. It is OK because that the queue storage will ignore the zero<a name="line.244"></a>
-<span class="sourceLineNo">245</span> // position and the file will be removed soon in cleanOldLogs.<a name="line.245"></a>
-<span class="sourceLineNo">246</span> if (batch.isEndOfFile() || !batch.getLastWalPath().equals(currentPath) ||<a name="line.246"></a>
-<span class="sourceLineNo">247</span> batch.getLastWalPosition() != currentPosition) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span> source.getSourceManager().logPositionAndCleanOldLogs(source.getQueueId(),<a name="line.248"></a>
-<span class="sourceLineNo">249</span> source.isRecovered(), batch);<a name="line.249"></a>
-<span class="sourceLineNo">250</span> updated = true;<a name="line.250"></a>
-<span class="sourceLineNo">251</span> }<a name="line.251"></a>
-<span class="sourceLineNo">252</span> // if end of file is true, then we can just skip to the next file in queue.<a name="line.252"></a>
-<span class="sourceLineNo">253</span> // the only exception is for recovered queue, if we reach the end of the queue, then there will<a name="line.253"></a>
-<span class="sourceLineNo">254</span> // no more files so here the currentPath may be null.<a name="line.254"></a>
-<span class="sourceLineNo">255</span> if (batch.isEndOfFile()) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span> currentPath = entryReader.getCurrentPath();<a name="line.256"></a>
-<span class="sourceLineNo">257</span> currentPosition = 0L;<a name="line.257"></a>
-<span class="sourceLineNo">258</span> } else {<a name="line.258"></a>
-<span class="sourceLineNo">259</span> currentPath = batch.getLastWalPath();<a name="line.259"></a>
-<span class="sourceLineNo">260</span> currentPosition = batch.getLastWalPosition();<a name="line.260"></a>
-<span class="sourceLineNo">261</span> }<a name="line.261"></a>
-<span class="sourceLineNo">262</span> return updated;<a name="line.262"></a>
-<span class="sourceLineNo">263</span> }<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span> public void startup(UncaughtExceptionHandler handler) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span> String name = Thread.currentThread().getName();<a name="line.266"></a>
-<span class="sourceLineNo">267</span> Threads.setDaemonThreadRunning(this,<a name="line.267"></a>
-<span class="sourceLineNo">268</span> name + ".replicationSource.shipper" + walGroupId + "," + source.getQueueId(), handler);<a name="line.268"></a>
-<span class="sourceLineNo">269</span> }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span> Path getCurrentPath() {<a name="line.271"></a>
-<span class="sourceLineNo">272</span> return entryReader.getCurrentPath();<a name="line.272"></a>
-<span class="sourceLineNo">273</span> }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span> long getCurrentPosition() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span> return currentPosition;<a name="line.276"></a>
-<span class="sourceLineNo">277</span> }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span> void setWALReader(ReplicationSourceWALReader entryReader) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span> this.entryReader = entryReader;<a name="line.280"></a>
-<span class="sourceLineNo">281</span> }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span> long getStartPosition() {<a name="line.283"></a>
-<span class="sourceLineNo">284</span> return 0;<a name="line.284"></a>
-<span class="sourceLineNo">285</span> }<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span> private boolean isActive() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span> return source.isSourceActive() && state == WorkerState.RUNNING && !isInterrupted();<a name="line.288"></a>
-<span class="sourceLineNo">289</span> }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span> protected final void setWorkerState(WorkerState state) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span> this.state = state;<a name="line.292"></a>
-<span class="sourceLineNo">293</span> }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span> void stopWorker() {<a name="line.295"></a>
-<span class="sourceLineNo">296</span> setWorkerState(WorkerState.STOPPED);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span> public boolean isFinished() {<a name="line.299"></a>
-<span class="sourceLineNo">300</span> return state == WorkerState.FINISHED;<a name="line.300"></a>
-<span class="sourceLineNo">301</span> }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span> /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span> * Do the sleeping logic<a name="line.304"></a>
-<span class="sourceLineNo">305</span> * @param msg Why we sleep<a name="line.305"></a>
-<span class="sourceLineNo">306</span> * @param sleepMultiplier by how many times the default sleeping time is augmented<a name="line.306"></a>
-<span class="sourceLineNo">307</span> * @return True if <code>sleepMultiplier</code> is &lt; <code>maxRetriesMultiplier</code><a name="line.307"></a>
-<span class="sourceLineNo">308</span> */<a name="line.308"></a>
-<span class="sourceLineNo">309</span> public boolean sleepForRetries(String msg, int sleepMultiplier) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span> try {<a name="line.310"></a>
-<span class="sourceLineNo">311</span> LOG.trace("{}, sleeping {} times {}", msg, sleepForRetries, sleepMultiplier);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> Thread.sleep(this.sleepForRetries * sleepMultiplier);<a name="line.312"></a>
-<span class="sourceLineNo">313</span> } catch (InterruptedException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span> LOG.debug("Interrupted while sleeping between retries");<a name="line.314"></a>
-<span class="sourceLineNo">315</span> Thread.currentThread().interrupt();<a name="line.315"></a>
-<span class="sourceLineNo">316</span> }<a name="line.316"></a>
-<span class="sourceLineNo">317</span> return sleepMultiplier < maxRetriesMultiplier;<a name="line.317"></a>
-<span class="sourceLineNo">318</span> }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>}<a name="line.319"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.TableName;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.replication.ReplicationEndpoint;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.slf4j.Logger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.slf4j.LoggerFactory;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.BulkLoadDescriptor;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.StoreDescriptor;<a name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>/**<a name="line.40"></a>
+<span class="sourceLineNo">041</span> * This thread reads entries from a queue and ships them. Entries are placed onto the queue by<a name="line.41"></a>
+<span class="sourceLineNo">042</span> * ReplicationSourceWALReaderThread<a name="line.42"></a>
+<span class="sourceLineNo">043</span> */<a name="line.43"></a>
+<span class="sourceLineNo">044</span>@InterfaceAudience.Private<a name="line.44"></a>
+<span class="sourceLineNo">045</span>public class ReplicationSourceShipper extends Thread {<a name="line.45"></a>
+<span class="sourceLineNo">046</span> private static final Logger LOG = LoggerFactory.getLogger(ReplicationSourceShipper.class);<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span> // Hold the state of a replication worker thread<a name="line.48"></a>
+<span class="sourceLineNo">049</span> public enum WorkerState {<a name="line.49"></a>
+<span class="sourceLineNo">050</span> RUNNING,<a name="line.50"></a>
+<span class="sourceLineNo">051</span> STOPPED,<a name="line.51"></a>
+<span class="sourceLineNo">052</span> FINISHED, // The worker is done processing a recovered queue<a name="line.52"></a>
+<span class="sourceLineNo">053</span> }<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span> private final Configuration conf;<a name="line.55"></a>
+<span class="sourceLineNo">056</span> protected final String walGroupId;<a name="line.56"></a>
+<span class="sourceLineNo">057</span> protected final PriorityBlockingQueue<Path> queue;<a name="line.57"></a>
+<span class="sourceLineNo">058</span> private final ReplicationSourceInterface source;<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span> // Last position in the log that we sent to ZooKeeper<a name="line.60"></a>
+<span class="sourceLineNo">061</span> // It will be accessed by the stats thread so make it volatile<a name="line.61"></a>
+<span class="sourceLineNo">062</span> private volatile long currentPosition = -1;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> // Path of the current log<a name="line.63"></a>
+<span class="sourceLineNo">064</span> private Path currentPath;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> // Current state of the worker thread<a name="line.65"></a>
+<span class="sourceLineNo">066</span> private volatile WorkerState state;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> protected ReplicationSourceWALReader entryReader;<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span> // How long should we sleep for each retry<a name="line.69"></a>
+<span class="sourceLineNo">070</span> protected final long sleepForRetries;<a name="line.70"></a>
+<span class="sourceLineNo">071</span> // Maximum number of retries before taking bold actions<a name="line.71"></a>
+<span class="sourceLineNo">072</span> protected final int maxRetriesMultiplier;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span> public ReplicationSourceShipper(Configuration conf, String walGroupId,<a name="line.74"></a>
+<span class="sourceLineNo">075</span> PriorityBlockingQueue<Path> queue, ReplicationSourceInterface source) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span> this.conf = conf;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> this.walGroupId = walGroupId;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> this.queue = queue;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> this.source = source;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> this.sleepForRetries =<a name="line.80"></a>
+<span class="sourceLineNo">081</span> this.conf.getLong("replication.source.sleepforretries", 1000); // 1 second<a name="line.81"></a>
+<span class="sourceLineNo">082</span> this.maxRetriesMultiplier =<a name="line.82"></a>
+<span class="sourceLineNo">083</span> this.conf.getInt("replication.source.maxretriesmultiplier", 300); // 5 minutes @ 1 sec per<a name="line.83"></a>
+<span class="sourceLineNo">084</span> }<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span> @Override<a name="line.86"></a>
+<span class="sourceLineNo">087</span> public final void run() {<a name="line.87"></a>
+<span class="sourceLineNo">088</span> setWorkerState(WorkerState.RUNNING);<a name="line.88"></a>
+<span class="sourceLineNo">089</span> // Loop until we close down<a name="line.89"></a>
+<span class="sourceLineNo">090</span> while (isActive()) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span> // Sleep until replication is enabled again<a name="line.91"></a>
+<span class="sourceLineNo">092</span> if (!source.isPeerEnabled()) {<a name="line.92"></a>
+<span class="sourceLineNo">093</span> // The peer enabled check is in memory, not expensive, so do not need to increase the<a name="line.93"></a>
+<span class="sourceLineNo">094</span> // sleep interval as it may cause a long lag when we enable the peer.<a name="line.94"></a>
+<span class="sourceLineNo">095</span> sleepForRetries("Replication is disabled", 1);<a name="line.95"></a>
+<span class="sourceLineNo">096</span> continue;<a name="line.96"></a>
+<span class="sourceLineNo">097</span> }<a name="line.97"></a>
+<span class="sourceLineNo">098</span> try {<a name="line.98"></a>
+<span class="sourceLineNo">099</span> WALEntryBatch entryBatch = entryReader.take();<a name="line.99"></a>
+<span class="sourceLineNo">100</span> // the NO_MORE_DATA instance has no path so do not all shipEdits<a name="line.100"></a>
+<span class="sourceLineNo">101</span> if (entryBatch == WALEntryBatch.NO_MORE_DATA) {<a name="line.101"></a>
+<span class="sourceLineNo">102</span> noMoreData();<a name="line.102"></a>
+<span class="sourceLineNo">103</span> } else {<a name="line.103"></a>
+<span class="sourceLineNo">104</span> shipEdits(entryBatch);<a name="line.104"></a>
+<span class="sourceLineNo">105</span> }<a name="line.105"></a>
+<span class="sourceLineNo">106</span> } catch (InterruptedException e) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span> LOG.trace("Interrupted while waiting for next replication entry batch", e);<a name="line.107"></a>
+<span class="sourceLineNo">108</span> Thread.currentThread().interrupt();<a name="line.108"></a>
+<span class="sourceLineNo">109</span> }<a name="line.109"></a>
+<span class="sourceLineNo">110</span> }<a name="line.110"></a>
+<span class="sourceLineNo">111</span> // If the worker exits run loop without finishing its task, mark it as stopped.<a name="line.111"></a>
+<span class="sourceLineNo">112</span> if (!isFinished()) {<a name="line.112"></a>
+<span class="sourceLineNo">113</span> setWorkerState(WorkerState.STOPPED);<a name="line.113"></a>
+<span class="sourceLineNo">114</span> } else {<a name="line.114"></a>
+<span class="sourceLineNo">115</span> postFinish();<a name="line.115"></a>
+<span class="sourceLineNo">116</span> }<a name="line.116"></a>
+<span class="sourceLineNo">117</span> }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span> // To be implemented by recovered shipper<a name="line.119"></a>
+<span class="sourceLineNo">120</span> protected void noMoreData() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span> }<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span> // To be implemented by recovered shipper<a name="line.123"></a>
+<span class="sourceLineNo">124</span> protected void postFinish() {<a name="line.124"></a>
+<span class="sourceLineNo">125</span> }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span> /**<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * get batchEntry size excludes bulk load file sizes.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * Uses ReplicationSourceWALReader's static method.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span> private int getBatchEntrySizeExcludeBulkLoad(WALEntryBatch entryBatch) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span> int totalSize = 0;<a name="line.132"></a>
+<span class="sourceLineNo">133</span> for(Entry entry : entryBatch.getWalEntries()) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span> totalSize += entryReader.getEntrySizeExcludeBulkLoad(entry);<a name="line.134"></a>
+<span class="sourceLineNo">135</span> }<a name="line.135"></a>
+<span class="sourceLineNo">136</span> return totalSize;<a name="line.136"></a>
+<span class="sourceLineNo">137</span> }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span> /**<a name="line.139"></a>
+<span class="sourceLineNo">140</span> * Do the shipping logic<a name="line.140"></a>
+<span class="sourceLineNo">141</span> */<a name="line.141"></a>
+<span class="sourceLineNo">142</span> private void shipEdits(WALEntryBatch entryBatch) {<a name="line.142"></a>
+<span class="sourceLineNo">143</span> List<Entry> entries = entryBatch.getWalEntries();<a name="line.143"></a>
+<span class="sourceLineNo">144</span> int sleepMultiplier = 0;<a name="line.144"></a>
+<span class="sourceLineNo">145</span> if (entries.isEmpty()) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span> if (updateLogPosition(entryBatch)) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span> // if there was nothing to ship and it's not an error<a name="line.147"></a>
+<span class="sourceLineNo">148</span> // set "ageOfLastShippedOp" to <now> to indicate that we're current<a name="line.148"></a>
+<span class="sourceLineNo">149</span> source.getSourceMetrics().setAgeOfLastShippedOp(EnvironmentEdgeManager.currentTime(),<a name="line.149"></a>
+<span class="sourceLineNo">150</span> walGroupId);<a name="line.150"></a>
+<span class="sourceLineNo">151</span> }<a name="line.151"></a>
+<span class="sourceLineNo">152</span> return;<a name="line.152"></a>
+<span class="sourceLineNo">153</span> }<a name="line.153"></a>
+<span class="sourceLineNo">154</span> int currentSize = (int) entryBatch.getHeapSize();<a name="line.154"></a>
+<span class="sourceLineNo">155</span> int sizeExcludeBulkLoad = getBatchEntrySizeExcludeBulkLoad(entryBatch);<a name="line.155"></a>
+<span class="sourceLineNo">156</span> while (isActive()) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span> try {<a name="line.157"></a>
+<span class="sourceLineNo">158</span> try {<a name="line.158"></a>
+<span class="sourceLineNo">159</span> source.tryThrottle(currentSize);<a name="line.159"></a>
+<span class="sourceLineNo">160</span> } catch (InterruptedException e) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span> LOG.debug("Interrupted while sleeping for throttling control");<a name="line.161"></a>
+<span class="sourceLineNo">162</span> Thread.currentThread().interrupt();<a name="line.162"></a>
+<span class="sourceLineNo">163</span> // current thread might be interrupted to terminate<a name="line.163"></a>
+<span class="sourceLineNo">164</span> // directly go back to while() for confirm this<a name="line.164"></a>
+<span class="sourceLineNo">165</span> continue;<a name="line.165"></a>
+<span class="sourceLineNo">166</span> }<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span> // create replicateContext here, so the entries can be GC'd upon return from this call<a name="line.168"></a>
+<span class="sourceLineNo">169</span> // stack<a name="line.169"></a>
+<span class="sourceLineNo">170</span> ReplicationEndpoint.ReplicateContext replicateContext =<a name="line.170"></a>
+<span class="sourceLineNo">171</span> new ReplicationEndpoint.ReplicateContext();<a name="line.171"></a>
+<span class="sourceLineNo">172</span> replicateContext.setEntries(entries).setSize(currentSize);<a name="line.172"></a>
+<span class="sourceLineNo">173</span> replicateContext.setWalGroupId(walGroupId);<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span> long startTimeNs = System.nanoTime();<a name="line.175"></a>
+<span class="sourceLineNo">176</span> // send the edits to the endpoint. Will block until the edits are shipped and acknowledged<a name="line.176"></a>
+<span class="sourceLineNo">177</span> boolean replicated = source.getReplicationEndpoint().replicate(replicateContext);<a name="line.177"></a>
+<span class="sourceLineNo">178</span> long endTimeNs = System.nanoTime();<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span> if (!replicated) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span> continue;<a name="line.181"></a>
+<span class="sourceLineNo">182</span> } else {<a name="line.182"></a>
+<span class="sourceLineNo">183</span> sleepMultiplier = Math.max(sleepMultiplier - 1, 0);<a name="line.183"></a>
+<span class="sourceLineNo">184</span> }<a name="line.184"></a>
+<span class="sourceLineNo">185</span> // Clean up hfile references<a name="line.185"></a>
+<span class="sourceLineNo">186</span> for (Entry entry : entries) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span> cleanUpHFileRefs(entry.getEdit());<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span> TableName tableName = entry.getKey().getTableName();<a name="line.189"></a>
+<span class="sourceLineNo">190</span> source.getSourceMetrics().setAgeOfLastShippedOpByTable(entry.getKey().getWriteTime(),<a name="line.190"></a>
+<span class="sourceLineNo">191</span> tableName.getNameAsString());<a name="line.191"></a>
+<span class="sourceLineNo">192</span> }<a name="line.192"></a>
+<span class="sourceLineNo">193</span> // Log and clean up WAL logs<a name="line.193"></a>
+<span class="sourceLineNo">194</span> updateLogPosition(entryBatch);<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span> //offsets totalBufferUsed by deducting shipped batchSize (excludes bulk load size)<a name="line.196"></a>
+<span class="sourceLineNo">197</span> //this sizeExcludeBulkLoad has to use same calculation that when calling<a name="line.197"></a>
+<span class="sourceLineNo">198</span> //acquireBufferQuota() in ReplicatinoSourceWALReader because they maintain<a name="line.198"></a>
+<span class="sourceLineNo">199</span> //same variable: totalBufferUsed<a name="line.199"></a>
+<span class="sourceLineNo">200</span> source.postShipEdits(entries, sizeExcludeBulkLoad);<a name="line.200"></a>
+<span class="sourceLineNo">201</span> // FIXME check relationship between wal group and overall<a name="line.201"></a>
+<span class="sourceLineNo">202</span> source.getSourceMetrics().shipBatch(entryBatch.getNbOperations(), currentSize,<a name="line.202"></a>
+<span class="sourceLineNo">203</span> entryBatch.getNbHFiles());<a name="line.203"></a>
+<span class="sourceLineNo">204</span> source.getSourceMetrics().setAgeOfLastShippedOp(<a name="line.204"></a>
+<span class="sourceLineNo">205</span> entries.get(entries.size() - 1).getKey().getWriteTime(), walGroupId);<a name="line.205"></a>
+<span class="sourceLineNo">206</span> if (LOG.isTraceEnabled()) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span> LOG.trace("Replicated {} entries or {} operations in {} ms",<a name="line.207"></a>
+<span class="sourceLineNo">208</span> entries.size(), entryBatch.getNbOperations(), (endTimeNs - startTimeNs) / 1000000);<a name="line.208"></a>
+<span class="sourceLineNo">209</span> }<a name="line.209"></a>
+<span class="sourceLineNo">210</span> break;<a name="line.210"></a>
+<span class="sourceLineNo">211</span> } catch (Exception ex) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span> LOG.warn("{} threw unknown exception:",<a name="line.212"></a>
+<span class="sourceLineNo">213</span> source.getReplicationEndpoint().getClass().getName(), ex);<a name="line.213"></a>
+<span class="sourceLineNo">214</span> if (sleepForRetries("ReplicationEndpoint threw exception", sleepMultiplier)) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span> sleepMultiplier++;<a name="line.215"></a>
+<span class="sourceLineNo">216</span> }<a name="line.216"></a>
+<span class="sourceLineNo">217</span> }<a name="line.217"></a>
+<span class="sourceLineNo">218</span> }<a name="line.218"></a>
+<span class="sourceLineNo">219</span> }<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span> private void cleanUpHFileRefs(WALEdit edit) throws IOException {<a name="line.221"></a>
+<span class="sourceLineNo">222</span> String peerId = source.getPeerId();<a name="line.222"></a>
+<span class="sourceLineNo">223</span> if (peerId.contains("-")) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span> // peerClusterZnode will be in the form peerId + "-" + rsZNode.<a name="line.224"></a>
+<span class="sourceLineNo">225</span> // A peerId will not have "-" in its name, see HBASE-11394<a name="line.225"></a>
+<span class="sourceLineNo">226</span> peerId = peerId.split("-")[0];<a name="line.226"></a>
+<span class="sourceLineNo">227</span> }<a name="line.227"></a>
+<span class="sourceLineNo">228</span> List<Cell> cells = edit.getCells();<a name="line.228"></a>
+<span class="sourceLineNo">229</span> int totalCells = cells.size();<a name="line.229"></a>
+<span class="sourceLineNo">230</span> for (int i = 0; i < totalCells; i++) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span> Cell cell = cells.get(i);<a name="line.231"></a>
+<span class="sourceLineNo">232</span> if (CellUtil.matchingQualifier(cell, WALEdit.BULK_LOAD)) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span> BulkLoadDescriptor bld = WALEdit.getBulkLoadDescriptor(cell);<a name="line.233"></a>
+<span class="sourceLineNo">234</span> List<StoreDescriptor> stores = bld.getStoresList();<a name="line.234"></a>
+<span class="sourceLineNo">235</span> int totalStores = stores.size();<a name="line.235"></a>
+<span class="sourceLineNo">236</span> for (int j = 0; j < totalStores; j++) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span> List<String> storeFileList = stores.get(j).getStoreFileList();<a name="line.237"></a>
+<span class="sourceLineNo">238</span> source.getSourceManager().cleanUpHFileRefs(peerId, storeFileList);<a name="line.238"></a>
+<span class="sourceLineNo">239</span> source.getSourceMetrics().decrSizeOfHFileRefsQueue(storeFileList.size());<a name="line.239"></a>
+<span class="sourceLineNo">240</span> }<a name="line.240"></a>
+<span class="sourceLineNo">241</span> }<a name="line.241"></a>
+<span class="sourceLineNo">242</span> }<a name="line.242"></a>
+<span class="sourceLineNo">243</span> }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span> private boolean updateLogPosition(WALEntryBatch batch) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span> boolean updated = false;<a name="line.246"></a>
+<span class="sourceLineNo">247</span> // if end of file is true, then the logPositionAndCleanOldLogs method will remove the file<a name="line.247"></a>
+<span class="sourceLineNo">248</span> // record on zk, so let's call it. The last wal position maybe zero if end of file is true and<a name="line.248"></a>
+<span class="sourceLineNo">249</span> // there is no entry in the batch. It is OK because that the queue storage will ignore the zero<a name="line.249"></a>
+<span class="sourceLineNo">250</span> // position and the file will be removed soon in cleanOldLogs.<a name="line.250"></a>
+<span class="sourceLineNo">251</span> if (batch.isEndOfFile() || !batch.getLastWalPath().equals(currentPath) ||<a name="line.251"></a>
+<span class="sourceLineNo">252</span> batch.getLastWalPosition() != currentPosition) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span> source.getSourceManager().logPositionAndCleanOldLogs(source.getQueueId(),<a name="line.253"></a>
+<span class="sourceLineNo">254</span> source.isRecovered(), batch);<a name="line.254"></a>
+<span class="sourceLineNo">255</span> updated = true;<a name="line.255"></a>
+<span class="sourceLineNo">256</span> }<a name="line.256"></a>
+<span class="sourceLineNo">257</span> // if end of file is true, then we can just skip to the next file in queue.<a name="line.257"></a>
+<span class="sourceLineNo">258</span> // the only exception is for recovered queue, if we reach the end of the queue, then there will<a name="line.258"></a>
+<span class="sourceLineNo">259</span> // no more files so here the currentPath may be null.<a name="line.259"></a>
+<span class="sourceLineNo">260</span> if (batch.isEndOfFile()) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span> currentPath = entryReader.getCurrentPath();<a name="line.261"></a>
+<span class="sourceLineNo">262</span> currentPosition = 0L;<a name="line.262"></a>
+<span class="sourceLineNo">263</span> } else {<a name="line.263"></a>
+<span class="sourceLineNo">264</span> currentPath = batch.getLastWalPath();<a name="line.264"></a>
+<span class="sourceLineNo">265</span> currentPosition = batch.getLastWalPosition();<a name="line.265"></a>
+<span class="sourceLineNo">266</span> }<a name="line.266"></a>
+<span class="sourceLineNo">267</span> return updated;<a name="line.267"></a>
+<span class="sourceLineNo">268</span> }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span> public void startup(UncaughtExceptionHandler handler) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> String name = Thread.currentThread().getName();<a name="line.271"></a>
+<span class="sourceLineNo">272</span> Threads.setDaemonThreadRunning(this,<a name="line.272"></a>
+<span class="sourceLineNo">273</span> name + ".replicationSource.shipper" + walGroupId + "," + source.getQueueId(), handler);<a name="line.273"></a>
+<span class="sourceLineNo">274</span> }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span> Path getCurrentPath() {<a name="line.276"></a>
+<span class="sourceLineNo">277</span> return entryReader.getCurrentPath();<a name="line.277"></a>
+<span class="sourceLineNo">278</span> }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span> long getCurrentPosition() {<a name="line.280"></a>
+<span class="sourceLineNo">281</span> return currentPosition;<a name="line.281"></a>
+<span class="sourceLineNo">282</span> }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span> void setWALReader(ReplicationSourceWALReader entryReader) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span> this.entryReader = entryReader;<a name="line.285"></a>
+<span class="sourceLineNo">286</span> }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span> long getStartPosition() {<a name="line.288"></a>
+<span class="sourceLineNo">289</span> return 0;<a name="line.289"></a>
+<span class="sourceLineNo">290</span> }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span> private boolean isActive() {<a name="line.292"></a>
+<span class="sourceLineNo">293</span> return source.isSourceActive() && state == WorkerState.RUNNING && !isInterrupted();<a name="line.293"></a>
+<span class="sourceLineNo">294</span> }<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span> protected final void setWorkerState(WorkerState state) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span> this.state = state;<a name="line.297"></a>
+<span class="sourceLineNo">298</span> }<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span> void stopWorker() {<a name="line.300"></a>
+<span class="sourceLineNo">301</span> setWorkerState(WorkerState.STOPPED);<a name="line.301"></a>
+<span class="sourceLineNo">302</span> }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span> public boolean isFinished() {<a name="line.304"></a>
+<span class="sourceLineNo">305</span> return state == WorkerState.FINISHED;<a name="line.305"></a>
+<span class="sourceLineNo">306</span> }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span> /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span> * Do the sleeping logic<a name="line.309"></a>
+<span class="sourceLineNo">310</span> * @param msg Why we sleep<a name="line.310"></a>
+<span class="sourceLineNo">311</span> * @param sleepMultiplier by how many times the default sleeping time is augmented<a name="line.311"></a>
+<span class="sourceLineNo">312</span> * @return True if <code>sleepMultiplier</code> is &lt; <code>maxRetriesMultiplier</code><a name="line.312"></a>
+<span class="sourceLineNo">313</span> */<a name="line.313"></a>
+<span class="sourceLineNo">314</span> public boolean sleepForRetries(String msg, int sleepMultiplier) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span> try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span> LOG.trace("{}, sleeping {} times {}", msg, sleepForRetries, sleepMultiplier);<a name="line.316"></a>
+<span class="sourceLineNo">317</span> Thread.sleep(this.sleepForRetries * sleepMultiplier);<a name="line.317"></a>
+<span class="sourceLineNo">318</span> } catch (InterruptedException e) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span> LOG.debug("Interrupted while sleeping between retries");<a name="line.319"></a>
+<span class="sourceLineNo">320</span> Thread.currentThread().interrupt();<a name="line.320"></a>
+<span class="sourceLineNo">321</span> }<a name="line.321"></a>
+<span class="sourceLineNo">322</span> return sleepMultiplier < maxRetriesMultiplier;<a name="line.322"></a>
+<span class="sourceLineNo">323</span> }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>}<a name="line.324"></a>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 5ba20c9..8979bea 100644
--- a/downloads.html
+++ b/downloads.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Apache HBase Downloads</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -366,7 +366,7 @@ under the License. -->
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index f552b44..452535e 100644
--- a/export_control.html
+++ b/export_control.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase –
Export Control
@@ -331,7 +331,7 @@ for more details.</p>
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 7fde2d7..0195bc9 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Apache HBaseâ„¢ Home</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -411,7 +411,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index 6e56bef..bc63fe6 100644
--- a/integration.html
+++ b/integration.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – CI Management</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -291,7 +291,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 4db6b12..0ce809d 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Issue Management</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -288,7 +288,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 32e6d28..0485a2b 100644
--- a/license.html
+++ b/license.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Project Licenses</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -491,7 +491,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 9c30fb3..5549fad 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Project Mailing Lists</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -341,7 +341,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index c646f3d..c180dce 100644
--- a/metrics.html
+++ b/metrics.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase –
Apache HBase (TM) Metrics
@@ -459,7 +459,7 @@ export HBASE_REGIONSERVER_OPTS="$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 65f5c75..318c6dc 100644
--- a/old_news.html
+++ b/old_news.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase –
Old Apache HBase (TM) News
@@ -440,7 +440,7 @@ under the License. -->
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 071002d..7ac1356 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Project Plugin Management</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -440,7 +440,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index bbd8482..edaf742 100644
--- a/plugins.html
+++ b/plugins.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Project Plugins</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -375,7 +375,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 2ce600b..0d2f69f 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Powered By Apache HBase™</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -769,7 +769,7 @@ under the License. -->
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 80334ba..37e3d20 100644
--- a/project-info.html
+++ b/project-info.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Project Information</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -335,7 +335,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 803b681..b59fea6 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Generated Reports</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -305,7 +305,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 16b4fbb..0cddb73 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Project Summary</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -331,7 +331,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 3f37591..fadd7d5 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase –
Running Apache HBase (TM) in pseudo-distributed mode
@@ -308,7 +308,7 @@ under the License. -->
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index e889c3a..d39786a 100644
--- a/replication.html
+++ b/replication.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase –
Apache HBase (TM) Replication
@@ -303,7 +303,7 @@ under the License. -->
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 6471a8b..ab5ce10 100644
--- a/resources.html
+++ b/resources.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Other Apache HBase (TM) Resources</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -331,7 +331,7 @@ under the License. -->
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 57a27a1..b0fb0f6 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Source Code Management</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -299,7 +299,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 2958c71..cc82af3 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Apache HBase™ Sponsors</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -333,7 +333,7 @@ under the License. -->
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 87f41bf..2127569 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Supporting Projects</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -520,7 +520,7 @@ under the License. -->
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index d7f4cc1..3c8e71e 100644
--- a/team-list.html
+++ b/team-list.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Project Team</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -736,7 +736,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html
index 61a58c9..46df856 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html
@@ -121,7 +121,7 @@ var activeTableTab = "activeTableTab";
</dl>
<hr>
<br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.520">TestReplicationEndpoint.EverythingPassesWALEntryFilter</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.540">TestReplicationEndpoint.EverythingPassesWALEntryFilter</a>
extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
implements org.apache.hadoop.hbase.replication.WALEntryFilter</pre>
</li>
@@ -214,7 +214,7 @@ implements org.apache.hadoop.hbase.replication.WALEntryFilter</pre>
<ul class="blockListLast">
<li class="blockList">
<h4>passedEntry</h4>
-<pre>private static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html#line.521">passedEntry</a></pre>
+<pre>private static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html#line.541">passedEntry</a></pre>
</li>
</ul>
</li>
@@ -231,7 +231,7 @@ implements org.apache.hadoop.hbase.replication.WALEntryFilter</pre>
<ul class="blockListLast">
<li class="blockList">
<h4>EverythingPassesWALEntryFilter</h4>
-<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html#line.520">EverythingPassesWALEntryFilter</a>()</pre>
+<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html#line.540">EverythingPassesWALEntryFilter</a>()</pre>
</li>
</ul>
</li>
@@ -248,7 +248,7 @@ implements org.apache.hadoop.hbase.replication.WALEntryFilter</pre>
<ul class="blockList">
<li class="blockList">
<h4>filter</h4>
-<pre>public org.apache.hadoop.hbase.wal.WAL.Entry <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html#line.523">filter</a>(org.apache.hadoop.hbase.wal.WAL.Entry entry)</pre>
+<pre>public org.apache.hadoop.hbase.wal.WAL.Entry <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html#line.543">filter</a>(org.apache.hadoop.hbase.wal.WAL.Entry entry)</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>filter</code> in interface <code>org.apache.hadoop.hbase.replication.WALEntryFilter</code></dd>
@@ -261,7 +261,7 @@ implements org.apache.hadoop.hbase.replication.WALEntryFilter</pre>
<ul class="blockListLast">
<li class="blockList">
<h4>hasPassedAnEntry</h4>
-<pre>public static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html#line.528">hasPassedAnEntry</a>()</pre>
+<pre>public static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html#line.548">hasPassedAnEntry</a>()</pre>
</li>
</ul>
</li>
[07/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html
index 43a87b6..819e491 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html
@@ -31,517 +31,537 @@
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.UUID;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.concurrent.Callable;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.Cell;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Waiter;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Put;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Table;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.junit.AfterClass;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.junit.Assert;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.junit.Before;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.BeforeClass;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.ClassRule;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.Test;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.experimental.categories.Category;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.slf4j.Logger;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.slf4j.LoggerFactory;<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.66"></a>
-<span class="sourceLineNo">067</span> */<a name="line.67"></a>
-<span class="sourceLineNo">068</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.68"></a>
-<span class="sourceLineNo">069</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span> @ClassRule<a name="line.71"></a>
-<span class="sourceLineNo">072</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.72"></a>
-<span class="sourceLineNo">073</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.75"></a>
+<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Map;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.UUID;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.Callable;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Cell;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Waiter;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Put;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Table;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.AfterClass;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.Assert;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.Before;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.BeforeClass;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.ClassRule;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.experimental.categories.Category;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.slf4j.Logger;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.slf4j.LoggerFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>/**<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.68"></a>
+<span class="sourceLineNo">069</span> */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.70"></a>
+<span class="sourceLineNo">071</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span> @ClassRule<a name="line.73"></a>
+<span class="sourceLineNo">074</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.74"></a>
+<span class="sourceLineNo">075</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.75"></a>
<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span> static int numRegionServers;<a name="line.77"></a>
+<span class="sourceLineNo">077</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.77"></a>
<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span> @BeforeClass<a name="line.79"></a>
-<span class="sourceLineNo">080</span> public static void setUpBeforeClass() throws Exception {<a name="line.80"></a>
-<span class="sourceLineNo">081</span> TestReplicationBase.setUpBeforeClass();<a name="line.81"></a>
-<span class="sourceLineNo">082</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.82"></a>
-<span class="sourceLineNo">083</span> }<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span> @AfterClass<a name="line.85"></a>
-<span class="sourceLineNo">086</span> public static void tearDownAfterClass() throws Exception {<a name="line.86"></a>
-<span class="sourceLineNo">087</span> TestReplicationBase.tearDownAfterClass();<a name="line.87"></a>
-<span class="sourceLineNo">088</span> // check stop is called<a name="line.88"></a>
-<span class="sourceLineNo">089</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.89"></a>
-<span class="sourceLineNo">090</span> }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span> @Before<a name="line.92"></a>
-<span class="sourceLineNo">093</span> public void setup() throws Exception {<a name="line.93"></a>
-<span class="sourceLineNo">094</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.94"></a>
-<span class="sourceLineNo">095</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.95"></a>
-<span class="sourceLineNo">096</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.96"></a>
-<span class="sourceLineNo">097</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.97"></a>
-<span class="sourceLineNo">098</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> final List<RegionServerThread> rsThreads =<a name="line.99"></a>
-<span class="sourceLineNo">100</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.100"></a>
-<span class="sourceLineNo">101</span> for (RegionServerThread rs : rsThreads) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.102"></a>
-<span class="sourceLineNo">103</span> }<a name="line.103"></a>
-<span class="sourceLineNo">104</span> // Wait for all log roll to finish<a name="line.104"></a>
-<span class="sourceLineNo">105</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.105"></a>
-<span class="sourceLineNo">106</span> @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span> public boolean evaluate() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span> for (RegionServerThread rs : rsThreads) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span> return false;<a name="line.110"></a>
-<span class="sourceLineNo">111</span> }<a name="line.111"></a>
-<span class="sourceLineNo">112</span> }<a name="line.112"></a>
-<span class="sourceLineNo">113</span> return true;<a name="line.113"></a>
-<span class="sourceLineNo">114</span> }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span> @Override<a name="line.116"></a>
-<span class="sourceLineNo">117</span> public String explainFailure() throws Exception {<a name="line.117"></a>
-<span class="sourceLineNo">118</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.118"></a>
-<span class="sourceLineNo">119</span> for (RegionServerThread rs : rsThreads) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.121"></a>
-<span class="sourceLineNo">122</span> }<a name="line.122"></a>
-<span class="sourceLineNo">123</span> }<a name="line.123"></a>
-<span class="sourceLineNo">124</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.124"></a>
-<span class="sourceLineNo">125</span> }<a name="line.125"></a>
-<span class="sourceLineNo">126</span> });<a name="line.126"></a>
-<span class="sourceLineNo">127</span> }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span> @Test<a name="line.129"></a>
-<span class="sourceLineNo">130</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.130"></a>
-<span class="sourceLineNo">131</span> // test installing a custom replication endpoint other than the default one.<a name="line.131"></a>
-<span class="sourceLineNo">132</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.132"></a>
-<span class="sourceLineNo">133</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.133"></a>
-<span class="sourceLineNo">134</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span> // check whether the class has been constructed and started<a name="line.136"></a>
-<span class="sourceLineNo">137</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.137"></a>
-<span class="sourceLineNo">138</span> @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span> public boolean evaluate() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.140"></a>
-<span class="sourceLineNo">141</span> }<a name="line.141"></a>
-<span class="sourceLineNo">142</span> });<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span> @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span> public boolean evaluate() throws Exception {<a name="line.146"></a>
-<span class="sourceLineNo">147</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.147"></a>
-<span class="sourceLineNo">148</span> }<a name="line.148"></a>
-<span class="sourceLineNo">149</span> });<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.151"></a>
+<span class="sourceLineNo">079</span> static int numRegionServers;<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span> @BeforeClass<a name="line.81"></a>
+<span class="sourceLineNo">082</span> public static void setUpBeforeClass() throws Exception {<a name="line.82"></a>
+<span class="sourceLineNo">083</span> TestReplicationBase.setUpBeforeClass();<a name="line.83"></a>
+<span class="sourceLineNo">084</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.84"></a>
+<span class="sourceLineNo">085</span> }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span> @AfterClass<a name="line.87"></a>
+<span class="sourceLineNo">088</span> public static void tearDownAfterClass() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span> TestReplicationBase.tearDownAfterClass();<a name="line.89"></a>
+<span class="sourceLineNo">090</span> // check stop is called<a name="line.90"></a>
+<span class="sourceLineNo">091</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.91"></a>
+<span class="sourceLineNo">092</span> }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span> @Before<a name="line.94"></a>
+<span class="sourceLineNo">095</span> public void setup() throws Exception {<a name="line.95"></a>
+<span class="sourceLineNo">096</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.96"></a>
+<span class="sourceLineNo">097</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.97"></a>
+<span class="sourceLineNo">098</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.98"></a>
+<span class="sourceLineNo">099</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.99"></a>
+<span class="sourceLineNo">100</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> final List<RegionServerThread> rsThreads =<a name="line.101"></a>
+<span class="sourceLineNo">102</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.102"></a>
+<span class="sourceLineNo">103</span> for (RegionServerThread rs : rsThreads) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.104"></a>
+<span class="sourceLineNo">105</span> }<a name="line.105"></a>
+<span class="sourceLineNo">106</span> // Wait for all log roll to finish<a name="line.106"></a>
+<span class="sourceLineNo">107</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.107"></a>
+<span class="sourceLineNo">108</span> @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span> public boolean evaluate() throws Exception {<a name="line.109"></a>
+<span class="sourceLineNo">110</span> for (RegionServerThread rs : rsThreads) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span> return false;<a name="line.112"></a>
+<span class="sourceLineNo">113</span> }<a name="line.113"></a>
+<span class="sourceLineNo">114</span> }<a name="line.114"></a>
+<span class="sourceLineNo">115</span> return true;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span> @Override<a name="line.118"></a>
+<span class="sourceLineNo">119</span> public String explainFailure() throws Exception {<a name="line.119"></a>
+<span class="sourceLineNo">120</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.120"></a>
+<span class="sourceLineNo">121</span> for (RegionServerThread rs : rsThreads) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.123"></a>
+<span class="sourceLineNo">124</span> }<a name="line.124"></a>
+<span class="sourceLineNo">125</span> }<a name="line.125"></a>
+<span class="sourceLineNo">126</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.126"></a>
+<span class="sourceLineNo">127</span> }<a name="line.127"></a>
+<span class="sourceLineNo">128</span> });<a name="line.128"></a>
+<span class="sourceLineNo">129</span> }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span> @Test<a name="line.131"></a>
+<span class="sourceLineNo">132</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.132"></a>
+<span class="sourceLineNo">133</span> // test installing a custom replication endpoint other than the default one.<a name="line.133"></a>
+<span class="sourceLineNo">134</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.134"></a>
+<span class="sourceLineNo">135</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.135"></a>
+<span class="sourceLineNo">136</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span> // check whether the class has been constructed and started<a name="line.138"></a>
+<span class="sourceLineNo">139</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.139"></a>
+<span class="sourceLineNo">140</span> @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span> public boolean evaluate() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.142"></a>
+<span class="sourceLineNo">143</span> }<a name="line.143"></a>
+<span class="sourceLineNo">144</span> });<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span> @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span> public boolean evaluate() throws Exception {<a name="line.148"></a>
+<span class="sourceLineNo">149</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.149"></a>
+<span class="sourceLineNo">150</span> }<a name="line.150"></a>
+<span class="sourceLineNo">151</span> });<a name="line.151"></a>
<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span> // now replicate some data.<a name="line.153"></a>
-<span class="sourceLineNo">154</span> doPut(Bytes.toBytes("row42"));<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span> @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span> public boolean evaluate() throws Exception {<a name="line.158"></a>
-<span class="sourceLineNo">159</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.159"></a>
-<span class="sourceLineNo">160</span> }<a name="line.160"></a>
-<span class="sourceLineNo">161</span> });<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span> doAssert(Bytes.toBytes("row42"));<a name="line.163"></a>
+<span class="sourceLineNo">153</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span> // now replicate some data.<a name="line.155"></a>
+<span class="sourceLineNo">156</span> doPut(Bytes.toBytes("row42"));<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span> @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span> public boolean evaluate() throws Exception {<a name="line.160"></a>
+<span class="sourceLineNo">161</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.161"></a>
+<span class="sourceLineNo">162</span> }<a name="line.162"></a>
+<span class="sourceLineNo">163</span> });<a name="line.163"></a>
<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.165"></a>
-<span class="sourceLineNo">166</span> }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span> @Test<a name="line.168"></a>
-<span class="sourceLineNo">169</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.169"></a>
-<span class="sourceLineNo">170</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.170"></a>
-<span class="sourceLineNo">171</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.171"></a>
-<span class="sourceLineNo">172</span> int peerCount = admin.getPeersCount();<a name="line.172"></a>
-<span class="sourceLineNo">173</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.173"></a>
-<span class="sourceLineNo">174</span> admin.addPeer(id,<a name="line.174"></a>
-<span class="sourceLineNo">175</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.175"></a>
-<span class="sourceLineNo">176</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.176"></a>
-<span class="sourceLineNo">177</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.177"></a>
-<span class="sourceLineNo">178</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.178"></a>
-<span class="sourceLineNo">179</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.179"></a>
-<span class="sourceLineNo">180</span> if (admin.getPeersCount() <= peerCount) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.181"></a>
-<span class="sourceLineNo">182</span> Threads.sleep(100);<a name="line.182"></a>
-<span class="sourceLineNo">183</span> }<a name="line.183"></a>
-<span class="sourceLineNo">184</span> // now replicate some data<a name="line.184"></a>
-<span class="sourceLineNo">185</span> doPut(row);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.187"></a>
-<span class="sourceLineNo">188</span> @Override<a name="line.188"></a>
-<span class="sourceLineNo">189</span> public boolean evaluate() throws Exception {<a name="line.189"></a>
-<span class="sourceLineNo">190</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.190"></a>
-<span class="sourceLineNo">191</span> // only send over one edit.<a name="line.191"></a>
-<span class="sourceLineNo">192</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.192"></a>
-<span class="sourceLineNo">193</span> LOG.info("count=" + count);<a name="line.193"></a>
-<span class="sourceLineNo">194</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.194"></a>
-<span class="sourceLineNo">195</span> }<a name="line.195"></a>
-<span class="sourceLineNo">196</span> });<a name="line.196"></a>
-<span class="sourceLineNo">197</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.198"></a>
-<span class="sourceLineNo">199</span> }<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.201"></a>
-<span class="sourceLineNo">202</span> }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span> @Test<a name="line.204"></a>
-<span class="sourceLineNo">205</span> public void testInterClusterReplication() throws Exception {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> final String id = "testInterClusterReplication";<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> int totEdits = 0;<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> // Make sure edits are spread across regions because we do region based batching<a name="line.211"></a>
-<span class="sourceLineNo">212</span> // before shipping edits.<a name="line.212"></a>
-<span class="sourceLineNo">213</span> for(HRegion region: regions) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span> RegionInfo hri = region.getRegionInfo();<a name="line.214"></a>
-<span class="sourceLineNo">215</span> byte[] row = hri.getStartKey();<a name="line.215"></a>
-<span class="sourceLineNo">216</span> for (int i = 0; i < 100; i++) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span> if (row.length > 0) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span> Put put = new Put(row);<a name="line.218"></a>
-<span class="sourceLineNo">219</span> put.addColumn(famName, row, row);<a name="line.219"></a>
-<span class="sourceLineNo">220</span> region.put(put);<a name="line.220"></a>
-<span class="sourceLineNo">221</span> totEdits++;<a name="line.221"></a>
-<span class="sourceLineNo">222</span> }<a name="line.222"></a>
-<span class="sourceLineNo">223</span> }<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> admin.addPeer(id,<a name="line.226"></a>
-<span class="sourceLineNo">227</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.227"></a>
-<span class="sourceLineNo">228</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.228"></a>
-<span class="sourceLineNo">229</span> null);<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span> final int numEdits = totEdits;<a name="line.231"></a>
-<span class="sourceLineNo">232</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.232"></a>
-<span class="sourceLineNo">233</span> @Override<a name="line.233"></a>
-<span class="sourceLineNo">234</span> public boolean evaluate() throws Exception {<a name="line.234"></a>
-<span class="sourceLineNo">235</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.235"></a>
-<span class="sourceLineNo">236</span> }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span> @Override<a name="line.238"></a>
-<span class="sourceLineNo">239</span> public String explainFailure() throws Exception {<a name="line.239"></a>
-<span class="sourceLineNo">240</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.240"></a>
-<span class="sourceLineNo">241</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.241"></a>
-<span class="sourceLineNo">242</span> return failure;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> }<a name="line.243"></a>
-<span class="sourceLineNo">244</span> });<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> admin.removePeer("testInterClusterReplication");<a name="line.246"></a>
-<span class="sourceLineNo">247</span> utility1.deleteTableData(tableName);<a name="line.247"></a>
-<span class="sourceLineNo">248</span> }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span> @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.252"></a>
-<span class="sourceLineNo">253</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.253"></a>
-<span class="sourceLineNo">254</span> //test that we can create mutliple WALFilters reflectively<a name="line.254"></a>
-<span class="sourceLineNo">255</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.256"></a>
-<span class="sourceLineNo">257</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.257"></a>
-<span class="sourceLineNo">258</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.258"></a>
-<span class="sourceLineNo">259</span> // now replicate some data.<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.261"></a>
-<span class="sourceLineNo">262</span> doPut(connection, row);<a name="line.262"></a>
-<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span> }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.266"></a>
-<span class="sourceLineNo">267</span> @Override<a name="line.267"></a>
-<span class="sourceLineNo">268</span> public boolean evaluate() throws Exception {<a name="line.268"></a>
-<span class="sourceLineNo">269</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> }<a name="line.270"></a>
-<span class="sourceLineNo">271</span> });<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.273"></a>
-<span class="sourceLineNo">274</span> //make sure our reflectively created filter is in the filter chain<a name="line.274"></a>
-<span class="sourceLineNo">275</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.275"></a>
-<span class="sourceLineNo">276</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.276"></a>
-<span class="sourceLineNo">277</span> }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span> @Test (expected=IOException.class)<a name="line.279"></a>
-<span class="sourceLineNo">280</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.281"></a>
-<span class="sourceLineNo">282</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span> //test that we can create mutliple WALFilters reflectively<a name="line.283"></a>
-<span class="sourceLineNo">284</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.284"></a>
-<span class="sourceLineNo">285</span> "IAmNotARealWalEntryFilter");<a name="line.285"></a>
-<span class="sourceLineNo">286</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.286"></a>
-<span class="sourceLineNo">287</span> }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span> @Test (expected=IOException.class)<a name="line.289"></a>
-<span class="sourceLineNo">290</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.290"></a>
-<span class="sourceLineNo">291</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.292"></a>
-<span class="sourceLineNo">293</span> //test that we can create mutliple WALFilters reflectively<a name="line.293"></a>
-<span class="sourceLineNo">294</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.294"></a>
-<span class="sourceLineNo">295</span> "IAmNotARealWalEntryFilter");<a name="line.295"></a>
-<span class="sourceLineNo">296</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span> @Test<a name="line.300"></a>
-<span class="sourceLineNo">301</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.301"></a>
-<span class="sourceLineNo">302</span> /*<a name="line.302"></a>
-<span class="sourceLineNo">303</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.303"></a>
-<span class="sourceLineNo">304</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.304"></a>
-<span class="sourceLineNo">305</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.305"></a>
-<span class="sourceLineNo">306</span> allows for custom JMX metrics.<a name="line.306"></a>
-<span class="sourceLineNo">307</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.307"></a>
-<span class="sourceLineNo">308</span> the two layers of wrapping to the actual BaseSource.<a name="line.308"></a>
-<span class="sourceLineNo">309</span> */<a name="line.309"></a>
-<span class="sourceLineNo">310</span> String id = "id";<a name="line.310"></a>
-<span class="sourceLineNo">311</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.312"></a>
-<span class="sourceLineNo">313</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.313"></a>
-<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
-<span class="sourceLineNo">315</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.317"></a>
-<span class="sourceLineNo">318</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.318"></a>
-<span class="sourceLineNo">319</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource);<a name="line.319"></a>
-<span class="sourceLineNo">320</span> String gaugeName = "gauge";<a name="line.320"></a>
-<span class="sourceLineNo">321</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.321"></a>
-<span class="sourceLineNo">322</span> String globalGaugeName = "source." + gaugeName;<a name="line.322"></a>
-<span class="sourceLineNo">323</span> long delta = 1;<a name="line.323"></a>
-<span class="sourceLineNo">324</span> String counterName = "counter";<a name="line.324"></a>
-<span class="sourceLineNo">325</span> String singleCounterName = "source.id." + counterName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span> String globalCounterName = "source." + counterName;<a name="line.326"></a>
-<span class="sourceLineNo">327</span> long count = 2;<a name="line.327"></a>
-<span class="sourceLineNo">328</span> source.decGauge(gaugeName, delta);<a name="line.328"></a>
-<span class="sourceLineNo">329</span> source.getMetricsContext();<a name="line.329"></a>
-<span class="sourceLineNo">330</span> source.getMetricsDescription();<a name="line.330"></a>
-<span class="sourceLineNo">331</span> source.getMetricsJmxContext();<a name="line.331"></a>
-<span class="sourceLineNo">332</span> source.getMetricsName();<a name="line.332"></a>
-<span class="sourceLineNo">333</span> source.incCounters(counterName, count);<a name="line.333"></a>
-<span class="sourceLineNo">334</span> source.incGauge(gaugeName, delta);<a name="line.334"></a>
-<span class="sourceLineNo">335</span> source.init();<a name="line.335"></a>
-<span class="sourceLineNo">336</span> source.removeMetric(gaugeName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span> source.setGauge(gaugeName, delta);<a name="line.337"></a>
-<span class="sourceLineNo">338</span> source.updateHistogram(counterName, count);<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.340"></a>
-<span class="sourceLineNo">341</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.341"></a>
-<span class="sourceLineNo">342</span> verify(globalRms).getMetricsContext();<a name="line.342"></a>
-<span class="sourceLineNo">343</span> verify(globalRms).getMetricsJmxContext();<a name="line.343"></a>
-<span class="sourceLineNo">344</span> verify(globalRms).getMetricsName();<a name="line.344"></a>
-<span class="sourceLineNo">345</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.345"></a>
-<span class="sourceLineNo">346</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.346"></a>
-<span class="sourceLineNo">347</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.347"></a>
-<span class="sourceLineNo">348</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.348"></a>
-<span class="sourceLineNo">349</span> verify(globalRms).init();<a name="line.349"></a>
-<span class="sourceLineNo">350</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.350"></a>
-<span class="sourceLineNo">351</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.352"></a>
-<span class="sourceLineNo">353</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.353"></a>
-<span class="sourceLineNo">354</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.354"></a>
-<span class="sourceLineNo">355</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.355"></a>
-<span class="sourceLineNo">356</span> }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span> private void doPut(byte[] row) throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span> doPut(connection, row);<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span> }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.364"></a>
-<span class="sourceLineNo">365</span> try (Table t = connection.getTable(tableName)) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span> Put put = new Put(row);<a name="line.366"></a>
-<span class="sourceLineNo">367</span> put.addColumn(famName, row, row);<a name="line.367"></a>
-<span class="sourceLineNo">368</span> t.put(put);<a name="line.368"></a>
-<span class="sourceLineNo">369</span> }<a name="line.369"></a>
-<span class="sourceLineNo">370</span> }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span> private static void doAssert(byte[] row) throws Exception {<a name="line.372"></a>
-<span class="sourceLineNo">373</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span> return; // first call<a name="line.374"></a>
-<span class="sourceLineNo">375</span> }<a name="line.375"></a>
-<span class="sourceLineNo">376</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.376"></a>
-<span class="sourceLineNo">377</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.377"></a>
-<span class="sourceLineNo">378</span> Assert.assertEquals(1, cells.size());<a name="line.378"></a>
-<span class="sourceLineNo">379</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.379"></a>
-<span class="sourceLineNo">380</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.380"></a>
-<span class="sourceLineNo">381</span> }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.383"></a>
-<span class="sourceLineNo">384</span> static UUID uuid = UUID.randomUUID();<a name="line.384"></a>
-<span class="sourceLineNo">385</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.385"></a>
-<span class="sourceLineNo">386</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.386"></a>
-<span class="sourceLineNo">387</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.387"></a>
-<span class="sourceLineNo">388</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.388"></a>
-<span class="sourceLineNo">389</span> static volatile List<Entry> lastEntries = null;<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span> public ReplicationEndpointForTest() {<a name="line.391"></a>
-<span class="sourceLineNo">392</span> replicateCount.set(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span> contructedCount.incrementAndGet();<a name="line.393"></a>
-<span class="sourceLineNo">394</span> }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span> @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span> public UUID getPeerUUID() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span> return uuid;<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span> @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span> replicateCount.incrementAndGet();<a name="line.403"></a>
-<span class="sourceLineNo">404</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.404"></a>
-<span class="sourceLineNo">405</span> return true;<a name="line.405"></a>
-<span class="sourceLineNo">406</span> }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span> @Override<a name="line.408"></a>
-<span class="sourceLineNo">409</span> public void start() {<a name="line.409"></a>
-<span class="sourceLineNo">410</span> startAsync();<a name="line.410"></a>
-<span class="sourceLineNo">411</span> }<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span> @Override<a name="line.413"></a>
-<span class="sourceLineNo">414</span> public void stop() {<a name="line.414"></a>
-<span class="sourceLineNo">415</span> stopAsync();<a name="line.415"></a>
-<span class="sourceLineNo">416</span> }<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span> @Override<a name="line.418"></a>
-<span class="sourceLineNo">419</span> protected void doStart() {<a name="line.419"></a>
-<span class="sourceLineNo">420</span> startedCount.incrementAndGet();<a name="line.420"></a>
-<span class="sourceLineNo">421</span> notifyStarted();<a name="line.421"></a>
-<span class="sourceLineNo">422</span> }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span> @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span> protected void doStop() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span> stoppedCount.incrementAndGet();<a name="line.426"></a>
-<span class="sourceLineNo">427</span> notifyStopped();<a name="line.427"></a>
-<span class="sourceLineNo">428</span> }<a name="line.428"></a>
-<span class="sourceLineNo">429</span> }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span> public static class InterClusterReplicationEndpointForTest<a name="line.431"></a>
-<span class="sourceLineNo">432</span> extends HBaseInterClusterReplicationEndpoint {<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.434"></a>
-<span class="sourceLineNo">435</span> static boolean failedOnce;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span> public InterClusterReplicationEndpointForTest() {<a name="line.437"></a>
-<span class="sourceLineNo">438</span> replicateCount.set(0);<a name="line.438"></a>
-<span class="sourceLineNo">439</span> }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span> @Override<a name="line.441"></a>
-<span class="sourceLineNo">442</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span> boolean success = super.replicate(replicateContext);<a name="line.443"></a>
-<span class="sourceLineNo">444</span> if (success) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span> replicateCount.addAndGet(replicateContext.entries.size());<a name="line.445"></a>
-<span class="sourceLineNo">446</span> }<a name="line.446"></a>
-<span class="sourceLineNo">447</span> return success;<a name="line.447"></a>
+<span class="sourceLineNo">165</span> doAssert(Bytes.toBytes("row42"));<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.167"></a>
+<span class="sourceLineNo">168</span> }<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span> @Test<a name="line.170"></a>
+<span class="sourceLineNo">171</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.171"></a>
+<span class="sourceLineNo">172</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.172"></a>
+<span class="sourceLineNo">173</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.173"></a>
+<span class="sourceLineNo">174</span> int peerCount = admin.getPeersCount();<a name="line.174"></a>
+<span class="sourceLineNo">175</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.175"></a>
+<span class="sourceLineNo">176</span> admin.addPeer(id,<a name="line.176"></a>
+<span class="sourceLineNo">177</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.177"></a>
+<span class="sourceLineNo">178</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.178"></a>
+<span class="sourceLineNo">179</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.179"></a>
+<span class="sourceLineNo">180</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.180"></a>
+<span class="sourceLineNo">181</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.181"></a>
+<span class="sourceLineNo">182</span> if (admin.getPeersCount() <= peerCount) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.183"></a>
+<span class="sourceLineNo">184</span> Threads.sleep(100);<a name="line.184"></a>
+<span class="sourceLineNo">185</span> }<a name="line.185"></a>
+<span class="sourceLineNo">186</span> // now replicate some data<a name="line.186"></a>
+<span class="sourceLineNo">187</span> doPut(row);<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.189"></a>
+<span class="sourceLineNo">190</span> @Override<a name="line.190"></a>
+<span class="sourceLineNo">191</span> public boolean evaluate() throws Exception {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.192"></a>
+<span class="sourceLineNo">193</span> // only send over one edit.<a name="line.193"></a>
+<span class="sourceLineNo">194</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.194"></a>
+<span class="sourceLineNo">195</span> LOG.info("count=" + count);<a name="line.195"></a>
+<span class="sourceLineNo">196</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.196"></a>
+<span class="sourceLineNo">197</span> }<a name="line.197"></a>
+<span class="sourceLineNo">198</span> });<a name="line.198"></a>
+<span class="sourceLineNo">199</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.200"></a>
+<span class="sourceLineNo">201</span> }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.203"></a>
+<span class="sourceLineNo">204</span> }<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span> @Test<a name="line.206"></a>
+<span class="sourceLineNo">207</span> public void testInterClusterReplication() throws Exception {<a name="line.207"></a>
+<span class="sourceLineNo">208</span> final String id = "testInterClusterReplication";<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.210"></a>
+<span class="sourceLineNo">211</span> int totEdits = 0;<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> // Make sure edits are spread across regions because we do region based batching<a name="line.213"></a>
+<span class="sourceLineNo">214</span> // before shipping edits.<a name="line.214"></a>
+<span class="sourceLineNo">215</span> for(HRegion region: regions) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span> RegionInfo hri = region.getRegionInfo();<a name="line.216"></a>
+<span class="sourceLineNo">217</span> byte[] row = hri.getStartKey();<a name="line.217"></a>
+<span class="sourceLineNo">218</span> for (int i = 0; i < 100; i++) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span> if (row.length > 0) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span> Put put = new Put(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span> put.addColumn(famName, row, row);<a name="line.221"></a>
+<span class="sourceLineNo">222</span> region.put(put);<a name="line.222"></a>
+<span class="sourceLineNo">223</span> totEdits++;<a name="line.223"></a>
+<span class="sourceLineNo">224</span> }<a name="line.224"></a>
+<span class="sourceLineNo">225</span> }<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span> admin.addPeer(id,<a name="line.228"></a>
+<span class="sourceLineNo">229</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.229"></a>
+<span class="sourceLineNo">230</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.230"></a>
+<span class="sourceLineNo">231</span> null);<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> final int numEdits = totEdits;<a name="line.233"></a>
+<span class="sourceLineNo">234</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> public boolean evaluate() throws Exception {<a name="line.236"></a>
+<span class="sourceLineNo">237</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.237"></a>
+<span class="sourceLineNo">238</span> }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span> @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span> public String explainFailure() throws Exception {<a name="line.241"></a>
+<span class="sourceLineNo">242</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.242"></a>
+<span class="sourceLineNo">243</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.243"></a>
+<span class="sourceLineNo">244</span> return failure;<a name="line.244"></a>
+<span class="sourceLineNo">245</span> }<a name="line.245"></a>
+<span class="sourceLineNo">246</span> });<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> admin.removePeer("testInterClusterReplication");<a name="line.248"></a>
+<span class="sourceLineNo">249</span> utility1.deleteTableData(tableName);<a name="line.249"></a>
+<span class="sourceLineNo">250</span> }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span> @Test<a name="line.252"></a>
+<span class="sourceLineNo">253</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.253"></a>
+<span class="sourceLineNo">254</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.254"></a>
+<span class="sourceLineNo">255</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.255"></a>
+<span class="sourceLineNo">256</span> //test that we can create mutliple WALFilters reflectively<a name="line.256"></a>
+<span class="sourceLineNo">257</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.257"></a>
+<span class="sourceLineNo">258</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.258"></a>
+<span class="sourceLineNo">259</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.259"></a>
+<span class="sourceLineNo">260</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> // now replicate some data.<a name="line.261"></a>
+<span class="sourceLineNo">262</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.263"></a>
+<span class="sourceLineNo">264</span> doPut(connection, row);<a name="line.264"></a>
+<span class="sourceLineNo">265</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.265"></a>
+<span class="sourceLineNo">266</span> }<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span> @Override<a name="line.269"></a>
+<span class="sourceLineNo">270</span> public boolean evaluate() throws Exception {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.271"></a>
+<span class="sourceLineNo">272</span> }<a name="line.272"></a>
+<span class="sourceLineNo">273</span> });<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.275"></a>
+<span class="sourceLineNo">276</span> //make sure our reflectively created filter is in the filter chain<a name="line.276"></a>
+<span class="sourceLineNo">277</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.277"></a>
+<span class="sourceLineNo">278</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.278"></a>
+<span class="sourceLineNo">279</span> }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span> @Test (expected=IOException.class)<a name="line.281"></a>
+<span class="sourceLineNo">282</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.283"></a>
+<span class="sourceLineNo">284</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span> //test that we can create mutliple WALFilters reflectively<a name="line.285"></a>
+<span class="sourceLineNo">286</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.286"></a>
+<span class="sourceLineNo">287</span> "IAmNotARealWalEntryFilter");<a name="line.287"></a>
+<span class="sourceLineNo">288</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.288"></a>
+<span class="sourceLineNo">289</span> }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span> @Test (expected=IOException.class)<a name="line.291"></a>
+<span class="sourceLineNo">292</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.292"></a>
+<span class="sourceLineNo">293</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.293"></a>
+<span class="sourceLineNo">294</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.294"></a>
+<span class="sourceLineNo">295</span> //test that we can create mutliple WALFilters reflectively<a name="line.295"></a>
+<span class="sourceLineNo">296</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.296"></a>
+<span class="sourceLineNo">297</span> "IAmNotARealWalEntryFilter");<a name="line.297"></a>
+<span class="sourceLineNo">298</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.298"></a>
+<span class="sourceLineNo">299</span> }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span> @Test<a name="line.302"></a>
+<span class="sourceLineNo">303</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.303"></a>
+<span class="sourceLineNo">304</span> /*<a name="line.304"></a>
+<span class="sourceLineNo">305</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.305"></a>
+<span class="sourceLineNo">306</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.306"></a>
+<span class="sourceLineNo">307</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.307"></a>
+<span class="sourceLineNo">308</span> allows for custom JMX metrics.<a name="line.308"></a>
+<span class="sourceLineNo">309</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.309"></a>
+<span class="sourceLineNo">310</span> the two layers of wrapping to the actual BaseSource.<a name="line.310"></a>
+<span class="sourceLineNo">311</span> */<a name="line.311"></a>
+<span class="sourceLineNo">312</span> String id = "id";<a name="line.312"></a>
+<span class="sourceLineNo">313</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.313"></a>
+<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
+<span class="sourceLineNo">315</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
+<span class="sourceLineNo">316</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.316"></a>
+<span class="sourceLineNo">317</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.319"></a>
+<span class="sourceLineNo">320</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.320"></a>
+<span class="sourceLineNo">321</span> Map<String, MetricsReplicationSourceSource> singleSourceSourceByTable = new HashMap<>();<a name="line.321"></a>
+<span class="sourceLineNo">322</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource,<a name="line.322"></a>
+<span class="sourceLineNo">323</span> singleSourceSourceByTable);<a name="line.323"></a>
+<span class="sourceLineNo">324</span> String gaugeName = "gauge";<a name="line.324"></a>
+<span class="sourceLineNo">325</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.325"></a>
+<span class="sourceLineNo">326</span> String globalGaugeName = "source." + gaugeName;<a name="line.326"></a>
+<span class="sourceLineNo">327</span> long delta = 1;<a name="line.327"></a>
+<span class="sourceLineNo">328</span> String counterName = "counter";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> String singleCounterName = "source.id." + counterName;<a name="line.329"></a>
+<span class="sourceLineNo">330</span> String globalCounterName = "source." + counterName;<a name="line.330"></a>
+<span class="sourceLineNo">331</span> long count = 2;<a name="line.331"></a>
+<span class="sourceLineNo">332</span> source.decGauge(gaugeName, delta);<a name="line.332"></a>
+<span class="sourceLineNo">333</span> source.getMetricsContext();<a name="line.333"></a>
+<span class="sourceLineNo">334</span> source.getMetricsDescription();<a name="line.334"></a>
+<span class="sourceLineNo">335</span> source.getMetricsJmxContext();<a name="line.335"></a>
+<span class="sourceLineNo">336</span> source.getMetricsName();<a name="line.336"></a>
+<span class="sourceLineNo">337</span> source.incCounters(counterName, count);<a name="line.337"></a>
+<span class="sourceLineNo">338</span> source.incGauge(gaugeName, delta);<a name="line.338"></a>
+<span class="sourceLineNo">339</span> source.init();<a name="line.339"></a>
+<span class="sourceLineNo">340</span> source.removeMetric(gaugeName);<a name="line.340"></a>
+<span class="sourceLineNo">341</span> source.setGauge(gaugeName, delta);<a name="line.341"></a>
+<span class="sourceLineNo">342</span> source.updateHistogram(counterName, count);<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.344"></a>
+<span class="sourceLineNo">345</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.345"></a>
+<span class="sourceLineNo">346</span> verify(globalRms).getMetricsContext();<a name="line.346"></a>
+<span class="sourceLineNo">347</span> verify(globalRms).getMetricsJmxContext();<a name="line.347"></a>
+<span class="sourceLineNo">348</span> verify(globalRms).getMetricsName();<a name="line.348"></a>
+<span class="sourceLineNo">349</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.349"></a>
+<span class="sourceLineNo">350</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.350"></a>
+<span class="sourceLineNo">351</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.351"></a>
+<span class="sourceLineNo">352</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.352"></a>
+<span class="sourceLineNo">353</span> verify(globalRms).init();<a name="line.353"></a>
+<span class="sourceLineNo">354</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.354"></a>
+<span class="sourceLineNo">355</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.355"></a>
+<span class="sourceLineNo">356</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.356"></a>
+<span class="sourceLineNo">357</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.357"></a>
+<span class="sourceLineNo">358</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.358"></a>
+<span class="sourceLineNo">359</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span> //check singleSourceSourceByTable metrics.<a name="line.361"></a>
+<span class="sourceLineNo">362</span> // singleSourceSourceByTable map entry will be created only<a name="line.362"></a>
+<span class="sourceLineNo">363</span> // after calling #setAgeOfLastShippedOpByTable<a name="line.363"></a>
+<span class="sourceLineNo">364</span> boolean containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.364"></a>
+<span class="sourceLineNo">365</span> .containsKey("RandomNewTable");<a name="line.365"></a>
+<span class="sourceLineNo">366</span> Assert.assertEquals(false, containsRandomNewTable);<a name="line.366"></a>
+<span class="sourceLineNo">367</span> source.setAgeOfLastShippedOpByTable(123L, "RandomNewTable");<a name="line.367"></a>
+<span class="sourceLineNo">368</span> containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.368"></a>
+<span class="sourceLineNo">369</span> .containsKey("RandomNewTable");<a name="line.369"></a>
+<span class="sourceLineNo">370</span> Assert.assertEquals(true, containsRandomNewTable);<a name="line.370"></a>
+<span class="sourceLineNo">371</span> MetricsReplicationSourceSource msr = source.getSingleSourceSourceByTable()<a name="line.371"></a>
+<span class="sourceLineNo">372</span> .get("RandomNewTable");<a name="line.372"></a>
+<span class="sourceLineNo">373</span> // cannot put more concreate value here to verify because the age is arbitrary.<a name="line.373"></a>
+<span class="sourceLineNo">374</span> // as long as it's greater than 0, we see it as correct answer.<a name="line.374"></a>
+<span class="sourceLineNo">375</span> Assert.assertTrue(msr.getLastShippedAge() > 0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span> }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span> private void doPut(byte[] row) throws IOException {<a name="line.378"></a>
+<span class="sourceLineNo">379</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span> doPut(connection, row);<a name="line.380"></a>
+<span class="sourceLineNo">381</span> }<a name="line.381"></a>
+<span class="sourceLineNo">382</span> }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.384"></a>
+<span class="sourceLineNo">385</span> try (Table t = connection.getTable(tableName)) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span> Put put = new Put(row);<a name="line.386"></a>
+<span class="sourceLineNo">387</span> put.addColumn(famName, row, row);<a name="line.387"></a>
+<span class="sourceLineNo">388</span> t.put(put);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<a name="line.389"></a>
+<span class="sourceLineNo">390</span> }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span> private static void doAssert(byte[] row) throws Exception {<a name="line.392"></a>
+<span class="sourceLineNo">393</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span> return; // first call<a name="line.394"></a>
+<span class="sourceLineNo">395</span> }<a name="line.395"></a>
+<span class="sourceLineNo">396</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.396"></a>
+<span class="sourceLineNo">397</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.397"></a>
+<span class="sourceLineNo">398</span> Assert.assertEquals(1, cells.size());<a name="line.398"></a>
+<span class="sourceLineNo">399</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.399"></a>
+<span class="sourceLineNo">400</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.400"></a>
+<span class="sourceLineNo">401</span> }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.403"></a>
+<span class="sourceLineNo">404</span> static UUID uuid = UUID.randomUUID();<a name="line.404"></a>
+<span class="sourceLineNo">405</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.405"></a>
+<span class="sourceLineNo">406</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.406"></a>
+<span class="sourceLineNo">407</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.407"></a>
+<span class="sourceLineNo">408</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.408"></a>
+<span class="sourceLineNo">409</span> static volatile List<Entry> lastEntries = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span> public ReplicationEndpointForTest() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span> replicateCount.set(0);<a name="line.412"></a>
+<span class="sourceLineNo">413</span> contructedCount.incrementAndGet();<a name="line.413"></a>
+<span class="sourceLineNo">414</span> }<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span> @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span> public UUID getPeerUUID() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span> return uuid;<a name="line.418"></a>
+<span class="sourceLineNo">419</span> }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span> @Override<a name="line.421"></a>
+<span class="sourceLineNo">422</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span> replicateCount.incrementAndGet();<a name="line.423"></a>
+<span class="sourceLineNo">424</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.424"></a>
+<span class="sourceLineNo">425</span> return true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span> }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span> @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span> public void start() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span> startAsync();<a name="line.430"></a>
+<span class="sourceLineNo">431</span> }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span> @Override<a name="line.433"></a>
+<span class="sourceLineNo">434</span> public void stop() {<a name="line.434"></a>
+<span class="sourceLineNo">435</span> stopAsync();<a name="line.435"></a>
+<span class="sourceLineNo">436</span> }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span> @Override<a name="line.438"></a>
+<span class="sourceLineNo">439</span> protected void doStart() {<a name="line.439"></a>
+<span class="sourceLineNo">440</span> startedCount.incrementAndGet();<a name="line.440"></a>
+<span class="sourceLineNo">441</span> notifyStarted();<a name="line.441"></a>
+<span class="sourceLineNo">442</span> }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span> @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span> protected void doStop() {<a name="line.445"></a>
+<span class="sourceLineNo">446</span> stoppedCount.incrementAndGet();<a name="line.446"></a>
+<span class="sourceLineNo">447</span> notifyStopped();<a name="line.447"></a>
<span class="sourceLineNo">448</span> }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span> @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span> protected Callable<Integer> createReplicator(List<Entry> entries, int ordinal) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span> // Fail only once, we don't want to slow down the test.<a name="line.452"></a>
-<span class="sourceLineNo">453</span> if (failedOnce) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span> return () -> ordinal;<a name="line.454"></a>
-<span class="sourceLineNo">455</span> } else {<a name="line.455"></a>
-<span class="sourceLineNo">456</span> failedOnce = true;<a name="line.456"></a>
-<span class="sourceLineNo">457</span> return () -> {<a name="line.457"></a>
-<span class="sourceLineNo">458</span> throw new IOException("Sample Exception: Failed to replicate.");<a name="line.458"></a>
-<span class="sourceLineNo">459</span> };<a name="line.459"></a>
-<span class="sourceLineNo">460</span> }<a name="line.460"></a>
-<span class="sourceLineNo">461</span> }<a name="line.461"></a>
-<span class="sourceLineNo">462</span> }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span> public static class ReplicationEndpointReturningFalse extends ReplicationEndpointForTest {<a name="line.464"></a>
-<span class="sourceLineNo">465</span> static int COUNT = 10;<a name="line.465"></a>
-<span class="sourceLineNo">466</span> static AtomicReference<Exception> ex = new AtomicReference<>(null);<a name="line.466"></a>
-<span class="sourceLineNo">467</span> static AtomicBoolean replicated = new AtomicBoolean(false);<a name="line.467"></a>
-<span class="sourceLineNo">468</span> @Override<a name="line.468"></a>
-<span class="sourceLineNo">469</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span> try {<a name="line.470"></a>
-<span class="sourceLineNo">471</span> // check row<a name="line.471"></a>
-<span class="sourceLineNo">472</span> doAssert(row);<a name="line.472"></a>
-<span class="sourceLineNo">473</span> } catch (Exception e) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span> ex.set(e);<a name="line.474"></a>
-<span class="sourceLineNo">475</span> }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span> super.replicate(replicateContext);<a name="line.477"></a>
-<span class="sourceLineNo">478</span> LOG.info("Replicated " + Byte
<TRUNCATED>
[10/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html
index db9d94c..11e7195 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html
@@ -32,299 +32,304 @@
<span class="sourceLineNo">024</span>import org.apache.hadoop.fs.Path;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.Cell;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.replication.ReplicationEndpoint;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.slf4j.Logger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.slf4j.LoggerFactory;<a name="line.34"></a>
-<span class="sourceLineNo">035</span><a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.BulkLoadDescriptor;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.StoreDescriptor;<a name="line.37"></a>
-<span class="sourceLineNo">038</span><a name="line.38"></a>
-<span class="sourceLineNo">039</span>/**<a name="line.39"></a>
-<span class="sourceLineNo">040</span> * This thread reads entries from a queue and ships them. Entries are placed onto the queue by<a name="line.40"></a>
-<span class="sourceLineNo">041</span> * ReplicationSourceWALReaderThread<a name="line.41"></a>
-<span class="sourceLineNo">042</span> */<a name="line.42"></a>
-<span class="sourceLineNo">043</span>@InterfaceAudience.Private<a name="line.43"></a>
-<span class="sourceLineNo">044</span>public class ReplicationSourceShipper extends Thread {<a name="line.44"></a>
-<span class="sourceLineNo">045</span> private static final Logger LOG = LoggerFactory.getLogger(ReplicationSourceShipper.class);<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span> // Hold the state of a replication worker thread<a name="line.47"></a>
-<span class="sourceLineNo">048</span> public enum WorkerState {<a name="line.48"></a>
-<span class="sourceLineNo">049</span> RUNNING,<a name="line.49"></a>
-<span class="sourceLineNo">050</span> STOPPED,<a name="line.50"></a>
-<span class="sourceLineNo">051</span> FINISHED, // The worker is done processing a recovered queue<a name="line.51"></a>
-<span class="sourceLineNo">052</span> }<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span> private final Configuration conf;<a name="line.54"></a>
-<span class="sourceLineNo">055</span> protected final String walGroupId;<a name="line.55"></a>
-<span class="sourceLineNo">056</span> protected final PriorityBlockingQueue<Path> queue;<a name="line.56"></a>
-<span class="sourceLineNo">057</span> private final ReplicationSourceInterface source;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span> // Last position in the log that we sent to ZooKeeper<a name="line.59"></a>
-<span class="sourceLineNo">060</span> // It will be accessed by the stats thread so make it volatile<a name="line.60"></a>
-<span class="sourceLineNo">061</span> private volatile long currentPosition = -1;<a name="line.61"></a>
-<span class="sourceLineNo">062</span> // Path of the current log<a name="line.62"></a>
-<span class="sourceLineNo">063</span> private Path currentPath;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> // Current state of the worker thread<a name="line.64"></a>
-<span class="sourceLineNo">065</span> private volatile WorkerState state;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> protected ReplicationSourceWALReader entryReader;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span> // How long should we sleep for each retry<a name="line.68"></a>
-<span class="sourceLineNo">069</span> protected final long sleepForRetries;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> // Maximum number of retries before taking bold actions<a name="line.70"></a>
-<span class="sourceLineNo">071</span> protected final int maxRetriesMultiplier;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span> public ReplicationSourceShipper(Configuration conf, String walGroupId,<a name="line.73"></a>
-<span class="sourceLineNo">074</span> PriorityBlockingQueue<Path> queue, ReplicationSourceInterface source) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span> this.conf = conf;<a name="line.75"></a>
-<span class="sourceLineNo">076</span> this.walGroupId = walGroupId;<a name="line.76"></a>
-<span class="sourceLineNo">077</span> this.queue = queue;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> this.source = source;<a name="line.78"></a>
-<span class="sourceLineNo">079</span> this.sleepForRetries =<a name="line.79"></a>
-<span class="sourceLineNo">080</span> this.conf.getLong("replication.source.sleepforretries", 1000); // 1 second<a name="line.80"></a>
-<span class="sourceLineNo">081</span> this.maxRetriesMultiplier =<a name="line.81"></a>
-<span class="sourceLineNo">082</span> this.conf.getInt("replication.source.maxretriesmultiplier", 300); // 5 minutes @ 1 sec per<a name="line.82"></a>
-<span class="sourceLineNo">083</span> }<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span> @Override<a name="line.85"></a>
-<span class="sourceLineNo">086</span> public final void run() {<a name="line.86"></a>
-<span class="sourceLineNo">087</span> setWorkerState(WorkerState.RUNNING);<a name="line.87"></a>
-<span class="sourceLineNo">088</span> // Loop until we close down<a name="line.88"></a>
-<span class="sourceLineNo">089</span> while (isActive()) {<a name="line.89"></a>
-<span class="sourceLineNo">090</span> // Sleep until replication is enabled again<a name="line.90"></a>
-<span class="sourceLineNo">091</span> if (!source.isPeerEnabled()) {<a name="line.91"></a>
-<span class="sourceLineNo">092</span> // The peer enabled check is in memory, not expensive, so do not need to increase the<a name="line.92"></a>
-<span class="sourceLineNo">093</span> // sleep interval as it may cause a long lag when we enable the peer.<a name="line.93"></a>
-<span class="sourceLineNo">094</span> sleepForRetries("Replication is disabled", 1);<a name="line.94"></a>
-<span class="sourceLineNo">095</span> continue;<a name="line.95"></a>
-<span class="sourceLineNo">096</span> }<a name="line.96"></a>
-<span class="sourceLineNo">097</span> try {<a name="line.97"></a>
-<span class="sourceLineNo">098</span> WALEntryBatch entryBatch = entryReader.take();<a name="line.98"></a>
-<span class="sourceLineNo">099</span> // the NO_MORE_DATA instance has no path so do not all shipEdits<a name="line.99"></a>
-<span class="sourceLineNo">100</span> if (entryBatch == WALEntryBatch.NO_MORE_DATA) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span> noMoreData();<a name="line.101"></a>
-<span class="sourceLineNo">102</span> } else {<a name="line.102"></a>
-<span class="sourceLineNo">103</span> shipEdits(entryBatch);<a name="line.103"></a>
-<span class="sourceLineNo">104</span> }<a name="line.104"></a>
-<span class="sourceLineNo">105</span> } catch (InterruptedException e) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span> LOG.trace("Interrupted while waiting for next replication entry batch", e);<a name="line.106"></a>
-<span class="sourceLineNo">107</span> Thread.currentThread().interrupt();<a name="line.107"></a>
-<span class="sourceLineNo">108</span> }<a name="line.108"></a>
-<span class="sourceLineNo">109</span> }<a name="line.109"></a>
-<span class="sourceLineNo">110</span> // If the worker exits run loop without finishing its task, mark it as stopped.<a name="line.110"></a>
-<span class="sourceLineNo">111</span> if (!isFinished()) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span> setWorkerState(WorkerState.STOPPED);<a name="line.112"></a>
-<span class="sourceLineNo">113</span> } else {<a name="line.113"></a>
-<span class="sourceLineNo">114</span> postFinish();<a name="line.114"></a>
-<span class="sourceLineNo">115</span> }<a name="line.115"></a>
-<span class="sourceLineNo">116</span> }<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span> // To be implemented by recovered shipper<a name="line.118"></a>
-<span class="sourceLineNo">119</span> protected void noMoreData() {<a name="line.119"></a>
-<span class="sourceLineNo">120</span> }<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span> // To be implemented by recovered shipper<a name="line.122"></a>
-<span class="sourceLineNo">123</span> protected void postFinish() {<a name="line.123"></a>
-<span class="sourceLineNo">124</span> }<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span> /**<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * get batchEntry size excludes bulk load file sizes.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * Uses ReplicationSourceWALReader's static method.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span> private int getBatchEntrySizeExcludeBulkLoad(WALEntryBatch entryBatch) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span> int totalSize = 0;<a name="line.131"></a>
-<span class="sourceLineNo">132</span> for(Entry entry : entryBatch.getWalEntries()) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span> totalSize += entryReader.getEntrySizeExcludeBulkLoad(entry);<a name="line.133"></a>
-<span class="sourceLineNo">134</span> }<a name="line.134"></a>
-<span class="sourceLineNo">135</span> return totalSize;<a name="line.135"></a>
-<span class="sourceLineNo">136</span> }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span> /**<a name="line.138"></a>
-<span class="sourceLineNo">139</span> * Do the shipping logic<a name="line.139"></a>
-<span class="sourceLineNo">140</span> */<a name="line.140"></a>
-<span class="sourceLineNo">141</span> private void shipEdits(WALEntryBatch entryBatch) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span> List<Entry> entries = entryBatch.getWalEntries();<a name="line.142"></a>
-<span class="sourceLineNo">143</span> int sleepMultiplier = 0;<a name="line.143"></a>
-<span class="sourceLineNo">144</span> if (entries.isEmpty()) {<a name="line.144"></a>
-<span class="sourceLineNo">145</span> if (updateLogPosition(entryBatch)) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span> // if there was nothing to ship and it's not an error<a name="line.146"></a>
-<span class="sourceLineNo">147</span> // set "ageOfLastShippedOp" to <now> to indicate that we're current<a name="line.147"></a>
-<span class="sourceLineNo">148</span> source.getSourceMetrics().setAgeOfLastShippedOp(EnvironmentEdgeManager.currentTime(),<a name="line.148"></a>
-<span class="sourceLineNo">149</span> walGroupId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span> }<a name="line.150"></a>
-<span class="sourceLineNo">151</span> return;<a name="line.151"></a>
-<span class="sourceLineNo">152</span> }<a name="line.152"></a>
-<span class="sourceLineNo">153</span> int currentSize = (int) entryBatch.getHeapSize();<a name="line.153"></a>
-<span class="sourceLineNo">154</span> int sizeExcludeBulkLoad = getBatchEntrySizeExcludeBulkLoad(entryBatch);<a name="line.154"></a>
-<span class="sourceLineNo">155</span> while (isActive()) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span> try {<a name="line.156"></a>
-<span class="sourceLineNo">157</span> try {<a name="line.157"></a>
-<span class="sourceLineNo">158</span> source.tryThrottle(currentSize);<a name="line.158"></a>
-<span class="sourceLineNo">159</span> } catch (InterruptedException e) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span> LOG.debug("Interrupted while sleeping for throttling control");<a name="line.160"></a>
-<span class="sourceLineNo">161</span> Thread.currentThread().interrupt();<a name="line.161"></a>
-<span class="sourceLineNo">162</span> // current thread might be interrupted to terminate<a name="line.162"></a>
-<span class="sourceLineNo">163</span> // directly go back to while() for confirm this<a name="line.163"></a>
-<span class="sourceLineNo">164</span> continue;<a name="line.164"></a>
-<span class="sourceLineNo">165</span> }<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span> // create replicateContext here, so the entries can be GC'd upon return from this call<a name="line.167"></a>
-<span class="sourceLineNo">168</span> // stack<a name="line.168"></a>
-<span class="sourceLineNo">169</span> ReplicationEndpoint.ReplicateContext replicateContext =<a name="line.169"></a>
-<span class="sourceLineNo">170</span> new ReplicationEndpoint.ReplicateContext();<a name="line.170"></a>
-<span class="sourceLineNo">171</span> replicateContext.setEntries(entries).setSize(currentSize);<a name="line.171"></a>
-<span class="sourceLineNo">172</span> replicateContext.setWalGroupId(walGroupId);<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span> long startTimeNs = System.nanoTime();<a name="line.174"></a>
-<span class="sourceLineNo">175</span> // send the edits to the endpoint. Will block until the edits are shipped and acknowledged<a name="line.175"></a>
-<span class="sourceLineNo">176</span> boolean replicated = source.getReplicationEndpoint().replicate(replicateContext);<a name="line.176"></a>
-<span class="sourceLineNo">177</span> long endTimeNs = System.nanoTime();<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span> if (!replicated) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span> continue;<a name="line.180"></a>
-<span class="sourceLineNo">181</span> } else {<a name="line.181"></a>
-<span class="sourceLineNo">182</span> sleepMultiplier = Math.max(sleepMultiplier - 1, 0);<a name="line.182"></a>
-<span class="sourceLineNo">183</span> }<a name="line.183"></a>
-<span class="sourceLineNo">184</span> // Clean up hfile references<a name="line.184"></a>
-<span class="sourceLineNo">185</span> for (Entry entry : entries) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span> cleanUpHFileRefs(entry.getEdit());<a name="line.186"></a>
-<span class="sourceLineNo">187</span> }<a name="line.187"></a>
-<span class="sourceLineNo">188</span> // Log and clean up WAL logs<a name="line.188"></a>
-<span class="sourceLineNo">189</span> updateLogPosition(entryBatch);<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span> //offsets totalBufferUsed by deducting shipped batchSize (excludes bulk load size)<a name="line.191"></a>
-<span class="sourceLineNo">192</span> //this sizeExcludeBulkLoad has to use same calculation that when calling<a name="line.192"></a>
-<span class="sourceLineNo">193</span> //acquireBufferQuota() in ReplicatinoSourceWALReader because they maintain<a name="line.193"></a>
-<span class="sourceLineNo">194</span> //same variable: totalBufferUsed<a name="line.194"></a>
-<span class="sourceLineNo">195</span> source.postShipEdits(entries, sizeExcludeBulkLoad);<a name="line.195"></a>
-<span class="sourceLineNo">196</span> // FIXME check relationship between wal group and overall<a name="line.196"></a>
-<span class="sourceLineNo">197</span> source.getSourceMetrics().shipBatch(entryBatch.getNbOperations(), currentSize,<a name="line.197"></a>
-<span class="sourceLineNo">198</span> entryBatch.getNbHFiles());<a name="line.198"></a>
-<span class="sourceLineNo">199</span> source.getSourceMetrics().setAgeOfLastShippedOp(<a name="line.199"></a>
-<span class="sourceLineNo">200</span> entries.get(entries.size() - 1).getKey().getWriteTime(), walGroupId);<a name="line.200"></a>
-<span class="sourceLineNo">201</span> if (LOG.isTraceEnabled()) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span> LOG.trace("Replicated " + entries.size() + " entries or " + entryBatch.getNbOperations()<a name="line.202"></a>
-<span class="sourceLineNo">203</span> + " operations in " + ((endTimeNs - startTimeNs) / 1000000) + " ms");<a name="line.203"></a>
-<span class="sourceLineNo">204</span> }<a name="line.204"></a>
-<span class="sourceLineNo">205</span> break;<a name="line.205"></a>
-<span class="sourceLineNo">206</span> } catch (Exception ex) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span> LOG.warn("{} threw unknown exception:",<a name="line.207"></a>
-<span class="sourceLineNo">208</span> source.getReplicationEndpoint().getClass().getName(), ex);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> if (sleepForRetries("ReplicationEndpoint threw exception", sleepMultiplier)) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span> sleepMultiplier++;<a name="line.210"></a>
-<span class="sourceLineNo">211</span> }<a name="line.211"></a>
-<span class="sourceLineNo">212</span> }<a name="line.212"></a>
-<span class="sourceLineNo">213</span> }<a name="line.213"></a>
-<span class="sourceLineNo">214</span> }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span> private void cleanUpHFileRefs(WALEdit edit) throws IOException {<a name="line.216"></a>
-<span class="sourceLineNo">217</span> String peerId = source.getPeerId();<a name="line.217"></a>
-<span class="sourceLineNo">218</span> if (peerId.contains("-")) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span> // peerClusterZnode will be in the form peerId + "-" + rsZNode.<a name="line.219"></a>
-<span class="sourceLineNo">220</span> // A peerId will not have "-" in its name, see HBASE-11394<a name="line.220"></a>
-<span class="sourceLineNo">221</span> peerId = peerId.split("-")[0];<a name="line.221"></a>
-<span class="sourceLineNo">222</span> }<a name="line.222"></a>
-<span class="sourceLineNo">223</span> List<Cell> cells = edit.getCells();<a name="line.223"></a>
-<span class="sourceLineNo">224</span> int totalCells = cells.size();<a name="line.224"></a>
-<span class="sourceLineNo">225</span> for (int i = 0; i < totalCells; i++) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span> Cell cell = cells.get(i);<a name="line.226"></a>
-<span class="sourceLineNo">227</span> if (CellUtil.matchingQualifier(cell, WALEdit.BULK_LOAD)) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span> BulkLoadDescriptor bld = WALEdit.getBulkLoadDescriptor(cell);<a name="line.228"></a>
-<span class="sourceLineNo">229</span> List<StoreDescriptor> stores = bld.getStoresList();<a name="line.229"></a>
-<span class="sourceLineNo">230</span> int totalStores = stores.size();<a name="line.230"></a>
-<span class="sourceLineNo">231</span> for (int j = 0; j < totalStores; j++) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span> List<String> storeFileList = stores.get(j).getStoreFileList();<a name="line.232"></a>
-<span class="sourceLineNo">233</span> source.getSourceManager().cleanUpHFileRefs(peerId, storeFileList);<a name="line.233"></a>
-<span class="sourceLineNo">234</span> source.getSourceMetrics().decrSizeOfHFileRefsQueue(storeFileList.size());<a name="line.234"></a>
-<span class="sourceLineNo">235</span> }<a name="line.235"></a>
-<span class="sourceLineNo">236</span> }<a name="line.236"></a>
-<span class="sourceLineNo">237</span> }<a name="line.237"></a>
-<span class="sourceLineNo">238</span> }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span> private boolean updateLogPosition(WALEntryBatch batch) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span> boolean updated = false;<a name="line.241"></a>
-<span class="sourceLineNo">242</span> // if end of file is true, then the logPositionAndCleanOldLogs method will remove the file<a name="line.242"></a>
-<span class="sourceLineNo">243</span> // record on zk, so let's call it. The last wal position maybe zero if end of file is true and<a name="line.243"></a>
-<span class="sourceLineNo">244</span> // there is no entry in the batch. It is OK because that the queue storage will ignore the zero<a name="line.244"></a>
-<span class="sourceLineNo">245</span> // position and the file will be removed soon in cleanOldLogs.<a name="line.245"></a>
-<span class="sourceLineNo">246</span> if (batch.isEndOfFile() || !batch.getLastWalPath().equals(currentPath) ||<a name="line.246"></a>
-<span class="sourceLineNo">247</span> batch.getLastWalPosition() != currentPosition) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span> source.getSourceManager().logPositionAndCleanOldLogs(source.getQueueId(),<a name="line.248"></a>
-<span class="sourceLineNo">249</span> source.isRecovered(), batch);<a name="line.249"></a>
-<span class="sourceLineNo">250</span> updated = true;<a name="line.250"></a>
-<span class="sourceLineNo">251</span> }<a name="line.251"></a>
-<span class="sourceLineNo">252</span> // if end of file is true, then we can just skip to the next file in queue.<a name="line.252"></a>
-<span class="sourceLineNo">253</span> // the only exception is for recovered queue, if we reach the end of the queue, then there will<a name="line.253"></a>
-<span class="sourceLineNo">254</span> // no more files so here the currentPath may be null.<a name="line.254"></a>
-<span class="sourceLineNo">255</span> if (batch.isEndOfFile()) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span> currentPath = entryReader.getCurrentPath();<a name="line.256"></a>
-<span class="sourceLineNo">257</span> currentPosition = 0L;<a name="line.257"></a>
-<span class="sourceLineNo">258</span> } else {<a name="line.258"></a>
-<span class="sourceLineNo">259</span> currentPath = batch.getLastWalPath();<a name="line.259"></a>
-<span class="sourceLineNo">260</span> currentPosition = batch.getLastWalPosition();<a name="line.260"></a>
-<span class="sourceLineNo">261</span> }<a name="line.261"></a>
-<span class="sourceLineNo">262</span> return updated;<a name="line.262"></a>
-<span class="sourceLineNo">263</span> }<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span> public void startup(UncaughtExceptionHandler handler) {<a name="line.265"></a>
-<span class="sourceLineNo">266</span> String name = Thread.currentThread().getName();<a name="line.266"></a>
-<span class="sourceLineNo">267</span> Threads.setDaemonThreadRunning(this,<a name="line.267"></a>
-<span class="sourceLineNo">268</span> name + ".replicationSource.shipper" + walGroupId + "," + source.getQueueId(), handler);<a name="line.268"></a>
-<span class="sourceLineNo">269</span> }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span> Path getCurrentPath() {<a name="line.271"></a>
-<span class="sourceLineNo">272</span> return entryReader.getCurrentPath();<a name="line.272"></a>
-<span class="sourceLineNo">273</span> }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span> long getCurrentPosition() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span> return currentPosition;<a name="line.276"></a>
-<span class="sourceLineNo">277</span> }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span> void setWALReader(ReplicationSourceWALReader entryReader) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span> this.entryReader = entryReader;<a name="line.280"></a>
-<span class="sourceLineNo">281</span> }<a name="line.281"></a>
-<span class="sourceLineNo">282</span><a name="line.282"></a>
-<span class="sourceLineNo">283</span> long getStartPosition() {<a name="line.283"></a>
-<span class="sourceLineNo">284</span> return 0;<a name="line.284"></a>
-<span class="sourceLineNo">285</span> }<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span> private boolean isActive() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span> return source.isSourceActive() && state == WorkerState.RUNNING && !isInterrupted();<a name="line.288"></a>
-<span class="sourceLineNo">289</span> }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span> protected final void setWorkerState(WorkerState state) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span> this.state = state;<a name="line.292"></a>
-<span class="sourceLineNo">293</span> }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span> void stopWorker() {<a name="line.295"></a>
-<span class="sourceLineNo">296</span> setWorkerState(WorkerState.STOPPED);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span> public boolean isFinished() {<a name="line.299"></a>
-<span class="sourceLineNo">300</span> return state == WorkerState.FINISHED;<a name="line.300"></a>
-<span class="sourceLineNo">301</span> }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span> /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span> * Do the sleeping logic<a name="line.304"></a>
-<span class="sourceLineNo">305</span> * @param msg Why we sleep<a name="line.305"></a>
-<span class="sourceLineNo">306</span> * @param sleepMultiplier by how many times the default sleeping time is augmented<a name="line.306"></a>
-<span class="sourceLineNo">307</span> * @return True if <code>sleepMultiplier</code> is &lt; <code>maxRetriesMultiplier</code><a name="line.307"></a>
-<span class="sourceLineNo">308</span> */<a name="line.308"></a>
-<span class="sourceLineNo">309</span> public boolean sleepForRetries(String msg, int sleepMultiplier) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span> try {<a name="line.310"></a>
-<span class="sourceLineNo">311</span> LOG.trace("{}, sleeping {} times {}", msg, sleepForRetries, sleepMultiplier);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> Thread.sleep(this.sleepForRetries * sleepMultiplier);<a name="line.312"></a>
-<span class="sourceLineNo">313</span> } catch (InterruptedException e) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span> LOG.debug("Interrupted while sleeping between retries");<a name="line.314"></a>
-<span class="sourceLineNo">315</span> Thread.currentThread().interrupt();<a name="line.315"></a>
-<span class="sourceLineNo">316</span> }<a name="line.316"></a>
-<span class="sourceLineNo">317</span> return sleepMultiplier < maxRetriesMultiplier;<a name="line.317"></a>
-<span class="sourceLineNo">318</span> }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>}<a name="line.319"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.TableName;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.replication.ReplicationEndpoint;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.slf4j.Logger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.slf4j.LoggerFactory;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.BulkLoadDescriptor;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.StoreDescriptor;<a name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>/**<a name="line.40"></a>
+<span class="sourceLineNo">041</span> * This thread reads entries from a queue and ships them. Entries are placed onto the queue by<a name="line.41"></a>
+<span class="sourceLineNo">042</span> * ReplicationSourceWALReaderThread<a name="line.42"></a>
+<span class="sourceLineNo">043</span> */<a name="line.43"></a>
+<span class="sourceLineNo">044</span>@InterfaceAudience.Private<a name="line.44"></a>
+<span class="sourceLineNo">045</span>public class ReplicationSourceShipper extends Thread {<a name="line.45"></a>
+<span class="sourceLineNo">046</span> private static final Logger LOG = LoggerFactory.getLogger(ReplicationSourceShipper.class);<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span> // Hold the state of a replication worker thread<a name="line.48"></a>
+<span class="sourceLineNo">049</span> public enum WorkerState {<a name="line.49"></a>
+<span class="sourceLineNo">050</span> RUNNING,<a name="line.50"></a>
+<span class="sourceLineNo">051</span> STOPPED,<a name="line.51"></a>
+<span class="sourceLineNo">052</span> FINISHED, // The worker is done processing a recovered queue<a name="line.52"></a>
+<span class="sourceLineNo">053</span> }<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span> private final Configuration conf;<a name="line.55"></a>
+<span class="sourceLineNo">056</span> protected final String walGroupId;<a name="line.56"></a>
+<span class="sourceLineNo">057</span> protected final PriorityBlockingQueue<Path> queue;<a name="line.57"></a>
+<span class="sourceLineNo">058</span> private final ReplicationSourceInterface source;<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span> // Last position in the log that we sent to ZooKeeper<a name="line.60"></a>
+<span class="sourceLineNo">061</span> // It will be accessed by the stats thread so make it volatile<a name="line.61"></a>
+<span class="sourceLineNo">062</span> private volatile long currentPosition = -1;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> // Path of the current log<a name="line.63"></a>
+<span class="sourceLineNo">064</span> private Path currentPath;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> // Current state of the worker thread<a name="line.65"></a>
+<span class="sourceLineNo">066</span> private volatile WorkerState state;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> protected ReplicationSourceWALReader entryReader;<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span> // How long should we sleep for each retry<a name="line.69"></a>
+<span class="sourceLineNo">070</span> protected final long sleepForRetries;<a name="line.70"></a>
+<span class="sourceLineNo">071</span> // Maximum number of retries before taking bold actions<a name="line.71"></a>
+<span class="sourceLineNo">072</span> protected final int maxRetriesMultiplier;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span> public ReplicationSourceShipper(Configuration conf, String walGroupId,<a name="line.74"></a>
+<span class="sourceLineNo">075</span> PriorityBlockingQueue<Path> queue, ReplicationSourceInterface source) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span> this.conf = conf;<a name="line.76"></a>
+<span class="sourceLineNo">077</span> this.walGroupId = walGroupId;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> this.queue = queue;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> this.source = source;<a name="line.79"></a>
+<span class="sourceLineNo">080</span> this.sleepForRetries =<a name="line.80"></a>
+<span class="sourceLineNo">081</span> this.conf.getLong("replication.source.sleepforretries", 1000); // 1 second<a name="line.81"></a>
+<span class="sourceLineNo">082</span> this.maxRetriesMultiplier =<a name="line.82"></a>
+<span class="sourceLineNo">083</span> this.conf.getInt("replication.source.maxretriesmultiplier", 300); // 5 minutes @ 1 sec per<a name="line.83"></a>
+<span class="sourceLineNo">084</span> }<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span> @Override<a name="line.86"></a>
+<span class="sourceLineNo">087</span> public final void run() {<a name="line.87"></a>
+<span class="sourceLineNo">088</span> setWorkerState(WorkerState.RUNNING);<a name="line.88"></a>
+<span class="sourceLineNo">089</span> // Loop until we close down<a name="line.89"></a>
+<span class="sourceLineNo">090</span> while (isActive()) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span> // Sleep until replication is enabled again<a name="line.91"></a>
+<span class="sourceLineNo">092</span> if (!source.isPeerEnabled()) {<a name="line.92"></a>
+<span class="sourceLineNo">093</span> // The peer enabled check is in memory, not expensive, so do not need to increase the<a name="line.93"></a>
+<span class="sourceLineNo">094</span> // sleep interval as it may cause a long lag when we enable the peer.<a name="line.94"></a>
+<span class="sourceLineNo">095</span> sleepForRetries("Replication is disabled", 1);<a name="line.95"></a>
+<span class="sourceLineNo">096</span> continue;<a name="line.96"></a>
+<span class="sourceLineNo">097</span> }<a name="line.97"></a>
+<span class="sourceLineNo">098</span> try {<a name="line.98"></a>
+<span class="sourceLineNo">099</span> WALEntryBatch entryBatch = entryReader.take();<a name="line.99"></a>
+<span class="sourceLineNo">100</span> // the NO_MORE_DATA instance has no path so do not all shipEdits<a name="line.100"></a>
+<span class="sourceLineNo">101</span> if (entryBatch == WALEntryBatch.NO_MORE_DATA) {<a name="line.101"></a>
+<span class="sourceLineNo">102</span> noMoreData();<a name="line.102"></a>
+<span class="sourceLineNo">103</span> } else {<a name="line.103"></a>
+<span class="sourceLineNo">104</span> shipEdits(entryBatch);<a name="line.104"></a>
+<span class="sourceLineNo">105</span> }<a name="line.105"></a>
+<span class="sourceLineNo">106</span> } catch (InterruptedException e) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span> LOG.trace("Interrupted while waiting for next replication entry batch", e);<a name="line.107"></a>
+<span class="sourceLineNo">108</span> Thread.currentThread().interrupt();<a name="line.108"></a>
+<span class="sourceLineNo">109</span> }<a name="line.109"></a>
+<span class="sourceLineNo">110</span> }<a name="line.110"></a>
+<span class="sourceLineNo">111</span> // If the worker exits run loop without finishing its task, mark it as stopped.<a name="line.111"></a>
+<span class="sourceLineNo">112</span> if (!isFinished()) {<a name="line.112"></a>
+<span class="sourceLineNo">113</span> setWorkerState(WorkerState.STOPPED);<a name="line.113"></a>
+<span class="sourceLineNo">114</span> } else {<a name="line.114"></a>
+<span class="sourceLineNo">115</span> postFinish();<a name="line.115"></a>
+<span class="sourceLineNo">116</span> }<a name="line.116"></a>
+<span class="sourceLineNo">117</span> }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span> // To be implemented by recovered shipper<a name="line.119"></a>
+<span class="sourceLineNo">120</span> protected void noMoreData() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span> }<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span> // To be implemented by recovered shipper<a name="line.123"></a>
+<span class="sourceLineNo">124</span> protected void postFinish() {<a name="line.124"></a>
+<span class="sourceLineNo">125</span> }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span> /**<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * get batchEntry size excludes bulk load file sizes.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * Uses ReplicationSourceWALReader's static method.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span> private int getBatchEntrySizeExcludeBulkLoad(WALEntryBatch entryBatch) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span> int totalSize = 0;<a name="line.132"></a>
+<span class="sourceLineNo">133</span> for(Entry entry : entryBatch.getWalEntries()) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span> totalSize += entryReader.getEntrySizeExcludeBulkLoad(entry);<a name="line.134"></a>
+<span class="sourceLineNo">135</span> }<a name="line.135"></a>
+<span class="sourceLineNo">136</span> return totalSize;<a name="line.136"></a>
+<span class="sourceLineNo">137</span> }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span> /**<a name="line.139"></a>
+<span class="sourceLineNo">140</span> * Do the shipping logic<a name="line.140"></a>
+<span class="sourceLineNo">141</span> */<a name="line.141"></a>
+<span class="sourceLineNo">142</span> private void shipEdits(WALEntryBatch entryBatch) {<a name="line.142"></a>
+<span class="sourceLineNo">143</span> List<Entry> entries = entryBatch.getWalEntries();<a name="line.143"></a>
+<span class="sourceLineNo">144</span> int sleepMultiplier = 0;<a name="line.144"></a>
+<span class="sourceLineNo">145</span> if (entries.isEmpty()) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span> if (updateLogPosition(entryBatch)) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span> // if there was nothing to ship and it's not an error<a name="line.147"></a>
+<span class="sourceLineNo">148</span> // set "ageOfLastShippedOp" to <now> to indicate that we're current<a name="line.148"></a>
+<span class="sourceLineNo">149</span> source.getSourceMetrics().setAgeOfLastShippedOp(EnvironmentEdgeManager.currentTime(),<a name="line.149"></a>
+<span class="sourceLineNo">150</span> walGroupId);<a name="line.150"></a>
+<span class="sourceLineNo">151</span> }<a name="line.151"></a>
+<span class="sourceLineNo">152</span> return;<a name="line.152"></a>
+<span class="sourceLineNo">153</span> }<a name="line.153"></a>
+<span class="sourceLineNo">154</span> int currentSize = (int) entryBatch.getHeapSize();<a name="line.154"></a>
+<span class="sourceLineNo">155</span> int sizeExcludeBulkLoad = getBatchEntrySizeExcludeBulkLoad(entryBatch);<a name="line.155"></a>
+<span class="sourceLineNo">156</span> while (isActive()) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span> try {<a name="line.157"></a>
+<span class="sourceLineNo">158</span> try {<a name="line.158"></a>
+<span class="sourceLineNo">159</span> source.tryThrottle(currentSize);<a name="line.159"></a>
+<span class="sourceLineNo">160</span> } catch (InterruptedException e) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span> LOG.debug("Interrupted while sleeping for throttling control");<a name="line.161"></a>
+<span class="sourceLineNo">162</span> Thread.currentThread().interrupt();<a name="line.162"></a>
+<span class="sourceLineNo">163</span> // current thread might be interrupted to terminate<a name="line.163"></a>
+<span class="sourceLineNo">164</span> // directly go back to while() for confirm this<a name="line.164"></a>
+<span class="sourceLineNo">165</span> continue;<a name="line.165"></a>
+<span class="sourceLineNo">166</span> }<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span> // create replicateContext here, so the entries can be GC'd upon return from this call<a name="line.168"></a>
+<span class="sourceLineNo">169</span> // stack<a name="line.169"></a>
+<span class="sourceLineNo">170</span> ReplicationEndpoint.ReplicateContext replicateContext =<a name="line.170"></a>
+<span class="sourceLineNo">171</span> new ReplicationEndpoint.ReplicateContext();<a name="line.171"></a>
+<span class="sourceLineNo">172</span> replicateContext.setEntries(entries).setSize(currentSize);<a name="line.172"></a>
+<span class="sourceLineNo">173</span> replicateContext.setWalGroupId(walGroupId);<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span> long startTimeNs = System.nanoTime();<a name="line.175"></a>
+<span class="sourceLineNo">176</span> // send the edits to the endpoint. Will block until the edits are shipped and acknowledged<a name="line.176"></a>
+<span class="sourceLineNo">177</span> boolean replicated = source.getReplicationEndpoint().replicate(replicateContext);<a name="line.177"></a>
+<span class="sourceLineNo">178</span> long endTimeNs = System.nanoTime();<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span> if (!replicated) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span> continue;<a name="line.181"></a>
+<span class="sourceLineNo">182</span> } else {<a name="line.182"></a>
+<span class="sourceLineNo">183</span> sleepMultiplier = Math.max(sleepMultiplier - 1, 0);<a name="line.183"></a>
+<span class="sourceLineNo">184</span> }<a name="line.184"></a>
+<span class="sourceLineNo">185</span> // Clean up hfile references<a name="line.185"></a>
+<span class="sourceLineNo">186</span> for (Entry entry : entries) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span> cleanUpHFileRefs(entry.getEdit());<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span> TableName tableName = entry.getKey().getTableName();<a name="line.189"></a>
+<span class="sourceLineNo">190</span> source.getSourceMetrics().setAgeOfLastShippedOpByTable(entry.getKey().getWriteTime(),<a name="line.190"></a>
+<span class="sourceLineNo">191</span> tableName.getNameAsString());<a name="line.191"></a>
+<span class="sourceLineNo">192</span> }<a name="line.192"></a>
+<span class="sourceLineNo">193</span> // Log and clean up WAL logs<a name="line.193"></a>
+<span class="sourceLineNo">194</span> updateLogPosition(entryBatch);<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span> //offsets totalBufferUsed by deducting shipped batchSize (excludes bulk load size)<a name="line.196"></a>
+<span class="sourceLineNo">197</span> //this sizeExcludeBulkLoad has to use same calculation that when calling<a name="line.197"></a>
+<span class="sourceLineNo">198</span> //acquireBufferQuota() in ReplicatinoSourceWALReader because they maintain<a name="line.198"></a>
+<span class="sourceLineNo">199</span> //same variable: totalBufferUsed<a name="line.199"></a>
+<span class="sourceLineNo">200</span> source.postShipEdits(entries, sizeExcludeBulkLoad);<a name="line.200"></a>
+<span class="sourceLineNo">201</span> // FIXME check relationship between wal group and overall<a name="line.201"></a>
+<span class="sourceLineNo">202</span> source.getSourceMetrics().shipBatch(entryBatch.getNbOperations(), currentSize,<a name="line.202"></a>
+<span class="sourceLineNo">203</span> entryBatch.getNbHFiles());<a name="line.203"></a>
+<span class="sourceLineNo">204</span> source.getSourceMetrics().setAgeOfLastShippedOp(<a name="line.204"></a>
+<span class="sourceLineNo">205</span> entries.get(entries.size() - 1).getKey().getWriteTime(), walGroupId);<a name="line.205"></a>
+<span class="sourceLineNo">206</span> if (LOG.isTraceEnabled()) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span> LOG.trace("Replicated {} entries or {} operations in {} ms",<a name="line.207"></a>
+<span class="sourceLineNo">208</span> entries.size(), entryBatch.getNbOperations(), (endTimeNs - startTimeNs) / 1000000);<a name="line.208"></a>
+<span class="sourceLineNo">209</span> }<a name="line.209"></a>
+<span class="sourceLineNo">210</span> break;<a name="line.210"></a>
+<span class="sourceLineNo">211</span> } catch (Exception ex) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span> LOG.warn("{} threw unknown exception:",<a name="line.212"></a>
+<span class="sourceLineNo">213</span> source.getReplicationEndpoint().getClass().getName(), ex);<a name="line.213"></a>
+<span class="sourceLineNo">214</span> if (sleepForRetries("ReplicationEndpoint threw exception", sleepMultiplier)) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span> sleepMultiplier++;<a name="line.215"></a>
+<span class="sourceLineNo">216</span> }<a name="line.216"></a>
+<span class="sourceLineNo">217</span> }<a name="line.217"></a>
+<span class="sourceLineNo">218</span> }<a name="line.218"></a>
+<span class="sourceLineNo">219</span> }<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span> private void cleanUpHFileRefs(WALEdit edit) throws IOException {<a name="line.221"></a>
+<span class="sourceLineNo">222</span> String peerId = source.getPeerId();<a name="line.222"></a>
+<span class="sourceLineNo">223</span> if (peerId.contains("-")) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span> // peerClusterZnode will be in the form peerId + "-" + rsZNode.<a name="line.224"></a>
+<span class="sourceLineNo">225</span> // A peerId will not have "-" in its name, see HBASE-11394<a name="line.225"></a>
+<span class="sourceLineNo">226</span> peerId = peerId.split("-")[0];<a name="line.226"></a>
+<span class="sourceLineNo">227</span> }<a name="line.227"></a>
+<span class="sourceLineNo">228</span> List<Cell> cells = edit.getCells();<a name="line.228"></a>
+<span class="sourceLineNo">229</span> int totalCells = cells.size();<a name="line.229"></a>
+<span class="sourceLineNo">230</span> for (int i = 0; i < totalCells; i++) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span> Cell cell = cells.get(i);<a name="line.231"></a>
+<span class="sourceLineNo">232</span> if (CellUtil.matchingQualifier(cell, WALEdit.BULK_LOAD)) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span> BulkLoadDescriptor bld = WALEdit.getBulkLoadDescriptor(cell);<a name="line.233"></a>
+<span class="sourceLineNo">234</span> List<StoreDescriptor> stores = bld.getStoresList();<a name="line.234"></a>
+<span class="sourceLineNo">235</span> int totalStores = stores.size();<a name="line.235"></a>
+<span class="sourceLineNo">236</span> for (int j = 0; j < totalStores; j++) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span> List<String> storeFileList = stores.get(j).getStoreFileList();<a name="line.237"></a>
+<span class="sourceLineNo">238</span> source.getSourceManager().cleanUpHFileRefs(peerId, storeFileList);<a name="line.238"></a>
+<span class="sourceLineNo">239</span> source.getSourceMetrics().decrSizeOfHFileRefsQueue(storeFileList.size());<a name="line.239"></a>
+<span class="sourceLineNo">240</span> }<a name="line.240"></a>
+<span class="sourceLineNo">241</span> }<a name="line.241"></a>
+<span class="sourceLineNo">242</span> }<a name="line.242"></a>
+<span class="sourceLineNo">243</span> }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span> private boolean updateLogPosition(WALEntryBatch batch) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span> boolean updated = false;<a name="line.246"></a>
+<span class="sourceLineNo">247</span> // if end of file is true, then the logPositionAndCleanOldLogs method will remove the file<a name="line.247"></a>
+<span class="sourceLineNo">248</span> // record on zk, so let's call it. The last wal position maybe zero if end of file is true and<a name="line.248"></a>
+<span class="sourceLineNo">249</span> // there is no entry in the batch. It is OK because that the queue storage will ignore the zero<a name="line.249"></a>
+<span class="sourceLineNo">250</span> // position and the file will be removed soon in cleanOldLogs.<a name="line.250"></a>
+<span class="sourceLineNo">251</span> if (batch.isEndOfFile() || !batch.getLastWalPath().equals(currentPath) ||<a name="line.251"></a>
+<span class="sourceLineNo">252</span> batch.getLastWalPosition() != currentPosition) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span> source.getSourceManager().logPositionAndCleanOldLogs(source.getQueueId(),<a name="line.253"></a>
+<span class="sourceLineNo">254</span> source.isRecovered(), batch);<a name="line.254"></a>
+<span class="sourceLineNo">255</span> updated = true;<a name="line.255"></a>
+<span class="sourceLineNo">256</span> }<a name="line.256"></a>
+<span class="sourceLineNo">257</span> // if end of file is true, then we can just skip to the next file in queue.<a name="line.257"></a>
+<span class="sourceLineNo">258</span> // the only exception is for recovered queue, if we reach the end of the queue, then there will<a name="line.258"></a>
+<span class="sourceLineNo">259</span> // no more files so here the currentPath may be null.<a name="line.259"></a>
+<span class="sourceLineNo">260</span> if (batch.isEndOfFile()) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span> currentPath = entryReader.getCurrentPath();<a name="line.261"></a>
+<span class="sourceLineNo">262</span> currentPosition = 0L;<a name="line.262"></a>
+<span class="sourceLineNo">263</span> } else {<a name="line.263"></a>
+<span class="sourceLineNo">264</span> currentPath = batch.getLastWalPath();<a name="line.264"></a>
+<span class="sourceLineNo">265</span> currentPosition = batch.getLastWalPosition();<a name="line.265"></a>
+<span class="sourceLineNo">266</span> }<a name="line.266"></a>
+<span class="sourceLineNo">267</span> return updated;<a name="line.267"></a>
+<span class="sourceLineNo">268</span> }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span> public void startup(UncaughtExceptionHandler handler) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> String name = Thread.currentThread().getName();<a name="line.271"></a>
+<span class="sourceLineNo">272</span> Threads.setDaemonThreadRunning(this,<a name="line.272"></a>
+<span class="sourceLineNo">273</span> name + ".replicationSource.shipper" + walGroupId + "," + source.getQueueId(), handler);<a name="line.273"></a>
+<span class="sourceLineNo">274</span> }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span> Path getCurrentPath() {<a name="line.276"></a>
+<span class="sourceLineNo">277</span> return entryReader.getCurrentPath();<a name="line.277"></a>
+<span class="sourceLineNo">278</span> }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span> long getCurrentPosition() {<a name="line.280"></a>
+<span class="sourceLineNo">281</span> return currentPosition;<a name="line.281"></a>
+<span class="sourceLineNo">282</span> }<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span> void setWALReader(ReplicationSourceWALReader entryReader) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span> this.entryReader = entryReader;<a name="line.285"></a>
+<span class="sourceLineNo">286</span> }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span> long getStartPosition() {<a name="line.288"></a>
+<span class="sourceLineNo">289</span> return 0;<a name="line.289"></a>
+<span class="sourceLineNo">290</span> }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span> private boolean isActive() {<a name="line.292"></a>
+<span class="sourceLineNo">293</span> return source.isSourceActive() && state == WorkerState.RUNNING && !isInterrupted();<a name="line.293"></a>
+<span class="sourceLineNo">294</span> }<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span> protected final void setWorkerState(WorkerState state) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span> this.state = state;<a name="line.297"></a>
+<span class="sourceLineNo">298</span> }<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span> void stopWorker() {<a name="line.300"></a>
+<span class="sourceLineNo">301</span> setWorkerState(WorkerState.STOPPED);<a name="line.301"></a>
+<span class="sourceLineNo">302</span> }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span> public boolean isFinished() {<a name="line.304"></a>
+<span class="sourceLineNo">305</span> return state == WorkerState.FINISHED;<a name="line.305"></a>
+<span class="sourceLineNo">306</span> }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span> /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span> * Do the sleeping logic<a name="line.309"></a>
+<span class="sourceLineNo">310</span> * @param msg Why we sleep<a name="line.310"></a>
+<span class="sourceLineNo">311</span> * @param sleepMultiplier by how many times the default sleeping time is augmented<a name="line.311"></a>
+<span class="sourceLineNo">312</span> * @return True if <code>sleepMultiplier</code> is &lt; <code>maxRetriesMultiplier</code><a name="line.312"></a>
+<span class="sourceLineNo">313</span> */<a name="line.313"></a>
+<span class="sourceLineNo">314</span> public boolean sleepForRetries(String msg, int sleepMultiplier) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span> try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span> LOG.trace("{}, sleeping {} times {}", msg, sleepForRetries, sleepMultiplier);<a name="line.316"></a>
+<span class="sourceLineNo">317</span> Thread.sleep(this.sleepForRetries * sleepMultiplier);<a name="line.317"></a>
+<span class="sourceLineNo">318</span> } catch (InterruptedException e) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span> LOG.debug("Interrupted while sleeping between retries");<a name="line.319"></a>
+<span class="sourceLineNo">320</span> Thread.currentThread().interrupt();<a name="line.320"></a>
+<span class="sourceLineNo">321</span> }<a name="line.321"></a>
+<span class="sourceLineNo">322</span> return sleepMultiplier < maxRetriesMultiplier;<a name="line.322"></a>
+<span class="sourceLineNo">323</span> }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>}<a name="line.324"></a>
[04/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html
index 43a87b6..819e491 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html
@@ -31,517 +31,537 @@
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.UUID;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.concurrent.Callable;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.Cell;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Waiter;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Put;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Table;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.junit.AfterClass;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.junit.Assert;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.junit.Before;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.BeforeClass;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.ClassRule;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.Test;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.experimental.categories.Category;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.slf4j.Logger;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.slf4j.LoggerFactory;<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.66"></a>
-<span class="sourceLineNo">067</span> */<a name="line.67"></a>
-<span class="sourceLineNo">068</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.68"></a>
-<span class="sourceLineNo">069</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span> @ClassRule<a name="line.71"></a>
-<span class="sourceLineNo">072</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.72"></a>
-<span class="sourceLineNo">073</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.75"></a>
+<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Map;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.UUID;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.Callable;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Cell;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Waiter;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Put;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Table;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.AfterClass;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.Assert;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.Before;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.BeforeClass;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.ClassRule;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.experimental.categories.Category;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.slf4j.Logger;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.slf4j.LoggerFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>/**<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.68"></a>
+<span class="sourceLineNo">069</span> */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.70"></a>
+<span class="sourceLineNo">071</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span> @ClassRule<a name="line.73"></a>
+<span class="sourceLineNo">074</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.74"></a>
+<span class="sourceLineNo">075</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.75"></a>
<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span> static int numRegionServers;<a name="line.77"></a>
+<span class="sourceLineNo">077</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.77"></a>
<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span> @BeforeClass<a name="line.79"></a>
-<span class="sourceLineNo">080</span> public static void setUpBeforeClass() throws Exception {<a name="line.80"></a>
-<span class="sourceLineNo">081</span> TestReplicationBase.setUpBeforeClass();<a name="line.81"></a>
-<span class="sourceLineNo">082</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.82"></a>
-<span class="sourceLineNo">083</span> }<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span> @AfterClass<a name="line.85"></a>
-<span class="sourceLineNo">086</span> public static void tearDownAfterClass() throws Exception {<a name="line.86"></a>
-<span class="sourceLineNo">087</span> TestReplicationBase.tearDownAfterClass();<a name="line.87"></a>
-<span class="sourceLineNo">088</span> // check stop is called<a name="line.88"></a>
-<span class="sourceLineNo">089</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.89"></a>
-<span class="sourceLineNo">090</span> }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span> @Before<a name="line.92"></a>
-<span class="sourceLineNo">093</span> public void setup() throws Exception {<a name="line.93"></a>
-<span class="sourceLineNo">094</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.94"></a>
-<span class="sourceLineNo">095</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.95"></a>
-<span class="sourceLineNo">096</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.96"></a>
-<span class="sourceLineNo">097</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.97"></a>
-<span class="sourceLineNo">098</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> final List<RegionServerThread> rsThreads =<a name="line.99"></a>
-<span class="sourceLineNo">100</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.100"></a>
-<span class="sourceLineNo">101</span> for (RegionServerThread rs : rsThreads) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.102"></a>
-<span class="sourceLineNo">103</span> }<a name="line.103"></a>
-<span class="sourceLineNo">104</span> // Wait for all log roll to finish<a name="line.104"></a>
-<span class="sourceLineNo">105</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.105"></a>
-<span class="sourceLineNo">106</span> @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span> public boolean evaluate() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span> for (RegionServerThread rs : rsThreads) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span> return false;<a name="line.110"></a>
-<span class="sourceLineNo">111</span> }<a name="line.111"></a>
-<span class="sourceLineNo">112</span> }<a name="line.112"></a>
-<span class="sourceLineNo">113</span> return true;<a name="line.113"></a>
-<span class="sourceLineNo">114</span> }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span> @Override<a name="line.116"></a>
-<span class="sourceLineNo">117</span> public String explainFailure() throws Exception {<a name="line.117"></a>
-<span class="sourceLineNo">118</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.118"></a>
-<span class="sourceLineNo">119</span> for (RegionServerThread rs : rsThreads) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.121"></a>
-<span class="sourceLineNo">122</span> }<a name="line.122"></a>
-<span class="sourceLineNo">123</span> }<a name="line.123"></a>
-<span class="sourceLineNo">124</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.124"></a>
-<span class="sourceLineNo">125</span> }<a name="line.125"></a>
-<span class="sourceLineNo">126</span> });<a name="line.126"></a>
-<span class="sourceLineNo">127</span> }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span> @Test<a name="line.129"></a>
-<span class="sourceLineNo">130</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.130"></a>
-<span class="sourceLineNo">131</span> // test installing a custom replication endpoint other than the default one.<a name="line.131"></a>
-<span class="sourceLineNo">132</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.132"></a>
-<span class="sourceLineNo">133</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.133"></a>
-<span class="sourceLineNo">134</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span> // check whether the class has been constructed and started<a name="line.136"></a>
-<span class="sourceLineNo">137</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.137"></a>
-<span class="sourceLineNo">138</span> @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span> public boolean evaluate() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.140"></a>
-<span class="sourceLineNo">141</span> }<a name="line.141"></a>
-<span class="sourceLineNo">142</span> });<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span> @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span> public boolean evaluate() throws Exception {<a name="line.146"></a>
-<span class="sourceLineNo">147</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.147"></a>
-<span class="sourceLineNo">148</span> }<a name="line.148"></a>
-<span class="sourceLineNo">149</span> });<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.151"></a>
+<span class="sourceLineNo">079</span> static int numRegionServers;<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span> @BeforeClass<a name="line.81"></a>
+<span class="sourceLineNo">082</span> public static void setUpBeforeClass() throws Exception {<a name="line.82"></a>
+<span class="sourceLineNo">083</span> TestReplicationBase.setUpBeforeClass();<a name="line.83"></a>
+<span class="sourceLineNo">084</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.84"></a>
+<span class="sourceLineNo">085</span> }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span> @AfterClass<a name="line.87"></a>
+<span class="sourceLineNo">088</span> public static void tearDownAfterClass() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span> TestReplicationBase.tearDownAfterClass();<a name="line.89"></a>
+<span class="sourceLineNo">090</span> // check stop is called<a name="line.90"></a>
+<span class="sourceLineNo">091</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.91"></a>
+<span class="sourceLineNo">092</span> }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span> @Before<a name="line.94"></a>
+<span class="sourceLineNo">095</span> public void setup() throws Exception {<a name="line.95"></a>
+<span class="sourceLineNo">096</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.96"></a>
+<span class="sourceLineNo">097</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.97"></a>
+<span class="sourceLineNo">098</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.98"></a>
+<span class="sourceLineNo">099</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.99"></a>
+<span class="sourceLineNo">100</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> final List<RegionServerThread> rsThreads =<a name="line.101"></a>
+<span class="sourceLineNo">102</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.102"></a>
+<span class="sourceLineNo">103</span> for (RegionServerThread rs : rsThreads) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.104"></a>
+<span class="sourceLineNo">105</span> }<a name="line.105"></a>
+<span class="sourceLineNo">106</span> // Wait for all log roll to finish<a name="line.106"></a>
+<span class="sourceLineNo">107</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.107"></a>
+<span class="sourceLineNo">108</span> @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span> public boolean evaluate() throws Exception {<a name="line.109"></a>
+<span class="sourceLineNo">110</span> for (RegionServerThread rs : rsThreads) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span> return false;<a name="line.112"></a>
+<span class="sourceLineNo">113</span> }<a name="line.113"></a>
+<span class="sourceLineNo">114</span> }<a name="line.114"></a>
+<span class="sourceLineNo">115</span> return true;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span> @Override<a name="line.118"></a>
+<span class="sourceLineNo">119</span> public String explainFailure() throws Exception {<a name="line.119"></a>
+<span class="sourceLineNo">120</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.120"></a>
+<span class="sourceLineNo">121</span> for (RegionServerThread rs : rsThreads) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.123"></a>
+<span class="sourceLineNo">124</span> }<a name="line.124"></a>
+<span class="sourceLineNo">125</span> }<a name="line.125"></a>
+<span class="sourceLineNo">126</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.126"></a>
+<span class="sourceLineNo">127</span> }<a name="line.127"></a>
+<span class="sourceLineNo">128</span> });<a name="line.128"></a>
+<span class="sourceLineNo">129</span> }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span> @Test<a name="line.131"></a>
+<span class="sourceLineNo">132</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.132"></a>
+<span class="sourceLineNo">133</span> // test installing a custom replication endpoint other than the default one.<a name="line.133"></a>
+<span class="sourceLineNo">134</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.134"></a>
+<span class="sourceLineNo">135</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.135"></a>
+<span class="sourceLineNo">136</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span> // check whether the class has been constructed and started<a name="line.138"></a>
+<span class="sourceLineNo">139</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.139"></a>
+<span class="sourceLineNo">140</span> @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span> public boolean evaluate() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.142"></a>
+<span class="sourceLineNo">143</span> }<a name="line.143"></a>
+<span class="sourceLineNo">144</span> });<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span> @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span> public boolean evaluate() throws Exception {<a name="line.148"></a>
+<span class="sourceLineNo">149</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.149"></a>
+<span class="sourceLineNo">150</span> }<a name="line.150"></a>
+<span class="sourceLineNo">151</span> });<a name="line.151"></a>
<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span> // now replicate some data.<a name="line.153"></a>
-<span class="sourceLineNo">154</span> doPut(Bytes.toBytes("row42"));<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span> @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span> public boolean evaluate() throws Exception {<a name="line.158"></a>
-<span class="sourceLineNo">159</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.159"></a>
-<span class="sourceLineNo">160</span> }<a name="line.160"></a>
-<span class="sourceLineNo">161</span> });<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span> doAssert(Bytes.toBytes("row42"));<a name="line.163"></a>
+<span class="sourceLineNo">153</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span> // now replicate some data.<a name="line.155"></a>
+<span class="sourceLineNo">156</span> doPut(Bytes.toBytes("row42"));<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span> @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span> public boolean evaluate() throws Exception {<a name="line.160"></a>
+<span class="sourceLineNo">161</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.161"></a>
+<span class="sourceLineNo">162</span> }<a name="line.162"></a>
+<span class="sourceLineNo">163</span> });<a name="line.163"></a>
<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.165"></a>
-<span class="sourceLineNo">166</span> }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span> @Test<a name="line.168"></a>
-<span class="sourceLineNo">169</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.169"></a>
-<span class="sourceLineNo">170</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.170"></a>
-<span class="sourceLineNo">171</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.171"></a>
-<span class="sourceLineNo">172</span> int peerCount = admin.getPeersCount();<a name="line.172"></a>
-<span class="sourceLineNo">173</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.173"></a>
-<span class="sourceLineNo">174</span> admin.addPeer(id,<a name="line.174"></a>
-<span class="sourceLineNo">175</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.175"></a>
-<span class="sourceLineNo">176</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.176"></a>
-<span class="sourceLineNo">177</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.177"></a>
-<span class="sourceLineNo">178</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.178"></a>
-<span class="sourceLineNo">179</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.179"></a>
-<span class="sourceLineNo">180</span> if (admin.getPeersCount() <= peerCount) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.181"></a>
-<span class="sourceLineNo">182</span> Threads.sleep(100);<a name="line.182"></a>
-<span class="sourceLineNo">183</span> }<a name="line.183"></a>
-<span class="sourceLineNo">184</span> // now replicate some data<a name="line.184"></a>
-<span class="sourceLineNo">185</span> doPut(row);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.187"></a>
-<span class="sourceLineNo">188</span> @Override<a name="line.188"></a>
-<span class="sourceLineNo">189</span> public boolean evaluate() throws Exception {<a name="line.189"></a>
-<span class="sourceLineNo">190</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.190"></a>
-<span class="sourceLineNo">191</span> // only send over one edit.<a name="line.191"></a>
-<span class="sourceLineNo">192</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.192"></a>
-<span class="sourceLineNo">193</span> LOG.info("count=" + count);<a name="line.193"></a>
-<span class="sourceLineNo">194</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.194"></a>
-<span class="sourceLineNo">195</span> }<a name="line.195"></a>
-<span class="sourceLineNo">196</span> });<a name="line.196"></a>
-<span class="sourceLineNo">197</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.198"></a>
-<span class="sourceLineNo">199</span> }<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.201"></a>
-<span class="sourceLineNo">202</span> }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span> @Test<a name="line.204"></a>
-<span class="sourceLineNo">205</span> public void testInterClusterReplication() throws Exception {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> final String id = "testInterClusterReplication";<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> int totEdits = 0;<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> // Make sure edits are spread across regions because we do region based batching<a name="line.211"></a>
-<span class="sourceLineNo">212</span> // before shipping edits.<a name="line.212"></a>
-<span class="sourceLineNo">213</span> for(HRegion region: regions) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span> RegionInfo hri = region.getRegionInfo();<a name="line.214"></a>
-<span class="sourceLineNo">215</span> byte[] row = hri.getStartKey();<a name="line.215"></a>
-<span class="sourceLineNo">216</span> for (int i = 0; i < 100; i++) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span> if (row.length > 0) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span> Put put = new Put(row);<a name="line.218"></a>
-<span class="sourceLineNo">219</span> put.addColumn(famName, row, row);<a name="line.219"></a>
-<span class="sourceLineNo">220</span> region.put(put);<a name="line.220"></a>
-<span class="sourceLineNo">221</span> totEdits++;<a name="line.221"></a>
-<span class="sourceLineNo">222</span> }<a name="line.222"></a>
-<span class="sourceLineNo">223</span> }<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> admin.addPeer(id,<a name="line.226"></a>
-<span class="sourceLineNo">227</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.227"></a>
-<span class="sourceLineNo">228</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.228"></a>
-<span class="sourceLineNo">229</span> null);<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span> final int numEdits = totEdits;<a name="line.231"></a>
-<span class="sourceLineNo">232</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.232"></a>
-<span class="sourceLineNo">233</span> @Override<a name="line.233"></a>
-<span class="sourceLineNo">234</span> public boolean evaluate() throws Exception {<a name="line.234"></a>
-<span class="sourceLineNo">235</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.235"></a>
-<span class="sourceLineNo">236</span> }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span> @Override<a name="line.238"></a>
-<span class="sourceLineNo">239</span> public String explainFailure() throws Exception {<a name="line.239"></a>
-<span class="sourceLineNo">240</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.240"></a>
-<span class="sourceLineNo">241</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.241"></a>
-<span class="sourceLineNo">242</span> return failure;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> }<a name="line.243"></a>
-<span class="sourceLineNo">244</span> });<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> admin.removePeer("testInterClusterReplication");<a name="line.246"></a>
-<span class="sourceLineNo">247</span> utility1.deleteTableData(tableName);<a name="line.247"></a>
-<span class="sourceLineNo">248</span> }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span> @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.252"></a>
-<span class="sourceLineNo">253</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.253"></a>
-<span class="sourceLineNo">254</span> //test that we can create mutliple WALFilters reflectively<a name="line.254"></a>
-<span class="sourceLineNo">255</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.256"></a>
-<span class="sourceLineNo">257</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.257"></a>
-<span class="sourceLineNo">258</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.258"></a>
-<span class="sourceLineNo">259</span> // now replicate some data.<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.261"></a>
-<span class="sourceLineNo">262</span> doPut(connection, row);<a name="line.262"></a>
-<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span> }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.266"></a>
-<span class="sourceLineNo">267</span> @Override<a name="line.267"></a>
-<span class="sourceLineNo">268</span> public boolean evaluate() throws Exception {<a name="line.268"></a>
-<span class="sourceLineNo">269</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> }<a name="line.270"></a>
-<span class="sourceLineNo">271</span> });<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.273"></a>
-<span class="sourceLineNo">274</span> //make sure our reflectively created filter is in the filter chain<a name="line.274"></a>
-<span class="sourceLineNo">275</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.275"></a>
-<span class="sourceLineNo">276</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.276"></a>
-<span class="sourceLineNo">277</span> }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span> @Test (expected=IOException.class)<a name="line.279"></a>
-<span class="sourceLineNo">280</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.281"></a>
-<span class="sourceLineNo">282</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span> //test that we can create mutliple WALFilters reflectively<a name="line.283"></a>
-<span class="sourceLineNo">284</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.284"></a>
-<span class="sourceLineNo">285</span> "IAmNotARealWalEntryFilter");<a name="line.285"></a>
-<span class="sourceLineNo">286</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.286"></a>
-<span class="sourceLineNo">287</span> }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span> @Test (expected=IOException.class)<a name="line.289"></a>
-<span class="sourceLineNo">290</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.290"></a>
-<span class="sourceLineNo">291</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.292"></a>
-<span class="sourceLineNo">293</span> //test that we can create mutliple WALFilters reflectively<a name="line.293"></a>
-<span class="sourceLineNo">294</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.294"></a>
-<span class="sourceLineNo">295</span> "IAmNotARealWalEntryFilter");<a name="line.295"></a>
-<span class="sourceLineNo">296</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span> @Test<a name="line.300"></a>
-<span class="sourceLineNo">301</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.301"></a>
-<span class="sourceLineNo">302</span> /*<a name="line.302"></a>
-<span class="sourceLineNo">303</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.303"></a>
-<span class="sourceLineNo">304</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.304"></a>
-<span class="sourceLineNo">305</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.305"></a>
-<span class="sourceLineNo">306</span> allows for custom JMX metrics.<a name="line.306"></a>
-<span class="sourceLineNo">307</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.307"></a>
-<span class="sourceLineNo">308</span> the two layers of wrapping to the actual BaseSource.<a name="line.308"></a>
-<span class="sourceLineNo">309</span> */<a name="line.309"></a>
-<span class="sourceLineNo">310</span> String id = "id";<a name="line.310"></a>
-<span class="sourceLineNo">311</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.312"></a>
-<span class="sourceLineNo">313</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.313"></a>
-<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
-<span class="sourceLineNo">315</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.317"></a>
-<span class="sourceLineNo">318</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.318"></a>
-<span class="sourceLineNo">319</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource);<a name="line.319"></a>
-<span class="sourceLineNo">320</span> String gaugeName = "gauge";<a name="line.320"></a>
-<span class="sourceLineNo">321</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.321"></a>
-<span class="sourceLineNo">322</span> String globalGaugeName = "source." + gaugeName;<a name="line.322"></a>
-<span class="sourceLineNo">323</span> long delta = 1;<a name="line.323"></a>
-<span class="sourceLineNo">324</span> String counterName = "counter";<a name="line.324"></a>
-<span class="sourceLineNo">325</span> String singleCounterName = "source.id." + counterName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span> String globalCounterName = "source." + counterName;<a name="line.326"></a>
-<span class="sourceLineNo">327</span> long count = 2;<a name="line.327"></a>
-<span class="sourceLineNo">328</span> source.decGauge(gaugeName, delta);<a name="line.328"></a>
-<span class="sourceLineNo">329</span> source.getMetricsContext();<a name="line.329"></a>
-<span class="sourceLineNo">330</span> source.getMetricsDescription();<a name="line.330"></a>
-<span class="sourceLineNo">331</span> source.getMetricsJmxContext();<a name="line.331"></a>
-<span class="sourceLineNo">332</span> source.getMetricsName();<a name="line.332"></a>
-<span class="sourceLineNo">333</span> source.incCounters(counterName, count);<a name="line.333"></a>
-<span class="sourceLineNo">334</span> source.incGauge(gaugeName, delta);<a name="line.334"></a>
-<span class="sourceLineNo">335</span> source.init();<a name="line.335"></a>
-<span class="sourceLineNo">336</span> source.removeMetric(gaugeName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span> source.setGauge(gaugeName, delta);<a name="line.337"></a>
-<span class="sourceLineNo">338</span> source.updateHistogram(counterName, count);<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.340"></a>
-<span class="sourceLineNo">341</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.341"></a>
-<span class="sourceLineNo">342</span> verify(globalRms).getMetricsContext();<a name="line.342"></a>
-<span class="sourceLineNo">343</span> verify(globalRms).getMetricsJmxContext();<a name="line.343"></a>
-<span class="sourceLineNo">344</span> verify(globalRms).getMetricsName();<a name="line.344"></a>
-<span class="sourceLineNo">345</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.345"></a>
-<span class="sourceLineNo">346</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.346"></a>
-<span class="sourceLineNo">347</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.347"></a>
-<span class="sourceLineNo">348</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.348"></a>
-<span class="sourceLineNo">349</span> verify(globalRms).init();<a name="line.349"></a>
-<span class="sourceLineNo">350</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.350"></a>
-<span class="sourceLineNo">351</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.352"></a>
-<span class="sourceLineNo">353</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.353"></a>
-<span class="sourceLineNo">354</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.354"></a>
-<span class="sourceLineNo">355</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.355"></a>
-<span class="sourceLineNo">356</span> }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span> private void doPut(byte[] row) throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span> doPut(connection, row);<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span> }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.364"></a>
-<span class="sourceLineNo">365</span> try (Table t = connection.getTable(tableName)) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span> Put put = new Put(row);<a name="line.366"></a>
-<span class="sourceLineNo">367</span> put.addColumn(famName, row, row);<a name="line.367"></a>
-<span class="sourceLineNo">368</span> t.put(put);<a name="line.368"></a>
-<span class="sourceLineNo">369</span> }<a name="line.369"></a>
-<span class="sourceLineNo">370</span> }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span> private static void doAssert(byte[] row) throws Exception {<a name="line.372"></a>
-<span class="sourceLineNo">373</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span> return; // first call<a name="line.374"></a>
-<span class="sourceLineNo">375</span> }<a name="line.375"></a>
-<span class="sourceLineNo">376</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.376"></a>
-<span class="sourceLineNo">377</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.377"></a>
-<span class="sourceLineNo">378</span> Assert.assertEquals(1, cells.size());<a name="line.378"></a>
-<span class="sourceLineNo">379</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.379"></a>
-<span class="sourceLineNo">380</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.380"></a>
-<span class="sourceLineNo">381</span> }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.383"></a>
-<span class="sourceLineNo">384</span> static UUID uuid = UUID.randomUUID();<a name="line.384"></a>
-<span class="sourceLineNo">385</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.385"></a>
-<span class="sourceLineNo">386</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.386"></a>
-<span class="sourceLineNo">387</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.387"></a>
-<span class="sourceLineNo">388</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.388"></a>
-<span class="sourceLineNo">389</span> static volatile List<Entry> lastEntries = null;<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span> public ReplicationEndpointForTest() {<a name="line.391"></a>
-<span class="sourceLineNo">392</span> replicateCount.set(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span> contructedCount.incrementAndGet();<a name="line.393"></a>
-<span class="sourceLineNo">394</span> }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span> @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span> public UUID getPeerUUID() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span> return uuid;<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span> @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span> replicateCount.incrementAndGet();<a name="line.403"></a>
-<span class="sourceLineNo">404</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.404"></a>
-<span class="sourceLineNo">405</span> return true;<a name="line.405"></a>
-<span class="sourceLineNo">406</span> }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span> @Override<a name="line.408"></a>
-<span class="sourceLineNo">409</span> public void start() {<a name="line.409"></a>
-<span class="sourceLineNo">410</span> startAsync();<a name="line.410"></a>
-<span class="sourceLineNo">411</span> }<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span> @Override<a name="line.413"></a>
-<span class="sourceLineNo">414</span> public void stop() {<a name="line.414"></a>
-<span class="sourceLineNo">415</span> stopAsync();<a name="line.415"></a>
-<span class="sourceLineNo">416</span> }<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span> @Override<a name="line.418"></a>
-<span class="sourceLineNo">419</span> protected void doStart() {<a name="line.419"></a>
-<span class="sourceLineNo">420</span> startedCount.incrementAndGet();<a name="line.420"></a>
-<span class="sourceLineNo">421</span> notifyStarted();<a name="line.421"></a>
-<span class="sourceLineNo">422</span> }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span> @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span> protected void doStop() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span> stoppedCount.incrementAndGet();<a name="line.426"></a>
-<span class="sourceLineNo">427</span> notifyStopped();<a name="line.427"></a>
-<span class="sourceLineNo">428</span> }<a name="line.428"></a>
-<span class="sourceLineNo">429</span> }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span> public static class InterClusterReplicationEndpointForTest<a name="line.431"></a>
-<span class="sourceLineNo">432</span> extends HBaseInterClusterReplicationEndpoint {<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.434"></a>
-<span class="sourceLineNo">435</span> static boolean failedOnce;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span> public InterClusterReplicationEndpointForTest() {<a name="line.437"></a>
-<span class="sourceLineNo">438</span> replicateCount.set(0);<a name="line.438"></a>
-<span class="sourceLineNo">439</span> }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span> @Override<a name="line.441"></a>
-<span class="sourceLineNo">442</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span> boolean success = super.replicate(replicateContext);<a name="line.443"></a>
-<span class="sourceLineNo">444</span> if (success) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span> replicateCount.addAndGet(replicateContext.entries.size());<a name="line.445"></a>
-<span class="sourceLineNo">446</span> }<a name="line.446"></a>
-<span class="sourceLineNo">447</span> return success;<a name="line.447"></a>
+<span class="sourceLineNo">165</span> doAssert(Bytes.toBytes("row42"));<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.167"></a>
+<span class="sourceLineNo">168</span> }<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span> @Test<a name="line.170"></a>
+<span class="sourceLineNo">171</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.171"></a>
+<span class="sourceLineNo">172</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.172"></a>
+<span class="sourceLineNo">173</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.173"></a>
+<span class="sourceLineNo">174</span> int peerCount = admin.getPeersCount();<a name="line.174"></a>
+<span class="sourceLineNo">175</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.175"></a>
+<span class="sourceLineNo">176</span> admin.addPeer(id,<a name="line.176"></a>
+<span class="sourceLineNo">177</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.177"></a>
+<span class="sourceLineNo">178</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.178"></a>
+<span class="sourceLineNo">179</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.179"></a>
+<span class="sourceLineNo">180</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.180"></a>
+<span class="sourceLineNo">181</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.181"></a>
+<span class="sourceLineNo">182</span> if (admin.getPeersCount() <= peerCount) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.183"></a>
+<span class="sourceLineNo">184</span> Threads.sleep(100);<a name="line.184"></a>
+<span class="sourceLineNo">185</span> }<a name="line.185"></a>
+<span class="sourceLineNo">186</span> // now replicate some data<a name="line.186"></a>
+<span class="sourceLineNo">187</span> doPut(row);<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.189"></a>
+<span class="sourceLineNo">190</span> @Override<a name="line.190"></a>
+<span class="sourceLineNo">191</span> public boolean evaluate() throws Exception {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.192"></a>
+<span class="sourceLineNo">193</span> // only send over one edit.<a name="line.193"></a>
+<span class="sourceLineNo">194</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.194"></a>
+<span class="sourceLineNo">195</span> LOG.info("count=" + count);<a name="line.195"></a>
+<span class="sourceLineNo">196</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.196"></a>
+<span class="sourceLineNo">197</span> }<a name="line.197"></a>
+<span class="sourceLineNo">198</span> });<a name="line.198"></a>
+<span class="sourceLineNo">199</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.200"></a>
+<span class="sourceLineNo">201</span> }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.203"></a>
+<span class="sourceLineNo">204</span> }<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span> @Test<a name="line.206"></a>
+<span class="sourceLineNo">207</span> public void testInterClusterReplication() throws Exception {<a name="line.207"></a>
+<span class="sourceLineNo">208</span> final String id = "testInterClusterReplication";<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.210"></a>
+<span class="sourceLineNo">211</span> int totEdits = 0;<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> // Make sure edits are spread across regions because we do region based batching<a name="line.213"></a>
+<span class="sourceLineNo">214</span> // before shipping edits.<a name="line.214"></a>
+<span class="sourceLineNo">215</span> for(HRegion region: regions) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span> RegionInfo hri = region.getRegionInfo();<a name="line.216"></a>
+<span class="sourceLineNo">217</span> byte[] row = hri.getStartKey();<a name="line.217"></a>
+<span class="sourceLineNo">218</span> for (int i = 0; i < 100; i++) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span> if (row.length > 0) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span> Put put = new Put(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span> put.addColumn(famName, row, row);<a name="line.221"></a>
+<span class="sourceLineNo">222</span> region.put(put);<a name="line.222"></a>
+<span class="sourceLineNo">223</span> totEdits++;<a name="line.223"></a>
+<span class="sourceLineNo">224</span> }<a name="line.224"></a>
+<span class="sourceLineNo">225</span> }<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span> admin.addPeer(id,<a name="line.228"></a>
+<span class="sourceLineNo">229</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.229"></a>
+<span class="sourceLineNo">230</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.230"></a>
+<span class="sourceLineNo">231</span> null);<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> final int numEdits = totEdits;<a name="line.233"></a>
+<span class="sourceLineNo">234</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> public boolean evaluate() throws Exception {<a name="line.236"></a>
+<span class="sourceLineNo">237</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.237"></a>
+<span class="sourceLineNo">238</span> }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span> @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span> public String explainFailure() throws Exception {<a name="line.241"></a>
+<span class="sourceLineNo">242</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.242"></a>
+<span class="sourceLineNo">243</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.243"></a>
+<span class="sourceLineNo">244</span> return failure;<a name="line.244"></a>
+<span class="sourceLineNo">245</span> }<a name="line.245"></a>
+<span class="sourceLineNo">246</span> });<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> admin.removePeer("testInterClusterReplication");<a name="line.248"></a>
+<span class="sourceLineNo">249</span> utility1.deleteTableData(tableName);<a name="line.249"></a>
+<span class="sourceLineNo">250</span> }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span> @Test<a name="line.252"></a>
+<span class="sourceLineNo">253</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.253"></a>
+<span class="sourceLineNo">254</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.254"></a>
+<span class="sourceLineNo">255</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.255"></a>
+<span class="sourceLineNo">256</span> //test that we can create mutliple WALFilters reflectively<a name="line.256"></a>
+<span class="sourceLineNo">257</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.257"></a>
+<span class="sourceLineNo">258</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.258"></a>
+<span class="sourceLineNo">259</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.259"></a>
+<span class="sourceLineNo">260</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> // now replicate some data.<a name="line.261"></a>
+<span class="sourceLineNo">262</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.263"></a>
+<span class="sourceLineNo">264</span> doPut(connection, row);<a name="line.264"></a>
+<span class="sourceLineNo">265</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.265"></a>
+<span class="sourceLineNo">266</span> }<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span> @Override<a name="line.269"></a>
+<span class="sourceLineNo">270</span> public boolean evaluate() throws Exception {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.271"></a>
+<span class="sourceLineNo">272</span> }<a name="line.272"></a>
+<span class="sourceLineNo">273</span> });<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.275"></a>
+<span class="sourceLineNo">276</span> //make sure our reflectively created filter is in the filter chain<a name="line.276"></a>
+<span class="sourceLineNo">277</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.277"></a>
+<span class="sourceLineNo">278</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.278"></a>
+<span class="sourceLineNo">279</span> }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span> @Test (expected=IOException.class)<a name="line.281"></a>
+<span class="sourceLineNo">282</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.283"></a>
+<span class="sourceLineNo">284</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span> //test that we can create mutliple WALFilters reflectively<a name="line.285"></a>
+<span class="sourceLineNo">286</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.286"></a>
+<span class="sourceLineNo">287</span> "IAmNotARealWalEntryFilter");<a name="line.287"></a>
+<span class="sourceLineNo">288</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.288"></a>
+<span class="sourceLineNo">289</span> }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span> @Test (expected=IOException.class)<a name="line.291"></a>
+<span class="sourceLineNo">292</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.292"></a>
+<span class="sourceLineNo">293</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.293"></a>
+<span class="sourceLineNo">294</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.294"></a>
+<span class="sourceLineNo">295</span> //test that we can create mutliple WALFilters reflectively<a name="line.295"></a>
+<span class="sourceLineNo">296</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.296"></a>
+<span class="sourceLineNo">297</span> "IAmNotARealWalEntryFilter");<a name="line.297"></a>
+<span class="sourceLineNo">298</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.298"></a>
+<span class="sourceLineNo">299</span> }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span> @Test<a name="line.302"></a>
+<span class="sourceLineNo">303</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.303"></a>
+<span class="sourceLineNo">304</span> /*<a name="line.304"></a>
+<span class="sourceLineNo">305</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.305"></a>
+<span class="sourceLineNo">306</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.306"></a>
+<span class="sourceLineNo">307</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.307"></a>
+<span class="sourceLineNo">308</span> allows for custom JMX metrics.<a name="line.308"></a>
+<span class="sourceLineNo">309</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.309"></a>
+<span class="sourceLineNo">310</span> the two layers of wrapping to the actual BaseSource.<a name="line.310"></a>
+<span class="sourceLineNo">311</span> */<a name="line.311"></a>
+<span class="sourceLineNo">312</span> String id = "id";<a name="line.312"></a>
+<span class="sourceLineNo">313</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.313"></a>
+<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
+<span class="sourceLineNo">315</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
+<span class="sourceLineNo">316</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.316"></a>
+<span class="sourceLineNo">317</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.319"></a>
+<span class="sourceLineNo">320</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.320"></a>
+<span class="sourceLineNo">321</span> Map<String, MetricsReplicationSourceSource> singleSourceSourceByTable = new HashMap<>();<a name="line.321"></a>
+<span class="sourceLineNo">322</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource,<a name="line.322"></a>
+<span class="sourceLineNo">323</span> singleSourceSourceByTable);<a name="line.323"></a>
+<span class="sourceLineNo">324</span> String gaugeName = "gauge";<a name="line.324"></a>
+<span class="sourceLineNo">325</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.325"></a>
+<span class="sourceLineNo">326</span> String globalGaugeName = "source." + gaugeName;<a name="line.326"></a>
+<span class="sourceLineNo">327</span> long delta = 1;<a name="line.327"></a>
+<span class="sourceLineNo">328</span> String counterName = "counter";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> String singleCounterName = "source.id." + counterName;<a name="line.329"></a>
+<span class="sourceLineNo">330</span> String globalCounterName = "source." + counterName;<a name="line.330"></a>
+<span class="sourceLineNo">331</span> long count = 2;<a name="line.331"></a>
+<span class="sourceLineNo">332</span> source.decGauge(gaugeName, delta);<a name="line.332"></a>
+<span class="sourceLineNo">333</span> source.getMetricsContext();<a name="line.333"></a>
+<span class="sourceLineNo">334</span> source.getMetricsDescription();<a name="line.334"></a>
+<span class="sourceLineNo">335</span> source.getMetricsJmxContext();<a name="line.335"></a>
+<span class="sourceLineNo">336</span> source.getMetricsName();<a name="line.336"></a>
+<span class="sourceLineNo">337</span> source.incCounters(counterName, count);<a name="line.337"></a>
+<span class="sourceLineNo">338</span> source.incGauge(gaugeName, delta);<a name="line.338"></a>
+<span class="sourceLineNo">339</span> source.init();<a name="line.339"></a>
+<span class="sourceLineNo">340</span> source.removeMetric(gaugeName);<a name="line.340"></a>
+<span class="sourceLineNo">341</span> source.setGauge(gaugeName, delta);<a name="line.341"></a>
+<span class="sourceLineNo">342</span> source.updateHistogram(counterName, count);<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.344"></a>
+<span class="sourceLineNo">345</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.345"></a>
+<span class="sourceLineNo">346</span> verify(globalRms).getMetricsContext();<a name="line.346"></a>
+<span class="sourceLineNo">347</span> verify(globalRms).getMetricsJmxContext();<a name="line.347"></a>
+<span class="sourceLineNo">348</span> verify(globalRms).getMetricsName();<a name="line.348"></a>
+<span class="sourceLineNo">349</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.349"></a>
+<span class="sourceLineNo">350</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.350"></a>
+<span class="sourceLineNo">351</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.351"></a>
+<span class="sourceLineNo">352</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.352"></a>
+<span class="sourceLineNo">353</span> verify(globalRms).init();<a name="line.353"></a>
+<span class="sourceLineNo">354</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.354"></a>
+<span class="sourceLineNo">355</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.355"></a>
+<span class="sourceLineNo">356</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.356"></a>
+<span class="sourceLineNo">357</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.357"></a>
+<span class="sourceLineNo">358</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.358"></a>
+<span class="sourceLineNo">359</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span> //check singleSourceSourceByTable metrics.<a name="line.361"></a>
+<span class="sourceLineNo">362</span> // singleSourceSourceByTable map entry will be created only<a name="line.362"></a>
+<span class="sourceLineNo">363</span> // after calling #setAgeOfLastShippedOpByTable<a name="line.363"></a>
+<span class="sourceLineNo">364</span> boolean containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.364"></a>
+<span class="sourceLineNo">365</span> .containsKey("RandomNewTable");<a name="line.365"></a>
+<span class="sourceLineNo">366</span> Assert.assertEquals(false, containsRandomNewTable);<a name="line.366"></a>
+<span class="sourceLineNo">367</span> source.setAgeOfLastShippedOpByTable(123L, "RandomNewTable");<a name="line.367"></a>
+<span class="sourceLineNo">368</span> containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.368"></a>
+<span class="sourceLineNo">369</span> .containsKey("RandomNewTable");<a name="line.369"></a>
+<span class="sourceLineNo">370</span> Assert.assertEquals(true, containsRandomNewTable);<a name="line.370"></a>
+<span class="sourceLineNo">371</span> MetricsReplicationSourceSource msr = source.getSingleSourceSourceByTable()<a name="line.371"></a>
+<span class="sourceLineNo">372</span> .get("RandomNewTable");<a name="line.372"></a>
+<span class="sourceLineNo">373</span> // cannot put more concreate value here to verify because the age is arbitrary.<a name="line.373"></a>
+<span class="sourceLineNo">374</span> // as long as it's greater than 0, we see it as correct answer.<a name="line.374"></a>
+<span class="sourceLineNo">375</span> Assert.assertTrue(msr.getLastShippedAge() > 0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span> }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span> private void doPut(byte[] row) throws IOException {<a name="line.378"></a>
+<span class="sourceLineNo">379</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span> doPut(connection, row);<a name="line.380"></a>
+<span class="sourceLineNo">381</span> }<a name="line.381"></a>
+<span class="sourceLineNo">382</span> }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.384"></a>
+<span class="sourceLineNo">385</span> try (Table t = connection.getTable(tableName)) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span> Put put = new Put(row);<a name="line.386"></a>
+<span class="sourceLineNo">387</span> put.addColumn(famName, row, row);<a name="line.387"></a>
+<span class="sourceLineNo">388</span> t.put(put);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<a name="line.389"></a>
+<span class="sourceLineNo">390</span> }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span> private static void doAssert(byte[] row) throws Exception {<a name="line.392"></a>
+<span class="sourceLineNo">393</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span> return; // first call<a name="line.394"></a>
+<span class="sourceLineNo">395</span> }<a name="line.395"></a>
+<span class="sourceLineNo">396</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.396"></a>
+<span class="sourceLineNo">397</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.397"></a>
+<span class="sourceLineNo">398</span> Assert.assertEquals(1, cells.size());<a name="line.398"></a>
+<span class="sourceLineNo">399</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.399"></a>
+<span class="sourceLineNo">400</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.400"></a>
+<span class="sourceLineNo">401</span> }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.403"></a>
+<span class="sourceLineNo">404</span> static UUID uuid = UUID.randomUUID();<a name="line.404"></a>
+<span class="sourceLineNo">405</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.405"></a>
+<span class="sourceLineNo">406</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.406"></a>
+<span class="sourceLineNo">407</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.407"></a>
+<span class="sourceLineNo">408</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.408"></a>
+<span class="sourceLineNo">409</span> static volatile List<Entry> lastEntries = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span> public ReplicationEndpointForTest() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span> replicateCount.set(0);<a name="line.412"></a>
+<span class="sourceLineNo">413</span> contructedCount.incrementAndGet();<a name="line.413"></a>
+<span class="sourceLineNo">414</span> }<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span> @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span> public UUID getPeerUUID() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span> return uuid;<a name="line.418"></a>
+<span class="sourceLineNo">419</span> }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span> @Override<a name="line.421"></a>
+<span class="sourceLineNo">422</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span> replicateCount.incrementAndGet();<a name="line.423"></a>
+<span class="sourceLineNo">424</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.424"></a>
+<span class="sourceLineNo">425</span> return true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span> }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span> @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span> public void start() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span> startAsync();<a name="line.430"></a>
+<span class="sourceLineNo">431</span> }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span> @Override<a name="line.433"></a>
+<span class="sourceLineNo">434</span> public void stop() {<a name="line.434"></a>
+<span class="sourceLineNo">435</span> stopAsync();<a name="line.435"></a>
+<span class="sourceLineNo">436</span> }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span> @Override<a name="line.438"></a>
+<span class="sourceLineNo">439</span> protected void doStart() {<a name="line.439"></a>
+<span class="sourceLineNo">440</span> startedCount.incrementAndGet();<a name="line.440"></a>
+<span class="sourceLineNo">441</span> notifyStarted();<a name="line.441"></a>
+<span class="sourceLineNo">442</span> }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span> @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span> protected void doStop() {<a name="line.445"></a>
+<span class="sourceLineNo">446</span> stoppedCount.incrementAndGet();<a name="line.446"></a>
+<span class="sourceLineNo">447</span> notifyStopped();<a name="line.447"></a>
<span class="sourceLineNo">448</span> }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span> @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span> protected Callable<Integer> createReplicator(List<Entry> entries, int ordinal) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span> // Fail only once, we don't want to slow down the test.<a name="line.452"></a>
-<span class="sourceLineNo">453</span> if (failedOnce) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span> return () -> ordinal;<a name="line.454"></a>
-<span class="sourceLineNo">455</span> } else {<a name="line.455"></a>
-<span class="sourceLineNo">456</span> failedOnce = true;<a name="line.456"></a>
-<span class="sourceLineNo">457</span> return () -> {<a name="line.457"></a>
-<span class="sourceLineNo">458</span> throw new IOException("Sample Exception: Failed to replicate.");<a name="line.458"></a>
-<span class="sourceLineNo">459</span> };<a name="line.459"></a>
-<span class="sourceLineNo">460</span> }<a name="line.460"></a>
-<span class="sourceLineNo">461</span> }<a name="line.461"></a>
-<span class="sourceLineNo">462</span> }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span> public static class ReplicationEndpointReturningFalse extends ReplicationEndpointForTest {<a name="line.464"></a>
-<span class="sourceLineNo">465</span> static int COUNT = 10;<a name="line.465"></a>
-<span class="sourceLineNo">466</span> static AtomicReference<Exception> ex = new AtomicReference<>(null);<a name="line.466"></a>
-<span class="sourceLineNo">467</span> static AtomicBoolean replicated = new AtomicBoolean(false);<a name="line.467"></a>
-<span class="sourceLineNo">468</span> @Override<a name="line.468"></a>
-<span class="sourceLineNo">469</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span> try {<a name="line.470"></a>
-<span class="sourceLineNo">471</span> // check row<a name="line.471"></a>
-<span class="sourceLineNo">472</span> doAssert(row);<a name="line.472"></a>
-<span class="sourceLineNo">473</span> } catch (Exception e) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span> ex.set(e);<a name="line.474"></a>
-<span class="sourceLineNo">475</span> }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span> super.replicate(replicateContext);<a name="line.477"></a>
-<span class="sourceLineNo">478</span> LOG.info("Replicated " + Bytes.toString(row) + ",
<TRUNCATED>
[03/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html
index 43a87b6..819e491 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html
@@ -31,517 +31,537 @@
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.UUID;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.concurrent.Callable;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.Cell;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Waiter;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Put;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Table;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.junit.AfterClass;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.junit.Assert;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.junit.Before;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.BeforeClass;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.ClassRule;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.Test;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.experimental.categories.Category;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.slf4j.Logger;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.slf4j.LoggerFactory;<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.66"></a>
-<span class="sourceLineNo">067</span> */<a name="line.67"></a>
-<span class="sourceLineNo">068</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.68"></a>
-<span class="sourceLineNo">069</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span> @ClassRule<a name="line.71"></a>
-<span class="sourceLineNo">072</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.72"></a>
-<span class="sourceLineNo">073</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.75"></a>
+<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Map;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.UUID;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.Callable;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Cell;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Waiter;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Put;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Table;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.AfterClass;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.Assert;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.Before;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.BeforeClass;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.ClassRule;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.experimental.categories.Category;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.slf4j.Logger;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.slf4j.LoggerFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>/**<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.68"></a>
+<span class="sourceLineNo">069</span> */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.70"></a>
+<span class="sourceLineNo">071</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span> @ClassRule<a name="line.73"></a>
+<span class="sourceLineNo">074</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.74"></a>
+<span class="sourceLineNo">075</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.75"></a>
<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span> static int numRegionServers;<a name="line.77"></a>
+<span class="sourceLineNo">077</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.77"></a>
<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span> @BeforeClass<a name="line.79"></a>
-<span class="sourceLineNo">080</span> public static void setUpBeforeClass() throws Exception {<a name="line.80"></a>
-<span class="sourceLineNo">081</span> TestReplicationBase.setUpBeforeClass();<a name="line.81"></a>
-<span class="sourceLineNo">082</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.82"></a>
-<span class="sourceLineNo">083</span> }<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span> @AfterClass<a name="line.85"></a>
-<span class="sourceLineNo">086</span> public static void tearDownAfterClass() throws Exception {<a name="line.86"></a>
-<span class="sourceLineNo">087</span> TestReplicationBase.tearDownAfterClass();<a name="line.87"></a>
-<span class="sourceLineNo">088</span> // check stop is called<a name="line.88"></a>
-<span class="sourceLineNo">089</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.89"></a>
-<span class="sourceLineNo">090</span> }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span> @Before<a name="line.92"></a>
-<span class="sourceLineNo">093</span> public void setup() throws Exception {<a name="line.93"></a>
-<span class="sourceLineNo">094</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.94"></a>
-<span class="sourceLineNo">095</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.95"></a>
-<span class="sourceLineNo">096</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.96"></a>
-<span class="sourceLineNo">097</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.97"></a>
-<span class="sourceLineNo">098</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> final List<RegionServerThread> rsThreads =<a name="line.99"></a>
-<span class="sourceLineNo">100</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.100"></a>
-<span class="sourceLineNo">101</span> for (RegionServerThread rs : rsThreads) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.102"></a>
-<span class="sourceLineNo">103</span> }<a name="line.103"></a>
-<span class="sourceLineNo">104</span> // Wait for all log roll to finish<a name="line.104"></a>
-<span class="sourceLineNo">105</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.105"></a>
-<span class="sourceLineNo">106</span> @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span> public boolean evaluate() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span> for (RegionServerThread rs : rsThreads) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span> return false;<a name="line.110"></a>
-<span class="sourceLineNo">111</span> }<a name="line.111"></a>
-<span class="sourceLineNo">112</span> }<a name="line.112"></a>
-<span class="sourceLineNo">113</span> return true;<a name="line.113"></a>
-<span class="sourceLineNo">114</span> }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span> @Override<a name="line.116"></a>
-<span class="sourceLineNo">117</span> public String explainFailure() throws Exception {<a name="line.117"></a>
-<span class="sourceLineNo">118</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.118"></a>
-<span class="sourceLineNo">119</span> for (RegionServerThread rs : rsThreads) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.121"></a>
-<span class="sourceLineNo">122</span> }<a name="line.122"></a>
-<span class="sourceLineNo">123</span> }<a name="line.123"></a>
-<span class="sourceLineNo">124</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.124"></a>
-<span class="sourceLineNo">125</span> }<a name="line.125"></a>
-<span class="sourceLineNo">126</span> });<a name="line.126"></a>
-<span class="sourceLineNo">127</span> }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span> @Test<a name="line.129"></a>
-<span class="sourceLineNo">130</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.130"></a>
-<span class="sourceLineNo">131</span> // test installing a custom replication endpoint other than the default one.<a name="line.131"></a>
-<span class="sourceLineNo">132</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.132"></a>
-<span class="sourceLineNo">133</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.133"></a>
-<span class="sourceLineNo">134</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span> // check whether the class has been constructed and started<a name="line.136"></a>
-<span class="sourceLineNo">137</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.137"></a>
-<span class="sourceLineNo">138</span> @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span> public boolean evaluate() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.140"></a>
-<span class="sourceLineNo">141</span> }<a name="line.141"></a>
-<span class="sourceLineNo">142</span> });<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span> @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span> public boolean evaluate() throws Exception {<a name="line.146"></a>
-<span class="sourceLineNo">147</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.147"></a>
-<span class="sourceLineNo">148</span> }<a name="line.148"></a>
-<span class="sourceLineNo">149</span> });<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.151"></a>
+<span class="sourceLineNo">079</span> static int numRegionServers;<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span> @BeforeClass<a name="line.81"></a>
+<span class="sourceLineNo">082</span> public static void setUpBeforeClass() throws Exception {<a name="line.82"></a>
+<span class="sourceLineNo">083</span> TestReplicationBase.setUpBeforeClass();<a name="line.83"></a>
+<span class="sourceLineNo">084</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.84"></a>
+<span class="sourceLineNo">085</span> }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span> @AfterClass<a name="line.87"></a>
+<span class="sourceLineNo">088</span> public static void tearDownAfterClass() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span> TestReplicationBase.tearDownAfterClass();<a name="line.89"></a>
+<span class="sourceLineNo">090</span> // check stop is called<a name="line.90"></a>
+<span class="sourceLineNo">091</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.91"></a>
+<span class="sourceLineNo">092</span> }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span> @Before<a name="line.94"></a>
+<span class="sourceLineNo">095</span> public void setup() throws Exception {<a name="line.95"></a>
+<span class="sourceLineNo">096</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.96"></a>
+<span class="sourceLineNo">097</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.97"></a>
+<span class="sourceLineNo">098</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.98"></a>
+<span class="sourceLineNo">099</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.99"></a>
+<span class="sourceLineNo">100</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> final List<RegionServerThread> rsThreads =<a name="line.101"></a>
+<span class="sourceLineNo">102</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.102"></a>
+<span class="sourceLineNo">103</span> for (RegionServerThread rs : rsThreads) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.104"></a>
+<span class="sourceLineNo">105</span> }<a name="line.105"></a>
+<span class="sourceLineNo">106</span> // Wait for all log roll to finish<a name="line.106"></a>
+<span class="sourceLineNo">107</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.107"></a>
+<span class="sourceLineNo">108</span> @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span> public boolean evaluate() throws Exception {<a name="line.109"></a>
+<span class="sourceLineNo">110</span> for (RegionServerThread rs : rsThreads) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span> return false;<a name="line.112"></a>
+<span class="sourceLineNo">113</span> }<a name="line.113"></a>
+<span class="sourceLineNo">114</span> }<a name="line.114"></a>
+<span class="sourceLineNo">115</span> return true;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span> @Override<a name="line.118"></a>
+<span class="sourceLineNo">119</span> public String explainFailure() throws Exception {<a name="line.119"></a>
+<span class="sourceLineNo">120</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.120"></a>
+<span class="sourceLineNo">121</span> for (RegionServerThread rs : rsThreads) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.123"></a>
+<span class="sourceLineNo">124</span> }<a name="line.124"></a>
+<span class="sourceLineNo">125</span> }<a name="line.125"></a>
+<span class="sourceLineNo">126</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.126"></a>
+<span class="sourceLineNo">127</span> }<a name="line.127"></a>
+<span class="sourceLineNo">128</span> });<a name="line.128"></a>
+<span class="sourceLineNo">129</span> }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span> @Test<a name="line.131"></a>
+<span class="sourceLineNo">132</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.132"></a>
+<span class="sourceLineNo">133</span> // test installing a custom replication endpoint other than the default one.<a name="line.133"></a>
+<span class="sourceLineNo">134</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.134"></a>
+<span class="sourceLineNo">135</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.135"></a>
+<span class="sourceLineNo">136</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span> // check whether the class has been constructed and started<a name="line.138"></a>
+<span class="sourceLineNo">139</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.139"></a>
+<span class="sourceLineNo">140</span> @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span> public boolean evaluate() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.142"></a>
+<span class="sourceLineNo">143</span> }<a name="line.143"></a>
+<span class="sourceLineNo">144</span> });<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span> @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span> public boolean evaluate() throws Exception {<a name="line.148"></a>
+<span class="sourceLineNo">149</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.149"></a>
+<span class="sourceLineNo">150</span> }<a name="line.150"></a>
+<span class="sourceLineNo">151</span> });<a name="line.151"></a>
<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span> // now replicate some data.<a name="line.153"></a>
-<span class="sourceLineNo">154</span> doPut(Bytes.toBytes("row42"));<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span> @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span> public boolean evaluate() throws Exception {<a name="line.158"></a>
-<span class="sourceLineNo">159</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.159"></a>
-<span class="sourceLineNo">160</span> }<a name="line.160"></a>
-<span class="sourceLineNo">161</span> });<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span> doAssert(Bytes.toBytes("row42"));<a name="line.163"></a>
+<span class="sourceLineNo">153</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span> // now replicate some data.<a name="line.155"></a>
+<span class="sourceLineNo">156</span> doPut(Bytes.toBytes("row42"));<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span> @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span> public boolean evaluate() throws Exception {<a name="line.160"></a>
+<span class="sourceLineNo">161</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.161"></a>
+<span class="sourceLineNo">162</span> }<a name="line.162"></a>
+<span class="sourceLineNo">163</span> });<a name="line.163"></a>
<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.165"></a>
-<span class="sourceLineNo">166</span> }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span> @Test<a name="line.168"></a>
-<span class="sourceLineNo">169</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.169"></a>
-<span class="sourceLineNo">170</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.170"></a>
-<span class="sourceLineNo">171</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.171"></a>
-<span class="sourceLineNo">172</span> int peerCount = admin.getPeersCount();<a name="line.172"></a>
-<span class="sourceLineNo">173</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.173"></a>
-<span class="sourceLineNo">174</span> admin.addPeer(id,<a name="line.174"></a>
-<span class="sourceLineNo">175</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.175"></a>
-<span class="sourceLineNo">176</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.176"></a>
-<span class="sourceLineNo">177</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.177"></a>
-<span class="sourceLineNo">178</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.178"></a>
-<span class="sourceLineNo">179</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.179"></a>
-<span class="sourceLineNo">180</span> if (admin.getPeersCount() <= peerCount) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.181"></a>
-<span class="sourceLineNo">182</span> Threads.sleep(100);<a name="line.182"></a>
-<span class="sourceLineNo">183</span> }<a name="line.183"></a>
-<span class="sourceLineNo">184</span> // now replicate some data<a name="line.184"></a>
-<span class="sourceLineNo">185</span> doPut(row);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.187"></a>
-<span class="sourceLineNo">188</span> @Override<a name="line.188"></a>
-<span class="sourceLineNo">189</span> public boolean evaluate() throws Exception {<a name="line.189"></a>
-<span class="sourceLineNo">190</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.190"></a>
-<span class="sourceLineNo">191</span> // only send over one edit.<a name="line.191"></a>
-<span class="sourceLineNo">192</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.192"></a>
-<span class="sourceLineNo">193</span> LOG.info("count=" + count);<a name="line.193"></a>
-<span class="sourceLineNo">194</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.194"></a>
-<span class="sourceLineNo">195</span> }<a name="line.195"></a>
-<span class="sourceLineNo">196</span> });<a name="line.196"></a>
-<span class="sourceLineNo">197</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.198"></a>
-<span class="sourceLineNo">199</span> }<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.201"></a>
-<span class="sourceLineNo">202</span> }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span> @Test<a name="line.204"></a>
-<span class="sourceLineNo">205</span> public void testInterClusterReplication() throws Exception {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> final String id = "testInterClusterReplication";<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> int totEdits = 0;<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> // Make sure edits are spread across regions because we do region based batching<a name="line.211"></a>
-<span class="sourceLineNo">212</span> // before shipping edits.<a name="line.212"></a>
-<span class="sourceLineNo">213</span> for(HRegion region: regions) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span> RegionInfo hri = region.getRegionInfo();<a name="line.214"></a>
-<span class="sourceLineNo">215</span> byte[] row = hri.getStartKey();<a name="line.215"></a>
-<span class="sourceLineNo">216</span> for (int i = 0; i < 100; i++) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span> if (row.length > 0) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span> Put put = new Put(row);<a name="line.218"></a>
-<span class="sourceLineNo">219</span> put.addColumn(famName, row, row);<a name="line.219"></a>
-<span class="sourceLineNo">220</span> region.put(put);<a name="line.220"></a>
-<span class="sourceLineNo">221</span> totEdits++;<a name="line.221"></a>
-<span class="sourceLineNo">222</span> }<a name="line.222"></a>
-<span class="sourceLineNo">223</span> }<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> admin.addPeer(id,<a name="line.226"></a>
-<span class="sourceLineNo">227</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.227"></a>
-<span class="sourceLineNo">228</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.228"></a>
-<span class="sourceLineNo">229</span> null);<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span> final int numEdits = totEdits;<a name="line.231"></a>
-<span class="sourceLineNo">232</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.232"></a>
-<span class="sourceLineNo">233</span> @Override<a name="line.233"></a>
-<span class="sourceLineNo">234</span> public boolean evaluate() throws Exception {<a name="line.234"></a>
-<span class="sourceLineNo">235</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.235"></a>
-<span class="sourceLineNo">236</span> }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span> @Override<a name="line.238"></a>
-<span class="sourceLineNo">239</span> public String explainFailure() throws Exception {<a name="line.239"></a>
-<span class="sourceLineNo">240</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.240"></a>
-<span class="sourceLineNo">241</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.241"></a>
-<span class="sourceLineNo">242</span> return failure;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> }<a name="line.243"></a>
-<span class="sourceLineNo">244</span> });<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> admin.removePeer("testInterClusterReplication");<a name="line.246"></a>
-<span class="sourceLineNo">247</span> utility1.deleteTableData(tableName);<a name="line.247"></a>
-<span class="sourceLineNo">248</span> }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span> @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.252"></a>
-<span class="sourceLineNo">253</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.253"></a>
-<span class="sourceLineNo">254</span> //test that we can create mutliple WALFilters reflectively<a name="line.254"></a>
-<span class="sourceLineNo">255</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.256"></a>
-<span class="sourceLineNo">257</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.257"></a>
-<span class="sourceLineNo">258</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.258"></a>
-<span class="sourceLineNo">259</span> // now replicate some data.<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.261"></a>
-<span class="sourceLineNo">262</span> doPut(connection, row);<a name="line.262"></a>
-<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span> }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.266"></a>
-<span class="sourceLineNo">267</span> @Override<a name="line.267"></a>
-<span class="sourceLineNo">268</span> public boolean evaluate() throws Exception {<a name="line.268"></a>
-<span class="sourceLineNo">269</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> }<a name="line.270"></a>
-<span class="sourceLineNo">271</span> });<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.273"></a>
-<span class="sourceLineNo">274</span> //make sure our reflectively created filter is in the filter chain<a name="line.274"></a>
-<span class="sourceLineNo">275</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.275"></a>
-<span class="sourceLineNo">276</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.276"></a>
-<span class="sourceLineNo">277</span> }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span> @Test (expected=IOException.class)<a name="line.279"></a>
-<span class="sourceLineNo">280</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.281"></a>
-<span class="sourceLineNo">282</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span> //test that we can create mutliple WALFilters reflectively<a name="line.283"></a>
-<span class="sourceLineNo">284</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.284"></a>
-<span class="sourceLineNo">285</span> "IAmNotARealWalEntryFilter");<a name="line.285"></a>
-<span class="sourceLineNo">286</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.286"></a>
-<span class="sourceLineNo">287</span> }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span> @Test (expected=IOException.class)<a name="line.289"></a>
-<span class="sourceLineNo">290</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.290"></a>
-<span class="sourceLineNo">291</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.292"></a>
-<span class="sourceLineNo">293</span> //test that we can create mutliple WALFilters reflectively<a name="line.293"></a>
-<span class="sourceLineNo">294</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.294"></a>
-<span class="sourceLineNo">295</span> "IAmNotARealWalEntryFilter");<a name="line.295"></a>
-<span class="sourceLineNo">296</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span> @Test<a name="line.300"></a>
-<span class="sourceLineNo">301</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.301"></a>
-<span class="sourceLineNo">302</span> /*<a name="line.302"></a>
-<span class="sourceLineNo">303</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.303"></a>
-<span class="sourceLineNo">304</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.304"></a>
-<span class="sourceLineNo">305</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.305"></a>
-<span class="sourceLineNo">306</span> allows for custom JMX metrics.<a name="line.306"></a>
-<span class="sourceLineNo">307</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.307"></a>
-<span class="sourceLineNo">308</span> the two layers of wrapping to the actual BaseSource.<a name="line.308"></a>
-<span class="sourceLineNo">309</span> */<a name="line.309"></a>
-<span class="sourceLineNo">310</span> String id = "id";<a name="line.310"></a>
-<span class="sourceLineNo">311</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.312"></a>
-<span class="sourceLineNo">313</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.313"></a>
-<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
-<span class="sourceLineNo">315</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.317"></a>
-<span class="sourceLineNo">318</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.318"></a>
-<span class="sourceLineNo">319</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource);<a name="line.319"></a>
-<span class="sourceLineNo">320</span> String gaugeName = "gauge";<a name="line.320"></a>
-<span class="sourceLineNo">321</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.321"></a>
-<span class="sourceLineNo">322</span> String globalGaugeName = "source." + gaugeName;<a name="line.322"></a>
-<span class="sourceLineNo">323</span> long delta = 1;<a name="line.323"></a>
-<span class="sourceLineNo">324</span> String counterName = "counter";<a name="line.324"></a>
-<span class="sourceLineNo">325</span> String singleCounterName = "source.id." + counterName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span> String globalCounterName = "source." + counterName;<a name="line.326"></a>
-<span class="sourceLineNo">327</span> long count = 2;<a name="line.327"></a>
-<span class="sourceLineNo">328</span> source.decGauge(gaugeName, delta);<a name="line.328"></a>
-<span class="sourceLineNo">329</span> source.getMetricsContext();<a name="line.329"></a>
-<span class="sourceLineNo">330</span> source.getMetricsDescription();<a name="line.330"></a>
-<span class="sourceLineNo">331</span> source.getMetricsJmxContext();<a name="line.331"></a>
-<span class="sourceLineNo">332</span> source.getMetricsName();<a name="line.332"></a>
-<span class="sourceLineNo">333</span> source.incCounters(counterName, count);<a name="line.333"></a>
-<span class="sourceLineNo">334</span> source.incGauge(gaugeName, delta);<a name="line.334"></a>
-<span class="sourceLineNo">335</span> source.init();<a name="line.335"></a>
-<span class="sourceLineNo">336</span> source.removeMetric(gaugeName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span> source.setGauge(gaugeName, delta);<a name="line.337"></a>
-<span class="sourceLineNo">338</span> source.updateHistogram(counterName, count);<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.340"></a>
-<span class="sourceLineNo">341</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.341"></a>
-<span class="sourceLineNo">342</span> verify(globalRms).getMetricsContext();<a name="line.342"></a>
-<span class="sourceLineNo">343</span> verify(globalRms).getMetricsJmxContext();<a name="line.343"></a>
-<span class="sourceLineNo">344</span> verify(globalRms).getMetricsName();<a name="line.344"></a>
-<span class="sourceLineNo">345</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.345"></a>
-<span class="sourceLineNo">346</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.346"></a>
-<span class="sourceLineNo">347</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.347"></a>
-<span class="sourceLineNo">348</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.348"></a>
-<span class="sourceLineNo">349</span> verify(globalRms).init();<a name="line.349"></a>
-<span class="sourceLineNo">350</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.350"></a>
-<span class="sourceLineNo">351</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.352"></a>
-<span class="sourceLineNo">353</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.353"></a>
-<span class="sourceLineNo">354</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.354"></a>
-<span class="sourceLineNo">355</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.355"></a>
-<span class="sourceLineNo">356</span> }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span> private void doPut(byte[] row) throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span> doPut(connection, row);<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span> }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.364"></a>
-<span class="sourceLineNo">365</span> try (Table t = connection.getTable(tableName)) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span> Put put = new Put(row);<a name="line.366"></a>
-<span class="sourceLineNo">367</span> put.addColumn(famName, row, row);<a name="line.367"></a>
-<span class="sourceLineNo">368</span> t.put(put);<a name="line.368"></a>
-<span class="sourceLineNo">369</span> }<a name="line.369"></a>
-<span class="sourceLineNo">370</span> }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span> private static void doAssert(byte[] row) throws Exception {<a name="line.372"></a>
-<span class="sourceLineNo">373</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span> return; // first call<a name="line.374"></a>
-<span class="sourceLineNo">375</span> }<a name="line.375"></a>
-<span class="sourceLineNo">376</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.376"></a>
-<span class="sourceLineNo">377</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.377"></a>
-<span class="sourceLineNo">378</span> Assert.assertEquals(1, cells.size());<a name="line.378"></a>
-<span class="sourceLineNo">379</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.379"></a>
-<span class="sourceLineNo">380</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.380"></a>
-<span class="sourceLineNo">381</span> }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.383"></a>
-<span class="sourceLineNo">384</span> static UUID uuid = UUID.randomUUID();<a name="line.384"></a>
-<span class="sourceLineNo">385</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.385"></a>
-<span class="sourceLineNo">386</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.386"></a>
-<span class="sourceLineNo">387</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.387"></a>
-<span class="sourceLineNo">388</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.388"></a>
-<span class="sourceLineNo">389</span> static volatile List<Entry> lastEntries = null;<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span> public ReplicationEndpointForTest() {<a name="line.391"></a>
-<span class="sourceLineNo">392</span> replicateCount.set(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span> contructedCount.incrementAndGet();<a name="line.393"></a>
-<span class="sourceLineNo">394</span> }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span> @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span> public UUID getPeerUUID() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span> return uuid;<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span> @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span> replicateCount.incrementAndGet();<a name="line.403"></a>
-<span class="sourceLineNo">404</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.404"></a>
-<span class="sourceLineNo">405</span> return true;<a name="line.405"></a>
-<span class="sourceLineNo">406</span> }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span> @Override<a name="line.408"></a>
-<span class="sourceLineNo">409</span> public void start() {<a name="line.409"></a>
-<span class="sourceLineNo">410</span> startAsync();<a name="line.410"></a>
-<span class="sourceLineNo">411</span> }<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span> @Override<a name="line.413"></a>
-<span class="sourceLineNo">414</span> public void stop() {<a name="line.414"></a>
-<span class="sourceLineNo">415</span> stopAsync();<a name="line.415"></a>
-<span class="sourceLineNo">416</span> }<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span> @Override<a name="line.418"></a>
-<span class="sourceLineNo">419</span> protected void doStart() {<a name="line.419"></a>
-<span class="sourceLineNo">420</span> startedCount.incrementAndGet();<a name="line.420"></a>
-<span class="sourceLineNo">421</span> notifyStarted();<a name="line.421"></a>
-<span class="sourceLineNo">422</span> }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span> @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span> protected void doStop() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span> stoppedCount.incrementAndGet();<a name="line.426"></a>
-<span class="sourceLineNo">427</span> notifyStopped();<a name="line.427"></a>
-<span class="sourceLineNo">428</span> }<a name="line.428"></a>
-<span class="sourceLineNo">429</span> }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span> public static class InterClusterReplicationEndpointForTest<a name="line.431"></a>
-<span class="sourceLineNo">432</span> extends HBaseInterClusterReplicationEndpoint {<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.434"></a>
-<span class="sourceLineNo">435</span> static boolean failedOnce;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span> public InterClusterReplicationEndpointForTest() {<a name="line.437"></a>
-<span class="sourceLineNo">438</span> replicateCount.set(0);<a name="line.438"></a>
-<span class="sourceLineNo">439</span> }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span> @Override<a name="line.441"></a>
-<span class="sourceLineNo">442</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span> boolean success = super.replicate(replicateContext);<a name="line.443"></a>
-<span class="sourceLineNo">444</span> if (success) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span> replicateCount.addAndGet(replicateContext.entries.size());<a name="line.445"></a>
-<span class="sourceLineNo">446</span> }<a name="line.446"></a>
-<span class="sourceLineNo">447</span> return success;<a name="line.447"></a>
+<span class="sourceLineNo">165</span> doAssert(Bytes.toBytes("row42"));<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.167"></a>
+<span class="sourceLineNo">168</span> }<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span> @Test<a name="line.170"></a>
+<span class="sourceLineNo">171</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.171"></a>
+<span class="sourceLineNo">172</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.172"></a>
+<span class="sourceLineNo">173</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.173"></a>
+<span class="sourceLineNo">174</span> int peerCount = admin.getPeersCount();<a name="line.174"></a>
+<span class="sourceLineNo">175</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.175"></a>
+<span class="sourceLineNo">176</span> admin.addPeer(id,<a name="line.176"></a>
+<span class="sourceLineNo">177</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.177"></a>
+<span class="sourceLineNo">178</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.178"></a>
+<span class="sourceLineNo">179</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.179"></a>
+<span class="sourceLineNo">180</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.180"></a>
+<span class="sourceLineNo">181</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.181"></a>
+<span class="sourceLineNo">182</span> if (admin.getPeersCount() <= peerCount) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.183"></a>
+<span class="sourceLineNo">184</span> Threads.sleep(100);<a name="line.184"></a>
+<span class="sourceLineNo">185</span> }<a name="line.185"></a>
+<span class="sourceLineNo">186</span> // now replicate some data<a name="line.186"></a>
+<span class="sourceLineNo">187</span> doPut(row);<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.189"></a>
+<span class="sourceLineNo">190</span> @Override<a name="line.190"></a>
+<span class="sourceLineNo">191</span> public boolean evaluate() throws Exception {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.192"></a>
+<span class="sourceLineNo">193</span> // only send over one edit.<a name="line.193"></a>
+<span class="sourceLineNo">194</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.194"></a>
+<span class="sourceLineNo">195</span> LOG.info("count=" + count);<a name="line.195"></a>
+<span class="sourceLineNo">196</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.196"></a>
+<span class="sourceLineNo">197</span> }<a name="line.197"></a>
+<span class="sourceLineNo">198</span> });<a name="line.198"></a>
+<span class="sourceLineNo">199</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.200"></a>
+<span class="sourceLineNo">201</span> }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.203"></a>
+<span class="sourceLineNo">204</span> }<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span> @Test<a name="line.206"></a>
+<span class="sourceLineNo">207</span> public void testInterClusterReplication() throws Exception {<a name="line.207"></a>
+<span class="sourceLineNo">208</span> final String id = "testInterClusterReplication";<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.210"></a>
+<span class="sourceLineNo">211</span> int totEdits = 0;<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> // Make sure edits are spread across regions because we do region based batching<a name="line.213"></a>
+<span class="sourceLineNo">214</span> // before shipping edits.<a name="line.214"></a>
+<span class="sourceLineNo">215</span> for(HRegion region: regions) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span> RegionInfo hri = region.getRegionInfo();<a name="line.216"></a>
+<span class="sourceLineNo">217</span> byte[] row = hri.getStartKey();<a name="line.217"></a>
+<span class="sourceLineNo">218</span> for (int i = 0; i < 100; i++) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span> if (row.length > 0) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span> Put put = new Put(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span> put.addColumn(famName, row, row);<a name="line.221"></a>
+<span class="sourceLineNo">222</span> region.put(put);<a name="line.222"></a>
+<span class="sourceLineNo">223</span> totEdits++;<a name="line.223"></a>
+<span class="sourceLineNo">224</span> }<a name="line.224"></a>
+<span class="sourceLineNo">225</span> }<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span> admin.addPeer(id,<a name="line.228"></a>
+<span class="sourceLineNo">229</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.229"></a>
+<span class="sourceLineNo">230</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.230"></a>
+<span class="sourceLineNo">231</span> null);<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> final int numEdits = totEdits;<a name="line.233"></a>
+<span class="sourceLineNo">234</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> public boolean evaluate() throws Exception {<a name="line.236"></a>
+<span class="sourceLineNo">237</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.237"></a>
+<span class="sourceLineNo">238</span> }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span> @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span> public String explainFailure() throws Exception {<a name="line.241"></a>
+<span class="sourceLineNo">242</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.242"></a>
+<span class="sourceLineNo">243</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.243"></a>
+<span class="sourceLineNo">244</span> return failure;<a name="line.244"></a>
+<span class="sourceLineNo">245</span> }<a name="line.245"></a>
+<span class="sourceLineNo">246</span> });<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> admin.removePeer("testInterClusterReplication");<a name="line.248"></a>
+<span class="sourceLineNo">249</span> utility1.deleteTableData(tableName);<a name="line.249"></a>
+<span class="sourceLineNo">250</span> }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span> @Test<a name="line.252"></a>
+<span class="sourceLineNo">253</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.253"></a>
+<span class="sourceLineNo">254</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.254"></a>
+<span class="sourceLineNo">255</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.255"></a>
+<span class="sourceLineNo">256</span> //test that we can create mutliple WALFilters reflectively<a name="line.256"></a>
+<span class="sourceLineNo">257</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.257"></a>
+<span class="sourceLineNo">258</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.258"></a>
+<span class="sourceLineNo">259</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.259"></a>
+<span class="sourceLineNo">260</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> // now replicate some data.<a name="line.261"></a>
+<span class="sourceLineNo">262</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.263"></a>
+<span class="sourceLineNo">264</span> doPut(connection, row);<a name="line.264"></a>
+<span class="sourceLineNo">265</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.265"></a>
+<span class="sourceLineNo">266</span> }<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span> @Override<a name="line.269"></a>
+<span class="sourceLineNo">270</span> public boolean evaluate() throws Exception {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.271"></a>
+<span class="sourceLineNo">272</span> }<a name="line.272"></a>
+<span class="sourceLineNo">273</span> });<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.275"></a>
+<span class="sourceLineNo">276</span> //make sure our reflectively created filter is in the filter chain<a name="line.276"></a>
+<span class="sourceLineNo">277</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.277"></a>
+<span class="sourceLineNo">278</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.278"></a>
+<span class="sourceLineNo">279</span> }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span> @Test (expected=IOException.class)<a name="line.281"></a>
+<span class="sourceLineNo">282</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.283"></a>
+<span class="sourceLineNo">284</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span> //test that we can create mutliple WALFilters reflectively<a name="line.285"></a>
+<span class="sourceLineNo">286</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.286"></a>
+<span class="sourceLineNo">287</span> "IAmNotARealWalEntryFilter");<a name="line.287"></a>
+<span class="sourceLineNo">288</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.288"></a>
+<span class="sourceLineNo">289</span> }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span> @Test (expected=IOException.class)<a name="line.291"></a>
+<span class="sourceLineNo">292</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.292"></a>
+<span class="sourceLineNo">293</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.293"></a>
+<span class="sourceLineNo">294</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.294"></a>
+<span class="sourceLineNo">295</span> //test that we can create mutliple WALFilters reflectively<a name="line.295"></a>
+<span class="sourceLineNo">296</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.296"></a>
+<span class="sourceLineNo">297</span> "IAmNotARealWalEntryFilter");<a name="line.297"></a>
+<span class="sourceLineNo">298</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.298"></a>
+<span class="sourceLineNo">299</span> }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span> @Test<a name="line.302"></a>
+<span class="sourceLineNo">303</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.303"></a>
+<span class="sourceLineNo">304</span> /*<a name="line.304"></a>
+<span class="sourceLineNo">305</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.305"></a>
+<span class="sourceLineNo">306</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.306"></a>
+<span class="sourceLineNo">307</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.307"></a>
+<span class="sourceLineNo">308</span> allows for custom JMX metrics.<a name="line.308"></a>
+<span class="sourceLineNo">309</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.309"></a>
+<span class="sourceLineNo">310</span> the two layers of wrapping to the actual BaseSource.<a name="line.310"></a>
+<span class="sourceLineNo">311</span> */<a name="line.311"></a>
+<span class="sourceLineNo">312</span> String id = "id";<a name="line.312"></a>
+<span class="sourceLineNo">313</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.313"></a>
+<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
+<span class="sourceLineNo">315</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
+<span class="sourceLineNo">316</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.316"></a>
+<span class="sourceLineNo">317</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.319"></a>
+<span class="sourceLineNo">320</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.320"></a>
+<span class="sourceLineNo">321</span> Map<String, MetricsReplicationSourceSource> singleSourceSourceByTable = new HashMap<>();<a name="line.321"></a>
+<span class="sourceLineNo">322</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource,<a name="line.322"></a>
+<span class="sourceLineNo">323</span> singleSourceSourceByTable);<a name="line.323"></a>
+<span class="sourceLineNo">324</span> String gaugeName = "gauge";<a name="line.324"></a>
+<span class="sourceLineNo">325</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.325"></a>
+<span class="sourceLineNo">326</span> String globalGaugeName = "source." + gaugeName;<a name="line.326"></a>
+<span class="sourceLineNo">327</span> long delta = 1;<a name="line.327"></a>
+<span class="sourceLineNo">328</span> String counterName = "counter";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> String singleCounterName = "source.id." + counterName;<a name="line.329"></a>
+<span class="sourceLineNo">330</span> String globalCounterName = "source." + counterName;<a name="line.330"></a>
+<span class="sourceLineNo">331</span> long count = 2;<a name="line.331"></a>
+<span class="sourceLineNo">332</span> source.decGauge(gaugeName, delta);<a name="line.332"></a>
+<span class="sourceLineNo">333</span> source.getMetricsContext();<a name="line.333"></a>
+<span class="sourceLineNo">334</span> source.getMetricsDescription();<a name="line.334"></a>
+<span class="sourceLineNo">335</span> source.getMetricsJmxContext();<a name="line.335"></a>
+<span class="sourceLineNo">336</span> source.getMetricsName();<a name="line.336"></a>
+<span class="sourceLineNo">337</span> source.incCounters(counterName, count);<a name="line.337"></a>
+<span class="sourceLineNo">338</span> source.incGauge(gaugeName, delta);<a name="line.338"></a>
+<span class="sourceLineNo">339</span> source.init();<a name="line.339"></a>
+<span class="sourceLineNo">340</span> source.removeMetric(gaugeName);<a name="line.340"></a>
+<span class="sourceLineNo">341</span> source.setGauge(gaugeName, delta);<a name="line.341"></a>
+<span class="sourceLineNo">342</span> source.updateHistogram(counterName, count);<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.344"></a>
+<span class="sourceLineNo">345</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.345"></a>
+<span class="sourceLineNo">346</span> verify(globalRms).getMetricsContext();<a name="line.346"></a>
+<span class="sourceLineNo">347</span> verify(globalRms).getMetricsJmxContext();<a name="line.347"></a>
+<span class="sourceLineNo">348</span> verify(globalRms).getMetricsName();<a name="line.348"></a>
+<span class="sourceLineNo">349</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.349"></a>
+<span class="sourceLineNo">350</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.350"></a>
+<span class="sourceLineNo">351</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.351"></a>
+<span class="sourceLineNo">352</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.352"></a>
+<span class="sourceLineNo">353</span> verify(globalRms).init();<a name="line.353"></a>
+<span class="sourceLineNo">354</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.354"></a>
+<span class="sourceLineNo">355</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.355"></a>
+<span class="sourceLineNo">356</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.356"></a>
+<span class="sourceLineNo">357</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.357"></a>
+<span class="sourceLineNo">358</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.358"></a>
+<span class="sourceLineNo">359</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span> //check singleSourceSourceByTable metrics.<a name="line.361"></a>
+<span class="sourceLineNo">362</span> // singleSourceSourceByTable map entry will be created only<a name="line.362"></a>
+<span class="sourceLineNo">363</span> // after calling #setAgeOfLastShippedOpByTable<a name="line.363"></a>
+<span class="sourceLineNo">364</span> boolean containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.364"></a>
+<span class="sourceLineNo">365</span> .containsKey("RandomNewTable");<a name="line.365"></a>
+<span class="sourceLineNo">366</span> Assert.assertEquals(false, containsRandomNewTable);<a name="line.366"></a>
+<span class="sourceLineNo">367</span> source.setAgeOfLastShippedOpByTable(123L, "RandomNewTable");<a name="line.367"></a>
+<span class="sourceLineNo">368</span> containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.368"></a>
+<span class="sourceLineNo">369</span> .containsKey("RandomNewTable");<a name="line.369"></a>
+<span class="sourceLineNo">370</span> Assert.assertEquals(true, containsRandomNewTable);<a name="line.370"></a>
+<span class="sourceLineNo">371</span> MetricsReplicationSourceSource msr = source.getSingleSourceSourceByTable()<a name="line.371"></a>
+<span class="sourceLineNo">372</span> .get("RandomNewTable");<a name="line.372"></a>
+<span class="sourceLineNo">373</span> // cannot put more concreate value here to verify because the age is arbitrary.<a name="line.373"></a>
+<span class="sourceLineNo">374</span> // as long as it's greater than 0, we see it as correct answer.<a name="line.374"></a>
+<span class="sourceLineNo">375</span> Assert.assertTrue(msr.getLastShippedAge() > 0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span> }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span> private void doPut(byte[] row) throws IOException {<a name="line.378"></a>
+<span class="sourceLineNo">379</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span> doPut(connection, row);<a name="line.380"></a>
+<span class="sourceLineNo">381</span> }<a name="line.381"></a>
+<span class="sourceLineNo">382</span> }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.384"></a>
+<span class="sourceLineNo">385</span> try (Table t = connection.getTable(tableName)) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span> Put put = new Put(row);<a name="line.386"></a>
+<span class="sourceLineNo">387</span> put.addColumn(famName, row, row);<a name="line.387"></a>
+<span class="sourceLineNo">388</span> t.put(put);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<a name="line.389"></a>
+<span class="sourceLineNo">390</span> }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span> private static void doAssert(byte[] row) throws Exception {<a name="line.392"></a>
+<span class="sourceLineNo">393</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span> return; // first call<a name="line.394"></a>
+<span class="sourceLineNo">395</span> }<a name="line.395"></a>
+<span class="sourceLineNo">396</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.396"></a>
+<span class="sourceLineNo">397</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.397"></a>
+<span class="sourceLineNo">398</span> Assert.assertEquals(1, cells.size());<a name="line.398"></a>
+<span class="sourceLineNo">399</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.399"></a>
+<span class="sourceLineNo">400</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.400"></a>
+<span class="sourceLineNo">401</span> }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.403"></a>
+<span class="sourceLineNo">404</span> static UUID uuid = UUID.randomUUID();<a name="line.404"></a>
+<span class="sourceLineNo">405</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.405"></a>
+<span class="sourceLineNo">406</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.406"></a>
+<span class="sourceLineNo">407</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.407"></a>
+<span class="sourceLineNo">408</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.408"></a>
+<span class="sourceLineNo">409</span> static volatile List<Entry> lastEntries = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span> public ReplicationEndpointForTest() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span> replicateCount.set(0);<a name="line.412"></a>
+<span class="sourceLineNo">413</span> contructedCount.incrementAndGet();<a name="line.413"></a>
+<span class="sourceLineNo">414</span> }<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span> @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span> public UUID getPeerUUID() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span> return uuid;<a name="line.418"></a>
+<span class="sourceLineNo">419</span> }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span> @Override<a name="line.421"></a>
+<span class="sourceLineNo">422</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span> replicateCount.incrementAndGet();<a name="line.423"></a>
+<span class="sourceLineNo">424</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.424"></a>
+<span class="sourceLineNo">425</span> return true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span> }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span> @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span> public void start() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span> startAsync();<a name="line.430"></a>
+<span class="sourceLineNo">431</span> }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span> @Override<a name="line.433"></a>
+<span class="sourceLineNo">434</span> public void stop() {<a name="line.434"></a>
+<span class="sourceLineNo">435</span> stopAsync();<a name="line.435"></a>
+<span class="sourceLineNo">436</span> }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span> @Override<a name="line.438"></a>
+<span class="sourceLineNo">439</span> protected void doStart() {<a name="line.439"></a>
+<span class="sourceLineNo">440</span> startedCount.incrementAndGet();<a name="line.440"></a>
+<span class="sourceLineNo">441</span> notifyStarted();<a name="line.441"></a>
+<span class="sourceLineNo">442</span> }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span> @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span> protected void doStop() {<a name="line.445"></a>
+<span class="sourceLineNo">446</span> stoppedCount.incrementAndGet();<a name="line.446"></a>
+<span class="sourceLineNo">447</span> notifyStopped();<a name="line.447"></a>
<span class="sourceLineNo">448</span> }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span> @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span> protected Callable<Integer> createReplicator(List<Entry> entries, int ordinal) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span> // Fail only once, we don't want to slow down the test.<a name="line.452"></a>
-<span class="sourceLineNo">453</span> if (failedOnce) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span> return () -> ordinal;<a name="line.454"></a>
-<span class="sourceLineNo">455</span> } else {<a name="line.455"></a>
-<span class="sourceLineNo">456</span> failedOnce = true;<a name="line.456"></a>
-<span class="sourceLineNo">457</span> return () -> {<a name="line.457"></a>
-<span class="sourceLineNo">458</span> throw new IOException("Sample Exception: Failed to replicate.");<a name="line.458"></a>
-<span class="sourceLineNo">459</span> };<a name="line.459"></a>
-<span class="sourceLineNo">460</span> }<a name="line.460"></a>
-<span class="sourceLineNo">461</span> }<a name="line.461"></a>
-<span class="sourceLineNo">462</span> }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span> public static class ReplicationEndpointReturningFalse extends ReplicationEndpointForTest {<a name="line.464"></a>
-<span class="sourceLineNo">465</span> static int COUNT = 10;<a name="line.465"></a>
-<span class="sourceLineNo">466</span> static AtomicReference<Exception> ex = new AtomicReference<>(null);<a name="line.466"></a>
-<span class="sourceLineNo">467</span> static AtomicBoolean replicated = new AtomicBoolean(false);<a name="line.467"></a>
-<span class="sourceLineNo">468</span> @Override<a name="line.468"></a>
-<span class="sourceLineNo">469</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span> try {<a name="line.470"></a>
-<span class="sourceLineNo">471</span> // check row<a name="line.471"></a>
-<span class="sourceLineNo">472</span> doAssert(row);<a name="line.472"></a>
-<span class="sourceLineNo">473</span> } catch (Exception e) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span> ex.set(e);<a name="line.474"></a>
-<span class="sourceLineNo">475</span> }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span> super.replicate(replicateContext);<a name="line.477"></a>
-<span class="sourceLineNo">478</span> LOG.info("Repl
<TRUNCATED>
[14/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html
index ead6a6a..4f03175 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html
@@ -123,7 +123,7 @@ var activeTableTab = "activeTableTab";
<hr>
<br>
<pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.44">ReplicationSourceShipper</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.45">ReplicationSourceShipper</a>
extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
<div class="block">This thread reads entries from a queue and ships them. Entries are placed onto the queue by
ReplicationSourceWALReaderThread</div>
@@ -367,7 +367,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>LOG</h4>
-<pre>private static final org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.45">LOG</a></pre>
+<pre>private static final org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.46">LOG</a></pre>
</li>
</ul>
<a name="conf">
@@ -376,7 +376,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>conf</h4>
-<pre>private final org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.54">conf</a></pre>
+<pre>private final org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.55">conf</a></pre>
</li>
</ul>
<a name="walGroupId">
@@ -385,7 +385,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>walGroupId</h4>
-<pre>protected final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.55">walGroupId</a></pre>
+<pre>protected final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.56">walGroupId</a></pre>
</li>
</ul>
<a name="queue">
@@ -394,7 +394,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>queue</h4>
-<pre>protected final <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/PriorityBlockingQueue.html?is-external=true" title="class or interface in java.util.concurrent">PriorityBlockingQueue</a><org.apache.hadoop.fs.Path> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.56">queue</a></pre>
+<pre>protected final <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/PriorityBlockingQueue.html?is-external=true" title="class or interface in java.util.concurrent">PriorityBlockingQueue</a><org.apache.hadoop.fs.Path> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.57">queue</a></pre>
</li>
</ul>
<a name="source">
@@ -403,7 +403,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>source</h4>
-<pre>private final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceInterface.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceInterface</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.57">source</a></pre>
+<pre>private final <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceInterface.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceInterface</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.58">source</a></pre>
</li>
</ul>
<a name="currentPosition">
@@ -412,7 +412,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>currentPosition</h4>
-<pre>private volatile long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.61">currentPosition</a></pre>
+<pre>private volatile long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.62">currentPosition</a></pre>
</li>
</ul>
<a name="currentPath">
@@ -421,7 +421,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>currentPath</h4>
-<pre>private org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.63">currentPath</a></pre>
+<pre>private org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.64">currentPath</a></pre>
</li>
</ul>
<a name="state">
@@ -430,7 +430,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>state</h4>
-<pre>private volatile <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.65">state</a></pre>
+<pre>private volatile <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.66">state</a></pre>
</li>
</ul>
<a name="entryReader">
@@ -439,7 +439,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>entryReader</h4>
-<pre>protected <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceWALReader.html" title="class in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceWALReader</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.66">entryReader</a></pre>
+<pre>protected <a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceWALReader.html" title="class in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceWALReader</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.67">entryReader</a></pre>
</li>
</ul>
<a name="sleepForRetries">
@@ -448,7 +448,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>sleepForRetries</h4>
-<pre>protected final long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.69">sleepForRetries</a></pre>
+<pre>protected final long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.70">sleepForRetries</a></pre>
</li>
</ul>
<a name="maxRetriesMultiplier">
@@ -457,7 +457,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockListLast">
<li class="blockList">
<h4>maxRetriesMultiplier</h4>
-<pre>protected final int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.71">maxRetriesMultiplier</a></pre>
+<pre>protected final int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.72">maxRetriesMultiplier</a></pre>
</li>
</ul>
</li>
@@ -474,7 +474,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockListLast">
<li class="blockList">
<h4>ReplicationSourceShipper</h4>
-<pre>public <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.73">ReplicationSourceShipper</a>(org.apache.hadoop.conf.Configuration conf,
+<pre>public <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.74">ReplicationSourceShipper</a>(org.apache.hadoop.conf.Configuration conf,
<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> walGroupId,
<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/PriorityBlockingQueue.html?is-external=true" title="class or interface in java.util.concurrent">PriorityBlockingQueue</a><org.apache.hadoop.fs.Path> queue,
<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceInterface.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceInterface</a> source)</pre>
@@ -494,7 +494,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>run</h4>
-<pre>public final void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.86">run</a>()</pre>
+<pre>public final void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.87">run</a>()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code> in interface <code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -509,7 +509,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>noMoreData</h4>
-<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.119">noMoreData</a>()</pre>
+<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.120">noMoreData</a>()</pre>
</li>
</ul>
<a name="postFinish--">
@@ -518,7 +518,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>postFinish</h4>
-<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.123">postFinish</a>()</pre>
+<pre>protected void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.124">postFinish</a>()</pre>
</li>
</ul>
<a name="getBatchEntrySizeExcludeBulkLoad-org.apache.hadoop.hbase.replication.regionserver.WALEntryBatch-">
@@ -527,7 +527,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>getBatchEntrySizeExcludeBulkLoad</h4>
-<pre>private int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.130">getBatchEntrySizeExcludeBulkLoad</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/WALEntryBatch.html" title="class in org.apache.hadoop.hbase.replication.regionserver">WALEntryBatch</a> entryBatch)</pre>
+<pre>private int <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.131">getBatchEntrySizeExcludeBulkLoad</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/WALEntryBatch.html" title="class in org.apache.hadoop.hbase.replication.regionserver">WALEntryBatch</a> entryBatch)</pre>
<div class="block">get batchEntry size excludes bulk load file sizes.
Uses ReplicationSourceWALReader's static method.</div>
</li>
@@ -538,7 +538,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>shipEdits</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.141">shipEdits</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/WALEntryBatch.html" title="class in org.apache.hadoop.hbase.replication.regionserver">WALEntryBatch</a> entryBatch)</pre>
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.142">shipEdits</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/WALEntryBatch.html" title="class in org.apache.hadoop.hbase.replication.regionserver">WALEntryBatch</a> entryBatch)</pre>
<div class="block">Do the shipping logic</div>
</li>
</ul>
@@ -548,7 +548,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>cleanUpHFileRefs</h4>
-<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.216">cleanUpHFileRefs</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a> edit)
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.221">cleanUpHFileRefs</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a> edit)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -562,7 +562,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>updateLogPosition</h4>
-<pre>private boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.240">updateLogPosition</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/WALEntryBatch.html" title="class in org.apache.hadoop.hbase.replication.regionserver">WALEntryBatch</a> batch)</pre>
+<pre>private boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.245">updateLogPosition</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/WALEntryBatch.html" title="class in org.apache.hadoop.hbase.replication.regionserver">WALEntryBatch</a> batch)</pre>
</li>
</ul>
<a name="startup-java.lang.Thread.UncaughtExceptionHandler-">
@@ -571,7 +571,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>startup</h4>
-<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.265">startup</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true" title="class or interface in java.lang">Thread.UncaughtExceptionHandler</a> handler)</pre>
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.270">startup</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true" title="class or interface in java.lang">Thread.UncaughtExceptionHandler</a> handler)</pre>
</li>
</ul>
<a name="getCurrentPath--">
@@ -580,7 +580,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>getCurrentPath</h4>
-<pre>org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.271">getCurrentPath</a>()</pre>
+<pre>org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.276">getCurrentPath</a>()</pre>
</li>
</ul>
<a name="getCurrentPosition--">
@@ -589,7 +589,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>getCurrentPosition</h4>
-<pre>long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.275">getCurrentPosition</a>()</pre>
+<pre>long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.280">getCurrentPosition</a>()</pre>
</li>
</ul>
<a name="setWALReader-org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceWALReader-">
@@ -598,7 +598,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>setWALReader</h4>
-<pre>void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.279">setWALReader</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceWALReader.html" title="class in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceWALReader</a> entryReader)</pre>
+<pre>void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.284">setWALReader</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceWALReader.html" title="class in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceWALReader</a> entryReader)</pre>
</li>
</ul>
<a name="getStartPosition--">
@@ -607,7 +607,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>getStartPosition</h4>
-<pre>long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.283">getStartPosition</a>()</pre>
+<pre>long <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.288">getStartPosition</a>()</pre>
</li>
</ul>
<a name="isActive--">
@@ -616,7 +616,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>isActive</h4>
-<pre>private boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.287">isActive</a>()</pre>
+<pre>private boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.292">isActive</a>()</pre>
</li>
</ul>
<a name="setWorkerState-org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceShipper.WorkerState-">
@@ -625,7 +625,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>setWorkerState</h4>
-<pre>protected final void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.291">setWorkerState</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> state)</pre>
+<pre>protected final void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.296">setWorkerState</a>(<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper.WorkerState</a> state)</pre>
</li>
</ul>
<a name="stopWorker--">
@@ -634,7 +634,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>stopWorker</h4>
-<pre>void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.295">stopWorker</a>()</pre>
+<pre>void <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.300">stopWorker</a>()</pre>
</li>
</ul>
<a name="isFinished--">
@@ -643,7 +643,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockList">
<li class="blockList">
<h4>isFinished</h4>
-<pre>public boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.299">isFinished</a>()</pre>
+<pre>public boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.304">isFinished</a>()</pre>
</li>
</ul>
<a name="sleepForRetries-java.lang.String-int-">
@@ -652,7 +652,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
<ul class="blockListLast">
<li class="blockList">
<h4>sleepForRetries</h4>
-<pre>public boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.309">sleepForRetries</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> msg,
+<pre>public boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#line.314">sleepForRetries</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> msg,
int sleepMultiplier)</pre>
<div class="block">Do the sleeping logic</div>
<dl>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/replication/regionserver/class-use/MetricsReplicationSourceSource.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/class-use/MetricsReplicationSourceSource.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/class-use/MetricsReplicationSourceSource.html
index 1b4b38f..22cc065 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/class-use/MetricsReplicationSourceSource.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/class-use/MetricsReplicationSourceSource.html
@@ -129,6 +129,19 @@
</tr>
</tbody>
</table>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
+<caption><span>Fields in <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/package-summary.html">org.apache.hadoop.hbase.replication.regionserver</a> with type parameters of type <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a></span><span class="tabEnd"> </span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a>></code></td>
+<td class="colLast"><span class="typeNameLabel">MetricsSource.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#singleSourceSourceByTable">singleSourceSourceByTable</a></span></code> </td>
+</tr>
+</tbody>
+</table>
<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
<caption><span>Methods in <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/package-summary.html">org.apache.hadoop.hbase.replication.regionserver</a> that return <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a></span><span class="tabEnd"> </span></caption>
<tr>
@@ -154,6 +167,19 @@
</tr>
</tbody>
</table>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
+<caption><span>Methods in <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/package-summary.html">org.apache.hadoop.hbase.replication.regionserver</a> that return types with arguments of type <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a></span><span class="tabEnd"> </span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a>></code></td>
+<td class="colLast"><span class="typeNameLabel">MetricsSource.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#getSingleSourceSourceByTable--">getSingleSourceSourceByTable</a></span>()</code> </td>
+</tr>
+</tbody>
+</table>
<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing constructors, and an explanation">
<caption><span>Constructors in <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/package-summary.html">org.apache.hadoop.hbase.replication.regionserver</a> with parameters of type <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a></span><span class="tabEnd"> </span></caption>
<tr>
@@ -161,9 +187,26 @@
</tr>
<tbody>
<tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#MetricsSource-java.lang.String-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-">MetricsSource</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> id,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#MetricsSource-java.lang.String-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-java.util.Map-">MetricsSource</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> id,
+ <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> singleSourceSource,
+ <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> globalSourceSource,
+ <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a>> singleSourceSourceByTable)</code>
+<div class="block">Constructor for injecting custom (or test) MetricsReplicationSourceSources</div>
+</td>
+</tr>
+</tbody>
+</table>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing constructors, and an explanation">
+<caption><span>Constructor parameters in <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/package-summary.html">org.apache.hadoop.hbase.replication.regionserver</a> with type arguments of type <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a></span><span class="tabEnd"> </span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#MetricsSource-java.lang.String-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-java.util.Map-">MetricsSource</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> id,
<a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> singleSourceSource,
- <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> globalSourceSource)</code>
+ <a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a> globalSourceSource,
+ <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceSource.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceSource</a>> singleSourceSourceByTable)</code>
<div class="block">Constructor for injecting custom (or test) MetricsReplicationSourceSources</div>
</td>
</tr>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 2cef8bd..81a90a9 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -199,9 +199,9 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index b5bd944..3c2c174 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -533,13 +533,13 @@
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a><T>)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a><T>)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a><T>)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index c0e28b4..9ec5b35 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -189,8 +189,8 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">WALFactory.Providers</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 817fc3a..b696c50 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,11 +16,11 @@
<span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
<span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
<span class="sourceLineNo">010</span> public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
-<span class="sourceLineNo">011</span> public static final String revision = "0b28155d274910b4e667b949d51f78809a1eff0b";<a name="line.11"></a>
+<span class="sourceLineNo">011</span> public static final String revision = "0e43abc78a5a55c84a7572125d498a950dabfb57";<a name="line.11"></a>
<span class="sourceLineNo">012</span> public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span> public static final String date = "Thu Jun 14 22:13:02 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span> public static final String date = "Fri Jun 15 21:36:50 UTC 2018";<a name="line.13"></a>
<span class="sourceLineNo">014</span> public static final String url = "git://jenkins-websites1.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span> public static final String srcChecksum = "241d3c5d4e507f803723d87043bf1d28";<a name="line.15"></a>
+<span class="sourceLineNo">015</span> public static final String srcChecksum = "2e5366d5b65adc25ba60d4644effc4f6";<a name="line.15"></a>
<span class="sourceLineNo">016</span>}<a name="line.16"></a>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html
index 33e600e..b06d7e8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html
@@ -195,179 +195,178 @@
<span class="sourceLineNo">187</span> }<a name="line.187"></a>
<span class="sourceLineNo">188</span><a name="line.188"></a>
<span class="sourceLineNo">189</span> // We're sending the new deads first.<a name="line.189"></a>
-<span class="sourceLineNo">190</span> List<Map.Entry<ServerName, Integer>> entries = new ArrayList<>();<a name="line.190"></a>
-<span class="sourceLineNo">191</span> entries.addAll(lastSent.entrySet());<a name="line.191"></a>
-<span class="sourceLineNo">192</span> Collections.sort(entries, new Comparator<Map.Entry<ServerName, Integer>>() {<a name="line.192"></a>
-<span class="sourceLineNo">193</span> @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span> public int compare(Map.Entry<ServerName, Integer> o1, Map.Entry<ServerName, Integer> o2) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span> return o1.getValue().compareTo(o2.getValue());<a name="line.195"></a>
-<span class="sourceLineNo">196</span> }<a name="line.196"></a>
-<span class="sourceLineNo">197</span> });<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span> // With a limit of MAX_SERVER_PER_MESSAGE<a name="line.199"></a>
-<span class="sourceLineNo">200</span> int max = entries.size() > MAX_SERVER_PER_MESSAGE ? MAX_SERVER_PER_MESSAGE : entries.size();<a name="line.200"></a>
-<span class="sourceLineNo">201</span> List<ServerName> res = new ArrayList<>(max);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span> for (int i = 0; i < max; i++) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span> Map.Entry<ServerName, Integer> toSend = entries.get(i);<a name="line.204"></a>
-<span class="sourceLineNo">205</span> if (toSend.getValue() >= (NB_SEND - 1)) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> lastSent.remove(toSend.getKey());<a name="line.206"></a>
-<span class="sourceLineNo">207</span> } else {<a name="line.207"></a>
-<span class="sourceLineNo">208</span> lastSent.replace(toSend.getKey(), toSend.getValue(), toSend.getValue() + 1);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> res.add(toSend.getKey());<a name="line.211"></a>
-<span class="sourceLineNo">212</span> }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span> return res;<a name="line.214"></a>
-<span class="sourceLineNo">215</span> }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span> /**<a name="line.217"></a>
-<span class="sourceLineNo">218</span> * Get the servers which died since a given timestamp.<a name="line.218"></a>
-<span class="sourceLineNo">219</span> * protected because it can be subclassed by the tests.<a name="line.219"></a>
-<span class="sourceLineNo">220</span> */<a name="line.220"></a>
-<span class="sourceLineNo">221</span> protected List<Pair<ServerName, Long>> getDeadServers(long since) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span> if (master.getServerManager() == null) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span> return Collections.emptyList();<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> return master.getServerManager().getDeadServers().copyDeadServersSince(since);<a name="line.226"></a>
-<span class="sourceLineNo">227</span> }<a name="line.227"></a>
+<span class="sourceLineNo">190</span> List<Map.Entry<ServerName, Integer>> entries = new ArrayList<>(lastSent.entrySet());<a name="line.190"></a>
+<span class="sourceLineNo">191</span> Collections.sort(entries, new Comparator<Map.Entry<ServerName, Integer>>() {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span> public int compare(Map.Entry<ServerName, Integer> o1, Map.Entry<ServerName, Integer> o2) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span> return o1.getValue().compareTo(o2.getValue());<a name="line.194"></a>
+<span class="sourceLineNo">195</span> }<a name="line.195"></a>
+<span class="sourceLineNo">196</span> });<a name="line.196"></a>
+<span class="sourceLineNo">197</span><a name="line.197"></a>
+<span class="sourceLineNo">198</span> // With a limit of MAX_SERVER_PER_MESSAGE<a name="line.198"></a>
+<span class="sourceLineNo">199</span> int max = entries.size() > MAX_SERVER_PER_MESSAGE ? MAX_SERVER_PER_MESSAGE : entries.size();<a name="line.199"></a>
+<span class="sourceLineNo">200</span> List<ServerName> res = new ArrayList<>(max);<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span> for (int i = 0; i < max; i++) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span> Map.Entry<ServerName, Integer> toSend = entries.get(i);<a name="line.203"></a>
+<span class="sourceLineNo">204</span> if (toSend.getValue() >= (NB_SEND - 1)) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span> lastSent.remove(toSend.getKey());<a name="line.205"></a>
+<span class="sourceLineNo">206</span> } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span> lastSent.replace(toSend.getKey(), toSend.getValue(), toSend.getValue() + 1);<a name="line.207"></a>
+<span class="sourceLineNo">208</span> }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> res.add(toSend.getKey());<a name="line.210"></a>
+<span class="sourceLineNo">211</span> }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> return res;<a name="line.213"></a>
+<span class="sourceLineNo">214</span> }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span> /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span> * Get the servers which died since a given timestamp.<a name="line.217"></a>
+<span class="sourceLineNo">218</span> * protected because it can be subclassed by the tests.<a name="line.218"></a>
+<span class="sourceLineNo">219</span> */<a name="line.219"></a>
+<span class="sourceLineNo">220</span> protected List<Pair<ServerName, Long>> getDeadServers(long since) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span> if (master.getServerManager() == null) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span> return Collections.emptyList();<a name="line.222"></a>
+<span class="sourceLineNo">223</span> }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span> return master.getServerManager().getDeadServers().copyDeadServersSince(since);<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span> public interface Publisher extends Closeable {<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span> void connect(Configuration conf) throws IOException;<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span> void publish(ClusterMetrics cs);<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span> @Override<a name="line.236"></a>
-<span class="sourceLineNo">237</span> void close();<a name="line.237"></a>
-<span class="sourceLineNo">238</span> }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span> @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.240"></a>
-<span class="sourceLineNo">241</span> public static class MulticastPublisher implements Publisher {<a name="line.241"></a>
-<span class="sourceLineNo">242</span> private DatagramChannel channel;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> private final EventLoopGroup group = new NioEventLoopGroup(<a name="line.243"></a>
-<span class="sourceLineNo">244</span> 1, Threads.newDaemonThreadFactory("hbase-master-clusterStatusPublisher"));<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> public MulticastPublisher() {<a name="line.246"></a>
-<span class="sourceLineNo">247</span> }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span> @Override<a name="line.249"></a>
-<span class="sourceLineNo">250</span> public void connect(Configuration conf) throws IOException {<a name="line.250"></a>
-<span class="sourceLineNo">251</span> String mcAddress = conf.get(HConstants.STATUS_MULTICAST_ADDRESS,<a name="line.251"></a>
-<span class="sourceLineNo">252</span> HConstants.DEFAULT_STATUS_MULTICAST_ADDRESS);<a name="line.252"></a>
-<span class="sourceLineNo">253</span> int port = conf.getInt(HConstants.STATUS_MULTICAST_PORT,<a name="line.253"></a>
-<span class="sourceLineNo">254</span> HConstants.DEFAULT_STATUS_MULTICAST_PORT);<a name="line.254"></a>
-<span class="sourceLineNo">255</span> String bindAddress = conf.get(HConstants.STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> HConstants.DEFAULT_STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS);<a name="line.256"></a>
-<span class="sourceLineNo">257</span> String niName = conf.get(HConstants.STATUS_MULTICAST_NI_NAME);<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span> final InetAddress ina;<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> ina = InetAddress.getByName(mcAddress);<a name="line.261"></a>
-<span class="sourceLineNo">262</span> } catch (UnknownHostException e) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span> close();<a name="line.263"></a>
-<span class="sourceLineNo">264</span> throw new IOException("Can't connect to " + mcAddress, e);<a name="line.264"></a>
-<span class="sourceLineNo">265</span> }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span> final InetSocketAddress isa = new InetSocketAddress(mcAddress, port);<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span> InternetProtocolFamily family;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> NetworkInterface ni;<a name="line.270"></a>
-<span class="sourceLineNo">271</span> if (niName != null) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span> if (ina instanceof Inet6Address) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span> family = InternetProtocolFamily.IPv6;<a name="line.273"></a>
-<span class="sourceLineNo">274</span> } else {<a name="line.274"></a>
-<span class="sourceLineNo">275</span> family = InternetProtocolFamily.IPv4;<a name="line.275"></a>
-<span class="sourceLineNo">276</span> }<a name="line.276"></a>
-<span class="sourceLineNo">277</span> ni = NetworkInterface.getByName(niName);<a name="line.277"></a>
-<span class="sourceLineNo">278</span> } else {<a name="line.278"></a>
-<span class="sourceLineNo">279</span> InetAddress localAddress;<a name="line.279"></a>
-<span class="sourceLineNo">280</span> if (ina instanceof Inet6Address) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> localAddress = Addressing.getIp6Address();<a name="line.281"></a>
-<span class="sourceLineNo">282</span> family = InternetProtocolFamily.IPv6;<a name="line.282"></a>
-<span class="sourceLineNo">283</span> } else {<a name="line.283"></a>
-<span class="sourceLineNo">284</span> localAddress = Addressing.getIp4Address();<a name="line.284"></a>
-<span class="sourceLineNo">285</span> family = InternetProtocolFamily.IPv4;<a name="line.285"></a>
-<span class="sourceLineNo">286</span> }<a name="line.286"></a>
-<span class="sourceLineNo">287</span> ni = NetworkInterface.getByInetAddress(localAddress);<a name="line.287"></a>
-<span class="sourceLineNo">288</span> }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span> Bootstrap b = new Bootstrap();<a name="line.290"></a>
-<span class="sourceLineNo">291</span> b.group(group)<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .channelFactory(new HBaseDatagramChannelFactory<Channel>(NioDatagramChannel.class, family))<a name="line.292"></a>
-<span class="sourceLineNo">293</span> .option(ChannelOption.SO_REUSEADDR, true)<a name="line.293"></a>
-<span class="sourceLineNo">294</span> .handler(new ClusterMetricsEncoder(isa));<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span> try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span> channel = (DatagramChannel) b.bind(bindAddress, 0).sync().channel();<a name="line.297"></a>
-<span class="sourceLineNo">298</span> channel.joinGroup(ina, ni, null, channel.newPromise()).sync();<a name="line.298"></a>
-<span class="sourceLineNo">299</span> channel.connect(isa).sync();<a name="line.299"></a>
-<span class="sourceLineNo">300</span> } catch (InterruptedException e) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span> close();<a name="line.301"></a>
-<span class="sourceLineNo">302</span> throw ExceptionUtil.asInterrupt(e);<a name="line.302"></a>
-<span class="sourceLineNo">303</span> }<a name="line.303"></a>
-<span class="sourceLineNo">304</span> }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span> private static final class HBaseDatagramChannelFactory<T extends Channel><a name="line.306"></a>
-<span class="sourceLineNo">307</span> implements ChannelFactory<T> {<a name="line.307"></a>
-<span class="sourceLineNo">308</span> private final Class<? extends T> clazz;<a name="line.308"></a>
-<span class="sourceLineNo">309</span> private InternetProtocolFamily family;<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span> HBaseDatagramChannelFactory(Class<? extends T> clazz, InternetProtocolFamily family) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span> this.clazz = clazz;<a name="line.312"></a>
-<span class="sourceLineNo">313</span> this.family = family;<a name="line.313"></a>
-<span class="sourceLineNo">314</span> }<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span> @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span> public T newChannel() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span> try {<a name="line.318"></a>
-<span class="sourceLineNo">319</span> return ReflectionUtils.instantiateWithCustomCtor(clazz.getName(),<a name="line.319"></a>
-<span class="sourceLineNo">320</span> new Class[] { InternetProtocolFamily.class }, new Object[] { family });<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span> } catch (Throwable t) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span> throw new ChannelException("Unable to create Channel from class " + clazz, t);<a name="line.323"></a>
-<span class="sourceLineNo">324</span> }<a name="line.324"></a>
-<span class="sourceLineNo">325</span> }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span> @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span> public String toString() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span> return StringUtil.simpleClassName(clazz) + ".class";<a name="line.329"></a>
-<span class="sourceLineNo">330</span> }<a name="line.330"></a>
-<span class="sourceLineNo">331</span> }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span> private static final class ClusterMetricsEncoder<a name="line.333"></a>
-<span class="sourceLineNo">334</span> extends MessageToMessageEncoder<ClusterMetrics> {<a name="line.334"></a>
-<span class="sourceLineNo">335</span> final private InetSocketAddress isa;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span> private ClusterMetricsEncoder(InetSocketAddress isa) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span> this.isa = isa;<a name="line.338"></a>
-<span class="sourceLineNo">339</span> }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span> @Override<a name="line.341"></a>
-<span class="sourceLineNo">342</span> protected void encode(ChannelHandlerContext channelHandlerContext,<a name="line.342"></a>
-<span class="sourceLineNo">343</span> ClusterMetrics clusterStatus, List<Object> objects) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span> objects.add(new DatagramPacket(Unpooled.wrappedBuffer(<a name="line.344"></a>
-<span class="sourceLineNo">345</span> ClusterMetricsBuilder.toClusterStatus(clusterStatus).toByteArray()), isa));<a name="line.345"></a>
-<span class="sourceLineNo">346</span> }<a name="line.346"></a>
-<span class="sourceLineNo">347</span> }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span> @Override<a name="line.349"></a>
-<span class="sourceLineNo">350</span> public void publish(ClusterMetrics cs) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span> channel.writeAndFlush(cs).syncUninterruptibly();<a name="line.351"></a>
-<span class="sourceLineNo">352</span> }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span> @Override<a name="line.354"></a>
-<span class="sourceLineNo">355</span> public void close() {<a name="line.355"></a>
-<span class="sourceLineNo">356</span> if (channel != null) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span> channel.close();<a name="line.357"></a>
-<span class="sourceLineNo">358</span> }<a name="line.358"></a>
-<span class="sourceLineNo">359</span> group.shutdownGracefully();<a name="line.359"></a>
-<span class="sourceLineNo">360</span> }<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>}<a name="line.362"></a>
+<span class="sourceLineNo">229</span> public interface Publisher extends Closeable {<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span> void connect(Configuration conf) throws IOException;<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> void publish(ClusterMetrics cs);<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> void close();<a name="line.236"></a>
+<span class="sourceLineNo">237</span> }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span> @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.239"></a>
+<span class="sourceLineNo">240</span> public static class MulticastPublisher implements Publisher {<a name="line.240"></a>
+<span class="sourceLineNo">241</span> private DatagramChannel channel;<a name="line.241"></a>
+<span class="sourceLineNo">242</span> private final EventLoopGroup group = new NioEventLoopGroup(<a name="line.242"></a>
+<span class="sourceLineNo">243</span> 1, Threads.newDaemonThreadFactory("hbase-master-clusterStatusPublisher"));<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span> public MulticastPublisher() {<a name="line.245"></a>
+<span class="sourceLineNo">246</span> }<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> @Override<a name="line.248"></a>
+<span class="sourceLineNo">249</span> public void connect(Configuration conf) throws IOException {<a name="line.249"></a>
+<span class="sourceLineNo">250</span> String mcAddress = conf.get(HConstants.STATUS_MULTICAST_ADDRESS,<a name="line.250"></a>
+<span class="sourceLineNo">251</span> HConstants.DEFAULT_STATUS_MULTICAST_ADDRESS);<a name="line.251"></a>
+<span class="sourceLineNo">252</span> int port = conf.getInt(HConstants.STATUS_MULTICAST_PORT,<a name="line.252"></a>
+<span class="sourceLineNo">253</span> HConstants.DEFAULT_STATUS_MULTICAST_PORT);<a name="line.253"></a>
+<span class="sourceLineNo">254</span> String bindAddress = conf.get(HConstants.STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS,<a name="line.254"></a>
+<span class="sourceLineNo">255</span> HConstants.DEFAULT_STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS);<a name="line.255"></a>
+<span class="sourceLineNo">256</span> String niName = conf.get(HConstants.STATUS_MULTICAST_NI_NAME);<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span> final InetAddress ina;<a name="line.258"></a>
+<span class="sourceLineNo">259</span> try {<a name="line.259"></a>
+<span class="sourceLineNo">260</span> ina = InetAddress.getByName(mcAddress);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> } catch (UnknownHostException e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span> close();<a name="line.262"></a>
+<span class="sourceLineNo">263</span> throw new IOException("Can't connect to " + mcAddress, e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span> }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span> final InetSocketAddress isa = new InetSocketAddress(mcAddress, port);<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> InternetProtocolFamily family;<a name="line.268"></a>
+<span class="sourceLineNo">269</span> NetworkInterface ni;<a name="line.269"></a>
+<span class="sourceLineNo">270</span> if (niName != null) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> if (ina instanceof Inet6Address) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span> family = InternetProtocolFamily.IPv6;<a name="line.272"></a>
+<span class="sourceLineNo">273</span> } else {<a name="line.273"></a>
+<span class="sourceLineNo">274</span> family = InternetProtocolFamily.IPv4;<a name="line.274"></a>
+<span class="sourceLineNo">275</span> }<a name="line.275"></a>
+<span class="sourceLineNo">276</span> ni = NetworkInterface.getByName(niName);<a name="line.276"></a>
+<span class="sourceLineNo">277</span> } else {<a name="line.277"></a>
+<span class="sourceLineNo">278</span> InetAddress localAddress;<a name="line.278"></a>
+<span class="sourceLineNo">279</span> if (ina instanceof Inet6Address) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span> localAddress = Addressing.getIp6Address();<a name="line.280"></a>
+<span class="sourceLineNo">281</span> family = InternetProtocolFamily.IPv6;<a name="line.281"></a>
+<span class="sourceLineNo">282</span> } else {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> localAddress = Addressing.getIp4Address();<a name="line.283"></a>
+<span class="sourceLineNo">284</span> family = InternetProtocolFamily.IPv4;<a name="line.284"></a>
+<span class="sourceLineNo">285</span> }<a name="line.285"></a>
+<span class="sourceLineNo">286</span> ni = NetworkInterface.getByInetAddress(localAddress);<a name="line.286"></a>
+<span class="sourceLineNo">287</span> }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span> Bootstrap b = new Bootstrap();<a name="line.289"></a>
+<span class="sourceLineNo">290</span> b.group(group)<a name="line.290"></a>
+<span class="sourceLineNo">291</span> .channelFactory(new HBaseDatagramChannelFactory<Channel>(NioDatagramChannel.class, family))<a name="line.291"></a>
+<span class="sourceLineNo">292</span> .option(ChannelOption.SO_REUSEADDR, true)<a name="line.292"></a>
+<span class="sourceLineNo">293</span> .handler(new ClusterMetricsEncoder(isa));<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span> try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span> channel = (DatagramChannel) b.bind(bindAddress, 0).sync().channel();<a name="line.296"></a>
+<span class="sourceLineNo">297</span> channel.joinGroup(ina, ni, null, channel.newPromise()).sync();<a name="line.297"></a>
+<span class="sourceLineNo">298</span> channel.connect(isa).sync();<a name="line.298"></a>
+<span class="sourceLineNo">299</span> } catch (InterruptedException e) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span> close();<a name="line.300"></a>
+<span class="sourceLineNo">301</span> throw ExceptionUtil.asInterrupt(e);<a name="line.301"></a>
+<span class="sourceLineNo">302</span> }<a name="line.302"></a>
+<span class="sourceLineNo">303</span> }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span> private static final class HBaseDatagramChannelFactory<T extends Channel><a name="line.305"></a>
+<span class="sourceLineNo">306</span> implements ChannelFactory<T> {<a name="line.306"></a>
+<span class="sourceLineNo">307</span> private final Class<? extends T> clazz;<a name="line.307"></a>
+<span class="sourceLineNo">308</span> private InternetProtocolFamily family;<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span> HBaseDatagramChannelFactory(Class<? extends T> clazz, InternetProtocolFamily family) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span> this.clazz = clazz;<a name="line.311"></a>
+<span class="sourceLineNo">312</span> this.family = family;<a name="line.312"></a>
+<span class="sourceLineNo">313</span> }<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span> @Override<a name="line.315"></a>
+<span class="sourceLineNo">316</span> public T newChannel() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span> try {<a name="line.317"></a>
+<span class="sourceLineNo">318</span> return ReflectionUtils.instantiateWithCustomCtor(clazz.getName(),<a name="line.318"></a>
+<span class="sourceLineNo">319</span> new Class[] { InternetProtocolFamily.class }, new Object[] { family });<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span> } catch (Throwable t) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span> throw new ChannelException("Unable to create Channel from class " + clazz, t);<a name="line.322"></a>
+<span class="sourceLineNo">323</span> }<a name="line.323"></a>
+<span class="sourceLineNo">324</span> }<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span> @Override<a name="line.326"></a>
+<span class="sourceLineNo">327</span> public String toString() {<a name="line.327"></a>
+<span class="sourceLineNo">328</span> return StringUtil.simpleClassName(clazz) + ".class";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> }<a name="line.329"></a>
+<span class="sourceLineNo">330</span> }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span> private static final class ClusterMetricsEncoder<a name="line.332"></a>
+<span class="sourceLineNo">333</span> extends MessageToMessageEncoder<ClusterMetrics> {<a name="line.333"></a>
+<span class="sourceLineNo">334</span> final private InetSocketAddress isa;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span> private ClusterMetricsEncoder(InetSocketAddress isa) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span> this.isa = isa;<a name="line.337"></a>
+<span class="sourceLineNo">338</span> }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span> @Override<a name="line.340"></a>
+<span class="sourceLineNo">341</span> protected void encode(ChannelHandlerContext channelHandlerContext,<a name="line.341"></a>
+<span class="sourceLineNo">342</span> ClusterMetrics clusterStatus, List<Object> objects) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span> objects.add(new DatagramPacket(Unpooled.wrappedBuffer(<a name="line.343"></a>
+<span class="sourceLineNo">344</span> ClusterMetricsBuilder.toClusterStatus(clusterStatus).toByteArray()), isa));<a name="line.344"></a>
+<span class="sourceLineNo">345</span> }<a name="line.345"></a>
+<span class="sourceLineNo">346</span> }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span> @Override<a name="line.348"></a>
+<span class="sourceLineNo">349</span> public void publish(ClusterMetrics cs) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span> channel.writeAndFlush(cs).syncUninterruptibly();<a name="line.350"></a>
+<span class="sourceLineNo">351</span> }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span> @Override<a name="line.353"></a>
+<span class="sourceLineNo">354</span> public void close() {<a name="line.354"></a>
+<span class="sourceLineNo">355</span> if (channel != null) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span> channel.close();<a name="line.356"></a>
+<span class="sourceLineNo">357</span> }<a name="line.357"></a>
+<span class="sourceLineNo">358</span> group.shutdownGracefully();<a name="line.358"></a>
+<span class="sourceLineNo">359</span> }<a name="line.359"></a>
+<span class="sourceLineNo">360</span> }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>}<a name="line.361"></a>
[06/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html
index 43a87b6..819e491 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html
@@ -31,517 +31,537 @@
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.UUID;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.concurrent.Callable;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.Cell;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Waiter;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Put;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Table;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.junit.AfterClass;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.junit.Assert;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.junit.Before;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.BeforeClass;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.ClassRule;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.Test;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.experimental.categories.Category;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.slf4j.Logger;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.slf4j.LoggerFactory;<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.66"></a>
-<span class="sourceLineNo">067</span> */<a name="line.67"></a>
-<span class="sourceLineNo">068</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.68"></a>
-<span class="sourceLineNo">069</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span> @ClassRule<a name="line.71"></a>
-<span class="sourceLineNo">072</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.72"></a>
-<span class="sourceLineNo">073</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.75"></a>
+<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Map;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.UUID;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.Callable;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Cell;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Waiter;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Put;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Table;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.AfterClass;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.Assert;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.Before;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.BeforeClass;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.ClassRule;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.experimental.categories.Category;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.slf4j.Logger;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.slf4j.LoggerFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>/**<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.68"></a>
+<span class="sourceLineNo">069</span> */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.70"></a>
+<span class="sourceLineNo">071</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span> @ClassRule<a name="line.73"></a>
+<span class="sourceLineNo">074</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.74"></a>
+<span class="sourceLineNo">075</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.75"></a>
<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span> static int numRegionServers;<a name="line.77"></a>
+<span class="sourceLineNo">077</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.77"></a>
<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span> @BeforeClass<a name="line.79"></a>
-<span class="sourceLineNo">080</span> public static void setUpBeforeClass() throws Exception {<a name="line.80"></a>
-<span class="sourceLineNo">081</span> TestReplicationBase.setUpBeforeClass();<a name="line.81"></a>
-<span class="sourceLineNo">082</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.82"></a>
-<span class="sourceLineNo">083</span> }<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span> @AfterClass<a name="line.85"></a>
-<span class="sourceLineNo">086</span> public static void tearDownAfterClass() throws Exception {<a name="line.86"></a>
-<span class="sourceLineNo">087</span> TestReplicationBase.tearDownAfterClass();<a name="line.87"></a>
-<span class="sourceLineNo">088</span> // check stop is called<a name="line.88"></a>
-<span class="sourceLineNo">089</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.89"></a>
-<span class="sourceLineNo">090</span> }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span> @Before<a name="line.92"></a>
-<span class="sourceLineNo">093</span> public void setup() throws Exception {<a name="line.93"></a>
-<span class="sourceLineNo">094</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.94"></a>
-<span class="sourceLineNo">095</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.95"></a>
-<span class="sourceLineNo">096</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.96"></a>
-<span class="sourceLineNo">097</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.97"></a>
-<span class="sourceLineNo">098</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> final List<RegionServerThread> rsThreads =<a name="line.99"></a>
-<span class="sourceLineNo">100</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.100"></a>
-<span class="sourceLineNo">101</span> for (RegionServerThread rs : rsThreads) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.102"></a>
-<span class="sourceLineNo">103</span> }<a name="line.103"></a>
-<span class="sourceLineNo">104</span> // Wait for all log roll to finish<a name="line.104"></a>
-<span class="sourceLineNo">105</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.105"></a>
-<span class="sourceLineNo">106</span> @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span> public boolean evaluate() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span> for (RegionServerThread rs : rsThreads) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span> return false;<a name="line.110"></a>
-<span class="sourceLineNo">111</span> }<a name="line.111"></a>
-<span class="sourceLineNo">112</span> }<a name="line.112"></a>
-<span class="sourceLineNo">113</span> return true;<a name="line.113"></a>
-<span class="sourceLineNo">114</span> }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span> @Override<a name="line.116"></a>
-<span class="sourceLineNo">117</span> public String explainFailure() throws Exception {<a name="line.117"></a>
-<span class="sourceLineNo">118</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.118"></a>
-<span class="sourceLineNo">119</span> for (RegionServerThread rs : rsThreads) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.121"></a>
-<span class="sourceLineNo">122</span> }<a name="line.122"></a>
-<span class="sourceLineNo">123</span> }<a name="line.123"></a>
-<span class="sourceLineNo">124</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.124"></a>
-<span class="sourceLineNo">125</span> }<a name="line.125"></a>
-<span class="sourceLineNo">126</span> });<a name="line.126"></a>
-<span class="sourceLineNo">127</span> }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span> @Test<a name="line.129"></a>
-<span class="sourceLineNo">130</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.130"></a>
-<span class="sourceLineNo">131</span> // test installing a custom replication endpoint other than the default one.<a name="line.131"></a>
-<span class="sourceLineNo">132</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.132"></a>
-<span class="sourceLineNo">133</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.133"></a>
-<span class="sourceLineNo">134</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span> // check whether the class has been constructed and started<a name="line.136"></a>
-<span class="sourceLineNo">137</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.137"></a>
-<span class="sourceLineNo">138</span> @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span> public boolean evaluate() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.140"></a>
-<span class="sourceLineNo">141</span> }<a name="line.141"></a>
-<span class="sourceLineNo">142</span> });<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span> @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span> public boolean evaluate() throws Exception {<a name="line.146"></a>
-<span class="sourceLineNo">147</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.147"></a>
-<span class="sourceLineNo">148</span> }<a name="line.148"></a>
-<span class="sourceLineNo">149</span> });<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.151"></a>
+<span class="sourceLineNo">079</span> static int numRegionServers;<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span> @BeforeClass<a name="line.81"></a>
+<span class="sourceLineNo">082</span> public static void setUpBeforeClass() throws Exception {<a name="line.82"></a>
+<span class="sourceLineNo">083</span> TestReplicationBase.setUpBeforeClass();<a name="line.83"></a>
+<span class="sourceLineNo">084</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.84"></a>
+<span class="sourceLineNo">085</span> }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span> @AfterClass<a name="line.87"></a>
+<span class="sourceLineNo">088</span> public static void tearDownAfterClass() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span> TestReplicationBase.tearDownAfterClass();<a name="line.89"></a>
+<span class="sourceLineNo">090</span> // check stop is called<a name="line.90"></a>
+<span class="sourceLineNo">091</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.91"></a>
+<span class="sourceLineNo">092</span> }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span> @Before<a name="line.94"></a>
+<span class="sourceLineNo">095</span> public void setup() throws Exception {<a name="line.95"></a>
+<span class="sourceLineNo">096</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.96"></a>
+<span class="sourceLineNo">097</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.97"></a>
+<span class="sourceLineNo">098</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.98"></a>
+<span class="sourceLineNo">099</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.99"></a>
+<span class="sourceLineNo">100</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> final List<RegionServerThread> rsThreads =<a name="line.101"></a>
+<span class="sourceLineNo">102</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.102"></a>
+<span class="sourceLineNo">103</span> for (RegionServerThread rs : rsThreads) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.104"></a>
+<span class="sourceLineNo">105</span> }<a name="line.105"></a>
+<span class="sourceLineNo">106</span> // Wait for all log roll to finish<a name="line.106"></a>
+<span class="sourceLineNo">107</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.107"></a>
+<span class="sourceLineNo">108</span> @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span> public boolean evaluate() throws Exception {<a name="line.109"></a>
+<span class="sourceLineNo">110</span> for (RegionServerThread rs : rsThreads) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span> return false;<a name="line.112"></a>
+<span class="sourceLineNo">113</span> }<a name="line.113"></a>
+<span class="sourceLineNo">114</span> }<a name="line.114"></a>
+<span class="sourceLineNo">115</span> return true;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span> @Override<a name="line.118"></a>
+<span class="sourceLineNo">119</span> public String explainFailure() throws Exception {<a name="line.119"></a>
+<span class="sourceLineNo">120</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.120"></a>
+<span class="sourceLineNo">121</span> for (RegionServerThread rs : rsThreads) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.123"></a>
+<span class="sourceLineNo">124</span> }<a name="line.124"></a>
+<span class="sourceLineNo">125</span> }<a name="line.125"></a>
+<span class="sourceLineNo">126</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.126"></a>
+<span class="sourceLineNo">127</span> }<a name="line.127"></a>
+<span class="sourceLineNo">128</span> });<a name="line.128"></a>
+<span class="sourceLineNo">129</span> }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span> @Test<a name="line.131"></a>
+<span class="sourceLineNo">132</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.132"></a>
+<span class="sourceLineNo">133</span> // test installing a custom replication endpoint other than the default one.<a name="line.133"></a>
+<span class="sourceLineNo">134</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.134"></a>
+<span class="sourceLineNo">135</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.135"></a>
+<span class="sourceLineNo">136</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span> // check whether the class has been constructed and started<a name="line.138"></a>
+<span class="sourceLineNo">139</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.139"></a>
+<span class="sourceLineNo">140</span> @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span> public boolean evaluate() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.142"></a>
+<span class="sourceLineNo">143</span> }<a name="line.143"></a>
+<span class="sourceLineNo">144</span> });<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span> @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span> public boolean evaluate() throws Exception {<a name="line.148"></a>
+<span class="sourceLineNo">149</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.149"></a>
+<span class="sourceLineNo">150</span> }<a name="line.150"></a>
+<span class="sourceLineNo">151</span> });<a name="line.151"></a>
<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span> // now replicate some data.<a name="line.153"></a>
-<span class="sourceLineNo">154</span> doPut(Bytes.toBytes("row42"));<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span> @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span> public boolean evaluate() throws Exception {<a name="line.158"></a>
-<span class="sourceLineNo">159</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.159"></a>
-<span class="sourceLineNo">160</span> }<a name="line.160"></a>
-<span class="sourceLineNo">161</span> });<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span> doAssert(Bytes.toBytes("row42"));<a name="line.163"></a>
+<span class="sourceLineNo">153</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span> // now replicate some data.<a name="line.155"></a>
+<span class="sourceLineNo">156</span> doPut(Bytes.toBytes("row42"));<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span> @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span> public boolean evaluate() throws Exception {<a name="line.160"></a>
+<span class="sourceLineNo">161</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.161"></a>
+<span class="sourceLineNo">162</span> }<a name="line.162"></a>
+<span class="sourceLineNo">163</span> });<a name="line.163"></a>
<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.165"></a>
-<span class="sourceLineNo">166</span> }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span> @Test<a name="line.168"></a>
-<span class="sourceLineNo">169</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.169"></a>
-<span class="sourceLineNo">170</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.170"></a>
-<span class="sourceLineNo">171</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.171"></a>
-<span class="sourceLineNo">172</span> int peerCount = admin.getPeersCount();<a name="line.172"></a>
-<span class="sourceLineNo">173</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.173"></a>
-<span class="sourceLineNo">174</span> admin.addPeer(id,<a name="line.174"></a>
-<span class="sourceLineNo">175</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.175"></a>
-<span class="sourceLineNo">176</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.176"></a>
-<span class="sourceLineNo">177</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.177"></a>
-<span class="sourceLineNo">178</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.178"></a>
-<span class="sourceLineNo">179</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.179"></a>
-<span class="sourceLineNo">180</span> if (admin.getPeersCount() <= peerCount) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.181"></a>
-<span class="sourceLineNo">182</span> Threads.sleep(100);<a name="line.182"></a>
-<span class="sourceLineNo">183</span> }<a name="line.183"></a>
-<span class="sourceLineNo">184</span> // now replicate some data<a name="line.184"></a>
-<span class="sourceLineNo">185</span> doPut(row);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.187"></a>
-<span class="sourceLineNo">188</span> @Override<a name="line.188"></a>
-<span class="sourceLineNo">189</span> public boolean evaluate() throws Exception {<a name="line.189"></a>
-<span class="sourceLineNo">190</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.190"></a>
-<span class="sourceLineNo">191</span> // only send over one edit.<a name="line.191"></a>
-<span class="sourceLineNo">192</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.192"></a>
-<span class="sourceLineNo">193</span> LOG.info("count=" + count);<a name="line.193"></a>
-<span class="sourceLineNo">194</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.194"></a>
-<span class="sourceLineNo">195</span> }<a name="line.195"></a>
-<span class="sourceLineNo">196</span> });<a name="line.196"></a>
-<span class="sourceLineNo">197</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.198"></a>
-<span class="sourceLineNo">199</span> }<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.201"></a>
-<span class="sourceLineNo">202</span> }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span> @Test<a name="line.204"></a>
-<span class="sourceLineNo">205</span> public void testInterClusterReplication() throws Exception {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> final String id = "testInterClusterReplication";<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> int totEdits = 0;<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> // Make sure edits are spread across regions because we do region based batching<a name="line.211"></a>
-<span class="sourceLineNo">212</span> // before shipping edits.<a name="line.212"></a>
-<span class="sourceLineNo">213</span> for(HRegion region: regions) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span> RegionInfo hri = region.getRegionInfo();<a name="line.214"></a>
-<span class="sourceLineNo">215</span> byte[] row = hri.getStartKey();<a name="line.215"></a>
-<span class="sourceLineNo">216</span> for (int i = 0; i < 100; i++) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span> if (row.length > 0) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span> Put put = new Put(row);<a name="line.218"></a>
-<span class="sourceLineNo">219</span> put.addColumn(famName, row, row);<a name="line.219"></a>
-<span class="sourceLineNo">220</span> region.put(put);<a name="line.220"></a>
-<span class="sourceLineNo">221</span> totEdits++;<a name="line.221"></a>
-<span class="sourceLineNo">222</span> }<a name="line.222"></a>
-<span class="sourceLineNo">223</span> }<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> admin.addPeer(id,<a name="line.226"></a>
-<span class="sourceLineNo">227</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.227"></a>
-<span class="sourceLineNo">228</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.228"></a>
-<span class="sourceLineNo">229</span> null);<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span> final int numEdits = totEdits;<a name="line.231"></a>
-<span class="sourceLineNo">232</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.232"></a>
-<span class="sourceLineNo">233</span> @Override<a name="line.233"></a>
-<span class="sourceLineNo">234</span> public boolean evaluate() throws Exception {<a name="line.234"></a>
-<span class="sourceLineNo">235</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.235"></a>
-<span class="sourceLineNo">236</span> }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span> @Override<a name="line.238"></a>
-<span class="sourceLineNo">239</span> public String explainFailure() throws Exception {<a name="line.239"></a>
-<span class="sourceLineNo">240</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.240"></a>
-<span class="sourceLineNo">241</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.241"></a>
-<span class="sourceLineNo">242</span> return failure;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> }<a name="line.243"></a>
-<span class="sourceLineNo">244</span> });<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> admin.removePeer("testInterClusterReplication");<a name="line.246"></a>
-<span class="sourceLineNo">247</span> utility1.deleteTableData(tableName);<a name="line.247"></a>
-<span class="sourceLineNo">248</span> }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span> @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.252"></a>
-<span class="sourceLineNo">253</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.253"></a>
-<span class="sourceLineNo">254</span> //test that we can create mutliple WALFilters reflectively<a name="line.254"></a>
-<span class="sourceLineNo">255</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.256"></a>
-<span class="sourceLineNo">257</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.257"></a>
-<span class="sourceLineNo">258</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.258"></a>
-<span class="sourceLineNo">259</span> // now replicate some data.<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.261"></a>
-<span class="sourceLineNo">262</span> doPut(connection, row);<a name="line.262"></a>
-<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span> }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.266"></a>
-<span class="sourceLineNo">267</span> @Override<a name="line.267"></a>
-<span class="sourceLineNo">268</span> public boolean evaluate() throws Exception {<a name="line.268"></a>
-<span class="sourceLineNo">269</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> }<a name="line.270"></a>
-<span class="sourceLineNo">271</span> });<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.273"></a>
-<span class="sourceLineNo">274</span> //make sure our reflectively created filter is in the filter chain<a name="line.274"></a>
-<span class="sourceLineNo">275</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.275"></a>
-<span class="sourceLineNo">276</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.276"></a>
-<span class="sourceLineNo">277</span> }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span> @Test (expected=IOException.class)<a name="line.279"></a>
-<span class="sourceLineNo">280</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.281"></a>
-<span class="sourceLineNo">282</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span> //test that we can create mutliple WALFilters reflectively<a name="line.283"></a>
-<span class="sourceLineNo">284</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.284"></a>
-<span class="sourceLineNo">285</span> "IAmNotARealWalEntryFilter");<a name="line.285"></a>
-<span class="sourceLineNo">286</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.286"></a>
-<span class="sourceLineNo">287</span> }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span> @Test (expected=IOException.class)<a name="line.289"></a>
-<span class="sourceLineNo">290</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.290"></a>
-<span class="sourceLineNo">291</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.292"></a>
-<span class="sourceLineNo">293</span> //test that we can create mutliple WALFilters reflectively<a name="line.293"></a>
-<span class="sourceLineNo">294</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.294"></a>
-<span class="sourceLineNo">295</span> "IAmNotARealWalEntryFilter");<a name="line.295"></a>
-<span class="sourceLineNo">296</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span> @Test<a name="line.300"></a>
-<span class="sourceLineNo">301</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.301"></a>
-<span class="sourceLineNo">302</span> /*<a name="line.302"></a>
-<span class="sourceLineNo">303</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.303"></a>
-<span class="sourceLineNo">304</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.304"></a>
-<span class="sourceLineNo">305</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.305"></a>
-<span class="sourceLineNo">306</span> allows for custom JMX metrics.<a name="line.306"></a>
-<span class="sourceLineNo">307</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.307"></a>
-<span class="sourceLineNo">308</span> the two layers of wrapping to the actual BaseSource.<a name="line.308"></a>
-<span class="sourceLineNo">309</span> */<a name="line.309"></a>
-<span class="sourceLineNo">310</span> String id = "id";<a name="line.310"></a>
-<span class="sourceLineNo">311</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.312"></a>
-<span class="sourceLineNo">313</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.313"></a>
-<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
-<span class="sourceLineNo">315</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.317"></a>
-<span class="sourceLineNo">318</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.318"></a>
-<span class="sourceLineNo">319</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource);<a name="line.319"></a>
-<span class="sourceLineNo">320</span> String gaugeName = "gauge";<a name="line.320"></a>
-<span class="sourceLineNo">321</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.321"></a>
-<span class="sourceLineNo">322</span> String globalGaugeName = "source." + gaugeName;<a name="line.322"></a>
-<span class="sourceLineNo">323</span> long delta = 1;<a name="line.323"></a>
-<span class="sourceLineNo">324</span> String counterName = "counter";<a name="line.324"></a>
-<span class="sourceLineNo">325</span> String singleCounterName = "source.id." + counterName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span> String globalCounterName = "source." + counterName;<a name="line.326"></a>
-<span class="sourceLineNo">327</span> long count = 2;<a name="line.327"></a>
-<span class="sourceLineNo">328</span> source.decGauge(gaugeName, delta);<a name="line.328"></a>
-<span class="sourceLineNo">329</span> source.getMetricsContext();<a name="line.329"></a>
-<span class="sourceLineNo">330</span> source.getMetricsDescription();<a name="line.330"></a>
-<span class="sourceLineNo">331</span> source.getMetricsJmxContext();<a name="line.331"></a>
-<span class="sourceLineNo">332</span> source.getMetricsName();<a name="line.332"></a>
-<span class="sourceLineNo">333</span> source.incCounters(counterName, count);<a name="line.333"></a>
-<span class="sourceLineNo">334</span> source.incGauge(gaugeName, delta);<a name="line.334"></a>
-<span class="sourceLineNo">335</span> source.init();<a name="line.335"></a>
-<span class="sourceLineNo">336</span> source.removeMetric(gaugeName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span> source.setGauge(gaugeName, delta);<a name="line.337"></a>
-<span class="sourceLineNo">338</span> source.updateHistogram(counterName, count);<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.340"></a>
-<span class="sourceLineNo">341</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.341"></a>
-<span class="sourceLineNo">342</span> verify(globalRms).getMetricsContext();<a name="line.342"></a>
-<span class="sourceLineNo">343</span> verify(globalRms).getMetricsJmxContext();<a name="line.343"></a>
-<span class="sourceLineNo">344</span> verify(globalRms).getMetricsName();<a name="line.344"></a>
-<span class="sourceLineNo">345</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.345"></a>
-<span class="sourceLineNo">346</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.346"></a>
-<span class="sourceLineNo">347</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.347"></a>
-<span class="sourceLineNo">348</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.348"></a>
-<span class="sourceLineNo">349</span> verify(globalRms).init();<a name="line.349"></a>
-<span class="sourceLineNo">350</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.350"></a>
-<span class="sourceLineNo">351</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.352"></a>
-<span class="sourceLineNo">353</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.353"></a>
-<span class="sourceLineNo">354</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.354"></a>
-<span class="sourceLineNo">355</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.355"></a>
-<span class="sourceLineNo">356</span> }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span> private void doPut(byte[] row) throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span> doPut(connection, row);<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span> }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.364"></a>
-<span class="sourceLineNo">365</span> try (Table t = connection.getTable(tableName)) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span> Put put = new Put(row);<a name="line.366"></a>
-<span class="sourceLineNo">367</span> put.addColumn(famName, row, row);<a name="line.367"></a>
-<span class="sourceLineNo">368</span> t.put(put);<a name="line.368"></a>
-<span class="sourceLineNo">369</span> }<a name="line.369"></a>
-<span class="sourceLineNo">370</span> }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span> private static void doAssert(byte[] row) throws Exception {<a name="line.372"></a>
-<span class="sourceLineNo">373</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span> return; // first call<a name="line.374"></a>
-<span class="sourceLineNo">375</span> }<a name="line.375"></a>
-<span class="sourceLineNo">376</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.376"></a>
-<span class="sourceLineNo">377</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.377"></a>
-<span class="sourceLineNo">378</span> Assert.assertEquals(1, cells.size());<a name="line.378"></a>
-<span class="sourceLineNo">379</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.379"></a>
-<span class="sourceLineNo">380</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.380"></a>
-<span class="sourceLineNo">381</span> }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.383"></a>
-<span class="sourceLineNo">384</span> static UUID uuid = UUID.randomUUID();<a name="line.384"></a>
-<span class="sourceLineNo">385</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.385"></a>
-<span class="sourceLineNo">386</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.386"></a>
-<span class="sourceLineNo">387</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.387"></a>
-<span class="sourceLineNo">388</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.388"></a>
-<span class="sourceLineNo">389</span> static volatile List<Entry> lastEntries = null;<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span> public ReplicationEndpointForTest() {<a name="line.391"></a>
-<span class="sourceLineNo">392</span> replicateCount.set(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span> contructedCount.incrementAndGet();<a name="line.393"></a>
-<span class="sourceLineNo">394</span> }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span> @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span> public UUID getPeerUUID() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span> return uuid;<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span> @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span> replicateCount.incrementAndGet();<a name="line.403"></a>
-<span class="sourceLineNo">404</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.404"></a>
-<span class="sourceLineNo">405</span> return true;<a name="line.405"></a>
-<span class="sourceLineNo">406</span> }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span> @Override<a name="line.408"></a>
-<span class="sourceLineNo">409</span> public void start() {<a name="line.409"></a>
-<span class="sourceLineNo">410</span> startAsync();<a name="line.410"></a>
-<span class="sourceLineNo">411</span> }<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span> @Override<a name="line.413"></a>
-<span class="sourceLineNo">414</span> public void stop() {<a name="line.414"></a>
-<span class="sourceLineNo">415</span> stopAsync();<a name="line.415"></a>
-<span class="sourceLineNo">416</span> }<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span> @Override<a name="line.418"></a>
-<span class="sourceLineNo">419</span> protected void doStart() {<a name="line.419"></a>
-<span class="sourceLineNo">420</span> startedCount.incrementAndGet();<a name="line.420"></a>
-<span class="sourceLineNo">421</span> notifyStarted();<a name="line.421"></a>
-<span class="sourceLineNo">422</span> }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span> @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span> protected void doStop() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span> stoppedCount.incrementAndGet();<a name="line.426"></a>
-<span class="sourceLineNo">427</span> notifyStopped();<a name="line.427"></a>
-<span class="sourceLineNo">428</span> }<a name="line.428"></a>
-<span class="sourceLineNo">429</span> }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span> public static class InterClusterReplicationEndpointForTest<a name="line.431"></a>
-<span class="sourceLineNo">432</span> extends HBaseInterClusterReplicationEndpoint {<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.434"></a>
-<span class="sourceLineNo">435</span> static boolean failedOnce;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span> public InterClusterReplicationEndpointForTest() {<a name="line.437"></a>
-<span class="sourceLineNo">438</span> replicateCount.set(0);<a name="line.438"></a>
-<span class="sourceLineNo">439</span> }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span> @Override<a name="line.441"></a>
-<span class="sourceLineNo">442</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span> boolean success = super.replicate(replicateContext);<a name="line.443"></a>
-<span class="sourceLineNo">444</span> if (success) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span> replicateCount.addAndGet(replicateContext.entries.size());<a name="line.445"></a>
-<span class="sourceLineNo">446</span> }<a name="line.446"></a>
-<span class="sourceLineNo">447</span> return success;<a name="line.447"></a>
+<span class="sourceLineNo">165</span> doAssert(Bytes.toBytes("row42"));<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.167"></a>
+<span class="sourceLineNo">168</span> }<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span> @Test<a name="line.170"></a>
+<span class="sourceLineNo">171</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.171"></a>
+<span class="sourceLineNo">172</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.172"></a>
+<span class="sourceLineNo">173</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.173"></a>
+<span class="sourceLineNo">174</span> int peerCount = admin.getPeersCount();<a name="line.174"></a>
+<span class="sourceLineNo">175</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.175"></a>
+<span class="sourceLineNo">176</span> admin.addPeer(id,<a name="line.176"></a>
+<span class="sourceLineNo">177</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.177"></a>
+<span class="sourceLineNo">178</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.178"></a>
+<span class="sourceLineNo">179</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.179"></a>
+<span class="sourceLineNo">180</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.180"></a>
+<span class="sourceLineNo">181</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.181"></a>
+<span class="sourceLineNo">182</span> if (admin.getPeersCount() <= peerCount) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.183"></a>
+<span class="sourceLineNo">184</span> Threads.sleep(100);<a name="line.184"></a>
+<span class="sourceLineNo">185</span> }<a name="line.185"></a>
+<span class="sourceLineNo">186</span> // now replicate some data<a name="line.186"></a>
+<span class="sourceLineNo">187</span> doPut(row);<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.189"></a>
+<span class="sourceLineNo">190</span> @Override<a name="line.190"></a>
+<span class="sourceLineNo">191</span> public boolean evaluate() throws Exception {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.192"></a>
+<span class="sourceLineNo">193</span> // only send over one edit.<a name="line.193"></a>
+<span class="sourceLineNo">194</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.194"></a>
+<span class="sourceLineNo">195</span> LOG.info("count=" + count);<a name="line.195"></a>
+<span class="sourceLineNo">196</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.196"></a>
+<span class="sourceLineNo">197</span> }<a name="line.197"></a>
+<span class="sourceLineNo">198</span> });<a name="line.198"></a>
+<span class="sourceLineNo">199</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.200"></a>
+<span class="sourceLineNo">201</span> }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.203"></a>
+<span class="sourceLineNo">204</span> }<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span> @Test<a name="line.206"></a>
+<span class="sourceLineNo">207</span> public void testInterClusterReplication() throws Exception {<a name="line.207"></a>
+<span class="sourceLineNo">208</span> final String id = "testInterClusterReplication";<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.210"></a>
+<span class="sourceLineNo">211</span> int totEdits = 0;<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> // Make sure edits are spread across regions because we do region based batching<a name="line.213"></a>
+<span class="sourceLineNo">214</span> // before shipping edits.<a name="line.214"></a>
+<span class="sourceLineNo">215</span> for(HRegion region: regions) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span> RegionInfo hri = region.getRegionInfo();<a name="line.216"></a>
+<span class="sourceLineNo">217</span> byte[] row = hri.getStartKey();<a name="line.217"></a>
+<span class="sourceLineNo">218</span> for (int i = 0; i < 100; i++) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span> if (row.length > 0) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span> Put put = new Put(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span> put.addColumn(famName, row, row);<a name="line.221"></a>
+<span class="sourceLineNo">222</span> region.put(put);<a name="line.222"></a>
+<span class="sourceLineNo">223</span> totEdits++;<a name="line.223"></a>
+<span class="sourceLineNo">224</span> }<a name="line.224"></a>
+<span class="sourceLineNo">225</span> }<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span> admin.addPeer(id,<a name="line.228"></a>
+<span class="sourceLineNo">229</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.229"></a>
+<span class="sourceLineNo">230</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.230"></a>
+<span class="sourceLineNo">231</span> null);<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> final int numEdits = totEdits;<a name="line.233"></a>
+<span class="sourceLineNo">234</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> public boolean evaluate() throws Exception {<a name="line.236"></a>
+<span class="sourceLineNo">237</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.237"></a>
+<span class="sourceLineNo">238</span> }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span> @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span> public String explainFailure() throws Exception {<a name="line.241"></a>
+<span class="sourceLineNo">242</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.242"></a>
+<span class="sourceLineNo">243</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.243"></a>
+<span class="sourceLineNo">244</span> return failure;<a name="line.244"></a>
+<span class="sourceLineNo">245</span> }<a name="line.245"></a>
+<span class="sourceLineNo">246</span> });<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> admin.removePeer("testInterClusterReplication");<a name="line.248"></a>
+<span class="sourceLineNo">249</span> utility1.deleteTableData(tableName);<a name="line.249"></a>
+<span class="sourceLineNo">250</span> }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span> @Test<a name="line.252"></a>
+<span class="sourceLineNo">253</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.253"></a>
+<span class="sourceLineNo">254</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.254"></a>
+<span class="sourceLineNo">255</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.255"></a>
+<span class="sourceLineNo">256</span> //test that we can create mutliple WALFilters reflectively<a name="line.256"></a>
+<span class="sourceLineNo">257</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.257"></a>
+<span class="sourceLineNo">258</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.258"></a>
+<span class="sourceLineNo">259</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.259"></a>
+<span class="sourceLineNo">260</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> // now replicate some data.<a name="line.261"></a>
+<span class="sourceLineNo">262</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.263"></a>
+<span class="sourceLineNo">264</span> doPut(connection, row);<a name="line.264"></a>
+<span class="sourceLineNo">265</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.265"></a>
+<span class="sourceLineNo">266</span> }<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span> @Override<a name="line.269"></a>
+<span class="sourceLineNo">270</span> public boolean evaluate() throws Exception {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.271"></a>
+<span class="sourceLineNo">272</span> }<a name="line.272"></a>
+<span class="sourceLineNo">273</span> });<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.275"></a>
+<span class="sourceLineNo">276</span> //make sure our reflectively created filter is in the filter chain<a name="line.276"></a>
+<span class="sourceLineNo">277</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.277"></a>
+<span class="sourceLineNo">278</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.278"></a>
+<span class="sourceLineNo">279</span> }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span> @Test (expected=IOException.class)<a name="line.281"></a>
+<span class="sourceLineNo">282</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.283"></a>
+<span class="sourceLineNo">284</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span> //test that we can create mutliple WALFilters reflectively<a name="line.285"></a>
+<span class="sourceLineNo">286</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.286"></a>
+<span class="sourceLineNo">287</span> "IAmNotARealWalEntryFilter");<a name="line.287"></a>
+<span class="sourceLineNo">288</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.288"></a>
+<span class="sourceLineNo">289</span> }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span> @Test (expected=IOException.class)<a name="line.291"></a>
+<span class="sourceLineNo">292</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.292"></a>
+<span class="sourceLineNo">293</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.293"></a>
+<span class="sourceLineNo">294</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.294"></a>
+<span class="sourceLineNo">295</span> //test that we can create mutliple WALFilters reflectively<a name="line.295"></a>
+<span class="sourceLineNo">296</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.296"></a>
+<span class="sourceLineNo">297</span> "IAmNotARealWalEntryFilter");<a name="line.297"></a>
+<span class="sourceLineNo">298</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.298"></a>
+<span class="sourceLineNo">299</span> }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span> @Test<a name="line.302"></a>
+<span class="sourceLineNo">303</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.303"></a>
+<span class="sourceLineNo">304</span> /*<a name="line.304"></a>
+<span class="sourceLineNo">305</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.305"></a>
+<span class="sourceLineNo">306</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.306"></a>
+<span class="sourceLineNo">307</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.307"></a>
+<span class="sourceLineNo">308</span> allows for custom JMX metrics.<a name="line.308"></a>
+<span class="sourceLineNo">309</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.309"></a>
+<span class="sourceLineNo">310</span> the two layers of wrapping to the actual BaseSource.<a name="line.310"></a>
+<span class="sourceLineNo">311</span> */<a name="line.311"></a>
+<span class="sourceLineNo">312</span> String id = "id";<a name="line.312"></a>
+<span class="sourceLineNo">313</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.313"></a>
+<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
+<span class="sourceLineNo">315</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
+<span class="sourceLineNo">316</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.316"></a>
+<span class="sourceLineNo">317</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.319"></a>
+<span class="sourceLineNo">320</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.320"></a>
+<span class="sourceLineNo">321</span> Map<String, MetricsReplicationSourceSource> singleSourceSourceByTable = new HashMap<>();<a name="line.321"></a>
+<span class="sourceLineNo">322</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource,<a name="line.322"></a>
+<span class="sourceLineNo">323</span> singleSourceSourceByTable);<a name="line.323"></a>
+<span class="sourceLineNo">324</span> String gaugeName = "gauge";<a name="line.324"></a>
+<span class="sourceLineNo">325</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.325"></a>
+<span class="sourceLineNo">326</span> String globalGaugeName = "source." + gaugeName;<a name="line.326"></a>
+<span class="sourceLineNo">327</span> long delta = 1;<a name="line.327"></a>
+<span class="sourceLineNo">328</span> String counterName = "counter";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> String singleCounterName = "source.id." + counterName;<a name="line.329"></a>
+<span class="sourceLineNo">330</span> String globalCounterName = "source." + counterName;<a name="line.330"></a>
+<span class="sourceLineNo">331</span> long count = 2;<a name="line.331"></a>
+<span class="sourceLineNo">332</span> source.decGauge(gaugeName, delta);<a name="line.332"></a>
+<span class="sourceLineNo">333</span> source.getMetricsContext();<a name="line.333"></a>
+<span class="sourceLineNo">334</span> source.getMetricsDescription();<a name="line.334"></a>
+<span class="sourceLineNo">335</span> source.getMetricsJmxContext();<a name="line.335"></a>
+<span class="sourceLineNo">336</span> source.getMetricsName();<a name="line.336"></a>
+<span class="sourceLineNo">337</span> source.incCounters(counterName, count);<a name="line.337"></a>
+<span class="sourceLineNo">338</span> source.incGauge(gaugeName, delta);<a name="line.338"></a>
+<span class="sourceLineNo">339</span> source.init();<a name="line.339"></a>
+<span class="sourceLineNo">340</span> source.removeMetric(gaugeName);<a name="line.340"></a>
+<span class="sourceLineNo">341</span> source.setGauge(gaugeName, delta);<a name="line.341"></a>
+<span class="sourceLineNo">342</span> source.updateHistogram(counterName, count);<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.344"></a>
+<span class="sourceLineNo">345</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.345"></a>
+<span class="sourceLineNo">346</span> verify(globalRms).getMetricsContext();<a name="line.346"></a>
+<span class="sourceLineNo">347</span> verify(globalRms).getMetricsJmxContext();<a name="line.347"></a>
+<span class="sourceLineNo">348</span> verify(globalRms).getMetricsName();<a name="line.348"></a>
+<span class="sourceLineNo">349</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.349"></a>
+<span class="sourceLineNo">350</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.350"></a>
+<span class="sourceLineNo">351</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.351"></a>
+<span class="sourceLineNo">352</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.352"></a>
+<span class="sourceLineNo">353</span> verify(globalRms).init();<a name="line.353"></a>
+<span class="sourceLineNo">354</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.354"></a>
+<span class="sourceLineNo">355</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.355"></a>
+<span class="sourceLineNo">356</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.356"></a>
+<span class="sourceLineNo">357</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.357"></a>
+<span class="sourceLineNo">358</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.358"></a>
+<span class="sourceLineNo">359</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span> //check singleSourceSourceByTable metrics.<a name="line.361"></a>
+<span class="sourceLineNo">362</span> // singleSourceSourceByTable map entry will be created only<a name="line.362"></a>
+<span class="sourceLineNo">363</span> // after calling #setAgeOfLastShippedOpByTable<a name="line.363"></a>
+<span class="sourceLineNo">364</span> boolean containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.364"></a>
+<span class="sourceLineNo">365</span> .containsKey("RandomNewTable");<a name="line.365"></a>
+<span class="sourceLineNo">366</span> Assert.assertEquals(false, containsRandomNewTable);<a name="line.366"></a>
+<span class="sourceLineNo">367</span> source.setAgeOfLastShippedOpByTable(123L, "RandomNewTable");<a name="line.367"></a>
+<span class="sourceLineNo">368</span> containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.368"></a>
+<span class="sourceLineNo">369</span> .containsKey("RandomNewTable");<a name="line.369"></a>
+<span class="sourceLineNo">370</span> Assert.assertEquals(true, containsRandomNewTable);<a name="line.370"></a>
+<span class="sourceLineNo">371</span> MetricsReplicationSourceSource msr = source.getSingleSourceSourceByTable()<a name="line.371"></a>
+<span class="sourceLineNo">372</span> .get("RandomNewTable");<a name="line.372"></a>
+<span class="sourceLineNo">373</span> // cannot put more concreate value here to verify because the age is arbitrary.<a name="line.373"></a>
+<span class="sourceLineNo">374</span> // as long as it's greater than 0, we see it as correct answer.<a name="line.374"></a>
+<span class="sourceLineNo">375</span> Assert.assertTrue(msr.getLastShippedAge() > 0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span> }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span> private void doPut(byte[] row) throws IOException {<a name="line.378"></a>
+<span class="sourceLineNo">379</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span> doPut(connection, row);<a name="line.380"></a>
+<span class="sourceLineNo">381</span> }<a name="line.381"></a>
+<span class="sourceLineNo">382</span> }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.384"></a>
+<span class="sourceLineNo">385</span> try (Table t = connection.getTable(tableName)) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span> Put put = new Put(row);<a name="line.386"></a>
+<span class="sourceLineNo">387</span> put.addColumn(famName, row, row);<a name="line.387"></a>
+<span class="sourceLineNo">388</span> t.put(put);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<a name="line.389"></a>
+<span class="sourceLineNo">390</span> }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span> private static void doAssert(byte[] row) throws Exception {<a name="line.392"></a>
+<span class="sourceLineNo">393</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span> return; // first call<a name="line.394"></a>
+<span class="sourceLineNo">395</span> }<a name="line.395"></a>
+<span class="sourceLineNo">396</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.396"></a>
+<span class="sourceLineNo">397</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.397"></a>
+<span class="sourceLineNo">398</span> Assert.assertEquals(1, cells.size());<a name="line.398"></a>
+<span class="sourceLineNo">399</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.399"></a>
+<span class="sourceLineNo">400</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.400"></a>
+<span class="sourceLineNo">401</span> }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.403"></a>
+<span class="sourceLineNo">404</span> static UUID uuid = UUID.randomUUID();<a name="line.404"></a>
+<span class="sourceLineNo">405</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.405"></a>
+<span class="sourceLineNo">406</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.406"></a>
+<span class="sourceLineNo">407</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.407"></a>
+<span class="sourceLineNo">408</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.408"></a>
+<span class="sourceLineNo">409</span> static volatile List<Entry> lastEntries = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span> public ReplicationEndpointForTest() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span> replicateCount.set(0);<a name="line.412"></a>
+<span class="sourceLineNo">413</span> contructedCount.incrementAndGet();<a name="line.413"></a>
+<span class="sourceLineNo">414</span> }<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span> @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span> public UUID getPeerUUID() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span> return uuid;<a name="line.418"></a>
+<span class="sourceLineNo">419</span> }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span> @Override<a name="line.421"></a>
+<span class="sourceLineNo">422</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span> replicateCount.incrementAndGet();<a name="line.423"></a>
+<span class="sourceLineNo">424</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.424"></a>
+<span class="sourceLineNo">425</span> return true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span> }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span> @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span> public void start() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span> startAsync();<a name="line.430"></a>
+<span class="sourceLineNo">431</span> }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span> @Override<a name="line.433"></a>
+<span class="sourceLineNo">434</span> public void stop() {<a name="line.434"></a>
+<span class="sourceLineNo">435</span> stopAsync();<a name="line.435"></a>
+<span class="sourceLineNo">436</span> }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span> @Override<a name="line.438"></a>
+<span class="sourceLineNo">439</span> protected void doStart() {<a name="line.439"></a>
+<span class="sourceLineNo">440</span> startedCount.incrementAndGet();<a name="line.440"></a>
+<span class="sourceLineNo">441</span> notifyStarted();<a name="line.441"></a>
+<span class="sourceLineNo">442</span> }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span> @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span> protected void doStop() {<a name="line.445"></a>
+<span class="sourceLineNo">446</span> stoppedCount.incrementAndGet();<a name="line.446"></a>
+<span class="sourceLineNo">447</span> notifyStopped();<a name="line.447"></a>
<span class="sourceLineNo">448</span> }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span> @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span> protected Callable<Integer> createReplicator(List<Entry> entries, int ordinal) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span> // Fail only once, we don't want to slow down the test.<a name="line.452"></a>
-<span class="sourceLineNo">453</span> if (failedOnce) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span> return () -> ordinal;<a name="line.454"></a>
-<span class="sourceLineNo">455</span> } else {<a name="line.455"></a>
-<span class="sourceLineNo">456</span> failedOnce = true;<a name="line.456"></a>
-<span class="sourceLineNo">457</span> return () -> {<a name="line.457"></a>
-<span class="sourceLineNo">458</span> throw new IOException("Sample Exception: Failed to replicate.");<a name="line.458"></a>
-<span class="sourceLineNo">459</span> };<a name="line.459"></a>
-<span class="sourceLineNo">460</span> }<a name="line.460"></a>
-<span class="sourceLineNo">461</span> }<a name="line.461"></a>
-<span class="sourceLineNo">462</span> }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span> public static class ReplicationEndpointReturningFalse extends ReplicationEndpointForTest {<a name="line.464"></a>
-<span class="sourceLineNo">465</span> static int COUNT = 10;<a name="line.465"></a>
-<span class="sourceLineNo">466</span> static AtomicReference<Exception> ex = new AtomicReference<>(null);<a name="line.466"></a>
-<span class="sourceLineNo">467</span> static AtomicBoolean replicated = new AtomicBoolean(false);<a name="line.467"></a>
-<span class="sourceLineNo">468</span> @Override<a name="line.468"></a>
-<span class="sourceLineNo">469</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span> try {<a name="line.470"></a>
-<span class="sourceLineNo">471</span> // check row<a name="line.471"></a>
-<span class="sourceLineNo">472</span> doAssert(row);<a name="line.472"></a>
-<span class="sourceLineNo">473</span> } catch (Exception e) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span> ex.set(e);<a name="line.474"></a>
-<span class="sourceLineNo">475</span> }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span> super.replicate(replicateContext);<a name="line.477"></a>
-<span class="sourceLineNo">478</
<TRUNCATED>
[08/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html
index 026a2fa..cd63d24 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html
@@ -116,7 +116,7 @@
</dl>
<hr>
<br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.533">TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.553">TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass</a>
extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilter.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationEndpoint.EverythingPassesWALEntryFilter</a></pre>
</li>
</ul>
@@ -181,7 +181,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockListLast">
<li class="blockList">
<h4>EverythingPassesWALEntryFilterSubclass</h4>
-<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html#line.533">EverythingPassesWALEntryFilterSubclass</a>()</pre>
+<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.EverythingPassesWALEntryFilterSubclass.html#line.553">EverythingPassesWALEntryFilterSubclass</a>()</pre>
</li>
</ul>
</li>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html
index 82cd795..00ccd40 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html
@@ -137,7 +137,7 @@ var activeTableTab = "activeTableTab";
</dl>
<hr>
<br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.431">TestReplicationEndpoint.InterClusterReplicationEndpointForTest</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.451">TestReplicationEndpoint.InterClusterReplicationEndpointForTest</a>
extends org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint</pre>
</li>
</ul>
@@ -305,7 +305,7 @@ extends org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplic
<ul class="blockList">
<li class="blockList">
<h4>replicateCount</h4>
-<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html#line.434">replicateCount</a></pre>
+<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html#line.454">replicateCount</a></pre>
</li>
</ul>
<a name="failedOnce">
@@ -314,7 +314,7 @@ extends org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplic
<ul class="blockListLast">
<li class="blockList">
<h4>failedOnce</h4>
-<pre>static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html#line.435">failedOnce</a></pre>
+<pre>static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html#line.455">failedOnce</a></pre>
</li>
</ul>
</li>
@@ -331,7 +331,7 @@ extends org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplic
<ul class="blockListLast">
<li class="blockList">
<h4>InterClusterReplicationEndpointForTest</h4>
-<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html#line.437">InterClusterReplicationEndpointForTest</a>()</pre>
+<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html#line.457">InterClusterReplicationEndpointForTest</a>()</pre>
</li>
</ul>
</li>
@@ -348,7 +348,7 @@ extends org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplic
<ul class="blockList">
<li class="blockList">
<h4>replicate</h4>
-<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html#line.442">replicate</a>(org.apache.hadoop.hbase.replication.ReplicationEndpoint.ReplicateContext replicateContext)</pre>
+<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html#line.462">replicate</a>(org.apache.hadoop.hbase.replication.ReplicationEndpoint.ReplicateContext replicateContext)</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>replicate</code> in interface <code>org.apache.hadoop.hbase.replication.ReplicationEndpoint</code></dd>
@@ -363,7 +363,7 @@ extends org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplic
<ul class="blockListLast">
<li class="blockList">
<h4>createReplicator</h4>
-<pre>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html#line.451">createReplicator</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><org.apache.hadoop.hbase.wal.WAL.Entry> entries,
+<pre>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.InterClusterReplicationEndpointForTest.html#line.471">createReplicator</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><org.apache.hadoop.hbase.wal.WAL.Entry> entries,
int ordinal)</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html
index 5186d9d..7ebc7bc 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html
@@ -131,7 +131,7 @@ var activeTableTab = "activeTableTab";
</dl>
<hr>
<br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.383">TestReplicationEndpoint.ReplicationEndpointForTest</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.403">TestReplicationEndpoint.ReplicationEndpointForTest</a>
extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
</li>
</ul>
@@ -309,7 +309,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockList">
<li class="blockList">
<h4>uuid</h4>
-<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.384">uuid</a></pre>
+<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.404">uuid</a></pre>
</li>
</ul>
<a name="contructedCount">
@@ -318,7 +318,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockList">
<li class="blockList">
<h4>contructedCount</h4>
-<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.385">contructedCount</a></pre>
+<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.405">contructedCount</a></pre>
</li>
</ul>
<a name="startedCount">
@@ -327,7 +327,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockList">
<li class="blockList">
<h4>startedCount</h4>
-<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.386">startedCount</a></pre>
+<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.406">startedCount</a></pre>
</li>
</ul>
<a name="stoppedCount">
@@ -336,7 +336,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockList">
<li class="blockList">
<h4>stoppedCount</h4>
-<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.387">stoppedCount</a></pre>
+<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.407">stoppedCount</a></pre>
</li>
</ul>
<a name="replicateCount">
@@ -345,7 +345,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockList">
<li class="blockList">
<h4>replicateCount</h4>
-<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.388">replicateCount</a></pre>
+<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.408">replicateCount</a></pre>
</li>
</ul>
<a name="lastEntries">
@@ -354,7 +354,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockListLast">
<li class="blockList">
<h4>lastEntries</h4>
-<pre>static volatile <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><org.apache.hadoop.hbase.wal.WAL.Entry> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.389">lastEntries</a></pre>
+<pre>static volatile <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><org.apache.hadoop.hbase.wal.WAL.Entry> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.409">lastEntries</a></pre>
</li>
</ul>
</li>
@@ -371,7 +371,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockListLast">
<li class="blockList">
<h4>ReplicationEndpointForTest</h4>
-<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.391">ReplicationEndpointForTest</a>()</pre>
+<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.411">ReplicationEndpointForTest</a>()</pre>
</li>
</ul>
</li>
@@ -388,7 +388,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockList">
<li class="blockList">
<h4>getPeerUUID</h4>
-<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.397">getPeerUUID</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.417">getPeerUUID</a>()</pre>
</li>
</ul>
<a name="replicate-org.apache.hadoop.hbase.replication.ReplicationEndpoint.ReplicateContext-">
@@ -397,7 +397,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockList">
<li class="blockList">
<h4>replicate</h4>
-<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.402">replicate</a>(org.apache.hadoop.hbase.replication.ReplicationEndpoint.ReplicateContext replicateContext)</pre>
+<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.422">replicate</a>(org.apache.hadoop.hbase.replication.ReplicationEndpoint.ReplicateContext replicateContext)</pre>
</li>
</ul>
<a name="start--">
@@ -406,7 +406,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockList">
<li class="blockList">
<h4>start</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.409">start</a>()</pre>
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.429">start</a>()</pre>
</li>
</ul>
<a name="stop--">
@@ -415,7 +415,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockList">
<li class="blockList">
<h4>stop</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.414">stop</a>()</pre>
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.434">stop</a>()</pre>
</li>
</ul>
<a name="doStart--">
@@ -424,7 +424,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockList">
<li class="blockList">
<h4>doStart</h4>
-<pre>protected void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.419">doStart</a>()</pre>
+<pre>protected void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.439">doStart</a>()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>doStart</code> in class <code>org.apache.hbase.thirdparty.com.google.common.util.concurrent.AbstractService</code></dd>
@@ -437,7 +437,7 @@ extends org.apache.hadoop.hbase.replication.BaseReplicationEndpoint</pre>
<ul class="blockListLast">
<li class="blockList">
<h4>doStop</h4>
-<pre>protected void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.425">doStop</a>()</pre>
+<pre>protected void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html#line.445">doStop</a>()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>doStop</code> in class <code>org.apache.hbase.thirdparty.com.google.common.util.concurrent.AbstractService</code></dd>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html
index 5639f48..d8825c6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html
@@ -132,7 +132,7 @@ var activeTableTab = "activeTableTab";
</dl>
<hr>
<br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.464">TestReplicationEndpoint.ReplicationEndpointReturningFalse</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.484">TestReplicationEndpoint.ReplicationEndpointReturningFalse</a>
extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationEndpoint.ReplicationEndpointForTest</a></pre>
</li>
</ul>
@@ -292,7 +292,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>COUNT</h4>
-<pre>static int <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html#line.465">COUNT</a></pre>
+<pre>static int <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html#line.485">COUNT</a></pre>
</li>
</ul>
<a name="ex">
@@ -301,7 +301,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>ex</h4>
-<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html#line.466">ex</a></pre>
+<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html#line.486">ex</a></pre>
</li>
</ul>
<a name="replicated">
@@ -310,7 +310,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockListLast">
<li class="blockList">
<h4>replicated</h4>
-<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html#line.467">replicated</a></pre>
+<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html#line.487">replicated</a></pre>
</li>
</ul>
</li>
@@ -327,7 +327,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockListLast">
<li class="blockList">
<h4>ReplicationEndpointReturningFalse</h4>
-<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html#line.464">ReplicationEndpointReturningFalse</a>()</pre>
+<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html#line.484">ReplicationEndpointReturningFalse</a>()</pre>
</li>
</ul>
</li>
@@ -344,7 +344,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockListLast">
<li class="blockList">
<h4>replicate</h4>
-<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html#line.469">replicate</a>(org.apache.hadoop.hbase.replication.ReplicationEndpoint.ReplicateContext replicateContext)</pre>
+<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointReturningFalse.html#line.489">replicate</a>(org.apache.hadoop.hbase.replication.ReplicationEndpoint.ReplicateContext replicateContext)</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>replicate</code> in interface <code>org.apache.hadoop.hbase.replication.ReplicationEndpoint</code></dd>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html
index 8dcfa75..ecd9601 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html
@@ -132,7 +132,7 @@ var activeTableTab = "activeTableTab";
</dl>
<hr>
<br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.486">TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.506">TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter</a>
extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointForTest.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationEndpoint.ReplicationEndpointForTest</a></pre>
</li>
</ul>
@@ -288,7 +288,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockListLast">
<li class="blockList">
<h4>ex</h4>
-<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html#line.487">ex</a></pre>
+<pre>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html#line.507">ex</a></pre>
</li>
</ul>
</li>
@@ -305,7 +305,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockListLast">
<li class="blockList">
<h4>ReplicationEndpointWithWALEntryFilter</h4>
-<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html#line.486">ReplicationEndpointWithWALEntryFilter</a>()</pre>
+<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html#line.506">ReplicationEndpointWithWALEntryFilter</a>()</pre>
</li>
</ul>
</li>
@@ -322,7 +322,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>replicate</h4>
-<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html#line.490">replicate</a>(org.apache.hadoop.hbase.replication.ReplicationEndpoint.ReplicateContext replicateContext)</pre>
+<pre>public boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html#line.510">replicate</a>(org.apache.hadoop.hbase.replication.ReplicationEndpoint.ReplicateContext replicateContext)</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>replicate</code> in interface <code>org.apache.hadoop.hbase.replication.ReplicationEndpoint</code></dd>
@@ -337,7 +337,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockListLast">
<li class="blockList">
<h4>getWALEntryfilter</h4>
-<pre>public org.apache.hadoop.hbase.replication.WALEntryFilter <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html#line.501">getWALEntryfilter</a>()</pre>
+<pre>public org.apache.hadoop.hbase.replication.WALEntryFilter <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html#line.521">getWALEntryfilter</a>()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>getWALEntryfilter</code> in interface <code>org.apache.hadoop.hbase.replication.ReplicationEndpoint</code></dd>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html
index 851bf77..a0681aa 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
</dl>
<hr>
<br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.69">TestReplicationEndpoint</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.71">TestReplicationEndpoint</a>
extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicationBase.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationBase</a></pre>
<div class="block">Tests ReplicationSource and ReplicationEndpoint interactions</div>
</li>
@@ -317,7 +317,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>CLASS_RULE</h4>
-<pre>public static final <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.72">CLASS_RULE</a></pre>
+<pre>public static final <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.74">CLASS_RULE</a></pre>
</li>
</ul>
<a name="LOG">
@@ -326,7 +326,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>LOG</h4>
-<pre>private static final org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.75">LOG</a></pre>
+<pre>private static final org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.77">LOG</a></pre>
</li>
</ul>
<a name="numRegionServers">
@@ -335,7 +335,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockListLast">
<li class="blockList">
<h4>numRegionServers</h4>
-<pre>static int <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.77">numRegionServers</a></pre>
+<pre>static int <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.79">numRegionServers</a></pre>
</li>
</ul>
</li>
@@ -352,7 +352,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockListLast">
<li class="blockList">
<h4>TestReplicationEndpoint</h4>
-<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.69">TestReplicationEndpoint</a>()</pre>
+<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.71">TestReplicationEndpoint</a>()</pre>
</li>
</ul>
</li>
@@ -369,7 +369,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>setUpBeforeClass</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.80">setUpBeforeClass</a>()
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.82">setUpBeforeClass</a>()
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -383,7 +383,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>tearDownAfterClass</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.86">tearDownAfterClass</a>()
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.88">tearDownAfterClass</a>()
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -397,7 +397,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>setup</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.93">setup</a>()
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.95">setup</a>()
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -411,7 +411,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>testCustomReplicationEndpoint</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.130">testCustomReplicationEndpoint</a>()
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.132">testCustomReplicationEndpoint</a>()
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -425,7 +425,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>testReplicationEndpointReturnsFalseOnReplicate</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.169">testReplicationEndpointReturnsFalseOnReplicate</a>()
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.171">testReplicationEndpointReturnsFalseOnReplicate</a>()
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -439,7 +439,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>testInterClusterReplication</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.205">testInterClusterReplication</a>()
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.207">testInterClusterReplication</a>()
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -453,7 +453,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>testWALEntryFilterFromReplicationEndpoint</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.251">testWALEntryFilterFromReplicationEndpoint</a>()
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.253">testWALEntryFilterFromReplicationEndpoint</a>()
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -467,7 +467,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>testWALEntryFilterAddValidation</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.280">testWALEntryFilterAddValidation</a>()
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.282">testWALEntryFilterAddValidation</a>()
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -481,7 +481,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>testWALEntryFilterUpdateValidation</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.290">testWALEntryFilterUpdateValidation</a>()
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.292">testWALEntryFilterUpdateValidation</a>()
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -495,7 +495,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>testMetricsSourceBaseSourcePassthrough</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.301">testMetricsSourceBaseSourcePassthrough</a>()</pre>
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.303">testMetricsSourceBaseSourcePassthrough</a>()</pre>
</li>
</ul>
<a name="doPut-byte:A-">
@@ -504,7 +504,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>doPut</h4>
-<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.358">doPut</a>(byte[] row)
+<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.378">doPut</a>(byte[] row)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -518,7 +518,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockList">
<li class="blockList">
<h4>doPut</h4>
-<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.364">doPut</a>(org.apache.hadoop.hbase.client.Connection connection,
+<pre>private void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.384">doPut</a>(org.apache.hadoop.hbase.client.Connection connection,
byte[] row)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<dl>
@@ -533,7 +533,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/replication/TestReplicat
<ul class="blockListLast">
<li class="blockList">
<h4>doAssert</h4>
-<pre>private static void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.372">doAssert</a>(byte[] row)
+<pre>private static void <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#line.392">doAssert</a>(byte[] row)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
[13/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html
index 33e600e..b06d7e8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html
@@ -195,179 +195,178 @@
<span class="sourceLineNo">187</span> }<a name="line.187"></a>
<span class="sourceLineNo">188</span><a name="line.188"></a>
<span class="sourceLineNo">189</span> // We're sending the new deads first.<a name="line.189"></a>
-<span class="sourceLineNo">190</span> List<Map.Entry<ServerName, Integer>> entries = new ArrayList<>();<a name="line.190"></a>
-<span class="sourceLineNo">191</span> entries.addAll(lastSent.entrySet());<a name="line.191"></a>
-<span class="sourceLineNo">192</span> Collections.sort(entries, new Comparator<Map.Entry<ServerName, Integer>>() {<a name="line.192"></a>
-<span class="sourceLineNo">193</span> @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span> public int compare(Map.Entry<ServerName, Integer> o1, Map.Entry<ServerName, Integer> o2) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span> return o1.getValue().compareTo(o2.getValue());<a name="line.195"></a>
-<span class="sourceLineNo">196</span> }<a name="line.196"></a>
-<span class="sourceLineNo">197</span> });<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span> // With a limit of MAX_SERVER_PER_MESSAGE<a name="line.199"></a>
-<span class="sourceLineNo">200</span> int max = entries.size() > MAX_SERVER_PER_MESSAGE ? MAX_SERVER_PER_MESSAGE : entries.size();<a name="line.200"></a>
-<span class="sourceLineNo">201</span> List<ServerName> res = new ArrayList<>(max);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span> for (int i = 0; i < max; i++) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span> Map.Entry<ServerName, Integer> toSend = entries.get(i);<a name="line.204"></a>
-<span class="sourceLineNo">205</span> if (toSend.getValue() >= (NB_SEND - 1)) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> lastSent.remove(toSend.getKey());<a name="line.206"></a>
-<span class="sourceLineNo">207</span> } else {<a name="line.207"></a>
-<span class="sourceLineNo">208</span> lastSent.replace(toSend.getKey(), toSend.getValue(), toSend.getValue() + 1);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> res.add(toSend.getKey());<a name="line.211"></a>
-<span class="sourceLineNo">212</span> }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span> return res;<a name="line.214"></a>
-<span class="sourceLineNo">215</span> }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span> /**<a name="line.217"></a>
-<span class="sourceLineNo">218</span> * Get the servers which died since a given timestamp.<a name="line.218"></a>
-<span class="sourceLineNo">219</span> * protected because it can be subclassed by the tests.<a name="line.219"></a>
-<span class="sourceLineNo">220</span> */<a name="line.220"></a>
-<span class="sourceLineNo">221</span> protected List<Pair<ServerName, Long>> getDeadServers(long since) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span> if (master.getServerManager() == null) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span> return Collections.emptyList();<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> return master.getServerManager().getDeadServers().copyDeadServersSince(since);<a name="line.226"></a>
-<span class="sourceLineNo">227</span> }<a name="line.227"></a>
+<span class="sourceLineNo">190</span> List<Map.Entry<ServerName, Integer>> entries = new ArrayList<>(lastSent.entrySet());<a name="line.190"></a>
+<span class="sourceLineNo">191</span> Collections.sort(entries, new Comparator<Map.Entry<ServerName, Integer>>() {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span> public int compare(Map.Entry<ServerName, Integer> o1, Map.Entry<ServerName, Integer> o2) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span> return o1.getValue().compareTo(o2.getValue());<a name="line.194"></a>
+<span class="sourceLineNo">195</span> }<a name="line.195"></a>
+<span class="sourceLineNo">196</span> });<a name="line.196"></a>
+<span class="sourceLineNo">197</span><a name="line.197"></a>
+<span class="sourceLineNo">198</span> // With a limit of MAX_SERVER_PER_MESSAGE<a name="line.198"></a>
+<span class="sourceLineNo">199</span> int max = entries.size() > MAX_SERVER_PER_MESSAGE ? MAX_SERVER_PER_MESSAGE : entries.size();<a name="line.199"></a>
+<span class="sourceLineNo">200</span> List<ServerName> res = new ArrayList<>(max);<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span> for (int i = 0; i < max; i++) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span> Map.Entry<ServerName, Integer> toSend = entries.get(i);<a name="line.203"></a>
+<span class="sourceLineNo">204</span> if (toSend.getValue() >= (NB_SEND - 1)) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span> lastSent.remove(toSend.getKey());<a name="line.205"></a>
+<span class="sourceLineNo">206</span> } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span> lastSent.replace(toSend.getKey(), toSend.getValue(), toSend.getValue() + 1);<a name="line.207"></a>
+<span class="sourceLineNo">208</span> }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> res.add(toSend.getKey());<a name="line.210"></a>
+<span class="sourceLineNo">211</span> }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> return res;<a name="line.213"></a>
+<span class="sourceLineNo">214</span> }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span> /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span> * Get the servers which died since a given timestamp.<a name="line.217"></a>
+<span class="sourceLineNo">218</span> * protected because it can be subclassed by the tests.<a name="line.218"></a>
+<span class="sourceLineNo">219</span> */<a name="line.219"></a>
+<span class="sourceLineNo">220</span> protected List<Pair<ServerName, Long>> getDeadServers(long since) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span> if (master.getServerManager() == null) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span> return Collections.emptyList();<a name="line.222"></a>
+<span class="sourceLineNo">223</span> }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span> return master.getServerManager().getDeadServers().copyDeadServersSince(since);<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span> public interface Publisher extends Closeable {<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span> void connect(Configuration conf) throws IOException;<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span> void publish(ClusterMetrics cs);<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span> @Override<a name="line.236"></a>
-<span class="sourceLineNo">237</span> void close();<a name="line.237"></a>
-<span class="sourceLineNo">238</span> }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span> @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.240"></a>
-<span class="sourceLineNo">241</span> public static class MulticastPublisher implements Publisher {<a name="line.241"></a>
-<span class="sourceLineNo">242</span> private DatagramChannel channel;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> private final EventLoopGroup group = new NioEventLoopGroup(<a name="line.243"></a>
-<span class="sourceLineNo">244</span> 1, Threads.newDaemonThreadFactory("hbase-master-clusterStatusPublisher"));<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> public MulticastPublisher() {<a name="line.246"></a>
-<span class="sourceLineNo">247</span> }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span> @Override<a name="line.249"></a>
-<span class="sourceLineNo">250</span> public void connect(Configuration conf) throws IOException {<a name="line.250"></a>
-<span class="sourceLineNo">251</span> String mcAddress = conf.get(HConstants.STATUS_MULTICAST_ADDRESS,<a name="line.251"></a>
-<span class="sourceLineNo">252</span> HConstants.DEFAULT_STATUS_MULTICAST_ADDRESS);<a name="line.252"></a>
-<span class="sourceLineNo">253</span> int port = conf.getInt(HConstants.STATUS_MULTICAST_PORT,<a name="line.253"></a>
-<span class="sourceLineNo">254</span> HConstants.DEFAULT_STATUS_MULTICAST_PORT);<a name="line.254"></a>
-<span class="sourceLineNo">255</span> String bindAddress = conf.get(HConstants.STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> HConstants.DEFAULT_STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS);<a name="line.256"></a>
-<span class="sourceLineNo">257</span> String niName = conf.get(HConstants.STATUS_MULTICAST_NI_NAME);<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span> final InetAddress ina;<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> ina = InetAddress.getByName(mcAddress);<a name="line.261"></a>
-<span class="sourceLineNo">262</span> } catch (UnknownHostException e) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span> close();<a name="line.263"></a>
-<span class="sourceLineNo">264</span> throw new IOException("Can't connect to " + mcAddress, e);<a name="line.264"></a>
-<span class="sourceLineNo">265</span> }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span> final InetSocketAddress isa = new InetSocketAddress(mcAddress, port);<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span> InternetProtocolFamily family;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> NetworkInterface ni;<a name="line.270"></a>
-<span class="sourceLineNo">271</span> if (niName != null) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span> if (ina instanceof Inet6Address) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span> family = InternetProtocolFamily.IPv6;<a name="line.273"></a>
-<span class="sourceLineNo">274</span> } else {<a name="line.274"></a>
-<span class="sourceLineNo">275</span> family = InternetProtocolFamily.IPv4;<a name="line.275"></a>
-<span class="sourceLineNo">276</span> }<a name="line.276"></a>
-<span class="sourceLineNo">277</span> ni = NetworkInterface.getByName(niName);<a name="line.277"></a>
-<span class="sourceLineNo">278</span> } else {<a name="line.278"></a>
-<span class="sourceLineNo">279</span> InetAddress localAddress;<a name="line.279"></a>
-<span class="sourceLineNo">280</span> if (ina instanceof Inet6Address) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> localAddress = Addressing.getIp6Address();<a name="line.281"></a>
-<span class="sourceLineNo">282</span> family = InternetProtocolFamily.IPv6;<a name="line.282"></a>
-<span class="sourceLineNo">283</span> } else {<a name="line.283"></a>
-<span class="sourceLineNo">284</span> localAddress = Addressing.getIp4Address();<a name="line.284"></a>
-<span class="sourceLineNo">285</span> family = InternetProtocolFamily.IPv4;<a name="line.285"></a>
-<span class="sourceLineNo">286</span> }<a name="line.286"></a>
-<span class="sourceLineNo">287</span> ni = NetworkInterface.getByInetAddress(localAddress);<a name="line.287"></a>
-<span class="sourceLineNo">288</span> }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span> Bootstrap b = new Bootstrap();<a name="line.290"></a>
-<span class="sourceLineNo">291</span> b.group(group)<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .channelFactory(new HBaseDatagramChannelFactory<Channel>(NioDatagramChannel.class, family))<a name="line.292"></a>
-<span class="sourceLineNo">293</span> .option(ChannelOption.SO_REUSEADDR, true)<a name="line.293"></a>
-<span class="sourceLineNo">294</span> .handler(new ClusterMetricsEncoder(isa));<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span> try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span> channel = (DatagramChannel) b.bind(bindAddress, 0).sync().channel();<a name="line.297"></a>
-<span class="sourceLineNo">298</span> channel.joinGroup(ina, ni, null, channel.newPromise()).sync();<a name="line.298"></a>
-<span class="sourceLineNo">299</span> channel.connect(isa).sync();<a name="line.299"></a>
-<span class="sourceLineNo">300</span> } catch (InterruptedException e) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span> close();<a name="line.301"></a>
-<span class="sourceLineNo">302</span> throw ExceptionUtil.asInterrupt(e);<a name="line.302"></a>
-<span class="sourceLineNo">303</span> }<a name="line.303"></a>
-<span class="sourceLineNo">304</span> }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span> private static final class HBaseDatagramChannelFactory<T extends Channel><a name="line.306"></a>
-<span class="sourceLineNo">307</span> implements ChannelFactory<T> {<a name="line.307"></a>
-<span class="sourceLineNo">308</span> private final Class<? extends T> clazz;<a name="line.308"></a>
-<span class="sourceLineNo">309</span> private InternetProtocolFamily family;<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span> HBaseDatagramChannelFactory(Class<? extends T> clazz, InternetProtocolFamily family) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span> this.clazz = clazz;<a name="line.312"></a>
-<span class="sourceLineNo">313</span> this.family = family;<a name="line.313"></a>
-<span class="sourceLineNo">314</span> }<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span> @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span> public T newChannel() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span> try {<a name="line.318"></a>
-<span class="sourceLineNo">319</span> return ReflectionUtils.instantiateWithCustomCtor(clazz.getName(),<a name="line.319"></a>
-<span class="sourceLineNo">320</span> new Class[] { InternetProtocolFamily.class }, new Object[] { family });<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span> } catch (Throwable t) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span> throw new ChannelException("Unable to create Channel from class " + clazz, t);<a name="line.323"></a>
-<span class="sourceLineNo">324</span> }<a name="line.324"></a>
-<span class="sourceLineNo">325</span> }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span> @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span> public String toString() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span> return StringUtil.simpleClassName(clazz) + ".class";<a name="line.329"></a>
-<span class="sourceLineNo">330</span> }<a name="line.330"></a>
-<span class="sourceLineNo">331</span> }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span> private static final class ClusterMetricsEncoder<a name="line.333"></a>
-<span class="sourceLineNo">334</span> extends MessageToMessageEncoder<ClusterMetrics> {<a name="line.334"></a>
-<span class="sourceLineNo">335</span> final private InetSocketAddress isa;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span> private ClusterMetricsEncoder(InetSocketAddress isa) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span> this.isa = isa;<a name="line.338"></a>
-<span class="sourceLineNo">339</span> }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span> @Override<a name="line.341"></a>
-<span class="sourceLineNo">342</span> protected void encode(ChannelHandlerContext channelHandlerContext,<a name="line.342"></a>
-<span class="sourceLineNo">343</span> ClusterMetrics clusterStatus, List<Object> objects) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span> objects.add(new DatagramPacket(Unpooled.wrappedBuffer(<a name="line.344"></a>
-<span class="sourceLineNo">345</span> ClusterMetricsBuilder.toClusterStatus(clusterStatus).toByteArray()), isa));<a name="line.345"></a>
-<span class="sourceLineNo">346</span> }<a name="line.346"></a>
-<span class="sourceLineNo">347</span> }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span> @Override<a name="line.349"></a>
-<span class="sourceLineNo">350</span> public void publish(ClusterMetrics cs) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span> channel.writeAndFlush(cs).syncUninterruptibly();<a name="line.351"></a>
-<span class="sourceLineNo">352</span> }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span> @Override<a name="line.354"></a>
-<span class="sourceLineNo">355</span> public void close() {<a name="line.355"></a>
-<span class="sourceLineNo">356</span> if (channel != null) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span> channel.close();<a name="line.357"></a>
-<span class="sourceLineNo">358</span> }<a name="line.358"></a>
-<span class="sourceLineNo">359</span> group.shutdownGracefully();<a name="line.359"></a>
-<span class="sourceLineNo">360</span> }<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>}<a name="line.362"></a>
+<span class="sourceLineNo">229</span> public interface Publisher extends Closeable {<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span> void connect(Configuration conf) throws IOException;<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> void publish(ClusterMetrics cs);<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> void close();<a name="line.236"></a>
+<span class="sourceLineNo">237</span> }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span> @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.239"></a>
+<span class="sourceLineNo">240</span> public static class MulticastPublisher implements Publisher {<a name="line.240"></a>
+<span class="sourceLineNo">241</span> private DatagramChannel channel;<a name="line.241"></a>
+<span class="sourceLineNo">242</span> private final EventLoopGroup group = new NioEventLoopGroup(<a name="line.242"></a>
+<span class="sourceLineNo">243</span> 1, Threads.newDaemonThreadFactory("hbase-master-clusterStatusPublisher"));<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span> public MulticastPublisher() {<a name="line.245"></a>
+<span class="sourceLineNo">246</span> }<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> @Override<a name="line.248"></a>
+<span class="sourceLineNo">249</span> public void connect(Configuration conf) throws IOException {<a name="line.249"></a>
+<span class="sourceLineNo">250</span> String mcAddress = conf.get(HConstants.STATUS_MULTICAST_ADDRESS,<a name="line.250"></a>
+<span class="sourceLineNo">251</span> HConstants.DEFAULT_STATUS_MULTICAST_ADDRESS);<a name="line.251"></a>
+<span class="sourceLineNo">252</span> int port = conf.getInt(HConstants.STATUS_MULTICAST_PORT,<a name="line.252"></a>
+<span class="sourceLineNo">253</span> HConstants.DEFAULT_STATUS_MULTICAST_PORT);<a name="line.253"></a>
+<span class="sourceLineNo">254</span> String bindAddress = conf.get(HConstants.STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS,<a name="line.254"></a>
+<span class="sourceLineNo">255</span> HConstants.DEFAULT_STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS);<a name="line.255"></a>
+<span class="sourceLineNo">256</span> String niName = conf.get(HConstants.STATUS_MULTICAST_NI_NAME);<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span> final InetAddress ina;<a name="line.258"></a>
+<span class="sourceLineNo">259</span> try {<a name="line.259"></a>
+<span class="sourceLineNo">260</span> ina = InetAddress.getByName(mcAddress);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> } catch (UnknownHostException e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span> close();<a name="line.262"></a>
+<span class="sourceLineNo">263</span> throw new IOException("Can't connect to " + mcAddress, e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span> }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span> final InetSocketAddress isa = new InetSocketAddress(mcAddress, port);<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> InternetProtocolFamily family;<a name="line.268"></a>
+<span class="sourceLineNo">269</span> NetworkInterface ni;<a name="line.269"></a>
+<span class="sourceLineNo">270</span> if (niName != null) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> if (ina instanceof Inet6Address) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span> family = InternetProtocolFamily.IPv6;<a name="line.272"></a>
+<span class="sourceLineNo">273</span> } else {<a name="line.273"></a>
+<span class="sourceLineNo">274</span> family = InternetProtocolFamily.IPv4;<a name="line.274"></a>
+<span class="sourceLineNo">275</span> }<a name="line.275"></a>
+<span class="sourceLineNo">276</span> ni = NetworkInterface.getByName(niName);<a name="line.276"></a>
+<span class="sourceLineNo">277</span> } else {<a name="line.277"></a>
+<span class="sourceLineNo">278</span> InetAddress localAddress;<a name="line.278"></a>
+<span class="sourceLineNo">279</span> if (ina instanceof Inet6Address) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span> localAddress = Addressing.getIp6Address();<a name="line.280"></a>
+<span class="sourceLineNo">281</span> family = InternetProtocolFamily.IPv6;<a name="line.281"></a>
+<span class="sourceLineNo">282</span> } else {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> localAddress = Addressing.getIp4Address();<a name="line.283"></a>
+<span class="sourceLineNo">284</span> family = InternetProtocolFamily.IPv4;<a name="line.284"></a>
+<span class="sourceLineNo">285</span> }<a name="line.285"></a>
+<span class="sourceLineNo">286</span> ni = NetworkInterface.getByInetAddress(localAddress);<a name="line.286"></a>
+<span class="sourceLineNo">287</span> }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span> Bootstrap b = new Bootstrap();<a name="line.289"></a>
+<span class="sourceLineNo">290</span> b.group(group)<a name="line.290"></a>
+<span class="sourceLineNo">291</span> .channelFactory(new HBaseDatagramChannelFactory<Channel>(NioDatagramChannel.class, family))<a name="line.291"></a>
+<span class="sourceLineNo">292</span> .option(ChannelOption.SO_REUSEADDR, true)<a name="line.292"></a>
+<span class="sourceLineNo">293</span> .handler(new ClusterMetricsEncoder(isa));<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span> try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span> channel = (DatagramChannel) b.bind(bindAddress, 0).sync().channel();<a name="line.296"></a>
+<span class="sourceLineNo">297</span> channel.joinGroup(ina, ni, null, channel.newPromise()).sync();<a name="line.297"></a>
+<span class="sourceLineNo">298</span> channel.connect(isa).sync();<a name="line.298"></a>
+<span class="sourceLineNo">299</span> } catch (InterruptedException e) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span> close();<a name="line.300"></a>
+<span class="sourceLineNo">301</span> throw ExceptionUtil.asInterrupt(e);<a name="line.301"></a>
+<span class="sourceLineNo">302</span> }<a name="line.302"></a>
+<span class="sourceLineNo">303</span> }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span> private static final class HBaseDatagramChannelFactory<T extends Channel><a name="line.305"></a>
+<span class="sourceLineNo">306</span> implements ChannelFactory<T> {<a name="line.306"></a>
+<span class="sourceLineNo">307</span> private final Class<? extends T> clazz;<a name="line.307"></a>
+<span class="sourceLineNo">308</span> private InternetProtocolFamily family;<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span> HBaseDatagramChannelFactory(Class<? extends T> clazz, InternetProtocolFamily family) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span> this.clazz = clazz;<a name="line.311"></a>
+<span class="sourceLineNo">312</span> this.family = family;<a name="line.312"></a>
+<span class="sourceLineNo">313</span> }<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span> @Override<a name="line.315"></a>
+<span class="sourceLineNo">316</span> public T newChannel() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span> try {<a name="line.317"></a>
+<span class="sourceLineNo">318</span> return ReflectionUtils.instantiateWithCustomCtor(clazz.getName(),<a name="line.318"></a>
+<span class="sourceLineNo">319</span> new Class[] { InternetProtocolFamily.class }, new Object[] { family });<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span> } catch (Throwable t) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span> throw new ChannelException("Unable to create Channel from class " + clazz, t);<a name="line.322"></a>
+<span class="sourceLineNo">323</span> }<a name="line.323"></a>
+<span class="sourceLineNo">324</span> }<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span> @Override<a name="line.326"></a>
+<span class="sourceLineNo">327</span> public String toString() {<a name="line.327"></a>
+<span class="sourceLineNo">328</span> return StringUtil.simpleClassName(clazz) + ".class";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> }<a name="line.329"></a>
+<span class="sourceLineNo">330</span> }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span> private static final class ClusterMetricsEncoder<a name="line.332"></a>
+<span class="sourceLineNo">333</span> extends MessageToMessageEncoder<ClusterMetrics> {<a name="line.333"></a>
+<span class="sourceLineNo">334</span> final private InetSocketAddress isa;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span> private ClusterMetricsEncoder(InetSocketAddress isa) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span> this.isa = isa;<a name="line.337"></a>
+<span class="sourceLineNo">338</span> }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span> @Override<a name="line.340"></a>
+<span class="sourceLineNo">341</span> protected void encode(ChannelHandlerContext channelHandlerContext,<a name="line.341"></a>
+<span class="sourceLineNo">342</span> ClusterMetrics clusterStatus, List<Object> objects) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span> objects.add(new DatagramPacket(Unpooled.wrappedBuffer(<a name="line.343"></a>
+<span class="sourceLineNo">344</span> ClusterMetricsBuilder.toClusterStatus(clusterStatus).toByteArray()), isa));<a name="line.344"></a>
+<span class="sourceLineNo">345</span> }<a name="line.345"></a>
+<span class="sourceLineNo">346</span> }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span> @Override<a name="line.348"></a>
+<span class="sourceLineNo">349</span> public void publish(ClusterMetrics cs) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span> channel.writeAndFlush(cs).syncUninterruptibly();<a name="line.350"></a>
+<span class="sourceLineNo">351</span> }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span> @Override<a name="line.353"></a>
+<span class="sourceLineNo">354</span> public void close() {<a name="line.354"></a>
+<span class="sourceLineNo">355</span> if (channel != null) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span> channel.close();<a name="line.356"></a>
+<span class="sourceLineNo">357</span> }<a name="line.357"></a>
+<span class="sourceLineNo">358</span> group.shutdownGracefully();<a name="line.358"></a>
+<span class="sourceLineNo">359</span> }<a name="line.359"></a>
+<span class="sourceLineNo">360</span> }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>}<a name="line.361"></a>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html
index 33e600e..b06d7e8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html
@@ -195,179 +195,178 @@
<span class="sourceLineNo">187</span> }<a name="line.187"></a>
<span class="sourceLineNo">188</span><a name="line.188"></a>
<span class="sourceLineNo">189</span> // We're sending the new deads first.<a name="line.189"></a>
-<span class="sourceLineNo">190</span> List<Map.Entry<ServerName, Integer>> entries = new ArrayList<>();<a name="line.190"></a>
-<span class="sourceLineNo">191</span> entries.addAll(lastSent.entrySet());<a name="line.191"></a>
-<span class="sourceLineNo">192</span> Collections.sort(entries, new Comparator<Map.Entry<ServerName, Integer>>() {<a name="line.192"></a>
-<span class="sourceLineNo">193</span> @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span> public int compare(Map.Entry<ServerName, Integer> o1, Map.Entry<ServerName, Integer> o2) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span> return o1.getValue().compareTo(o2.getValue());<a name="line.195"></a>
-<span class="sourceLineNo">196</span> }<a name="line.196"></a>
-<span class="sourceLineNo">197</span> });<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span> // With a limit of MAX_SERVER_PER_MESSAGE<a name="line.199"></a>
-<span class="sourceLineNo">200</span> int max = entries.size() > MAX_SERVER_PER_MESSAGE ? MAX_SERVER_PER_MESSAGE : entries.size();<a name="line.200"></a>
-<span class="sourceLineNo">201</span> List<ServerName> res = new ArrayList<>(max);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span> for (int i = 0; i < max; i++) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span> Map.Entry<ServerName, Integer> toSend = entries.get(i);<a name="line.204"></a>
-<span class="sourceLineNo">205</span> if (toSend.getValue() >= (NB_SEND - 1)) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> lastSent.remove(toSend.getKey());<a name="line.206"></a>
-<span class="sourceLineNo">207</span> } else {<a name="line.207"></a>
-<span class="sourceLineNo">208</span> lastSent.replace(toSend.getKey(), toSend.getValue(), toSend.getValue() + 1);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> res.add(toSend.getKey());<a name="line.211"></a>
-<span class="sourceLineNo">212</span> }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span> return res;<a name="line.214"></a>
-<span class="sourceLineNo">215</span> }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span> /**<a name="line.217"></a>
-<span class="sourceLineNo">218</span> * Get the servers which died since a given timestamp.<a name="line.218"></a>
-<span class="sourceLineNo">219</span> * protected because it can be subclassed by the tests.<a name="line.219"></a>
-<span class="sourceLineNo">220</span> */<a name="line.220"></a>
-<span class="sourceLineNo">221</span> protected List<Pair<ServerName, Long>> getDeadServers(long since) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span> if (master.getServerManager() == null) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span> return Collections.emptyList();<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> return master.getServerManager().getDeadServers().copyDeadServersSince(since);<a name="line.226"></a>
-<span class="sourceLineNo">227</span> }<a name="line.227"></a>
+<span class="sourceLineNo">190</span> List<Map.Entry<ServerName, Integer>> entries = new ArrayList<>(lastSent.entrySet());<a name="line.190"></a>
+<span class="sourceLineNo">191</span> Collections.sort(entries, new Comparator<Map.Entry<ServerName, Integer>>() {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span> public int compare(Map.Entry<ServerName, Integer> o1, Map.Entry<ServerName, Integer> o2) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span> return o1.getValue().compareTo(o2.getValue());<a name="line.194"></a>
+<span class="sourceLineNo">195</span> }<a name="line.195"></a>
+<span class="sourceLineNo">196</span> });<a name="line.196"></a>
+<span class="sourceLineNo">197</span><a name="line.197"></a>
+<span class="sourceLineNo">198</span> // With a limit of MAX_SERVER_PER_MESSAGE<a name="line.198"></a>
+<span class="sourceLineNo">199</span> int max = entries.size() > MAX_SERVER_PER_MESSAGE ? MAX_SERVER_PER_MESSAGE : entries.size();<a name="line.199"></a>
+<span class="sourceLineNo">200</span> List<ServerName> res = new ArrayList<>(max);<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span> for (int i = 0; i < max; i++) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span> Map.Entry<ServerName, Integer> toSend = entries.get(i);<a name="line.203"></a>
+<span class="sourceLineNo">204</span> if (toSend.getValue() >= (NB_SEND - 1)) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span> lastSent.remove(toSend.getKey());<a name="line.205"></a>
+<span class="sourceLineNo">206</span> } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span> lastSent.replace(toSend.getKey(), toSend.getValue(), toSend.getValue() + 1);<a name="line.207"></a>
+<span class="sourceLineNo">208</span> }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> res.add(toSend.getKey());<a name="line.210"></a>
+<span class="sourceLineNo">211</span> }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> return res;<a name="line.213"></a>
+<span class="sourceLineNo">214</span> }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span> /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span> * Get the servers which died since a given timestamp.<a name="line.217"></a>
+<span class="sourceLineNo">218</span> * protected because it can be subclassed by the tests.<a name="line.218"></a>
+<span class="sourceLineNo">219</span> */<a name="line.219"></a>
+<span class="sourceLineNo">220</span> protected List<Pair<ServerName, Long>> getDeadServers(long since) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span> if (master.getServerManager() == null) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span> return Collections.emptyList();<a name="line.222"></a>
+<span class="sourceLineNo">223</span> }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span> return master.getServerManager().getDeadServers().copyDeadServersSince(since);<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span> public interface Publisher extends Closeable {<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span> void connect(Configuration conf) throws IOException;<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span> void publish(ClusterMetrics cs);<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span> @Override<a name="line.236"></a>
-<span class="sourceLineNo">237</span> void close();<a name="line.237"></a>
-<span class="sourceLineNo">238</span> }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span> @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.240"></a>
-<span class="sourceLineNo">241</span> public static class MulticastPublisher implements Publisher {<a name="line.241"></a>
-<span class="sourceLineNo">242</span> private DatagramChannel channel;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> private final EventLoopGroup group = new NioEventLoopGroup(<a name="line.243"></a>
-<span class="sourceLineNo">244</span> 1, Threads.newDaemonThreadFactory("hbase-master-clusterStatusPublisher"));<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> public MulticastPublisher() {<a name="line.246"></a>
-<span class="sourceLineNo">247</span> }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span> @Override<a name="line.249"></a>
-<span class="sourceLineNo">250</span> public void connect(Configuration conf) throws IOException {<a name="line.250"></a>
-<span class="sourceLineNo">251</span> String mcAddress = conf.get(HConstants.STATUS_MULTICAST_ADDRESS,<a name="line.251"></a>
-<span class="sourceLineNo">252</span> HConstants.DEFAULT_STATUS_MULTICAST_ADDRESS);<a name="line.252"></a>
-<span class="sourceLineNo">253</span> int port = conf.getInt(HConstants.STATUS_MULTICAST_PORT,<a name="line.253"></a>
-<span class="sourceLineNo">254</span> HConstants.DEFAULT_STATUS_MULTICAST_PORT);<a name="line.254"></a>
-<span class="sourceLineNo">255</span> String bindAddress = conf.get(HConstants.STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> HConstants.DEFAULT_STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS);<a name="line.256"></a>
-<span class="sourceLineNo">257</span> String niName = conf.get(HConstants.STATUS_MULTICAST_NI_NAME);<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span> final InetAddress ina;<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> ina = InetAddress.getByName(mcAddress);<a name="line.261"></a>
-<span class="sourceLineNo">262</span> } catch (UnknownHostException e) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span> close();<a name="line.263"></a>
-<span class="sourceLineNo">264</span> throw new IOException("Can't connect to " + mcAddress, e);<a name="line.264"></a>
-<span class="sourceLineNo">265</span> }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span> final InetSocketAddress isa = new InetSocketAddress(mcAddress, port);<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span> InternetProtocolFamily family;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> NetworkInterface ni;<a name="line.270"></a>
-<span class="sourceLineNo">271</span> if (niName != null) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span> if (ina instanceof Inet6Address) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span> family = InternetProtocolFamily.IPv6;<a name="line.273"></a>
-<span class="sourceLineNo">274</span> } else {<a name="line.274"></a>
-<span class="sourceLineNo">275</span> family = InternetProtocolFamily.IPv4;<a name="line.275"></a>
-<span class="sourceLineNo">276</span> }<a name="line.276"></a>
-<span class="sourceLineNo">277</span> ni = NetworkInterface.getByName(niName);<a name="line.277"></a>
-<span class="sourceLineNo">278</span> } else {<a name="line.278"></a>
-<span class="sourceLineNo">279</span> InetAddress localAddress;<a name="line.279"></a>
-<span class="sourceLineNo">280</span> if (ina instanceof Inet6Address) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> localAddress = Addressing.getIp6Address();<a name="line.281"></a>
-<span class="sourceLineNo">282</span> family = InternetProtocolFamily.IPv6;<a name="line.282"></a>
-<span class="sourceLineNo">283</span> } else {<a name="line.283"></a>
-<span class="sourceLineNo">284</span> localAddress = Addressing.getIp4Address();<a name="line.284"></a>
-<span class="sourceLineNo">285</span> family = InternetProtocolFamily.IPv4;<a name="line.285"></a>
-<span class="sourceLineNo">286</span> }<a name="line.286"></a>
-<span class="sourceLineNo">287</span> ni = NetworkInterface.getByInetAddress(localAddress);<a name="line.287"></a>
-<span class="sourceLineNo">288</span> }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span> Bootstrap b = new Bootstrap();<a name="line.290"></a>
-<span class="sourceLineNo">291</span> b.group(group)<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .channelFactory(new HBaseDatagramChannelFactory<Channel>(NioDatagramChannel.class, family))<a name="line.292"></a>
-<span class="sourceLineNo">293</span> .option(ChannelOption.SO_REUSEADDR, true)<a name="line.293"></a>
-<span class="sourceLineNo">294</span> .handler(new ClusterMetricsEncoder(isa));<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span> try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span> channel = (DatagramChannel) b.bind(bindAddress, 0).sync().channel();<a name="line.297"></a>
-<span class="sourceLineNo">298</span> channel.joinGroup(ina, ni, null, channel.newPromise()).sync();<a name="line.298"></a>
-<span class="sourceLineNo">299</span> channel.connect(isa).sync();<a name="line.299"></a>
-<span class="sourceLineNo">300</span> } catch (InterruptedException e) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span> close();<a name="line.301"></a>
-<span class="sourceLineNo">302</span> throw ExceptionUtil.asInterrupt(e);<a name="line.302"></a>
-<span class="sourceLineNo">303</span> }<a name="line.303"></a>
-<span class="sourceLineNo">304</span> }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span> private static final class HBaseDatagramChannelFactory<T extends Channel><a name="line.306"></a>
-<span class="sourceLineNo">307</span> implements ChannelFactory<T> {<a name="line.307"></a>
-<span class="sourceLineNo">308</span> private final Class<? extends T> clazz;<a name="line.308"></a>
-<span class="sourceLineNo">309</span> private InternetProtocolFamily family;<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span> HBaseDatagramChannelFactory(Class<? extends T> clazz, InternetProtocolFamily family) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span> this.clazz = clazz;<a name="line.312"></a>
-<span class="sourceLineNo">313</span> this.family = family;<a name="line.313"></a>
-<span class="sourceLineNo">314</span> }<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span> @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span> public T newChannel() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span> try {<a name="line.318"></a>
-<span class="sourceLineNo">319</span> return ReflectionUtils.instantiateWithCustomCtor(clazz.getName(),<a name="line.319"></a>
-<span class="sourceLineNo">320</span> new Class[] { InternetProtocolFamily.class }, new Object[] { family });<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span> } catch (Throwable t) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span> throw new ChannelException("Unable to create Channel from class " + clazz, t);<a name="line.323"></a>
-<span class="sourceLineNo">324</span> }<a name="line.324"></a>
-<span class="sourceLineNo">325</span> }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span> @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span> public String toString() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span> return StringUtil.simpleClassName(clazz) + ".class";<a name="line.329"></a>
-<span class="sourceLineNo">330</span> }<a name="line.330"></a>
-<span class="sourceLineNo">331</span> }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span> private static final class ClusterMetricsEncoder<a name="line.333"></a>
-<span class="sourceLineNo">334</span> extends MessageToMessageEncoder<ClusterMetrics> {<a name="line.334"></a>
-<span class="sourceLineNo">335</span> final private InetSocketAddress isa;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span> private ClusterMetricsEncoder(InetSocketAddress isa) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span> this.isa = isa;<a name="line.338"></a>
-<span class="sourceLineNo">339</span> }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span> @Override<a name="line.341"></a>
-<span class="sourceLineNo">342</span> protected void encode(ChannelHandlerContext channelHandlerContext,<a name="line.342"></a>
-<span class="sourceLineNo">343</span> ClusterMetrics clusterStatus, List<Object> objects) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span> objects.add(new DatagramPacket(Unpooled.wrappedBuffer(<a name="line.344"></a>
-<span class="sourceLineNo">345</span> ClusterMetricsBuilder.toClusterStatus(clusterStatus).toByteArray()), isa));<a name="line.345"></a>
-<span class="sourceLineNo">346</span> }<a name="line.346"></a>
-<span class="sourceLineNo">347</span> }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span> @Override<a name="line.349"></a>
-<span class="sourceLineNo">350</span> public void publish(ClusterMetrics cs) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span> channel.writeAndFlush(cs).syncUninterruptibly();<a name="line.351"></a>
-<span class="sourceLineNo">352</span> }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span> @Override<a name="line.354"></a>
-<span class="sourceLineNo">355</span> public void close() {<a name="line.355"></a>
-<span class="sourceLineNo">356</span> if (channel != null) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span> channel.close();<a name="line.357"></a>
-<span class="sourceLineNo">358</span> }<a name="line.358"></a>
-<span class="sourceLineNo">359</span> group.shutdownGracefully();<a name="line.359"></a>
-<span class="sourceLineNo">360</span> }<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>}<a name="line.362"></a>
+<span class="sourceLineNo">229</span> public interface Publisher extends Closeable {<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span> void connect(Configuration conf) throws IOException;<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> void publish(ClusterMetrics cs);<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> void close();<a name="line.236"></a>
+<span class="sourceLineNo">237</span> }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span> @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.239"></a>
+<span class="sourceLineNo">240</span> public static class MulticastPublisher implements Publisher {<a name="line.240"></a>
+<span class="sourceLineNo">241</span> private DatagramChannel channel;<a name="line.241"></a>
+<span class="sourceLineNo">242</span> private final EventLoopGroup group = new NioEventLoopGroup(<a name="line.242"></a>
+<span class="sourceLineNo">243</span> 1, Threads.newDaemonThreadFactory("hbase-master-clusterStatusPublisher"));<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span> public MulticastPublisher() {<a name="line.245"></a>
+<span class="sourceLineNo">246</span> }<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> @Override<a name="line.248"></a>
+<span class="sourceLineNo">249</span> public void connect(Configuration conf) throws IOException {<a name="line.249"></a>
+<span class="sourceLineNo">250</span> String mcAddress = conf.get(HConstants.STATUS_MULTICAST_ADDRESS,<a name="line.250"></a>
+<span class="sourceLineNo">251</span> HConstants.DEFAULT_STATUS_MULTICAST_ADDRESS);<a name="line.251"></a>
+<span class="sourceLineNo">252</span> int port = conf.getInt(HConstants.STATUS_MULTICAST_PORT,<a name="line.252"></a>
+<span class="sourceLineNo">253</span> HConstants.DEFAULT_STATUS_MULTICAST_PORT);<a name="line.253"></a>
+<span class="sourceLineNo">254</span> String bindAddress = conf.get(HConstants.STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS,<a name="line.254"></a>
+<span class="sourceLineNo">255</span> HConstants.DEFAULT_STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS);<a name="line.255"></a>
+<span class="sourceLineNo">256</span> String niName = conf.get(HConstants.STATUS_MULTICAST_NI_NAME);<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span> final InetAddress ina;<a name="line.258"></a>
+<span class="sourceLineNo">259</span> try {<a name="line.259"></a>
+<span class="sourceLineNo">260</span> ina = InetAddress.getByName(mcAddress);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> } catch (UnknownHostException e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span> close();<a name="line.262"></a>
+<span class="sourceLineNo">263</span> throw new IOException("Can't connect to " + mcAddress, e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span> }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span> final InetSocketAddress isa = new InetSocketAddress(mcAddress, port);<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> InternetProtocolFamily family;<a name="line.268"></a>
+<span class="sourceLineNo">269</span> NetworkInterface ni;<a name="line.269"></a>
+<span class="sourceLineNo">270</span> if (niName != null) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> if (ina instanceof Inet6Address) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span> family = InternetProtocolFamily.IPv6;<a name="line.272"></a>
+<span class="sourceLineNo">273</span> } else {<a name="line.273"></a>
+<span class="sourceLineNo">274</span> family = InternetProtocolFamily.IPv4;<a name="line.274"></a>
+<span class="sourceLineNo">275</span> }<a name="line.275"></a>
+<span class="sourceLineNo">276</span> ni = NetworkInterface.getByName(niName);<a name="line.276"></a>
+<span class="sourceLineNo">277</span> } else {<a name="line.277"></a>
+<span class="sourceLineNo">278</span> InetAddress localAddress;<a name="line.278"></a>
+<span class="sourceLineNo">279</span> if (ina instanceof Inet6Address) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span> localAddress = Addressing.getIp6Address();<a name="line.280"></a>
+<span class="sourceLineNo">281</span> family = InternetProtocolFamily.IPv6;<a name="line.281"></a>
+<span class="sourceLineNo">282</span> } else {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> localAddress = Addressing.getIp4Address();<a name="line.283"></a>
+<span class="sourceLineNo">284</span> family = InternetProtocolFamily.IPv4;<a name="line.284"></a>
+<span class="sourceLineNo">285</span> }<a name="line.285"></a>
+<span class="sourceLineNo">286</span> ni = NetworkInterface.getByInetAddress(localAddress);<a name="line.286"></a>
+<span class="sourceLineNo">287</span> }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span> Bootstrap b = new Bootstrap();<a name="line.289"></a>
+<span class="sourceLineNo">290</span> b.group(group)<a name="line.290"></a>
+<span class="sourceLineNo">291</span> .channelFactory(new HBaseDatagramChannelFactory<Channel>(NioDatagramChannel.class, family))<a name="line.291"></a>
+<span class="sourceLineNo">292</span> .option(ChannelOption.SO_REUSEADDR, true)<a name="line.292"></a>
+<span class="sourceLineNo">293</span> .handler(new ClusterMetricsEncoder(isa));<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span> try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span> channel = (DatagramChannel) b.bind(bindAddress, 0).sync().channel();<a name="line.296"></a>
+<span class="sourceLineNo">297</span> channel.joinGroup(ina, ni, null, channel.newPromise()).sync();<a name="line.297"></a>
+<span class="sourceLineNo">298</span> channel.connect(isa).sync();<a name="line.298"></a>
+<span class="sourceLineNo">299</span> } catch (InterruptedException e) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span> close();<a name="line.300"></a>
+<span class="sourceLineNo">301</span> throw ExceptionUtil.asInterrupt(e);<a name="line.301"></a>
+<span class="sourceLineNo">302</span> }<a name="line.302"></a>
+<span class="sourceLineNo">303</span> }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span> private static final class HBaseDatagramChannelFactory<T extends Channel><a name="line.305"></a>
+<span class="sourceLineNo">306</span> implements ChannelFactory<T> {<a name="line.306"></a>
+<span class="sourceLineNo">307</span> private final Class<? extends T> clazz;<a name="line.307"></a>
+<span class="sourceLineNo">308</span> private InternetProtocolFamily family;<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span> HBaseDatagramChannelFactory(Class<? extends T> clazz, InternetProtocolFamily family) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span> this.clazz = clazz;<a name="line.311"></a>
+<span class="sourceLineNo">312</span> this.family = family;<a name="line.312"></a>
+<span class="sourceLineNo">313</span> }<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span> @Override<a name="line.315"></a>
+<span class="sourceLineNo">316</span> public T newChannel() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span> try {<a name="line.317"></a>
+<span class="sourceLineNo">318</span> return ReflectionUtils.instantiateWithCustomCtor(clazz.getName(),<a name="line.318"></a>
+<span class="sourceLineNo">319</span> new Class[] { InternetProtocolFamily.class }, new Object[] { family });<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span> } catch (Throwable t) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span> throw new ChannelException("Unable to create Channel from class " + clazz, t);<a name="line.322"></a>
+<span class="sourceLineNo">323</span> }<a name="line.323"></a>
+<span class="sourceLineNo">324</span> }<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span> @Override<a name="line.326"></a>
+<span class="sourceLineNo">327</span> public String toString() {<a name="line.327"></a>
+<span class="sourceLineNo">328</span> return StringUtil.simpleClassName(clazz) + ".class";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> }<a name="line.329"></a>
+<span class="sourceLineNo">330</span> }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span> private static final class ClusterMetricsEncoder<a name="line.332"></a>
+<span class="sourceLineNo">333</span> extends MessageToMessageEncoder<ClusterMetrics> {<a name="line.333"></a>
+<span class="sourceLineNo">334</span> final private InetSocketAddress isa;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span> private ClusterMetricsEncoder(InetSocketAddress isa) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span> this.isa = isa;<a name="line.337"></a>
+<span class="sourceLineNo">338</span> }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span> @Override<a name="line.340"></a>
+<span class="sourceLineNo">341</span> protected void encode(ChannelHandlerContext channelHandlerContext,<a name="line.341"></a>
+<span class="sourceLineNo">342</span> ClusterMetrics clusterStatus, List<Object> objects) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span> objects.add(new DatagramPacket(Unpooled.wrappedBuffer(<a name="line.343"></a>
+<span class="sourceLineNo">344</span> ClusterMetricsBuilder.toClusterStatus(clusterStatus).toByteArray()), isa));<a name="line.344"></a>
+<span class="sourceLineNo">345</span> }<a name="line.345"></a>
+<span class="sourceLineNo">346</span> }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span> @Override<a name="line.348"></a>
+<span class="sourceLineNo">349</span> public void publish(ClusterMetrics cs) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span> channel.writeAndFlush(cs).syncUninterruptibly();<a name="line.350"></a>
+<span class="sourceLineNo">351</span> }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span> @Override<a name="line.353"></a>
+<span class="sourceLineNo">354</span> public void close() {<a name="line.354"></a>
+<span class="sourceLineNo">355</span> if (channel != null) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span> channel.close();<a name="line.356"></a>
+<span class="sourceLineNo">357</span> }<a name="line.357"></a>
+<span class="sourceLineNo">358</span> group.shutdownGracefully();<a name="line.358"></a>
+<span class="sourceLineNo">359</span> }<a name="line.359"></a>
+<span class="sourceLineNo">360</span> }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>}<a name="line.361"></a>
[12/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html
index 33e600e..b06d7e8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html
@@ -195,179 +195,178 @@
<span class="sourceLineNo">187</span> }<a name="line.187"></a>
<span class="sourceLineNo">188</span><a name="line.188"></a>
<span class="sourceLineNo">189</span> // We're sending the new deads first.<a name="line.189"></a>
-<span class="sourceLineNo">190</span> List<Map.Entry<ServerName, Integer>> entries = new ArrayList<>();<a name="line.190"></a>
-<span class="sourceLineNo">191</span> entries.addAll(lastSent.entrySet());<a name="line.191"></a>
-<span class="sourceLineNo">192</span> Collections.sort(entries, new Comparator<Map.Entry<ServerName, Integer>>() {<a name="line.192"></a>
-<span class="sourceLineNo">193</span> @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span> public int compare(Map.Entry<ServerName, Integer> o1, Map.Entry<ServerName, Integer> o2) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span> return o1.getValue().compareTo(o2.getValue());<a name="line.195"></a>
-<span class="sourceLineNo">196</span> }<a name="line.196"></a>
-<span class="sourceLineNo">197</span> });<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span> // With a limit of MAX_SERVER_PER_MESSAGE<a name="line.199"></a>
-<span class="sourceLineNo">200</span> int max = entries.size() > MAX_SERVER_PER_MESSAGE ? MAX_SERVER_PER_MESSAGE : entries.size();<a name="line.200"></a>
-<span class="sourceLineNo">201</span> List<ServerName> res = new ArrayList<>(max);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span> for (int i = 0; i < max; i++) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span> Map.Entry<ServerName, Integer> toSend = entries.get(i);<a name="line.204"></a>
-<span class="sourceLineNo">205</span> if (toSend.getValue() >= (NB_SEND - 1)) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> lastSent.remove(toSend.getKey());<a name="line.206"></a>
-<span class="sourceLineNo">207</span> } else {<a name="line.207"></a>
-<span class="sourceLineNo">208</span> lastSent.replace(toSend.getKey(), toSend.getValue(), toSend.getValue() + 1);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> res.add(toSend.getKey());<a name="line.211"></a>
-<span class="sourceLineNo">212</span> }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span> return res;<a name="line.214"></a>
-<span class="sourceLineNo">215</span> }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span> /**<a name="line.217"></a>
-<span class="sourceLineNo">218</span> * Get the servers which died since a given timestamp.<a name="line.218"></a>
-<span class="sourceLineNo">219</span> * protected because it can be subclassed by the tests.<a name="line.219"></a>
-<span class="sourceLineNo">220</span> */<a name="line.220"></a>
-<span class="sourceLineNo">221</span> protected List<Pair<ServerName, Long>> getDeadServers(long since) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span> if (master.getServerManager() == null) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span> return Collections.emptyList();<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> return master.getServerManager().getDeadServers().copyDeadServersSince(since);<a name="line.226"></a>
-<span class="sourceLineNo">227</span> }<a name="line.227"></a>
+<span class="sourceLineNo">190</span> List<Map.Entry<ServerName, Integer>> entries = new ArrayList<>(lastSent.entrySet());<a name="line.190"></a>
+<span class="sourceLineNo">191</span> Collections.sort(entries, new Comparator<Map.Entry<ServerName, Integer>>() {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span> public int compare(Map.Entry<ServerName, Integer> o1, Map.Entry<ServerName, Integer> o2) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span> return o1.getValue().compareTo(o2.getValue());<a name="line.194"></a>
+<span class="sourceLineNo">195</span> }<a name="line.195"></a>
+<span class="sourceLineNo">196</span> });<a name="line.196"></a>
+<span class="sourceLineNo">197</span><a name="line.197"></a>
+<span class="sourceLineNo">198</span> // With a limit of MAX_SERVER_PER_MESSAGE<a name="line.198"></a>
+<span class="sourceLineNo">199</span> int max = entries.size() > MAX_SERVER_PER_MESSAGE ? MAX_SERVER_PER_MESSAGE : entries.size();<a name="line.199"></a>
+<span class="sourceLineNo">200</span> List<ServerName> res = new ArrayList<>(max);<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span> for (int i = 0; i < max; i++) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span> Map.Entry<ServerName, Integer> toSend = entries.get(i);<a name="line.203"></a>
+<span class="sourceLineNo">204</span> if (toSend.getValue() >= (NB_SEND - 1)) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span> lastSent.remove(toSend.getKey());<a name="line.205"></a>
+<span class="sourceLineNo">206</span> } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span> lastSent.replace(toSend.getKey(), toSend.getValue(), toSend.getValue() + 1);<a name="line.207"></a>
+<span class="sourceLineNo">208</span> }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> res.add(toSend.getKey());<a name="line.210"></a>
+<span class="sourceLineNo">211</span> }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> return res;<a name="line.213"></a>
+<span class="sourceLineNo">214</span> }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span> /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span> * Get the servers which died since a given timestamp.<a name="line.217"></a>
+<span class="sourceLineNo">218</span> * protected because it can be subclassed by the tests.<a name="line.218"></a>
+<span class="sourceLineNo">219</span> */<a name="line.219"></a>
+<span class="sourceLineNo">220</span> protected List<Pair<ServerName, Long>> getDeadServers(long since) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span> if (master.getServerManager() == null) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span> return Collections.emptyList();<a name="line.222"></a>
+<span class="sourceLineNo">223</span> }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span> return master.getServerManager().getDeadServers().copyDeadServersSince(since);<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span> public interface Publisher extends Closeable {<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span> void connect(Configuration conf) throws IOException;<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span> void publish(ClusterMetrics cs);<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span> @Override<a name="line.236"></a>
-<span class="sourceLineNo">237</span> void close();<a name="line.237"></a>
-<span class="sourceLineNo">238</span> }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span> @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.240"></a>
-<span class="sourceLineNo">241</span> public static class MulticastPublisher implements Publisher {<a name="line.241"></a>
-<span class="sourceLineNo">242</span> private DatagramChannel channel;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> private final EventLoopGroup group = new NioEventLoopGroup(<a name="line.243"></a>
-<span class="sourceLineNo">244</span> 1, Threads.newDaemonThreadFactory("hbase-master-clusterStatusPublisher"));<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> public MulticastPublisher() {<a name="line.246"></a>
-<span class="sourceLineNo">247</span> }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span> @Override<a name="line.249"></a>
-<span class="sourceLineNo">250</span> public void connect(Configuration conf) throws IOException {<a name="line.250"></a>
-<span class="sourceLineNo">251</span> String mcAddress = conf.get(HConstants.STATUS_MULTICAST_ADDRESS,<a name="line.251"></a>
-<span class="sourceLineNo">252</span> HConstants.DEFAULT_STATUS_MULTICAST_ADDRESS);<a name="line.252"></a>
-<span class="sourceLineNo">253</span> int port = conf.getInt(HConstants.STATUS_MULTICAST_PORT,<a name="line.253"></a>
-<span class="sourceLineNo">254</span> HConstants.DEFAULT_STATUS_MULTICAST_PORT);<a name="line.254"></a>
-<span class="sourceLineNo">255</span> String bindAddress = conf.get(HConstants.STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> HConstants.DEFAULT_STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS);<a name="line.256"></a>
-<span class="sourceLineNo">257</span> String niName = conf.get(HConstants.STATUS_MULTICAST_NI_NAME);<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span> final InetAddress ina;<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> ina = InetAddress.getByName(mcAddress);<a name="line.261"></a>
-<span class="sourceLineNo">262</span> } catch (UnknownHostException e) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span> close();<a name="line.263"></a>
-<span class="sourceLineNo">264</span> throw new IOException("Can't connect to " + mcAddress, e);<a name="line.264"></a>
-<span class="sourceLineNo">265</span> }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span> final InetSocketAddress isa = new InetSocketAddress(mcAddress, port);<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span> InternetProtocolFamily family;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> NetworkInterface ni;<a name="line.270"></a>
-<span class="sourceLineNo">271</span> if (niName != null) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span> if (ina instanceof Inet6Address) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span> family = InternetProtocolFamily.IPv6;<a name="line.273"></a>
-<span class="sourceLineNo">274</span> } else {<a name="line.274"></a>
-<span class="sourceLineNo">275</span> family = InternetProtocolFamily.IPv4;<a name="line.275"></a>
-<span class="sourceLineNo">276</span> }<a name="line.276"></a>
-<span class="sourceLineNo">277</span> ni = NetworkInterface.getByName(niName);<a name="line.277"></a>
-<span class="sourceLineNo">278</span> } else {<a name="line.278"></a>
-<span class="sourceLineNo">279</span> InetAddress localAddress;<a name="line.279"></a>
-<span class="sourceLineNo">280</span> if (ina instanceof Inet6Address) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> localAddress = Addressing.getIp6Address();<a name="line.281"></a>
-<span class="sourceLineNo">282</span> family = InternetProtocolFamily.IPv6;<a name="line.282"></a>
-<span class="sourceLineNo">283</span> } else {<a name="line.283"></a>
-<span class="sourceLineNo">284</span> localAddress = Addressing.getIp4Address();<a name="line.284"></a>
-<span class="sourceLineNo">285</span> family = InternetProtocolFamily.IPv4;<a name="line.285"></a>
-<span class="sourceLineNo">286</span> }<a name="line.286"></a>
-<span class="sourceLineNo">287</span> ni = NetworkInterface.getByInetAddress(localAddress);<a name="line.287"></a>
-<span class="sourceLineNo">288</span> }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span> Bootstrap b = new Bootstrap();<a name="line.290"></a>
-<span class="sourceLineNo">291</span> b.group(group)<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .channelFactory(new HBaseDatagramChannelFactory<Channel>(NioDatagramChannel.class, family))<a name="line.292"></a>
-<span class="sourceLineNo">293</span> .option(ChannelOption.SO_REUSEADDR, true)<a name="line.293"></a>
-<span class="sourceLineNo">294</span> .handler(new ClusterMetricsEncoder(isa));<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span> try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span> channel = (DatagramChannel) b.bind(bindAddress, 0).sync().channel();<a name="line.297"></a>
-<span class="sourceLineNo">298</span> channel.joinGroup(ina, ni, null, channel.newPromise()).sync();<a name="line.298"></a>
-<span class="sourceLineNo">299</span> channel.connect(isa).sync();<a name="line.299"></a>
-<span class="sourceLineNo">300</span> } catch (InterruptedException e) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span> close();<a name="line.301"></a>
-<span class="sourceLineNo">302</span> throw ExceptionUtil.asInterrupt(e);<a name="line.302"></a>
-<span class="sourceLineNo">303</span> }<a name="line.303"></a>
-<span class="sourceLineNo">304</span> }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span> private static final class HBaseDatagramChannelFactory<T extends Channel><a name="line.306"></a>
-<span class="sourceLineNo">307</span> implements ChannelFactory<T> {<a name="line.307"></a>
-<span class="sourceLineNo">308</span> private final Class<? extends T> clazz;<a name="line.308"></a>
-<span class="sourceLineNo">309</span> private InternetProtocolFamily family;<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span> HBaseDatagramChannelFactory(Class<? extends T> clazz, InternetProtocolFamily family) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span> this.clazz = clazz;<a name="line.312"></a>
-<span class="sourceLineNo">313</span> this.family = family;<a name="line.313"></a>
-<span class="sourceLineNo">314</span> }<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span> @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span> public T newChannel() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span> try {<a name="line.318"></a>
-<span class="sourceLineNo">319</span> return ReflectionUtils.instantiateWithCustomCtor(clazz.getName(),<a name="line.319"></a>
-<span class="sourceLineNo">320</span> new Class[] { InternetProtocolFamily.class }, new Object[] { family });<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span> } catch (Throwable t) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span> throw new ChannelException("Unable to create Channel from class " + clazz, t);<a name="line.323"></a>
-<span class="sourceLineNo">324</span> }<a name="line.324"></a>
-<span class="sourceLineNo">325</span> }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span> @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span> public String toString() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span> return StringUtil.simpleClassName(clazz) + ".class";<a name="line.329"></a>
-<span class="sourceLineNo">330</span> }<a name="line.330"></a>
-<span class="sourceLineNo">331</span> }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span> private static final class ClusterMetricsEncoder<a name="line.333"></a>
-<span class="sourceLineNo">334</span> extends MessageToMessageEncoder<ClusterMetrics> {<a name="line.334"></a>
-<span class="sourceLineNo">335</span> final private InetSocketAddress isa;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span> private ClusterMetricsEncoder(InetSocketAddress isa) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span> this.isa = isa;<a name="line.338"></a>
-<span class="sourceLineNo">339</span> }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span> @Override<a name="line.341"></a>
-<span class="sourceLineNo">342</span> protected void encode(ChannelHandlerContext channelHandlerContext,<a name="line.342"></a>
-<span class="sourceLineNo">343</span> ClusterMetrics clusterStatus, List<Object> objects) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span> objects.add(new DatagramPacket(Unpooled.wrappedBuffer(<a name="line.344"></a>
-<span class="sourceLineNo">345</span> ClusterMetricsBuilder.toClusterStatus(clusterStatus).toByteArray()), isa));<a name="line.345"></a>
-<span class="sourceLineNo">346</span> }<a name="line.346"></a>
-<span class="sourceLineNo">347</span> }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span> @Override<a name="line.349"></a>
-<span class="sourceLineNo">350</span> public void publish(ClusterMetrics cs) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span> channel.writeAndFlush(cs).syncUninterruptibly();<a name="line.351"></a>
-<span class="sourceLineNo">352</span> }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span> @Override<a name="line.354"></a>
-<span class="sourceLineNo">355</span> public void close() {<a name="line.355"></a>
-<span class="sourceLineNo">356</span> if (channel != null) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span> channel.close();<a name="line.357"></a>
-<span class="sourceLineNo">358</span> }<a name="line.358"></a>
-<span class="sourceLineNo">359</span> group.shutdownGracefully();<a name="line.359"></a>
-<span class="sourceLineNo">360</span> }<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>}<a name="line.362"></a>
+<span class="sourceLineNo">229</span> public interface Publisher extends Closeable {<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span> void connect(Configuration conf) throws IOException;<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> void publish(ClusterMetrics cs);<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> void close();<a name="line.236"></a>
+<span class="sourceLineNo">237</span> }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span> @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.239"></a>
+<span class="sourceLineNo">240</span> public static class MulticastPublisher implements Publisher {<a name="line.240"></a>
+<span class="sourceLineNo">241</span> private DatagramChannel channel;<a name="line.241"></a>
+<span class="sourceLineNo">242</span> private final EventLoopGroup group = new NioEventLoopGroup(<a name="line.242"></a>
+<span class="sourceLineNo">243</span> 1, Threads.newDaemonThreadFactory("hbase-master-clusterStatusPublisher"));<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span> public MulticastPublisher() {<a name="line.245"></a>
+<span class="sourceLineNo">246</span> }<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> @Override<a name="line.248"></a>
+<span class="sourceLineNo">249</span> public void connect(Configuration conf) throws IOException {<a name="line.249"></a>
+<span class="sourceLineNo">250</span> String mcAddress = conf.get(HConstants.STATUS_MULTICAST_ADDRESS,<a name="line.250"></a>
+<span class="sourceLineNo">251</span> HConstants.DEFAULT_STATUS_MULTICAST_ADDRESS);<a name="line.251"></a>
+<span class="sourceLineNo">252</span> int port = conf.getInt(HConstants.STATUS_MULTICAST_PORT,<a name="line.252"></a>
+<span class="sourceLineNo">253</span> HConstants.DEFAULT_STATUS_MULTICAST_PORT);<a name="line.253"></a>
+<span class="sourceLineNo">254</span> String bindAddress = conf.get(HConstants.STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS,<a name="line.254"></a>
+<span class="sourceLineNo">255</span> HConstants.DEFAULT_STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS);<a name="line.255"></a>
+<span class="sourceLineNo">256</span> String niName = conf.get(HConstants.STATUS_MULTICAST_NI_NAME);<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span> final InetAddress ina;<a name="line.258"></a>
+<span class="sourceLineNo">259</span> try {<a name="line.259"></a>
+<span class="sourceLineNo">260</span> ina = InetAddress.getByName(mcAddress);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> } catch (UnknownHostException e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span> close();<a name="line.262"></a>
+<span class="sourceLineNo">263</span> throw new IOException("Can't connect to " + mcAddress, e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span> }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span> final InetSocketAddress isa = new InetSocketAddress(mcAddress, port);<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> InternetProtocolFamily family;<a name="line.268"></a>
+<span class="sourceLineNo">269</span> NetworkInterface ni;<a name="line.269"></a>
+<span class="sourceLineNo">270</span> if (niName != null) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> if (ina instanceof Inet6Address) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span> family = InternetProtocolFamily.IPv6;<a name="line.272"></a>
+<span class="sourceLineNo">273</span> } else {<a name="line.273"></a>
+<span class="sourceLineNo">274</span> family = InternetProtocolFamily.IPv4;<a name="line.274"></a>
+<span class="sourceLineNo">275</span> }<a name="line.275"></a>
+<span class="sourceLineNo">276</span> ni = NetworkInterface.getByName(niName);<a name="line.276"></a>
+<span class="sourceLineNo">277</span> } else {<a name="line.277"></a>
+<span class="sourceLineNo">278</span> InetAddress localAddress;<a name="line.278"></a>
+<span class="sourceLineNo">279</span> if (ina instanceof Inet6Address) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span> localAddress = Addressing.getIp6Address();<a name="line.280"></a>
+<span class="sourceLineNo">281</span> family = InternetProtocolFamily.IPv6;<a name="line.281"></a>
+<span class="sourceLineNo">282</span> } else {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> localAddress = Addressing.getIp4Address();<a name="line.283"></a>
+<span class="sourceLineNo">284</span> family = InternetProtocolFamily.IPv4;<a name="line.284"></a>
+<span class="sourceLineNo">285</span> }<a name="line.285"></a>
+<span class="sourceLineNo">286</span> ni = NetworkInterface.getByInetAddress(localAddress);<a name="line.286"></a>
+<span class="sourceLineNo">287</span> }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span> Bootstrap b = new Bootstrap();<a name="line.289"></a>
+<span class="sourceLineNo">290</span> b.group(group)<a name="line.290"></a>
+<span class="sourceLineNo">291</span> .channelFactory(new HBaseDatagramChannelFactory<Channel>(NioDatagramChannel.class, family))<a name="line.291"></a>
+<span class="sourceLineNo">292</span> .option(ChannelOption.SO_REUSEADDR, true)<a name="line.292"></a>
+<span class="sourceLineNo">293</span> .handler(new ClusterMetricsEncoder(isa));<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span> try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span> channel = (DatagramChannel) b.bind(bindAddress, 0).sync().channel();<a name="line.296"></a>
+<span class="sourceLineNo">297</span> channel.joinGroup(ina, ni, null, channel.newPromise()).sync();<a name="line.297"></a>
+<span class="sourceLineNo">298</span> channel.connect(isa).sync();<a name="line.298"></a>
+<span class="sourceLineNo">299</span> } catch (InterruptedException e) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span> close();<a name="line.300"></a>
+<span class="sourceLineNo">301</span> throw ExceptionUtil.asInterrupt(e);<a name="line.301"></a>
+<span class="sourceLineNo">302</span> }<a name="line.302"></a>
+<span class="sourceLineNo">303</span> }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span> private static final class HBaseDatagramChannelFactory<T extends Channel><a name="line.305"></a>
+<span class="sourceLineNo">306</span> implements ChannelFactory<T> {<a name="line.306"></a>
+<span class="sourceLineNo">307</span> private final Class<? extends T> clazz;<a name="line.307"></a>
+<span class="sourceLineNo">308</span> private InternetProtocolFamily family;<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span> HBaseDatagramChannelFactory(Class<? extends T> clazz, InternetProtocolFamily family) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span> this.clazz = clazz;<a name="line.311"></a>
+<span class="sourceLineNo">312</span> this.family = family;<a name="line.312"></a>
+<span class="sourceLineNo">313</span> }<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span> @Override<a name="line.315"></a>
+<span class="sourceLineNo">316</span> public T newChannel() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span> try {<a name="line.317"></a>
+<span class="sourceLineNo">318</span> return ReflectionUtils.instantiateWithCustomCtor(clazz.getName(),<a name="line.318"></a>
+<span class="sourceLineNo">319</span> new Class[] { InternetProtocolFamily.class }, new Object[] { family });<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span> } catch (Throwable t) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span> throw new ChannelException("Unable to create Channel from class " + clazz, t);<a name="line.322"></a>
+<span class="sourceLineNo">323</span> }<a name="line.323"></a>
+<span class="sourceLineNo">324</span> }<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span> @Override<a name="line.326"></a>
+<span class="sourceLineNo">327</span> public String toString() {<a name="line.327"></a>
+<span class="sourceLineNo">328</span> return StringUtil.simpleClassName(clazz) + ".class";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> }<a name="line.329"></a>
+<span class="sourceLineNo">330</span> }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span> private static final class ClusterMetricsEncoder<a name="line.332"></a>
+<span class="sourceLineNo">333</span> extends MessageToMessageEncoder<ClusterMetrics> {<a name="line.333"></a>
+<span class="sourceLineNo">334</span> final private InetSocketAddress isa;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span> private ClusterMetricsEncoder(InetSocketAddress isa) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span> this.isa = isa;<a name="line.337"></a>
+<span class="sourceLineNo">338</span> }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span> @Override<a name="line.340"></a>
+<span class="sourceLineNo">341</span> protected void encode(ChannelHandlerContext channelHandlerContext,<a name="line.341"></a>
+<span class="sourceLineNo">342</span> ClusterMetrics clusterStatus, List<Object> objects) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span> objects.add(new DatagramPacket(Unpooled.wrappedBuffer(<a name="line.343"></a>
+<span class="sourceLineNo">344</span> ClusterMetricsBuilder.toClusterStatus(clusterStatus).toByteArray()), isa));<a name="line.344"></a>
+<span class="sourceLineNo">345</span> }<a name="line.345"></a>
+<span class="sourceLineNo">346</span> }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span> @Override<a name="line.348"></a>
+<span class="sourceLineNo">349</span> public void publish(ClusterMetrics cs) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span> channel.writeAndFlush(cs).syncUninterruptibly();<a name="line.350"></a>
+<span class="sourceLineNo">351</span> }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span> @Override<a name="line.353"></a>
+<span class="sourceLineNo">354</span> public void close() {<a name="line.354"></a>
+<span class="sourceLineNo">355</span> if (channel != null) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span> channel.close();<a name="line.356"></a>
+<span class="sourceLineNo">357</span> }<a name="line.357"></a>
+<span class="sourceLineNo">358</span> group.shutdownGracefully();<a name="line.358"></a>
+<span class="sourceLineNo">359</span> }<a name="line.359"></a>
+<span class="sourceLineNo">360</span> }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>}<a name="line.361"></a>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html
index 33e600e..b06d7e8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html
@@ -195,179 +195,178 @@
<span class="sourceLineNo">187</span> }<a name="line.187"></a>
<span class="sourceLineNo">188</span><a name="line.188"></a>
<span class="sourceLineNo">189</span> // We're sending the new deads first.<a name="line.189"></a>
-<span class="sourceLineNo">190</span> List<Map.Entry<ServerName, Integer>> entries = new ArrayList<>();<a name="line.190"></a>
-<span class="sourceLineNo">191</span> entries.addAll(lastSent.entrySet());<a name="line.191"></a>
-<span class="sourceLineNo">192</span> Collections.sort(entries, new Comparator<Map.Entry<ServerName, Integer>>() {<a name="line.192"></a>
-<span class="sourceLineNo">193</span> @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span> public int compare(Map.Entry<ServerName, Integer> o1, Map.Entry<ServerName, Integer> o2) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span> return o1.getValue().compareTo(o2.getValue());<a name="line.195"></a>
-<span class="sourceLineNo">196</span> }<a name="line.196"></a>
-<span class="sourceLineNo">197</span> });<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span> // With a limit of MAX_SERVER_PER_MESSAGE<a name="line.199"></a>
-<span class="sourceLineNo">200</span> int max = entries.size() > MAX_SERVER_PER_MESSAGE ? MAX_SERVER_PER_MESSAGE : entries.size();<a name="line.200"></a>
-<span class="sourceLineNo">201</span> List<ServerName> res = new ArrayList<>(max);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span> for (int i = 0; i < max; i++) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span> Map.Entry<ServerName, Integer> toSend = entries.get(i);<a name="line.204"></a>
-<span class="sourceLineNo">205</span> if (toSend.getValue() >= (NB_SEND - 1)) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> lastSent.remove(toSend.getKey());<a name="line.206"></a>
-<span class="sourceLineNo">207</span> } else {<a name="line.207"></a>
-<span class="sourceLineNo">208</span> lastSent.replace(toSend.getKey(), toSend.getValue(), toSend.getValue() + 1);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> res.add(toSend.getKey());<a name="line.211"></a>
-<span class="sourceLineNo">212</span> }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span> return res;<a name="line.214"></a>
-<span class="sourceLineNo">215</span> }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span> /**<a name="line.217"></a>
-<span class="sourceLineNo">218</span> * Get the servers which died since a given timestamp.<a name="line.218"></a>
-<span class="sourceLineNo">219</span> * protected because it can be subclassed by the tests.<a name="line.219"></a>
-<span class="sourceLineNo">220</span> */<a name="line.220"></a>
-<span class="sourceLineNo">221</span> protected List<Pair<ServerName, Long>> getDeadServers(long since) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span> if (master.getServerManager() == null) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span> return Collections.emptyList();<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> return master.getServerManager().getDeadServers().copyDeadServersSince(since);<a name="line.226"></a>
-<span class="sourceLineNo">227</span> }<a name="line.227"></a>
+<span class="sourceLineNo">190</span> List<Map.Entry<ServerName, Integer>> entries = new ArrayList<>(lastSent.entrySet());<a name="line.190"></a>
+<span class="sourceLineNo">191</span> Collections.sort(entries, new Comparator<Map.Entry<ServerName, Integer>>() {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span> public int compare(Map.Entry<ServerName, Integer> o1, Map.Entry<ServerName, Integer> o2) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span> return o1.getValue().compareTo(o2.getValue());<a name="line.194"></a>
+<span class="sourceLineNo">195</span> }<a name="line.195"></a>
+<span class="sourceLineNo">196</span> });<a name="line.196"></a>
+<span class="sourceLineNo">197</span><a name="line.197"></a>
+<span class="sourceLineNo">198</span> // With a limit of MAX_SERVER_PER_MESSAGE<a name="line.198"></a>
+<span class="sourceLineNo">199</span> int max = entries.size() > MAX_SERVER_PER_MESSAGE ? MAX_SERVER_PER_MESSAGE : entries.size();<a name="line.199"></a>
+<span class="sourceLineNo">200</span> List<ServerName> res = new ArrayList<>(max);<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span> for (int i = 0; i < max; i++) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span> Map.Entry<ServerName, Integer> toSend = entries.get(i);<a name="line.203"></a>
+<span class="sourceLineNo">204</span> if (toSend.getValue() >= (NB_SEND - 1)) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span> lastSent.remove(toSend.getKey());<a name="line.205"></a>
+<span class="sourceLineNo">206</span> } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span> lastSent.replace(toSend.getKey(), toSend.getValue(), toSend.getValue() + 1);<a name="line.207"></a>
+<span class="sourceLineNo">208</span> }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> res.add(toSend.getKey());<a name="line.210"></a>
+<span class="sourceLineNo">211</span> }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> return res;<a name="line.213"></a>
+<span class="sourceLineNo">214</span> }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span> /**<a name="line.216"></a>
+<span class="sourceLineNo">217</span> * Get the servers which died since a given timestamp.<a name="line.217"></a>
+<span class="sourceLineNo">218</span> * protected because it can be subclassed by the tests.<a name="line.218"></a>
+<span class="sourceLineNo">219</span> */<a name="line.219"></a>
+<span class="sourceLineNo">220</span> protected List<Pair<ServerName, Long>> getDeadServers(long since) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span> if (master.getServerManager() == null) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span> return Collections.emptyList();<a name="line.222"></a>
+<span class="sourceLineNo">223</span> }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span> return master.getServerManager().getDeadServers().copyDeadServersSince(since);<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span> public interface Publisher extends Closeable {<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span> void connect(Configuration conf) throws IOException;<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span> void publish(ClusterMetrics cs);<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span> @Override<a name="line.236"></a>
-<span class="sourceLineNo">237</span> void close();<a name="line.237"></a>
-<span class="sourceLineNo">238</span> }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span> @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.240"></a>
-<span class="sourceLineNo">241</span> public static class MulticastPublisher implements Publisher {<a name="line.241"></a>
-<span class="sourceLineNo">242</span> private DatagramChannel channel;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> private final EventLoopGroup group = new NioEventLoopGroup(<a name="line.243"></a>
-<span class="sourceLineNo">244</span> 1, Threads.newDaemonThreadFactory("hbase-master-clusterStatusPublisher"));<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> public MulticastPublisher() {<a name="line.246"></a>
-<span class="sourceLineNo">247</span> }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span> @Override<a name="line.249"></a>
-<span class="sourceLineNo">250</span> public void connect(Configuration conf) throws IOException {<a name="line.250"></a>
-<span class="sourceLineNo">251</span> String mcAddress = conf.get(HConstants.STATUS_MULTICAST_ADDRESS,<a name="line.251"></a>
-<span class="sourceLineNo">252</span> HConstants.DEFAULT_STATUS_MULTICAST_ADDRESS);<a name="line.252"></a>
-<span class="sourceLineNo">253</span> int port = conf.getInt(HConstants.STATUS_MULTICAST_PORT,<a name="line.253"></a>
-<span class="sourceLineNo">254</span> HConstants.DEFAULT_STATUS_MULTICAST_PORT);<a name="line.254"></a>
-<span class="sourceLineNo">255</span> String bindAddress = conf.get(HConstants.STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> HConstants.DEFAULT_STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS);<a name="line.256"></a>
-<span class="sourceLineNo">257</span> String niName = conf.get(HConstants.STATUS_MULTICAST_NI_NAME);<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span> final InetAddress ina;<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> ina = InetAddress.getByName(mcAddress);<a name="line.261"></a>
-<span class="sourceLineNo">262</span> } catch (UnknownHostException e) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span> close();<a name="line.263"></a>
-<span class="sourceLineNo">264</span> throw new IOException("Can't connect to " + mcAddress, e);<a name="line.264"></a>
-<span class="sourceLineNo">265</span> }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span> final InetSocketAddress isa = new InetSocketAddress(mcAddress, port);<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span> InternetProtocolFamily family;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> NetworkInterface ni;<a name="line.270"></a>
-<span class="sourceLineNo">271</span> if (niName != null) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span> if (ina instanceof Inet6Address) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span> family = InternetProtocolFamily.IPv6;<a name="line.273"></a>
-<span class="sourceLineNo">274</span> } else {<a name="line.274"></a>
-<span class="sourceLineNo">275</span> family = InternetProtocolFamily.IPv4;<a name="line.275"></a>
-<span class="sourceLineNo">276</span> }<a name="line.276"></a>
-<span class="sourceLineNo">277</span> ni = NetworkInterface.getByName(niName);<a name="line.277"></a>
-<span class="sourceLineNo">278</span> } else {<a name="line.278"></a>
-<span class="sourceLineNo">279</span> InetAddress localAddress;<a name="line.279"></a>
-<span class="sourceLineNo">280</span> if (ina instanceof Inet6Address) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> localAddress = Addressing.getIp6Address();<a name="line.281"></a>
-<span class="sourceLineNo">282</span> family = InternetProtocolFamily.IPv6;<a name="line.282"></a>
-<span class="sourceLineNo">283</span> } else {<a name="line.283"></a>
-<span class="sourceLineNo">284</span> localAddress = Addressing.getIp4Address();<a name="line.284"></a>
-<span class="sourceLineNo">285</span> family = InternetProtocolFamily.IPv4;<a name="line.285"></a>
-<span class="sourceLineNo">286</span> }<a name="line.286"></a>
-<span class="sourceLineNo">287</span> ni = NetworkInterface.getByInetAddress(localAddress);<a name="line.287"></a>
-<span class="sourceLineNo">288</span> }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span> Bootstrap b = new Bootstrap();<a name="line.290"></a>
-<span class="sourceLineNo">291</span> b.group(group)<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .channelFactory(new HBaseDatagramChannelFactory<Channel>(NioDatagramChannel.class, family))<a name="line.292"></a>
-<span class="sourceLineNo">293</span> .option(ChannelOption.SO_REUSEADDR, true)<a name="line.293"></a>
-<span class="sourceLineNo">294</span> .handler(new ClusterMetricsEncoder(isa));<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span> try {<a name="line.296"></a>
-<span class="sourceLineNo">297</span> channel = (DatagramChannel) b.bind(bindAddress, 0).sync().channel();<a name="line.297"></a>
-<span class="sourceLineNo">298</span> channel.joinGroup(ina, ni, null, channel.newPromise()).sync();<a name="line.298"></a>
-<span class="sourceLineNo">299</span> channel.connect(isa).sync();<a name="line.299"></a>
-<span class="sourceLineNo">300</span> } catch (InterruptedException e) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span> close();<a name="line.301"></a>
-<span class="sourceLineNo">302</span> throw ExceptionUtil.asInterrupt(e);<a name="line.302"></a>
-<span class="sourceLineNo">303</span> }<a name="line.303"></a>
-<span class="sourceLineNo">304</span> }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span> private static final class HBaseDatagramChannelFactory<T extends Channel><a name="line.306"></a>
-<span class="sourceLineNo">307</span> implements ChannelFactory<T> {<a name="line.307"></a>
-<span class="sourceLineNo">308</span> private final Class<? extends T> clazz;<a name="line.308"></a>
-<span class="sourceLineNo">309</span> private InternetProtocolFamily family;<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span> HBaseDatagramChannelFactory(Class<? extends T> clazz, InternetProtocolFamily family) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span> this.clazz = clazz;<a name="line.312"></a>
-<span class="sourceLineNo">313</span> this.family = family;<a name="line.313"></a>
-<span class="sourceLineNo">314</span> }<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span> @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span> public T newChannel() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span> try {<a name="line.318"></a>
-<span class="sourceLineNo">319</span> return ReflectionUtils.instantiateWithCustomCtor(clazz.getName(),<a name="line.319"></a>
-<span class="sourceLineNo">320</span> new Class[] { InternetProtocolFamily.class }, new Object[] { family });<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span> } catch (Throwable t) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span> throw new ChannelException("Unable to create Channel from class " + clazz, t);<a name="line.323"></a>
-<span class="sourceLineNo">324</span> }<a name="line.324"></a>
-<span class="sourceLineNo">325</span> }<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span> @Override<a name="line.327"></a>
-<span class="sourceLineNo">328</span> public String toString() {<a name="line.328"></a>
-<span class="sourceLineNo">329</span> return StringUtil.simpleClassName(clazz) + ".class";<a name="line.329"></a>
-<span class="sourceLineNo">330</span> }<a name="line.330"></a>
-<span class="sourceLineNo">331</span> }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span> private static final class ClusterMetricsEncoder<a name="line.333"></a>
-<span class="sourceLineNo">334</span> extends MessageToMessageEncoder<ClusterMetrics> {<a name="line.334"></a>
-<span class="sourceLineNo">335</span> final private InetSocketAddress isa;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span> private ClusterMetricsEncoder(InetSocketAddress isa) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span> this.isa = isa;<a name="line.338"></a>
-<span class="sourceLineNo">339</span> }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span> @Override<a name="line.341"></a>
-<span class="sourceLineNo">342</span> protected void encode(ChannelHandlerContext channelHandlerContext,<a name="line.342"></a>
-<span class="sourceLineNo">343</span> ClusterMetrics clusterStatus, List<Object> objects) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span> objects.add(new DatagramPacket(Unpooled.wrappedBuffer(<a name="line.344"></a>
-<span class="sourceLineNo">345</span> ClusterMetricsBuilder.toClusterStatus(clusterStatus).toByteArray()), isa));<a name="line.345"></a>
-<span class="sourceLineNo">346</span> }<a name="line.346"></a>
-<span class="sourceLineNo">347</span> }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span> @Override<a name="line.349"></a>
-<span class="sourceLineNo">350</span> public void publish(ClusterMetrics cs) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span> channel.writeAndFlush(cs).syncUninterruptibly();<a name="line.351"></a>
-<span class="sourceLineNo">352</span> }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span> @Override<a name="line.354"></a>
-<span class="sourceLineNo">355</span> public void close() {<a name="line.355"></a>
-<span class="sourceLineNo">356</span> if (channel != null) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span> channel.close();<a name="line.357"></a>
-<span class="sourceLineNo">358</span> }<a name="line.358"></a>
-<span class="sourceLineNo">359</span> group.shutdownGracefully();<a name="line.359"></a>
-<span class="sourceLineNo">360</span> }<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>}<a name="line.362"></a>
+<span class="sourceLineNo">229</span> public interface Publisher extends Closeable {<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span> void connect(Configuration conf) throws IOException;<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> void publish(ClusterMetrics cs);<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> void close();<a name="line.236"></a>
+<span class="sourceLineNo">237</span> }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span> @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.239"></a>
+<span class="sourceLineNo">240</span> public static class MulticastPublisher implements Publisher {<a name="line.240"></a>
+<span class="sourceLineNo">241</span> private DatagramChannel channel;<a name="line.241"></a>
+<span class="sourceLineNo">242</span> private final EventLoopGroup group = new NioEventLoopGroup(<a name="line.242"></a>
+<span class="sourceLineNo">243</span> 1, Threads.newDaemonThreadFactory("hbase-master-clusterStatusPublisher"));<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span> public MulticastPublisher() {<a name="line.245"></a>
+<span class="sourceLineNo">246</span> }<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> @Override<a name="line.248"></a>
+<span class="sourceLineNo">249</span> public void connect(Configuration conf) throws IOException {<a name="line.249"></a>
+<span class="sourceLineNo">250</span> String mcAddress = conf.get(HConstants.STATUS_MULTICAST_ADDRESS,<a name="line.250"></a>
+<span class="sourceLineNo">251</span> HConstants.DEFAULT_STATUS_MULTICAST_ADDRESS);<a name="line.251"></a>
+<span class="sourceLineNo">252</span> int port = conf.getInt(HConstants.STATUS_MULTICAST_PORT,<a name="line.252"></a>
+<span class="sourceLineNo">253</span> HConstants.DEFAULT_STATUS_MULTICAST_PORT);<a name="line.253"></a>
+<span class="sourceLineNo">254</span> String bindAddress = conf.get(HConstants.STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS,<a name="line.254"></a>
+<span class="sourceLineNo">255</span> HConstants.DEFAULT_STATUS_MULTICAST_PUBLISHER_BIND_ADDRESS);<a name="line.255"></a>
+<span class="sourceLineNo">256</span> String niName = conf.get(HConstants.STATUS_MULTICAST_NI_NAME);<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span> final InetAddress ina;<a name="line.258"></a>
+<span class="sourceLineNo">259</span> try {<a name="line.259"></a>
+<span class="sourceLineNo">260</span> ina = InetAddress.getByName(mcAddress);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> } catch (UnknownHostException e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span> close();<a name="line.262"></a>
+<span class="sourceLineNo">263</span> throw new IOException("Can't connect to " + mcAddress, e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span> }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span> final InetSocketAddress isa = new InetSocketAddress(mcAddress, port);<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> InternetProtocolFamily family;<a name="line.268"></a>
+<span class="sourceLineNo">269</span> NetworkInterface ni;<a name="line.269"></a>
+<span class="sourceLineNo">270</span> if (niName != null) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> if (ina instanceof Inet6Address) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span> family = InternetProtocolFamily.IPv6;<a name="line.272"></a>
+<span class="sourceLineNo">273</span> } else {<a name="line.273"></a>
+<span class="sourceLineNo">274</span> family = InternetProtocolFamily.IPv4;<a name="line.274"></a>
+<span class="sourceLineNo">275</span> }<a name="line.275"></a>
+<span class="sourceLineNo">276</span> ni = NetworkInterface.getByName(niName);<a name="line.276"></a>
+<span class="sourceLineNo">277</span> } else {<a name="line.277"></a>
+<span class="sourceLineNo">278</span> InetAddress localAddress;<a name="line.278"></a>
+<span class="sourceLineNo">279</span> if (ina instanceof Inet6Address) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span> localAddress = Addressing.getIp6Address();<a name="line.280"></a>
+<span class="sourceLineNo">281</span> family = InternetProtocolFamily.IPv6;<a name="line.281"></a>
+<span class="sourceLineNo">282</span> } else {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> localAddress = Addressing.getIp4Address();<a name="line.283"></a>
+<span class="sourceLineNo">284</span> family = InternetProtocolFamily.IPv4;<a name="line.284"></a>
+<span class="sourceLineNo">285</span> }<a name="line.285"></a>
+<span class="sourceLineNo">286</span> ni = NetworkInterface.getByInetAddress(localAddress);<a name="line.286"></a>
+<span class="sourceLineNo">287</span> }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span> Bootstrap b = new Bootstrap();<a name="line.289"></a>
+<span class="sourceLineNo">290</span> b.group(group)<a name="line.290"></a>
+<span class="sourceLineNo">291</span> .channelFactory(new HBaseDatagramChannelFactory<Channel>(NioDatagramChannel.class, family))<a name="line.291"></a>
+<span class="sourceLineNo">292</span> .option(ChannelOption.SO_REUSEADDR, true)<a name="line.292"></a>
+<span class="sourceLineNo">293</span> .handler(new ClusterMetricsEncoder(isa));<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span> try {<a name="line.295"></a>
+<span class="sourceLineNo">296</span> channel = (DatagramChannel) b.bind(bindAddress, 0).sync().channel();<a name="line.296"></a>
+<span class="sourceLineNo">297</span> channel.joinGroup(ina, ni, null, channel.newPromise()).sync();<a name="line.297"></a>
+<span class="sourceLineNo">298</span> channel.connect(isa).sync();<a name="line.298"></a>
+<span class="sourceLineNo">299</span> } catch (InterruptedException e) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span> close();<a name="line.300"></a>
+<span class="sourceLineNo">301</span> throw ExceptionUtil.asInterrupt(e);<a name="line.301"></a>
+<span class="sourceLineNo">302</span> }<a name="line.302"></a>
+<span class="sourceLineNo">303</span> }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span> private static final class HBaseDatagramChannelFactory<T extends Channel><a name="line.305"></a>
+<span class="sourceLineNo">306</span> implements ChannelFactory<T> {<a name="line.306"></a>
+<span class="sourceLineNo">307</span> private final Class<? extends T> clazz;<a name="line.307"></a>
+<span class="sourceLineNo">308</span> private InternetProtocolFamily family;<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span> HBaseDatagramChannelFactory(Class<? extends T> clazz, InternetProtocolFamily family) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span> this.clazz = clazz;<a name="line.311"></a>
+<span class="sourceLineNo">312</span> this.family = family;<a name="line.312"></a>
+<span class="sourceLineNo">313</span> }<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span> @Override<a name="line.315"></a>
+<span class="sourceLineNo">316</span> public T newChannel() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span> try {<a name="line.317"></a>
+<span class="sourceLineNo">318</span> return ReflectionUtils.instantiateWithCustomCtor(clazz.getName(),<a name="line.318"></a>
+<span class="sourceLineNo">319</span> new Class[] { InternetProtocolFamily.class }, new Object[] { family });<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span> } catch (Throwable t) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span> throw new ChannelException("Unable to create Channel from class " + clazz, t);<a name="line.322"></a>
+<span class="sourceLineNo">323</span> }<a name="line.323"></a>
+<span class="sourceLineNo">324</span> }<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span> @Override<a name="line.326"></a>
+<span class="sourceLineNo">327</span> public String toString() {<a name="line.327"></a>
+<span class="sourceLineNo">328</span> return StringUtil.simpleClassName(clazz) + ".class";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> }<a name="line.329"></a>
+<span class="sourceLineNo">330</span> }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span> private static final class ClusterMetricsEncoder<a name="line.332"></a>
+<span class="sourceLineNo">333</span> extends MessageToMessageEncoder<ClusterMetrics> {<a name="line.333"></a>
+<span class="sourceLineNo">334</span> final private InetSocketAddress isa;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span> private ClusterMetricsEncoder(InetSocketAddress isa) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span> this.isa = isa;<a name="line.337"></a>
+<span class="sourceLineNo">338</span> }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span> @Override<a name="line.340"></a>
+<span class="sourceLineNo">341</span> protected void encode(ChannelHandlerContext channelHandlerContext,<a name="line.341"></a>
+<span class="sourceLineNo">342</span> ClusterMetrics clusterStatus, List<Object> objects) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span> objects.add(new DatagramPacket(Unpooled.wrappedBuffer(<a name="line.343"></a>
+<span class="sourceLineNo">344</span> ClusterMetricsBuilder.toClusterStatus(clusterStatus).toByteArray()), isa));<a name="line.344"></a>
+<span class="sourceLineNo">345</span> }<a name="line.345"></a>
+<span class="sourceLineNo">346</span> }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span> @Override<a name="line.348"></a>
+<span class="sourceLineNo">349</span> public void publish(ClusterMetrics cs) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span> channel.writeAndFlush(cs).syncUninterruptibly();<a name="line.350"></a>
+<span class="sourceLineNo">351</span> }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span> @Override<a name="line.353"></a>
+<span class="sourceLineNo">354</span> public void close() {<a name="line.354"></a>
+<span class="sourceLineNo">355</span> if (channel != null) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span> channel.close();<a name="line.356"></a>
+<span class="sourceLineNo">357</span> }<a name="line.357"></a>
+<span class="sourceLineNo">358</span> group.shutdownGracefully();<a name="line.358"></a>
+<span class="sourceLineNo">359</span> }<a name="line.359"></a>
+<span class="sourceLineNo">360</span> }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>}<a name="line.361"></a>
[16/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
Published site at 0e43abc78a5a55c84a7572125d498a950dabfb57.
Project: http://git-wip-us.apache.org/repos/asf/hbase-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase-site/commit/49626fc1
Tree: http://git-wip-us.apache.org/repos/asf/hbase-site/tree/49626fc1
Diff: http://git-wip-us.apache.org/repos/asf/hbase-site/diff/49626fc1
Branch: refs/heads/asf-site
Commit: 49626fc19d99da3050b3ac2e50de7abe21677fa2
Parents: 4de5b06
Author: jenkins <bu...@apache.org>
Authored: Fri Jun 15 21:45:44 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Fri Jun 15 21:45:44 2018 +0000
----------------------------------------------------------------------
acid-semantics.html | 4 +-
apache_hbase_reference_guide.pdf | 4 +-
book.html | 2 +-
bulk-loads.html | 4 +-
checkstyle-aggregate.html | 20 +-
coc.html | 4 +-
dependencies.html | 4 +-
dependency-convergence.html | 4 +-
dependency-info.html | 4 +-
dependency-management.html | 4 +-
devapidocs/constant-values.html | 6 +-
devapidocs/index-all.html | 10 +-
.../hadoop/hbase/backup/package-tree.html | 4 +-
.../hadoop/hbase/client/package-tree.html | 22 +-
.../hadoop/hbase/executor/package-tree.html | 2 +-
.../hadoop/hbase/filter/package-tree.html | 8 +-
.../hadoop/hbase/io/hfile/package-tree.html | 6 +-
.../hadoop/hbase/mapreduce/package-tree.html | 2 +-
...ulticastPublisher.ClusterMetricsEncoder.html | 8 +-
...stPublisher.HBaseDatagramChannelFactory.html | 12 +-
...usterStatusPublisher.MulticastPublisher.html | 14 +-
.../ClusterStatusPublisher.Publisher.html | 8 +-
.../hbase/master/ClusterStatusPublisher.html | 2 +-
.../hbase/master/balancer/package-tree.html | 2 +-
.../hadoop/hbase/master/package-tree.html | 6 +-
.../hbase/master/procedure/package-tree.html | 2 +-
.../org/apache/hadoop/hbase/package-tree.html | 20 +-
.../hadoop/hbase/procedure2/package-tree.html | 6 +-
.../hadoop/hbase/quotas/package-tree.html | 6 +-
.../hadoop/hbase/regionserver/package-tree.html | 18 +-
.../regionserver/querymatcher/package-tree.html | 2 +-
.../hbase/regionserver/wal/package-tree.html | 4 +-
.../replication/regionserver/MetricsSource.html | 209 ++--
.../ReplicationSourceShipper.WorkerState.html | 12 +-
.../regionserver/ReplicationSourceShipper.html | 60 +-
.../MetricsReplicationSourceSource.html | 47 +-
.../hadoop/hbase/thrift/package-tree.html | 2 +-
.../apache/hadoop/hbase/util/package-tree.html | 8 +-
.../apache/hadoop/hbase/wal/package-tree.html | 2 +-
.../org/apache/hadoop/hbase/Version.html | 6 +-
...ulticastPublisher.ClusterMetricsEncoder.html | 343 +++---
...stPublisher.HBaseDatagramChannelFactory.html | 343 +++---
...usterStatusPublisher.MulticastPublisher.html | 343 +++---
.../ClusterStatusPublisher.Publisher.html | 343 +++---
.../hbase/master/ClusterStatusPublisher.html | 343 +++---
.../replication/regionserver/MetricsSource.html | 627 ++++++-----
.../ReplicationSourceShipper.WorkerState.html | 591 +++++-----
.../regionserver/ReplicationSourceShipper.html | 591 +++++-----
downloads.html | 4 +-
export_control.html | 4 +-
index.html | 4 +-
integration.html | 4 +-
issue-tracking.html | 4 +-
license.html | 4 +-
mail-lists.html | 4 +-
metrics.html | 4 +-
old_news.html | 4 +-
plugin-management.html | 4 +-
plugins.html | 4 +-
poweredbyhbase.html | 4 +-
project-info.html | 4 +-
project-reports.html | 4 +-
project-summary.html | 4 +-
pseudo-distributed.html | 4 +-
replication.html | 4 +-
resources.html | 4 +-
source-repository.html | 4 +-
sponsors.html | 4 +-
supportingprojects.html | 4 +-
team-list.html | 4 +-
...Endpoint.EverythingPassesWALEntryFilter.html | 10 +-
....EverythingPassesWALEntryFilterSubclass.html | 4 +-
....InterClusterReplicationEndpointForTest.html | 12 +-
...tionEndpoint.ReplicationEndpointForTest.html | 28 +-
...point.ReplicationEndpointReturningFalse.html | 12 +-
...t.ReplicationEndpointWithWALEntryFilter.html | 10 +-
.../replication/TestReplicationEndpoint.html | 36 +-
...Endpoint.EverythingPassesWALEntryFilter.html | 1028 +++++++++---------
....EverythingPassesWALEntryFilterSubclass.html | 1028 +++++++++---------
....InterClusterReplicationEndpointForTest.html | 1028 +++++++++---------
...tionEndpoint.ReplicationEndpointForTest.html | 1028 +++++++++---------
...point.ReplicationEndpointReturningFalse.html | 1028 +++++++++---------
...t.ReplicationEndpointWithWALEntryFilter.html | 1028 +++++++++---------
.../replication/TestReplicationEndpoint.html | 1028 +++++++++---------
84 files changed, 5880 insertions(+), 5610 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 5a1b7d1..bd0b2d5 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase –
Apache HBase (TM) ACID Properties
@@ -601,7 +601,7 @@ under the License. -->
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 1686bc3..fe2b224 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
/Author (Apache HBase Team)
/Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
/Producer (Apache HBase Team)
-/ModDate (D:20180614220316+00'00')
-/CreationDate (D:20180614221851+00'00')
+/ModDate (D:20180615212614+00'00')
+/CreationDate (D:20180615214255+00'00')
>>
endobj
2 0 obj
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 59143f8..03054ef 100644
--- a/book.html
+++ b/book.html
@@ -38085,7 +38085,7 @@ The server will return cellblocks compressed using this same compressor as long
<div id="footer">
<div id="footer-text">
Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-06-14 22:03:16 UTC
+Last updated 2018-06-15 21:26:14 UTC
</div>
</div>
</body>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 3159e18..5b5250a 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase –
Bulk Loads in Apache HBase (TM)
@@ -306,7 +306,7 @@ under the License. -->
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 74c8741..03732d1 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Checkstyle Results</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -95868,43 +95868,43 @@
<td>sizes</td>
<td>LineLength</td>
<td>Line is longer than 100 characters (found 114).</td>
-<td>252</td></tr>
+<td>254</td></tr>
<tr class="a">
<td><img src="images/icon_error_sml.gif" alt="" /> Error</td>
<td>sizes</td>
<td>LineLength</td>
<td>Line is longer than 100 characters (found 114).</td>
-<td>281</td></tr>
+<td>283</td></tr>
<tr class="b">
<td><img src="images/icon_error_sml.gif" alt="" /> Error</td>
<td>sizes</td>
<td>LineLength</td>
<td>Line is longer than 100 characters (found 114).</td>
-<td>291</td></tr>
+<td>293</td></tr>
<tr class="a">
<td><img src="images/icon_error_sml.gif" alt="" /> Error</td>
<td>sizes</td>
<td>LineLength</td>
<td>Line is longer than 100 characters (found 109).</td>
-<td>307</td></tr>
+<td>309</td></tr>
<tr class="b">
<td><img src="images/icon_error_sml.gif" alt="" /> Error</td>
<td>sizes</td>
<td>LineLength</td>
<td>Line is longer than 100 characters (found 110).</td>
-<td>317</td></tr>
+<td>319</td></tr>
<tr class="a">
<td><img src="images/icon_error_sml.gif" alt="" /> Error</td>
<td>sizes</td>
<td>LineLength</td>
<td>Line is longer than 100 characters (found 108).</td>
-<td>318</td></tr>
+<td>320</td></tr>
<tr class="b">
<td><img src="images/icon_error_sml.gif" alt="" /> Error</td>
<td>sizes</td>
<td>LineLength</td>
<td>Line is longer than 100 characters (found 101).</td>
-<td>533</td></tr></table></div>
+<td>553</td></tr></table></div>
<div class="section">
<h3 id="org.apache.hadoop.hbase.replication.TestReplicationKillMasterRSCompressed.java">org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSCompressed.java</h3>
<table border="0" class="table table-striped">
@@ -96195,7 +96195,7 @@
<td>sizes</td>
<td>LineLength</td>
<td>Line is longer than 100 characters (found 124).</td>
-<td>60</td></tr></table></div>
+<td>62</td></tr></table></div>
<div class="section">
<h3 id="org.apache.hadoop.hbase.replication.regionserver.RegionReplicaReplicationEndpoint.java">org/apache/hadoop/hbase/replication/regionserver/RegionReplicaReplicationEndpoint.java</h3>
<table border="0" class="table table-striped">
@@ -124753,7 +124753,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index c90ab15..7899244 100644
--- a/coc.html
+++ b/coc.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase –
Code of Conduct Policy
@@ -375,7 +375,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 0577314..7863874 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Project Dependencies</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -440,7 +440,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index bc73b8a..c89e071 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Reactor Dependency Convergence</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -1105,7 +1105,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 4f98113..6fe0cda 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Dependency Information</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -313,7 +313,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 028a76b..8310e50 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -7,7 +7,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="Date-Revision-yyyymmdd" content="20180614" />
+ <meta name="Date-Revision-yyyymmdd" content="20180615" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache HBase – Project Dependency Management</title>
<link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -969,7 +969,7 @@
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
- <li id="publishDate" class="pull-right">Last Published: 2018-06-14</li>
+ <li id="publishDate" class="pull-right">Last Published: 2018-06-15</li>
</p>
</div>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 55f4f94..521cb44 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3768,21 +3768,21 @@
<!-- -->
</a><code>public static final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Thu Jun 14 22:13:02 UTC 2018"</code></td>
+<td class="colLast"><code>"Fri Jun 15 21:36:50 UTC 2018"</code></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
<!-- -->
</a><code>public static final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"0b28155d274910b4e667b949d51f78809a1eff0b"</code></td>
+<td class="colLast"><code>"0e43abc78a5a55c84a7572125d498a950dabfb57"</code></td>
</tr>
<tr class="altColor">
<td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
<!-- -->
</a><code>public static final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"241d3c5d4e507f803723d87043bf1d28"</code></td>
+<td class="colLast"><code>"2e5366d5b65adc25ba60d4644effc4f6"</code></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index b54d12f..617ca54 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -49024,6 +49024,8 @@
<dd> </dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html#getSingleFactor--">getSingleFactor()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.bucket.<a href="org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">BucketCache</a></dt>
<dd> </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#getSingleSourceSourceByTable--">getSingleSourceSourceByTable()</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html" title="class in org.apache.hadoop.hbase.replication.regionserver">MetricsSource</a></dt>
+<dd> </dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactory.html#getSink--">getSink()</a></span> - Method in interface org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactory.html" title="interface in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceFactory</a></dt>
<dd> </dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.html#getSink--">getSink()</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.html" title="class in org.apache.hadoop.hbase.replication.regionserver">MetricsReplicationSourceFactoryImpl</a></dt>
@@ -73349,7 +73351,7 @@
<dd>
<div class="block">Constructor used to register the metrics</div>
</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#MetricsSource-java.lang.String-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-">MetricsSource(String, MetricsReplicationSourceSource, MetricsReplicationSourceSource)</a></span> - Constructor for class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html" title="class in org.apache.hadoop.hbase.replication.regionserver">MetricsSource</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#MetricsSource-java.lang.String-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource-java.util.Map-">MetricsSource(String, MetricsReplicationSourceSource, MetricsReplicationSourceSource, Map<String, MetricsReplicationSourceSource>)</a></span> - Constructor for class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html" title="class in org.apache.hadoop.hbase.replication.regionserver">MetricsSource</a></dt>
<dd>
<div class="block">Constructor for injecting custom (or test) MetricsReplicationSourceSources</div>
</dd>
@@ -99053,6 +99055,10 @@ service.</div>
<dd>
<div class="block">Set the age of the last edit that was shipped</div>
</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#setAgeOfLastShippedOpByTable-long-java.lang.String-">setAgeOfLastShippedOpByTable(long, String)</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html" title="class in org.apache.hadoop.hbase.replication.regionserver">MetricsSource</a></dt>
+<dd>
+<div class="block">Set the age of the last edit that was shipped group by table</div>
+</dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/AuthResult.html#setAllowed-boolean-">setAllowed(boolean)</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/AuthResult.html" title="class in org.apache.hadoop.hbase.security.access">AuthResult</a></dt>
<dd> </dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/ReadOnlyConfiguration.html#setAllowNullValueProperties-boolean-">setAllowNullValueProperties(boolean)</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/ReadOnlyConfiguration.html" title="class in org.apache.hadoop.hbase.coprocessor">ReadOnlyConfiguration</a></dt>
@@ -104630,6 +104636,8 @@ service.</div>
<dd> </dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#singleSourceSource">singleSourceSource</a></span> - Variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html" title="class in org.apache.hadoop.hbase.replication.regionserver">MetricsSource</a></dt>
<dd> </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html#singleSourceSourceByTable">singleSourceSourceByTable</a></span> - Variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/MetricsSource.html" title="class in org.apache.hadoop.hbase.replication.regionserver">MetricsSource</a></dt>
+<dd> </dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/policies/MissingSnapshotViolationPolicyEnforcement.html#SINGLETON">SINGLETON</a></span> - Static variable in class org.apache.hadoop.hbase.quotas.policies.<a href="org/apache/hadoop/hbase/quotas/policies/MissingSnapshotViolationPolicyEnforcement.html" title="class in org.apache.hadoop.hbase.quotas.policies">MissingSnapshotViolationPolicyEnforcement</a></dt>
<dd> </dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#singleton">singleton</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index d0d625a..7a65b4f 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,10 +167,10 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 63c7ead..fc95504 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -552,24 +552,24 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index ae0124e..ce950b0 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -104,8 +104,8 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
-<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index 27df980..6ef2c44 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -183,14 +183,14 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index 16dff46..94e92ef 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -273,12 +273,12 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 4335db6..ff8a2f3 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -293,9 +293,9 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
</ul>
</li>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html b/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html
index 0f79cd7..e0349dd 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html
@@ -132,7 +132,7 @@ var activeTableTab = "activeTableTab";
</dl>
<hr>
<br>
-<pre>private static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.333">ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder</a>
+<pre>private static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.332">ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder</a>
extends org.apache.hbase.thirdparty.io.netty.handler.codec.MessageToMessageEncoder<<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a>></pre>
</li>
</ul>
@@ -267,7 +267,7 @@ extends org.apache.hbase.thirdparty.io.netty.handler.codec.MessageToMessageEncod
<ul class="blockListLast">
<li class="blockList">
<h4>isa</h4>
-<pre>private final <a href="https://docs.oracle.com/javase/8/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html#line.335">isa</a></pre>
+<pre>private final <a href="https://docs.oracle.com/javase/8/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html#line.334">isa</a></pre>
</li>
</ul>
</li>
@@ -284,7 +284,7 @@ extends org.apache.hbase.thirdparty.io.netty.handler.codec.MessageToMessageEncod
<ul class="blockListLast">
<li class="blockList">
<h4>ClusterMetricsEncoder</h4>
-<pre>private <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html#line.337">ClusterMetricsEncoder</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a> isa)</pre>
+<pre>private <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html#line.336">ClusterMetricsEncoder</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a> isa)</pre>
</li>
</ul>
</li>
@@ -301,7 +301,7 @@ extends org.apache.hbase.thirdparty.io.netty.handler.codec.MessageToMessageEncod
<ul class="blockListLast">
<li class="blockList">
<h4>encode</h4>
-<pre>protected void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html#line.342">encode</a>(org.apache.hbase.thirdparty.io.netty.channel.ChannelHandlerContext channelHandlerContext,
+<pre>protected void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.ClusterMetricsEncoder.html#line.341">encode</a>(org.apache.hbase.thirdparty.io.netty.channel.ChannelHandlerContext channelHandlerContext,
<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a> clusterStatus,
<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>> objects)</pre>
<dl>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html b/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html
index 7c1768d..05e8987 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
</dl>
<hr>
<br>
-<pre>private static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.306">ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory</a><T extends org.apache.hbase.thirdparty.io.netty.channel.Channel>
+<pre>private static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.305">ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory</a><T extends org.apache.hbase.thirdparty.io.netty.channel.Channel>
extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
implements org.apache.hbase.thirdparty.io.netty.bootstrap.ChannelFactory<T></pre>
</li>
@@ -215,7 +215,7 @@ implements org.apache.hbase.thirdparty.io.netty.bootstrap.ChannelFactory<T>
<ul class="blockList">
<li class="blockList">
<h4>clazz</h4>
-<pre>private final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a><? extends <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html" title="type parameter in ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory">T</a> extends org.apache.hbase.thirdparty.io.netty.channel.Channel> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html#line.308">clazz</a></pre>
+<pre>private final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a><? extends <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html" title="type parameter in ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory">T</a> extends org.apache.hbase.thirdparty.io.netty.channel.Channel> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html#line.307">clazz</a></pre>
</li>
</ul>
<a name="family">
@@ -224,7 +224,7 @@ implements org.apache.hbase.thirdparty.io.netty.bootstrap.ChannelFactory<T>
<ul class="blockListLast">
<li class="blockList">
<h4>family</h4>
-<pre>private org.apache.hbase.thirdparty.io.netty.channel.socket.InternetProtocolFamily <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html#line.309">family</a></pre>
+<pre>private org.apache.hbase.thirdparty.io.netty.channel.socket.InternetProtocolFamily <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html#line.308">family</a></pre>
</li>
</ul>
</li>
@@ -241,7 +241,7 @@ implements org.apache.hbase.thirdparty.io.netty.bootstrap.ChannelFactory<T>
<ul class="blockListLast">
<li class="blockList">
<h4>HBaseDatagramChannelFactory</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html#line.311">HBaseDatagramChannelFactory</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a><? extends <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html" title="type parameter in ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory">T</a>> clazz,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html#line.310">HBaseDatagramChannelFactory</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a><? extends <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html" title="type parameter in ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory">T</a>> clazz,
org.apache.hbase.thirdparty.io.netty.channel.socket.InternetProtocolFamily family)</pre>
</li>
</ul>
@@ -259,7 +259,7 @@ implements org.apache.hbase.thirdparty.io.netty.bootstrap.ChannelFactory<T>
<ul class="blockList">
<li class="blockList">
<h4>newChannel</h4>
-<pre>public <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html" title="type parameter in ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory">T</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html#line.317">newChannel</a>()</pre>
+<pre>public <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html" title="type parameter in ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory">T</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html#line.316">newChannel</a>()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>newChannel</code> in interface <code>org.apache.hbase.thirdparty.io.netty.bootstrap.ChannelFactory<<a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html" title="type parameter in ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory">T</a> extends org.apache.hbase.thirdparty.io.netty.channel.Channel></code></dd>
@@ -272,7 +272,7 @@ implements org.apache.hbase.thirdparty.io.netty.bootstrap.ChannelFactory<T>
<ul class="blockListLast">
<li class="blockList">
<h4>toString</h4>
-<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html#line.328">toString</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.HBaseDatagramChannelFactory.html#line.327">toString</a>()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code> in class <code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html b/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html
index c86b5dd..0d5b93b 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
<hr>
<br>
<pre>@InterfaceAudience.LimitedPrivate(value="Configuration")
-public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html#line.241">ClusterStatusPublisher.MulticastPublisher</a>
+public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html#line.240">ClusterStatusPublisher.MulticastPublisher</a>
extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
implements <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html" title="interface in org.apache.hadoop.hbase.master">ClusterStatusPublisher.Publisher</a></pre>
</li>
@@ -242,7 +242,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusP
<ul class="blockList">
<li class="blockList">
<h4>channel</h4>
-<pre>private org.apache.hbase.thirdparty.io.netty.channel.socket.DatagramChannel <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.242">channel</a></pre>
+<pre>private org.apache.hbase.thirdparty.io.netty.channel.socket.DatagramChannel <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.241">channel</a></pre>
</li>
</ul>
<a name="group">
@@ -251,7 +251,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusP
<ul class="blockListLast">
<li class="blockList">
<h4>group</h4>
-<pre>private final org.apache.hbase.thirdparty.io.netty.channel.EventLoopGroup <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.243">group</a></pre>
+<pre>private final org.apache.hbase.thirdparty.io.netty.channel.EventLoopGroup <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.242">group</a></pre>
</li>
</ul>
</li>
@@ -268,7 +268,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusP
<ul class="blockListLast">
<li class="blockList">
<h4>MulticastPublisher</h4>
-<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.246">MulticastPublisher</a>()</pre>
+<pre>public <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.245">MulticastPublisher</a>()</pre>
</li>
</ul>
</li>
@@ -285,7 +285,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusP
<ul class="blockList">
<li class="blockList">
<h4>connect</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.250">connect</a>(org.apache.hadoop.conf.Configuration conf)
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.249">connect</a>(org.apache.hadoop.conf.Configuration conf)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -301,7 +301,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusP
<ul class="blockList">
<li class="blockList">
<h4>publish</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.350">publish</a>(<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a> cs)</pre>
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.349">publish</a>(<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a> cs)</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html#publish-org.apache.hadoop.hbase.ClusterMetrics-">publish</a></code> in interface <code><a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html" title="interface in org.apache.hadoop.hbase.master">ClusterStatusPublisher.Publisher</a></code></dd>
@@ -314,7 +314,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusP
<ul class="blockListLast">
<li class="blockList">
<h4>close</h4>
-<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.355">close</a>()</pre>
+<pre>public void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#line.354">close</a>()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.html?is-external=true#close--" title="class or interface in java.io">close</a></code> in interface <code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a></code></dd>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html b/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html
index 9b97d8e..7e6c5a0 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
</dl>
<hr>
<br>
-<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html#line.230">ClusterStatusPublisher.Publisher</a>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html#line.229">ClusterStatusPublisher.Publisher</a>
extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a></pre>
</li>
</ul>
@@ -166,7 +166,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
<ul class="blockList">
<li class="blockList">
<h4>connect</h4>
-<pre>void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html#line.232">connect</a>(org.apache.hadoop.conf.Configuration conf)
+<pre>void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html#line.231">connect</a>(org.apache.hadoop.conf.Configuration conf)
throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
@@ -180,7 +180,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
<ul class="blockList">
<li class="blockList">
<h4>publish</h4>
-<pre>void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html#line.234">publish</a>(<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a> cs)</pre>
+<pre>void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html#line.233">publish</a>(<a href="../../../../../org/apache/hadoop/hbase/ClusterMetrics.html" title="interface in org.apache.hadoop.hbase">ClusterMetrics</a> cs)</pre>
</li>
</ul>
<a name="close--">
@@ -189,7 +189,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
<ul class="blockListLast">
<li class="blockList">
<h4>close</h4>
-<pre>void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html#line.237">close</a>()</pre>
+<pre>void <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.Publisher.html#line.236">close</a>()</pre>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html?is-external=true#close--" title="class or interface in java.lang">close</a></code> in interface <code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html?is-external=true" title="class or interface in java.lang">AutoCloseable</a></code></dd>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html b/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html
index b506bd5..9666515 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html
@@ -554,7 +554,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ScheduledChore.html" tit
<ul class="blockListLast">
<li class="blockList">
<h4>getDeadServers</h4>
-<pre>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html#line.221">getDeadServers</a>(long since)</pre>
+<pre>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>>> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/ClusterStatusPublisher.html#line.220">getDeadServers</a>(long since)</pre>
<div class="block">Get the servers which died since a given timestamp.
protected because it can be subclassed by the tests.</div>
</li>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
index ad40e69..eb945fb 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -197,8 +197,8 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
-<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index e37f9f8..fd83326 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -346,11 +346,11 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index 63d4992..84e6824 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -215,10 +215,10 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
</ul>
</li>
</ul>
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/devapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index d399839..0c86214 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -437,19 +437,19 @@
<ul>
<li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
<ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
</ul>
</li>
</ul>
[02/16] hbase-site git commit: Published site at
0e43abc78a5a55c84a7572125d498a950dabfb57.
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/49626fc1/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html
index 43a87b6..819e491 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/replication/TestReplicationEndpoint.ReplicationEndpointWithWALEntryFilter.html
@@ -31,517 +31,537 @@
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.UUID;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.concurrent.Callable;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.Cell;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Waiter;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Put;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Table;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.junit.AfterClass;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.junit.Assert;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.junit.Before;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.BeforeClass;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.ClassRule;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.Test;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.experimental.categories.Category;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.slf4j.Logger;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.slf4j.LoggerFactory;<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.66"></a>
-<span class="sourceLineNo">067</span> */<a name="line.67"></a>
-<span class="sourceLineNo">068</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.68"></a>
-<span class="sourceLineNo">069</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span> @ClassRule<a name="line.71"></a>
-<span class="sourceLineNo">072</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.72"></a>
-<span class="sourceLineNo">073</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.75"></a>
+<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Map;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.UUID;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.Callable;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicReference;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.Cell;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Waiter;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Put;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Table;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationGlobalSourceSource;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceImpl;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSource;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsReplicationSourceSourceImpl;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.replication.regionserver.MetricsSource;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.testclassification.ReplicationTests;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.zookeeper.ZKConfig;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.AfterClass;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.Assert;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.Before;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.BeforeClass;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.ClassRule;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.experimental.categories.Category;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.slf4j.Logger;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.slf4j.LoggerFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>/**<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Tests ReplicationSource and ReplicationEndpoint interactions<a name="line.68"></a>
+<span class="sourceLineNo">069</span> */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>@Category({ ReplicationTests.class, MediumTests.class })<a name="line.70"></a>
+<span class="sourceLineNo">071</span>public class TestReplicationEndpoint extends TestReplicationBase {<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span> @ClassRule<a name="line.73"></a>
+<span class="sourceLineNo">074</span> public static final HBaseClassTestRule CLASS_RULE =<a name="line.74"></a>
+<span class="sourceLineNo">075</span> HBaseClassTestRule.forClass(TestReplicationEndpoint.class);<a name="line.75"></a>
<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span> static int numRegionServers;<a name="line.77"></a>
+<span class="sourceLineNo">077</span> private static final Logger LOG = LoggerFactory.getLogger(TestReplicationEndpoint.class);<a name="line.77"></a>
<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span> @BeforeClass<a name="line.79"></a>
-<span class="sourceLineNo">080</span> public static void setUpBeforeClass() throws Exception {<a name="line.80"></a>
-<span class="sourceLineNo">081</span> TestReplicationBase.setUpBeforeClass();<a name="line.81"></a>
-<span class="sourceLineNo">082</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.82"></a>
-<span class="sourceLineNo">083</span> }<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span> @AfterClass<a name="line.85"></a>
-<span class="sourceLineNo">086</span> public static void tearDownAfterClass() throws Exception {<a name="line.86"></a>
-<span class="sourceLineNo">087</span> TestReplicationBase.tearDownAfterClass();<a name="line.87"></a>
-<span class="sourceLineNo">088</span> // check stop is called<a name="line.88"></a>
-<span class="sourceLineNo">089</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.89"></a>
-<span class="sourceLineNo">090</span> }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span> @Before<a name="line.92"></a>
-<span class="sourceLineNo">093</span> public void setup() throws Exception {<a name="line.93"></a>
-<span class="sourceLineNo">094</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.94"></a>
-<span class="sourceLineNo">095</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.95"></a>
-<span class="sourceLineNo">096</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.96"></a>
-<span class="sourceLineNo">097</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.97"></a>
-<span class="sourceLineNo">098</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> final List<RegionServerThread> rsThreads =<a name="line.99"></a>
-<span class="sourceLineNo">100</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.100"></a>
-<span class="sourceLineNo">101</span> for (RegionServerThread rs : rsThreads) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.102"></a>
-<span class="sourceLineNo">103</span> }<a name="line.103"></a>
-<span class="sourceLineNo">104</span> // Wait for all log roll to finish<a name="line.104"></a>
-<span class="sourceLineNo">105</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.105"></a>
-<span class="sourceLineNo">106</span> @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span> public boolean evaluate() throws Exception {<a name="line.107"></a>
-<span class="sourceLineNo">108</span> for (RegionServerThread rs : rsThreads) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span> return false;<a name="line.110"></a>
-<span class="sourceLineNo">111</span> }<a name="line.111"></a>
-<span class="sourceLineNo">112</span> }<a name="line.112"></a>
-<span class="sourceLineNo">113</span> return true;<a name="line.113"></a>
-<span class="sourceLineNo">114</span> }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span> @Override<a name="line.116"></a>
-<span class="sourceLineNo">117</span> public String explainFailure() throws Exception {<a name="line.117"></a>
-<span class="sourceLineNo">118</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.118"></a>
-<span class="sourceLineNo">119</span> for (RegionServerThread rs : rsThreads) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.121"></a>
-<span class="sourceLineNo">122</span> }<a name="line.122"></a>
-<span class="sourceLineNo">123</span> }<a name="line.123"></a>
-<span class="sourceLineNo">124</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.124"></a>
-<span class="sourceLineNo">125</span> }<a name="line.125"></a>
-<span class="sourceLineNo">126</span> });<a name="line.126"></a>
-<span class="sourceLineNo">127</span> }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span> @Test<a name="line.129"></a>
-<span class="sourceLineNo">130</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.130"></a>
-<span class="sourceLineNo">131</span> // test installing a custom replication endpoint other than the default one.<a name="line.131"></a>
-<span class="sourceLineNo">132</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.132"></a>
-<span class="sourceLineNo">133</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.133"></a>
-<span class="sourceLineNo">134</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span> // check whether the class has been constructed and started<a name="line.136"></a>
-<span class="sourceLineNo">137</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.137"></a>
-<span class="sourceLineNo">138</span> @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span> public boolean evaluate() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.140"></a>
-<span class="sourceLineNo">141</span> }<a name="line.141"></a>
-<span class="sourceLineNo">142</span> });<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span> @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span> public boolean evaluate() throws Exception {<a name="line.146"></a>
-<span class="sourceLineNo">147</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.147"></a>
-<span class="sourceLineNo">148</span> }<a name="line.148"></a>
-<span class="sourceLineNo">149</span> });<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.151"></a>
+<span class="sourceLineNo">079</span> static int numRegionServers;<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span> @BeforeClass<a name="line.81"></a>
+<span class="sourceLineNo">082</span> public static void setUpBeforeClass() throws Exception {<a name="line.82"></a>
+<span class="sourceLineNo">083</span> TestReplicationBase.setUpBeforeClass();<a name="line.83"></a>
+<span class="sourceLineNo">084</span> numRegionServers = utility1.getHBaseCluster().getRegionServerThreads().size();<a name="line.84"></a>
+<span class="sourceLineNo">085</span> }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span> @AfterClass<a name="line.87"></a>
+<span class="sourceLineNo">088</span> public static void tearDownAfterClass() throws Exception {<a name="line.88"></a>
+<span class="sourceLineNo">089</span> TestReplicationBase.tearDownAfterClass();<a name="line.89"></a>
+<span class="sourceLineNo">090</span> // check stop is called<a name="line.90"></a>
+<span class="sourceLineNo">091</span> Assert.assertTrue(ReplicationEndpointForTest.stoppedCount.get() > 0);<a name="line.91"></a>
+<span class="sourceLineNo">092</span> }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span> @Before<a name="line.94"></a>
+<span class="sourceLineNo">095</span> public void setup() throws Exception {<a name="line.95"></a>
+<span class="sourceLineNo">096</span> ReplicationEndpointForTest.contructedCount.set(0);<a name="line.96"></a>
+<span class="sourceLineNo">097</span> ReplicationEndpointForTest.startedCount.set(0);<a name="line.97"></a>
+<span class="sourceLineNo">098</span> ReplicationEndpointForTest.replicateCount.set(0);<a name="line.98"></a>
+<span class="sourceLineNo">099</span> ReplicationEndpointReturningFalse.replicated.set(false);<a name="line.99"></a>
+<span class="sourceLineNo">100</span> ReplicationEndpointForTest.lastEntries = null;<a name="line.100"></a>
+<span class="sourceLineNo">101</span> final List<RegionServerThread> rsThreads =<a name="line.101"></a>
+<span class="sourceLineNo">102</span> utility1.getMiniHBaseCluster().getRegionServerThreads();<a name="line.102"></a>
+<span class="sourceLineNo">103</span> for (RegionServerThread rs : rsThreads) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span> utility1.getAdmin().rollWALWriter(rs.getRegionServer().getServerName());<a name="line.104"></a>
+<span class="sourceLineNo">105</span> }<a name="line.105"></a>
+<span class="sourceLineNo">106</span> // Wait for all log roll to finish<a name="line.106"></a>
+<span class="sourceLineNo">107</span> utility1.waitFor(3000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.107"></a>
+<span class="sourceLineNo">108</span> @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span> public boolean evaluate() throws Exception {<a name="line.109"></a>
+<span class="sourceLineNo">110</span> for (RegionServerThread rs : rsThreads) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span> return false;<a name="line.112"></a>
+<span class="sourceLineNo">113</span> }<a name="line.113"></a>
+<span class="sourceLineNo">114</span> }<a name="line.114"></a>
+<span class="sourceLineNo">115</span> return true;<a name="line.115"></a>
+<span class="sourceLineNo">116</span> }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span> @Override<a name="line.118"></a>
+<span class="sourceLineNo">119</span> public String explainFailure() throws Exception {<a name="line.119"></a>
+<span class="sourceLineNo">120</span> List<String> logRollInProgressRsList = new ArrayList<>();<a name="line.120"></a>
+<span class="sourceLineNo">121</span> for (RegionServerThread rs : rsThreads) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span> if (!rs.getRegionServer().walRollRequestFinished()) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span> logRollInProgressRsList.add(rs.getRegionServer().toString());<a name="line.123"></a>
+<span class="sourceLineNo">124</span> }<a name="line.124"></a>
+<span class="sourceLineNo">125</span> }<a name="line.125"></a>
+<span class="sourceLineNo">126</span> return "Still waiting for log roll on regionservers: " + logRollInProgressRsList;<a name="line.126"></a>
+<span class="sourceLineNo">127</span> }<a name="line.127"></a>
+<span class="sourceLineNo">128</span> });<a name="line.128"></a>
+<span class="sourceLineNo">129</span> }<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span> @Test<a name="line.131"></a>
+<span class="sourceLineNo">132</span> public void testCustomReplicationEndpoint() throws Exception {<a name="line.132"></a>
+<span class="sourceLineNo">133</span> // test installing a custom replication endpoint other than the default one.<a name="line.133"></a>
+<span class="sourceLineNo">134</span> admin.addPeer("testCustomReplicationEndpoint",<a name="line.134"></a>
+<span class="sourceLineNo">135</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.135"></a>
+<span class="sourceLineNo">136</span> .setReplicationEndpointImpl(ReplicationEndpointForTest.class.getName()), null);<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span> // check whether the class has been constructed and started<a name="line.138"></a>
+<span class="sourceLineNo">139</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.139"></a>
+<span class="sourceLineNo">140</span> @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span> public boolean evaluate() throws Exception {<a name="line.141"></a>
+<span class="sourceLineNo">142</span> return ReplicationEndpointForTest.contructedCount.get() >= numRegionServers;<a name="line.142"></a>
+<span class="sourceLineNo">143</span> }<a name="line.143"></a>
+<span class="sourceLineNo">144</span> });<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span> @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span> public boolean evaluate() throws Exception {<a name="line.148"></a>
+<span class="sourceLineNo">149</span> return ReplicationEndpointForTest.startedCount.get() >= numRegionServers;<a name="line.149"></a>
+<span class="sourceLineNo">150</span> }<a name="line.150"></a>
+<span class="sourceLineNo">151</span> });<a name="line.151"></a>
<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span> // now replicate some data.<a name="line.153"></a>
-<span class="sourceLineNo">154</span> doPut(Bytes.toBytes("row42"));<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span> @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span> public boolean evaluate() throws Exception {<a name="line.158"></a>
-<span class="sourceLineNo">159</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.159"></a>
-<span class="sourceLineNo">160</span> }<a name="line.160"></a>
-<span class="sourceLineNo">161</span> });<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span> doAssert(Bytes.toBytes("row42"));<a name="line.163"></a>
+<span class="sourceLineNo">153</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span> // now replicate some data.<a name="line.155"></a>
+<span class="sourceLineNo">156</span> doPut(Bytes.toBytes("row42"));<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span> @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span> public boolean evaluate() throws Exception {<a name="line.160"></a>
+<span class="sourceLineNo">161</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.161"></a>
+<span class="sourceLineNo">162</span> }<a name="line.162"></a>
+<span class="sourceLineNo">163</span> });<a name="line.163"></a>
<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.165"></a>
-<span class="sourceLineNo">166</span> }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span> @Test<a name="line.168"></a>
-<span class="sourceLineNo">169</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.169"></a>
-<span class="sourceLineNo">170</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.170"></a>
-<span class="sourceLineNo">171</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.171"></a>
-<span class="sourceLineNo">172</span> int peerCount = admin.getPeersCount();<a name="line.172"></a>
-<span class="sourceLineNo">173</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.173"></a>
-<span class="sourceLineNo">174</span> admin.addPeer(id,<a name="line.174"></a>
-<span class="sourceLineNo">175</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.175"></a>
-<span class="sourceLineNo">176</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.176"></a>
-<span class="sourceLineNo">177</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.177"></a>
-<span class="sourceLineNo">178</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.178"></a>
-<span class="sourceLineNo">179</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.179"></a>
-<span class="sourceLineNo">180</span> if (admin.getPeersCount() <= peerCount) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.181"></a>
-<span class="sourceLineNo">182</span> Threads.sleep(100);<a name="line.182"></a>
-<span class="sourceLineNo">183</span> }<a name="line.183"></a>
-<span class="sourceLineNo">184</span> // now replicate some data<a name="line.184"></a>
-<span class="sourceLineNo">185</span> doPut(row);<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.187"></a>
-<span class="sourceLineNo">188</span> @Override<a name="line.188"></a>
-<span class="sourceLineNo">189</span> public boolean evaluate() throws Exception {<a name="line.189"></a>
-<span class="sourceLineNo">190</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.190"></a>
-<span class="sourceLineNo">191</span> // only send over one edit.<a name="line.191"></a>
-<span class="sourceLineNo">192</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.192"></a>
-<span class="sourceLineNo">193</span> LOG.info("count=" + count);<a name="line.193"></a>
-<span class="sourceLineNo">194</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.194"></a>
-<span class="sourceLineNo">195</span> }<a name="line.195"></a>
-<span class="sourceLineNo">196</span> });<a name="line.196"></a>
-<span class="sourceLineNo">197</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.198"></a>
-<span class="sourceLineNo">199</span> }<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.201"></a>
-<span class="sourceLineNo">202</span> }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span> @Test<a name="line.204"></a>
-<span class="sourceLineNo">205</span> public void testInterClusterReplication() throws Exception {<a name="line.205"></a>
-<span class="sourceLineNo">206</span> final String id = "testInterClusterReplication";<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.208"></a>
-<span class="sourceLineNo">209</span> int totEdits = 0;<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span> // Make sure edits are spread across regions because we do region based batching<a name="line.211"></a>
-<span class="sourceLineNo">212</span> // before shipping edits.<a name="line.212"></a>
-<span class="sourceLineNo">213</span> for(HRegion region: regions) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span> RegionInfo hri = region.getRegionInfo();<a name="line.214"></a>
-<span class="sourceLineNo">215</span> byte[] row = hri.getStartKey();<a name="line.215"></a>
-<span class="sourceLineNo">216</span> for (int i = 0; i < 100; i++) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span> if (row.length > 0) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span> Put put = new Put(row);<a name="line.218"></a>
-<span class="sourceLineNo">219</span> put.addColumn(famName, row, row);<a name="line.219"></a>
-<span class="sourceLineNo">220</span> region.put(put);<a name="line.220"></a>
-<span class="sourceLineNo">221</span> totEdits++;<a name="line.221"></a>
-<span class="sourceLineNo">222</span> }<a name="line.222"></a>
-<span class="sourceLineNo">223</span> }<a name="line.223"></a>
-<span class="sourceLineNo">224</span> }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span> admin.addPeer(id,<a name="line.226"></a>
-<span class="sourceLineNo">227</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.227"></a>
-<span class="sourceLineNo">228</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.228"></a>
-<span class="sourceLineNo">229</span> null);<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span> final int numEdits = totEdits;<a name="line.231"></a>
-<span class="sourceLineNo">232</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.232"></a>
-<span class="sourceLineNo">233</span> @Override<a name="line.233"></a>
-<span class="sourceLineNo">234</span> public boolean evaluate() throws Exception {<a name="line.234"></a>
-<span class="sourceLineNo">235</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.235"></a>
-<span class="sourceLineNo">236</span> }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span> @Override<a name="line.238"></a>
-<span class="sourceLineNo">239</span> public String explainFailure() throws Exception {<a name="line.239"></a>
-<span class="sourceLineNo">240</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.240"></a>
-<span class="sourceLineNo">241</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.241"></a>
-<span class="sourceLineNo">242</span> return failure;<a name="line.242"></a>
-<span class="sourceLineNo">243</span> }<a name="line.243"></a>
-<span class="sourceLineNo">244</span> });<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span> admin.removePeer("testInterClusterReplication");<a name="line.246"></a>
-<span class="sourceLineNo">247</span> utility1.deleteTableData(tableName);<a name="line.247"></a>
-<span class="sourceLineNo">248</span> }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span> @Test<a name="line.250"></a>
-<span class="sourceLineNo">251</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.251"></a>
-<span class="sourceLineNo">252</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.252"></a>
-<span class="sourceLineNo">253</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.253"></a>
-<span class="sourceLineNo">254</span> //test that we can create mutliple WALFilters reflectively<a name="line.254"></a>
-<span class="sourceLineNo">255</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.255"></a>
-<span class="sourceLineNo">256</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.256"></a>
-<span class="sourceLineNo">257</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.257"></a>
-<span class="sourceLineNo">258</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.258"></a>
-<span class="sourceLineNo">259</span> // now replicate some data.<a name="line.259"></a>
-<span class="sourceLineNo">260</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.261"></a>
-<span class="sourceLineNo">262</span> doPut(connection, row);<a name="line.262"></a>
-<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.263"></a>
-<span class="sourceLineNo">264</span> }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.266"></a>
-<span class="sourceLineNo">267</span> @Override<a name="line.267"></a>
-<span class="sourceLineNo">268</span> public boolean evaluate() throws Exception {<a name="line.268"></a>
-<span class="sourceLineNo">269</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.269"></a>
-<span class="sourceLineNo">270</span> }<a name="line.270"></a>
-<span class="sourceLineNo">271</span> });<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.273"></a>
-<span class="sourceLineNo">274</span> //make sure our reflectively created filter is in the filter chain<a name="line.274"></a>
-<span class="sourceLineNo">275</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.275"></a>
-<span class="sourceLineNo">276</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.276"></a>
-<span class="sourceLineNo">277</span> }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span> @Test (expected=IOException.class)<a name="line.279"></a>
-<span class="sourceLineNo">280</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.280"></a>
-<span class="sourceLineNo">281</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.281"></a>
-<span class="sourceLineNo">282</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.282"></a>
-<span class="sourceLineNo">283</span> //test that we can create mutliple WALFilters reflectively<a name="line.283"></a>
-<span class="sourceLineNo">284</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.284"></a>
-<span class="sourceLineNo">285</span> "IAmNotARealWalEntryFilter");<a name="line.285"></a>
-<span class="sourceLineNo">286</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.286"></a>
-<span class="sourceLineNo">287</span> }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span> @Test (expected=IOException.class)<a name="line.289"></a>
-<span class="sourceLineNo">290</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.290"></a>
-<span class="sourceLineNo">291</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.291"></a>
-<span class="sourceLineNo">292</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.292"></a>
-<span class="sourceLineNo">293</span> //test that we can create mutliple WALFilters reflectively<a name="line.293"></a>
-<span class="sourceLineNo">294</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.294"></a>
-<span class="sourceLineNo">295</span> "IAmNotARealWalEntryFilter");<a name="line.295"></a>
-<span class="sourceLineNo">296</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.296"></a>
-<span class="sourceLineNo">297</span> }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span> @Test<a name="line.300"></a>
-<span class="sourceLineNo">301</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.301"></a>
-<span class="sourceLineNo">302</span> /*<a name="line.302"></a>
-<span class="sourceLineNo">303</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.303"></a>
-<span class="sourceLineNo">304</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.304"></a>
-<span class="sourceLineNo">305</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.305"></a>
-<span class="sourceLineNo">306</span> allows for custom JMX metrics.<a name="line.306"></a>
-<span class="sourceLineNo">307</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.307"></a>
-<span class="sourceLineNo">308</span> the two layers of wrapping to the actual BaseSource.<a name="line.308"></a>
-<span class="sourceLineNo">309</span> */<a name="line.309"></a>
-<span class="sourceLineNo">310</span> String id = "id";<a name="line.310"></a>
-<span class="sourceLineNo">311</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.311"></a>
-<span class="sourceLineNo">312</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.312"></a>
-<span class="sourceLineNo">313</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.313"></a>
-<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
-<span class="sourceLineNo">315</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.317"></a>
-<span class="sourceLineNo">318</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.318"></a>
-<span class="sourceLineNo">319</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource);<a name="line.319"></a>
-<span class="sourceLineNo">320</span> String gaugeName = "gauge";<a name="line.320"></a>
-<span class="sourceLineNo">321</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.321"></a>
-<span class="sourceLineNo">322</span> String globalGaugeName = "source." + gaugeName;<a name="line.322"></a>
-<span class="sourceLineNo">323</span> long delta = 1;<a name="line.323"></a>
-<span class="sourceLineNo">324</span> String counterName = "counter";<a name="line.324"></a>
-<span class="sourceLineNo">325</span> String singleCounterName = "source.id." + counterName;<a name="line.325"></a>
-<span class="sourceLineNo">326</span> String globalCounterName = "source." + counterName;<a name="line.326"></a>
-<span class="sourceLineNo">327</span> long count = 2;<a name="line.327"></a>
-<span class="sourceLineNo">328</span> source.decGauge(gaugeName, delta);<a name="line.328"></a>
-<span class="sourceLineNo">329</span> source.getMetricsContext();<a name="line.329"></a>
-<span class="sourceLineNo">330</span> source.getMetricsDescription();<a name="line.330"></a>
-<span class="sourceLineNo">331</span> source.getMetricsJmxContext();<a name="line.331"></a>
-<span class="sourceLineNo">332</span> source.getMetricsName();<a name="line.332"></a>
-<span class="sourceLineNo">333</span> source.incCounters(counterName, count);<a name="line.333"></a>
-<span class="sourceLineNo">334</span> source.incGauge(gaugeName, delta);<a name="line.334"></a>
-<span class="sourceLineNo">335</span> source.init();<a name="line.335"></a>
-<span class="sourceLineNo">336</span> source.removeMetric(gaugeName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span> source.setGauge(gaugeName, delta);<a name="line.337"></a>
-<span class="sourceLineNo">338</span> source.updateHistogram(counterName, count);<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.340"></a>
-<span class="sourceLineNo">341</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.341"></a>
-<span class="sourceLineNo">342</span> verify(globalRms).getMetricsContext();<a name="line.342"></a>
-<span class="sourceLineNo">343</span> verify(globalRms).getMetricsJmxContext();<a name="line.343"></a>
-<span class="sourceLineNo">344</span> verify(globalRms).getMetricsName();<a name="line.344"></a>
-<span class="sourceLineNo">345</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.345"></a>
-<span class="sourceLineNo">346</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.346"></a>
-<span class="sourceLineNo">347</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.347"></a>
-<span class="sourceLineNo">348</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.348"></a>
-<span class="sourceLineNo">349</span> verify(globalRms).init();<a name="line.349"></a>
-<span class="sourceLineNo">350</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.350"></a>
-<span class="sourceLineNo">351</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.351"></a>
-<span class="sourceLineNo">352</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.352"></a>
-<span class="sourceLineNo">353</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.353"></a>
-<span class="sourceLineNo">354</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.354"></a>
-<span class="sourceLineNo">355</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.355"></a>
-<span class="sourceLineNo">356</span> }<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span> private void doPut(byte[] row) throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span> doPut(connection, row);<a name="line.360"></a>
-<span class="sourceLineNo">361</span> }<a name="line.361"></a>
-<span class="sourceLineNo">362</span> }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.364"></a>
-<span class="sourceLineNo">365</span> try (Table t = connection.getTable(tableName)) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span> Put put = new Put(row);<a name="line.366"></a>
-<span class="sourceLineNo">367</span> put.addColumn(famName, row, row);<a name="line.367"></a>
-<span class="sourceLineNo">368</span> t.put(put);<a name="line.368"></a>
-<span class="sourceLineNo">369</span> }<a name="line.369"></a>
-<span class="sourceLineNo">370</span> }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span> private static void doAssert(byte[] row) throws Exception {<a name="line.372"></a>
-<span class="sourceLineNo">373</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span> return; // first call<a name="line.374"></a>
-<span class="sourceLineNo">375</span> }<a name="line.375"></a>
-<span class="sourceLineNo">376</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.376"></a>
-<span class="sourceLineNo">377</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.377"></a>
-<span class="sourceLineNo">378</span> Assert.assertEquals(1, cells.size());<a name="line.378"></a>
-<span class="sourceLineNo">379</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.379"></a>
-<span class="sourceLineNo">380</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.380"></a>
-<span class="sourceLineNo">381</span> }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.383"></a>
-<span class="sourceLineNo">384</span> static UUID uuid = UUID.randomUUID();<a name="line.384"></a>
-<span class="sourceLineNo">385</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.385"></a>
-<span class="sourceLineNo">386</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.386"></a>
-<span class="sourceLineNo">387</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.387"></a>
-<span class="sourceLineNo">388</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.388"></a>
-<span class="sourceLineNo">389</span> static volatile List<Entry> lastEntries = null;<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span> public ReplicationEndpointForTest() {<a name="line.391"></a>
-<span class="sourceLineNo">392</span> replicateCount.set(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span> contructedCount.incrementAndGet();<a name="line.393"></a>
-<span class="sourceLineNo">394</span> }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span> @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span> public UUID getPeerUUID() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span> return uuid;<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span> @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span> replicateCount.incrementAndGet();<a name="line.403"></a>
-<span class="sourceLineNo">404</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.404"></a>
-<span class="sourceLineNo">405</span> return true;<a name="line.405"></a>
-<span class="sourceLineNo">406</span> }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span> @Override<a name="line.408"></a>
-<span class="sourceLineNo">409</span> public void start() {<a name="line.409"></a>
-<span class="sourceLineNo">410</span> startAsync();<a name="line.410"></a>
-<span class="sourceLineNo">411</span> }<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span> @Override<a name="line.413"></a>
-<span class="sourceLineNo">414</span> public void stop() {<a name="line.414"></a>
-<span class="sourceLineNo">415</span> stopAsync();<a name="line.415"></a>
-<span class="sourceLineNo">416</span> }<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span> @Override<a name="line.418"></a>
-<span class="sourceLineNo">419</span> protected void doStart() {<a name="line.419"></a>
-<span class="sourceLineNo">420</span> startedCount.incrementAndGet();<a name="line.420"></a>
-<span class="sourceLineNo">421</span> notifyStarted();<a name="line.421"></a>
-<span class="sourceLineNo">422</span> }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span> @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span> protected void doStop() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span> stoppedCount.incrementAndGet();<a name="line.426"></a>
-<span class="sourceLineNo">427</span> notifyStopped();<a name="line.427"></a>
-<span class="sourceLineNo">428</span> }<a name="line.428"></a>
-<span class="sourceLineNo">429</span> }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span> public static class InterClusterReplicationEndpointForTest<a name="line.431"></a>
-<span class="sourceLineNo">432</span> extends HBaseInterClusterReplicationEndpoint {<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.434"></a>
-<span class="sourceLineNo">435</span> static boolean failedOnce;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span> public InterClusterReplicationEndpointForTest() {<a name="line.437"></a>
-<span class="sourceLineNo">438</span> replicateCount.set(0);<a name="line.438"></a>
-<span class="sourceLineNo">439</span> }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span> @Override<a name="line.441"></a>
-<span class="sourceLineNo">442</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span> boolean success = super.replicate(replicateContext);<a name="line.443"></a>
-<span class="sourceLineNo">444</span> if (success) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span> replicateCount.addAndGet(replicateContext.entries.size());<a name="line.445"></a>
-<span class="sourceLineNo">446</span> }<a name="line.446"></a>
-<span class="sourceLineNo">447</span> return success;<a name="line.447"></a>
+<span class="sourceLineNo">165</span> doAssert(Bytes.toBytes("row42"));<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span> admin.removePeer("testCustomReplicationEndpoint");<a name="line.167"></a>
+<span class="sourceLineNo">168</span> }<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span> @Test<a name="line.170"></a>
+<span class="sourceLineNo">171</span> public void testReplicationEndpointReturnsFalseOnReplicate() throws Exception {<a name="line.171"></a>
+<span class="sourceLineNo">172</span> Assert.assertEquals(0, ReplicationEndpointForTest.replicateCount.get());<a name="line.172"></a>
+<span class="sourceLineNo">173</span> Assert.assertTrue(!ReplicationEndpointReturningFalse.replicated.get());<a name="line.173"></a>
+<span class="sourceLineNo">174</span> int peerCount = admin.getPeersCount();<a name="line.174"></a>
+<span class="sourceLineNo">175</span> final String id = "testReplicationEndpointReturnsFalseOnReplicate";<a name="line.175"></a>
+<span class="sourceLineNo">176</span> admin.addPeer(id,<a name="line.176"></a>
+<span class="sourceLineNo">177</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.177"></a>
+<span class="sourceLineNo">178</span> .setReplicationEndpointImpl(ReplicationEndpointReturningFalse.class.getName()), null);<a name="line.178"></a>
+<span class="sourceLineNo">179</span> // This test is flakey and then there is so much stuff flying around in here its, hard to<a name="line.179"></a>
+<span class="sourceLineNo">180</span> // debug. Peer needs to be up for the edit to make it across. This wait on<a name="line.180"></a>
+<span class="sourceLineNo">181</span> // peer count seems to be a hack that has us not progress till peer is up.<a name="line.181"></a>
+<span class="sourceLineNo">182</span> if (admin.getPeersCount() <= peerCount) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span> LOG.info("Waiting on peercount to go up from " + peerCount);<a name="line.183"></a>
+<span class="sourceLineNo">184</span> Threads.sleep(100);<a name="line.184"></a>
+<span class="sourceLineNo">185</span> }<a name="line.185"></a>
+<span class="sourceLineNo">186</span> // now replicate some data<a name="line.186"></a>
+<span class="sourceLineNo">187</span> doPut(row);<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.189"></a>
+<span class="sourceLineNo">190</span> @Override<a name="line.190"></a>
+<span class="sourceLineNo">191</span> public boolean evaluate() throws Exception {<a name="line.191"></a>
+<span class="sourceLineNo">192</span> // Looks like replication endpoint returns false unless we put more than 10 edits. We<a name="line.192"></a>
+<span class="sourceLineNo">193</span> // only send over one edit.<a name="line.193"></a>
+<span class="sourceLineNo">194</span> int count = ReplicationEndpointForTest.replicateCount.get();<a name="line.194"></a>
+<span class="sourceLineNo">195</span> LOG.info("count=" + count);<a name="line.195"></a>
+<span class="sourceLineNo">196</span> return ReplicationEndpointReturningFalse.replicated.get();<a name="line.196"></a>
+<span class="sourceLineNo">197</span> }<a name="line.197"></a>
+<span class="sourceLineNo">198</span> });<a name="line.198"></a>
+<span class="sourceLineNo">199</span> if (ReplicationEndpointReturningFalse.ex.get() != null) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span> throw ReplicationEndpointReturningFalse.ex.get();<a name="line.200"></a>
+<span class="sourceLineNo">201</span> }<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span> admin.removePeer("testReplicationEndpointReturnsFalseOnReplicate");<a name="line.203"></a>
+<span class="sourceLineNo">204</span> }<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span> @Test<a name="line.206"></a>
+<span class="sourceLineNo">207</span> public void testInterClusterReplication() throws Exception {<a name="line.207"></a>
+<span class="sourceLineNo">208</span> final String id = "testInterClusterReplication";<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span> List<HRegion> regions = utility1.getHBaseCluster().getRegions(tableName);<a name="line.210"></a>
+<span class="sourceLineNo">211</span> int totEdits = 0;<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span> // Make sure edits are spread across regions because we do region based batching<a name="line.213"></a>
+<span class="sourceLineNo">214</span> // before shipping edits.<a name="line.214"></a>
+<span class="sourceLineNo">215</span> for(HRegion region: regions) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span> RegionInfo hri = region.getRegionInfo();<a name="line.216"></a>
+<span class="sourceLineNo">217</span> byte[] row = hri.getStartKey();<a name="line.217"></a>
+<span class="sourceLineNo">218</span> for (int i = 0; i < 100; i++) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span> if (row.length > 0) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span> Put put = new Put(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span> put.addColumn(famName, row, row);<a name="line.221"></a>
+<span class="sourceLineNo">222</span> region.put(put);<a name="line.222"></a>
+<span class="sourceLineNo">223</span> totEdits++;<a name="line.223"></a>
+<span class="sourceLineNo">224</span> }<a name="line.224"></a>
+<span class="sourceLineNo">225</span> }<a name="line.225"></a>
+<span class="sourceLineNo">226</span> }<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span> admin.addPeer(id,<a name="line.228"></a>
+<span class="sourceLineNo">229</span> new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf2))<a name="line.229"></a>
+<span class="sourceLineNo">230</span> .setReplicationEndpointImpl(InterClusterReplicationEndpointForTest.class.getName()),<a name="line.230"></a>
+<span class="sourceLineNo">231</span> null);<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span> final int numEdits = totEdits;<a name="line.233"></a>
+<span class="sourceLineNo">234</span> Waiter.waitFor(conf1, 30000, new Waiter.ExplainingPredicate<Exception>() {<a name="line.234"></a>
+<span class="sourceLineNo">235</span> @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span> public boolean evaluate() throws Exception {<a name="line.236"></a>
+<span class="sourceLineNo">237</span> return InterClusterReplicationEndpointForTest.replicateCount.get() == numEdits;<a name="line.237"></a>
+<span class="sourceLineNo">238</span> }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span> @Override<a name="line.240"></a>
+<span class="sourceLineNo">241</span> public String explainFailure() throws Exception {<a name="line.241"></a>
+<span class="sourceLineNo">242</span> String failure = "Failed to replicate all edits, expected = " + numEdits<a name="line.242"></a>
+<span class="sourceLineNo">243</span> + " replicated = " + InterClusterReplicationEndpointForTest.replicateCount.get();<a name="line.243"></a>
+<span class="sourceLineNo">244</span> return failure;<a name="line.244"></a>
+<span class="sourceLineNo">245</span> }<a name="line.245"></a>
+<span class="sourceLineNo">246</span> });<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span> admin.removePeer("testInterClusterReplication");<a name="line.248"></a>
+<span class="sourceLineNo">249</span> utility1.deleteTableData(tableName);<a name="line.249"></a>
+<span class="sourceLineNo">250</span> }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span> @Test<a name="line.252"></a>
+<span class="sourceLineNo">253</span> public void testWALEntryFilterFromReplicationEndpoint() throws Exception {<a name="line.253"></a>
+<span class="sourceLineNo">254</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.254"></a>
+<span class="sourceLineNo">255</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.255"></a>
+<span class="sourceLineNo">256</span> //test that we can create mutliple WALFilters reflectively<a name="line.256"></a>
+<span class="sourceLineNo">257</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.257"></a>
+<span class="sourceLineNo">258</span> EverythingPassesWALEntryFilter.class.getName() +<a name="line.258"></a>
+<span class="sourceLineNo">259</span> "," + EverythingPassesWALEntryFilterSubclass.class.getName());<a name="line.259"></a>
+<span class="sourceLineNo">260</span> admin.addPeer("testWALEntryFilterFromReplicationEndpoint", rpc);<a name="line.260"></a>
+<span class="sourceLineNo">261</span> // now replicate some data.<a name="line.261"></a>
+<span class="sourceLineNo">262</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span> doPut(connection, Bytes.toBytes("row1"));<a name="line.263"></a>
+<span class="sourceLineNo">264</span> doPut(connection, row);<a name="line.264"></a>
+<span class="sourceLineNo">265</span> doPut(connection, Bytes.toBytes("row2"));<a name="line.265"></a>
+<span class="sourceLineNo">266</span> }<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span> Waiter.waitFor(conf1, 60000, new Waiter.Predicate<Exception>() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span> @Override<a name="line.269"></a>
+<span class="sourceLineNo">270</span> public boolean evaluate() throws Exception {<a name="line.270"></a>
+<span class="sourceLineNo">271</span> return ReplicationEndpointForTest.replicateCount.get() >= 1;<a name="line.271"></a>
+<span class="sourceLineNo">272</span> }<a name="line.272"></a>
+<span class="sourceLineNo">273</span> });<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span> Assert.assertNull(ReplicationEndpointWithWALEntryFilter.ex.get());<a name="line.275"></a>
+<span class="sourceLineNo">276</span> //make sure our reflectively created filter is in the filter chain<a name="line.276"></a>
+<span class="sourceLineNo">277</span> Assert.assertTrue(EverythingPassesWALEntryFilter.hasPassedAnEntry());<a name="line.277"></a>
+<span class="sourceLineNo">278</span> admin.removePeer("testWALEntryFilterFromReplicationEndpoint");<a name="line.278"></a>
+<span class="sourceLineNo">279</span> }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span> @Test (expected=IOException.class)<a name="line.281"></a>
+<span class="sourceLineNo">282</span> public void testWALEntryFilterAddValidation() throws Exception {<a name="line.282"></a>
+<span class="sourceLineNo">283</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.283"></a>
+<span class="sourceLineNo">284</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span> //test that we can create mutliple WALFilters reflectively<a name="line.285"></a>
+<span class="sourceLineNo">286</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.286"></a>
+<span class="sourceLineNo">287</span> "IAmNotARealWalEntryFilter");<a name="line.287"></a>
+<span class="sourceLineNo">288</span> admin.addPeer("testWALEntryFilterAddValidation", rpc);<a name="line.288"></a>
+<span class="sourceLineNo">289</span> }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span> @Test (expected=IOException.class)<a name="line.291"></a>
+<span class="sourceLineNo">292</span> public void testWALEntryFilterUpdateValidation() throws Exception {<a name="line.292"></a>
+<span class="sourceLineNo">293</span> ReplicationPeerConfig rpc = new ReplicationPeerConfig().setClusterKey(ZKConfig.getZooKeeperClusterKey(conf1))<a name="line.293"></a>
+<span class="sourceLineNo">294</span> .setReplicationEndpointImpl(ReplicationEndpointWithWALEntryFilter.class.getName());<a name="line.294"></a>
+<span class="sourceLineNo">295</span> //test that we can create mutliple WALFilters reflectively<a name="line.295"></a>
+<span class="sourceLineNo">296</span> rpc.getConfiguration().put(BaseReplicationEndpoint.REPLICATION_WALENTRYFILTER_CONFIG_KEY,<a name="line.296"></a>
+<span class="sourceLineNo">297</span> "IAmNotARealWalEntryFilter");<a name="line.297"></a>
+<span class="sourceLineNo">298</span> admin.updatePeerConfig("testWALEntryFilterUpdateValidation", rpc);<a name="line.298"></a>
+<span class="sourceLineNo">299</span> }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span> @Test<a name="line.302"></a>
+<span class="sourceLineNo">303</span> public void testMetricsSourceBaseSourcePassthrough(){<a name="line.303"></a>
+<span class="sourceLineNo">304</span> /*<a name="line.304"></a>
+<span class="sourceLineNo">305</span> The replication MetricsSource wraps a MetricsReplicationSourceSourceImpl<a name="line.305"></a>
+<span class="sourceLineNo">306</span> and a MetricsReplicationGlobalSourceSource, so that metrics get written to both namespaces.<a name="line.306"></a>
+<span class="sourceLineNo">307</span> Both of those classes wrap a MetricsReplicationSourceImpl that implements BaseSource, which<a name="line.307"></a>
+<span class="sourceLineNo">308</span> allows for custom JMX metrics.<a name="line.308"></a>
+<span class="sourceLineNo">309</span> This test checks to make sure the BaseSource decorator logic on MetricsSource actually calls down through<a name="line.309"></a>
+<span class="sourceLineNo">310</span> the two layers of wrapping to the actual BaseSource.<a name="line.310"></a>
+<span class="sourceLineNo">311</span> */<a name="line.311"></a>
+<span class="sourceLineNo">312</span> String id = "id";<a name="line.312"></a>
+<span class="sourceLineNo">313</span> DynamicMetricsRegistry mockRegistry = mock(DynamicMetricsRegistry.class);<a name="line.313"></a>
+<span class="sourceLineNo">314</span> MetricsReplicationSourceImpl singleRms = mock(MetricsReplicationSourceImpl.class);<a name="line.314"></a>
+<span class="sourceLineNo">315</span> when(singleRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.315"></a>
+<span class="sourceLineNo">316</span> MetricsReplicationSourceImpl globalRms = mock(MetricsReplicationSourceImpl.class);<a name="line.316"></a>
+<span class="sourceLineNo">317</span> when(globalRms.getMetricsRegistry()).thenReturn(mockRegistry);<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span> MetricsReplicationSourceSource singleSourceSource = new MetricsReplicationSourceSourceImpl(singleRms, id);<a name="line.319"></a>
+<span class="sourceLineNo">320</span> MetricsReplicationSourceSource globalSourceSource = new MetricsReplicationGlobalSourceSource(globalRms);<a name="line.320"></a>
+<span class="sourceLineNo">321</span> Map<String, MetricsReplicationSourceSource> singleSourceSourceByTable = new HashMap<>();<a name="line.321"></a>
+<span class="sourceLineNo">322</span> MetricsSource source = new MetricsSource(id, singleSourceSource, globalSourceSource,<a name="line.322"></a>
+<span class="sourceLineNo">323</span> singleSourceSourceByTable);<a name="line.323"></a>
+<span class="sourceLineNo">324</span> String gaugeName = "gauge";<a name="line.324"></a>
+<span class="sourceLineNo">325</span> String singleGaugeName = "source.id." + gaugeName;<a name="line.325"></a>
+<span class="sourceLineNo">326</span> String globalGaugeName = "source." + gaugeName;<a name="line.326"></a>
+<span class="sourceLineNo">327</span> long delta = 1;<a name="line.327"></a>
+<span class="sourceLineNo">328</span> String counterName = "counter";<a name="line.328"></a>
+<span class="sourceLineNo">329</span> String singleCounterName = "source.id." + counterName;<a name="line.329"></a>
+<span class="sourceLineNo">330</span> String globalCounterName = "source." + counterName;<a name="line.330"></a>
+<span class="sourceLineNo">331</span> long count = 2;<a name="line.331"></a>
+<span class="sourceLineNo">332</span> source.decGauge(gaugeName, delta);<a name="line.332"></a>
+<span class="sourceLineNo">333</span> source.getMetricsContext();<a name="line.333"></a>
+<span class="sourceLineNo">334</span> source.getMetricsDescription();<a name="line.334"></a>
+<span class="sourceLineNo">335</span> source.getMetricsJmxContext();<a name="line.335"></a>
+<span class="sourceLineNo">336</span> source.getMetricsName();<a name="line.336"></a>
+<span class="sourceLineNo">337</span> source.incCounters(counterName, count);<a name="line.337"></a>
+<span class="sourceLineNo">338</span> source.incGauge(gaugeName, delta);<a name="line.338"></a>
+<span class="sourceLineNo">339</span> source.init();<a name="line.339"></a>
+<span class="sourceLineNo">340</span> source.removeMetric(gaugeName);<a name="line.340"></a>
+<span class="sourceLineNo">341</span> source.setGauge(gaugeName, delta);<a name="line.341"></a>
+<span class="sourceLineNo">342</span> source.updateHistogram(counterName, count);<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span> verify(singleRms).decGauge(singleGaugeName, delta);<a name="line.344"></a>
+<span class="sourceLineNo">345</span> verify(globalRms).decGauge(globalGaugeName, delta);<a name="line.345"></a>
+<span class="sourceLineNo">346</span> verify(globalRms).getMetricsContext();<a name="line.346"></a>
+<span class="sourceLineNo">347</span> verify(globalRms).getMetricsJmxContext();<a name="line.347"></a>
+<span class="sourceLineNo">348</span> verify(globalRms).getMetricsName();<a name="line.348"></a>
+<span class="sourceLineNo">349</span> verify(singleRms).incCounters(singleCounterName, count);<a name="line.349"></a>
+<span class="sourceLineNo">350</span> verify(globalRms).incCounters(globalCounterName, count);<a name="line.350"></a>
+<span class="sourceLineNo">351</span> verify(singleRms).incGauge(singleGaugeName, delta);<a name="line.351"></a>
+<span class="sourceLineNo">352</span> verify(globalRms).incGauge(globalGaugeName, delta);<a name="line.352"></a>
+<span class="sourceLineNo">353</span> verify(globalRms).init();<a name="line.353"></a>
+<span class="sourceLineNo">354</span> verify(singleRms).removeMetric(singleGaugeName);<a name="line.354"></a>
+<span class="sourceLineNo">355</span> verify(globalRms).removeMetric(globalGaugeName);<a name="line.355"></a>
+<span class="sourceLineNo">356</span> verify(singleRms).setGauge(singleGaugeName, delta);<a name="line.356"></a>
+<span class="sourceLineNo">357</span> verify(globalRms).setGauge(globalGaugeName, delta);<a name="line.357"></a>
+<span class="sourceLineNo">358</span> verify(singleRms).updateHistogram(singleCounterName, count);<a name="line.358"></a>
+<span class="sourceLineNo">359</span> verify(globalRms).updateHistogram(globalCounterName, count);<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span> //check singleSourceSourceByTable metrics.<a name="line.361"></a>
+<span class="sourceLineNo">362</span> // singleSourceSourceByTable map entry will be created only<a name="line.362"></a>
+<span class="sourceLineNo">363</span> // after calling #setAgeOfLastShippedOpByTable<a name="line.363"></a>
+<span class="sourceLineNo">364</span> boolean containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.364"></a>
+<span class="sourceLineNo">365</span> .containsKey("RandomNewTable");<a name="line.365"></a>
+<span class="sourceLineNo">366</span> Assert.assertEquals(false, containsRandomNewTable);<a name="line.366"></a>
+<span class="sourceLineNo">367</span> source.setAgeOfLastShippedOpByTable(123L, "RandomNewTable");<a name="line.367"></a>
+<span class="sourceLineNo">368</span> containsRandomNewTable = source.getSingleSourceSourceByTable()<a name="line.368"></a>
+<span class="sourceLineNo">369</span> .containsKey("RandomNewTable");<a name="line.369"></a>
+<span class="sourceLineNo">370</span> Assert.assertEquals(true, containsRandomNewTable);<a name="line.370"></a>
+<span class="sourceLineNo">371</span> MetricsReplicationSourceSource msr = source.getSingleSourceSourceByTable()<a name="line.371"></a>
+<span class="sourceLineNo">372</span> .get("RandomNewTable");<a name="line.372"></a>
+<span class="sourceLineNo">373</span> // cannot put more concreate value here to verify because the age is arbitrary.<a name="line.373"></a>
+<span class="sourceLineNo">374</span> // as long as it's greater than 0, we see it as correct answer.<a name="line.374"></a>
+<span class="sourceLineNo">375</span> Assert.assertTrue(msr.getLastShippedAge() > 0);<a name="line.375"></a>
+<span class="sourceLineNo">376</span> }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span> private void doPut(byte[] row) throws IOException {<a name="line.378"></a>
+<span class="sourceLineNo">379</span> try (Connection connection = ConnectionFactory.createConnection(conf1)) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span> doPut(connection, row);<a name="line.380"></a>
+<span class="sourceLineNo">381</span> }<a name="line.381"></a>
+<span class="sourceLineNo">382</span> }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span> private void doPut(final Connection connection, final byte [] row) throws IOException {<a name="line.384"></a>
+<span class="sourceLineNo">385</span> try (Table t = connection.getTable(tableName)) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span> Put put = new Put(row);<a name="line.386"></a>
+<span class="sourceLineNo">387</span> put.addColumn(famName, row, row);<a name="line.387"></a>
+<span class="sourceLineNo">388</span> t.put(put);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<a name="line.389"></a>
+<span class="sourceLineNo">390</span> }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span> private static void doAssert(byte[] row) throws Exception {<a name="line.392"></a>
+<span class="sourceLineNo">393</span> if (ReplicationEndpointForTest.lastEntries == null) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span> return; // first call<a name="line.394"></a>
+<span class="sourceLineNo">395</span> }<a name="line.395"></a>
+<span class="sourceLineNo">396</span> Assert.assertEquals(1, ReplicationEndpointForTest.lastEntries.size());<a name="line.396"></a>
+<span class="sourceLineNo">397</span> List<Cell> cells = ReplicationEndpointForTest.lastEntries.get(0).getEdit().getCells();<a name="line.397"></a>
+<span class="sourceLineNo">398</span> Assert.assertEquals(1, cells.size());<a name="line.398"></a>
+<span class="sourceLineNo">399</span> Assert.assertTrue(Bytes.equals(cells.get(0).getRowArray(), cells.get(0).getRowOffset(),<a name="line.399"></a>
+<span class="sourceLineNo">400</span> cells.get(0).getRowLength(), row, 0, row.length));<a name="line.400"></a>
+<span class="sourceLineNo">401</span> }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span> public static class ReplicationEndpointForTest extends BaseReplicationEndpoint {<a name="line.403"></a>
+<span class="sourceLineNo">404</span> static UUID uuid = UUID.randomUUID();<a name="line.404"></a>
+<span class="sourceLineNo">405</span> static AtomicInteger contructedCount = new AtomicInteger();<a name="line.405"></a>
+<span class="sourceLineNo">406</span> static AtomicInteger startedCount = new AtomicInteger();<a name="line.406"></a>
+<span class="sourceLineNo">407</span> static AtomicInteger stoppedCount = new AtomicInteger();<a name="line.407"></a>
+<span class="sourceLineNo">408</span> static AtomicInteger replicateCount = new AtomicInteger();<a name="line.408"></a>
+<span class="sourceLineNo">409</span> static volatile List<Entry> lastEntries = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span> public ReplicationEndpointForTest() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span> replicateCount.set(0);<a name="line.412"></a>
+<span class="sourceLineNo">413</span> contructedCount.incrementAndGet();<a name="line.413"></a>
+<span class="sourceLineNo">414</span> }<a name="line.414"></a>
+<span class="sourceLineNo">415</span><a name="line.415"></a>
+<span class="sourceLineNo">416</span> @Override<a name="line.416"></a>
+<span class="sourceLineNo">417</span> public UUID getPeerUUID() {<a name="line.417"></a>
+<span class="sourceLineNo">418</span> return uuid;<a name="line.418"></a>
+<span class="sourceLineNo">419</span> }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span> @Override<a name="line.421"></a>
+<span class="sourceLineNo">422</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span> replicateCount.incrementAndGet();<a name="line.423"></a>
+<span class="sourceLineNo">424</span> lastEntries = new ArrayList<>(replicateContext.entries);<a name="line.424"></a>
+<span class="sourceLineNo">425</span> return true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span> }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span> @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span> public void start() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span> startAsync();<a name="line.430"></a>
+<span class="sourceLineNo">431</span> }<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span> @Override<a name="line.433"></a>
+<span class="sourceLineNo">434</span> public void stop() {<a name="line.434"></a>
+<span class="sourceLineNo">435</span> stopAsync();<a name="line.435"></a>
+<span class="sourceLineNo">436</span> }<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span> @Override<a name="line.438"></a>
+<span class="sourceLineNo">439</span> protected void doStart() {<a name="line.439"></a>
+<span class="sourceLineNo">440</span> startedCount.incrementAndGet();<a name="line.440"></a>
+<span class="sourceLineNo">441</span> notifyStarted();<a name="line.441"></a>
+<span class="sourceLineNo">442</span> }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span> @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span> protected void doStop() {<a name="line.445"></a>
+<span class="sourceLineNo">446</span> stoppedCount.incrementAndGet();<a name="line.446"></a>
+<span class="sourceLineNo">447</span> notifyStopped();<a name="line.447"></a>
<span class="sourceLineNo">448</span> }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span> @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span> protected Callable<Integer> createReplicator(List<Entry> entries, int ordinal) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span> // Fail only once, we don't want to slow down the test.<a name="line.452"></a>
-<span class="sourceLineNo">453</span> if (failedOnce) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span> return () -> ordinal;<a name="line.454"></a>
-<span class="sourceLineNo">455</span> } else {<a name="line.455"></a>
-<span class="sourceLineNo">456</span> failedOnce = true;<a name="line.456"></a>
-<span class="sourceLineNo">457</span> return () -> {<a name="line.457"></a>
-<span class="sourceLineNo">458</span> throw new IOException("Sample Exception: Failed to replicate.");<a name="line.458"></a>
-<span class="sourceLineNo">459</span> };<a name="line.459"></a>
-<span class="sourceLineNo">460</span> }<a name="line.460"></a>
-<span class="sourceLineNo">461</span> }<a name="line.461"></a>
-<span class="sourceLineNo">462</span> }<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span> public static class ReplicationEndpointReturningFalse extends ReplicationEndpointForTest {<a name="line.464"></a>
-<span class="sourceLineNo">465</span> static int COUNT = 10;<a name="line.465"></a>
-<span class="sourceLineNo">466</span> static AtomicReference<Exception> ex = new AtomicReference<>(null);<a name="line.466"></a>
-<span class="sourceLineNo">467</span> static AtomicBoolean replicated = new AtomicBoolean(false);<a name="line.467"></a>
-<span class="sourceLineNo">468</span> @Override<a name="line.468"></a>
-<span class="sourceLineNo">469</span> public boolean replicate(ReplicateContext replicateContext) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span> try {<a name="line.470"></a>
-<span class="sourceLineNo">471</span> // check row<a name="line.471"></a>
-<span class="sourceLineNo">472</span> doAssert(row);<a name="line.472"></a>
-<span class="sourceLineNo">473</span> } catch (Exception e) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span> ex.set(e);<a name="line.474"></a>
-<span class="sourceLineNo">475</span> }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span> super.replicate(replicateContext);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>
<TRUNCATED>