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/05/28 14:48:02 UTC

[01/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 31e53e2b5 -> 387c169a5


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html
index b4f4bf5..ab22a5c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html
@@ -31,293 +31,293 @@
 <span class="sourceLineNo">023</span>import static org.junit.Assert.fail;<a name="line.23"></a>
 <span class="sourceLineNo">024</span><a name="line.24"></a>
 <span class="sourceLineNo">025</span>import org.apache.hadoop.conf.Configuration;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.HConstants;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.TableName;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.security.User;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.security.access.AccessControlClient;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.security.access.AccessControlLists;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.security.access.Permission;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.security.access.SecureTestUtil;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.security.access.TableAuthManager;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.testclassification.SecurityTests;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.junit.AfterClass;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.junit.BeforeClass;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.junit.ClassRule;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.junit.Test;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.junit.experimental.categories.Category;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.slf4j.Logger;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.slf4j.LoggerFactory;<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> * Performs authorization checks for rsgroup operations, according to different<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * levels of authorized users.<a name="line.54"></a>
-<span class="sourceLineNo">055</span> */<a name="line.55"></a>
-<span class="sourceLineNo">056</span>@Category({SecurityTests.class, MediumTests.class})<a name="line.56"></a>
-<span class="sourceLineNo">057</span>public class TestRSGroupsWithACL extends SecureTestUtil{<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  @ClassRule<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      HBaseClassTestRule.forClass(TestRSGroupsWithACL.class);<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  private static final Logger LOG = LoggerFactory.getLogger(TestRSGroupsWithACL.class);<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private static TableName TEST_TABLE = TableName.valueOf("testtable1");<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private static Configuration conf;<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  private static Connection systemUserConnection;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  // user with all permissions<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  private static User SUPERUSER;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  // user granted with all global permission<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  private static User USER_ADMIN;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  // user with rw permissions on column family.<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  private static User USER_RW;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // user with read-only permissions<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private static User USER_RO;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  // user is table owner. will have all permissions on table<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private static User USER_OWNER;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  // user with create table permissions alone<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static User USER_CREATE;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  // user with no permissions<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  private static User USER_NONE;<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final String GROUP_ADMIN = "group_admin";<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private static final String GROUP_CREATE = "group_create";<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private static final String GROUP_READ = "group_read";<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private static final String GROUP_WRITE = "group_write";<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private static User USER_GROUP_ADMIN;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private static User USER_GROUP_CREATE;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private static User USER_GROUP_READ;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static User USER_GROUP_WRITE;<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private static byte[] TEST_FAMILY = Bytes.toBytes("f1");<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private static RSGroupAdminEndpoint rsGroupAdminEndpoint;<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @BeforeClass<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public static void setupBeforeClass() throws Exception {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    // setup configuration<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    conf = TEST_UTIL.getConfiguration();<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    conf.set(HConstants.HBASE_MASTER_LOADBALANCER_CLASS,<a name="line.102"></a>
-<span class="sourceLineNo">103</span>        RSGroupBasedLoadBalancer.class.getName());<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    // Enable security<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    enableSecurity(conf);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    // Verify enableSecurity sets up what we require<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    verifyConfiguration(conf);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    // Enable rsgroup<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    configureRSGroupAdminEndpoint(conf);<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>    TEST_UTIL.startMiniCluster();<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    rsGroupAdminEndpoint = (RSGroupAdminEndpoint) TEST_UTIL.getMiniHBaseCluster().getMaster().<a name="line.112"></a>
-<span class="sourceLineNo">113</span>        getMasterCoprocessorHost().findCoprocessor(RSGroupAdminEndpoint.class.getName());<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    // Wait for the ACL table to become available<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    TEST_UTIL.waitUntilAllRegionsAssigned(AccessControlLists.ACL_TABLE_NAME);<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>    // create a set of test users<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    SUPERUSER = User.createUserForTesting(conf, "admin", new String[] { "supergroup" });<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    USER_ADMIN = User.createUserForTesting(conf, "admin2", new String[0]);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    USER_RW = User.createUserForTesting(conf, "rwuser", new String[0]);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    USER_RO = User.createUserForTesting(conf, "rouser", new String[0]);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    USER_OWNER = User.createUserForTesting(conf, "owner", new String[0]);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    USER_CREATE = User.createUserForTesting(conf, "tbl_create", new String[0]);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    USER_NONE = User.createUserForTesting(conf, "nouser", new String[0]);<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>    USER_GROUP_ADMIN =<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        User.createUserForTesting(conf, "user_group_admin", new String[] { GROUP_ADMIN });<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    USER_GROUP_CREATE =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        User.createUserForTesting(conf, "user_group_create", new String[] { GROUP_CREATE });<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    USER_GROUP_READ =<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        User.createUserForTesting(conf, "user_group_read", new String[] { GROUP_READ });<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    USER_GROUP_WRITE =<a name="line.132"></a>
-<span class="sourceLineNo">133</span>        User.createUserForTesting(conf, "user_group_write", new String[] { GROUP_WRITE });<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>    systemUserConnection = TEST_UTIL.getConnection();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    setUpTableAndUserPermissions();<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>  private static void setUpTableAndUserPermissions() throws Exception {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    TableDescriptorBuilder tableBuilder = TableDescriptorBuilder.newBuilder(TEST_TABLE);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    ColumnFamilyDescriptorBuilder cfd = ColumnFamilyDescriptorBuilder.newBuilder(TEST_FAMILY);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    cfd.setMaxVersions(100);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    tableBuilder.setColumnFamily(cfd.build());<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    tableBuilder.setValue(TableDescriptorBuilder.OWNER, USER_OWNER.getShortName());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    createTable(TEST_UTIL, tableBuilder.build(),<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        new byte[][] { Bytes.toBytes("s") });<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // Set up initial grants<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    grantGlobal(TEST_UTIL, USER_ADMIN.getShortName(),<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        Permission.Action.ADMIN,<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        Permission.Action.CREATE,<a name="line.151"></a>
-<span class="sourceLineNo">152</span>        Permission.Action.READ,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        Permission.Action.WRITE);<a name="line.153"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HConstants;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.TableName;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.coprocessor.ObserverContext;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.coprocessor.ObserverContextImpl;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.security.User;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.security.access.AccessControlClient;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.security.access.AccessControlLists;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.security.access.AccessController;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.security.access.Permission;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.security.access.SecureTestUtil;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.security.access.TableAuthManager;<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.SecurityTests;<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.junit.AfterClass;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.junit.BeforeClass;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.junit.ClassRule;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.Test;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.experimental.categories.Category;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.slf4j.Logger;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.slf4j.LoggerFactory;<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>/**<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * Performs authorization checks for rsgroup operations, according to different<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * levels of authorized users.<a name="line.60"></a>
+<span class="sourceLineNo">061</span> */<a name="line.61"></a>
+<span class="sourceLineNo">062</span>@Category({SecurityTests.class, MediumTests.class})<a name="line.62"></a>
+<span class="sourceLineNo">063</span>public class TestRSGroupsWithACL extends SecureTestUtil{<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  @ClassRule<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      HBaseClassTestRule.forClass(TestRSGroupsWithACL.class);<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private static final Logger LOG = LoggerFactory.getLogger(TestRSGroupsWithACL.class);<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private static TableName TEST_TABLE = TableName.valueOf("testtable1");<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private static Configuration conf;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private static Connection systemUserConnection;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  // user with all permissions<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private static User SUPERUSER;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  // user granted with all global permission<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private static User USER_ADMIN;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  // user with rw permissions on column family.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static User USER_RW;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  // user with read-only permissions<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private static User USER_RO;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  // user is table owner. will have all permissions on table<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static User USER_OWNER;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  // user with create table permissions alone<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private static User USER_CREATE;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  // user with no permissions<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static User USER_NONE;<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private static final String GROUP_ADMIN = "group_admin";<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private static final String GROUP_CREATE = "group_create";<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  private static final String GROUP_READ = "group_read";<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final String GROUP_WRITE = "group_write";<a name="line.93"></a>
+<span class="sourceLineNo">094</span><a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private static User USER_GROUP_ADMIN;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private static User USER_GROUP_CREATE;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private static User USER_GROUP_READ;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private static User USER_GROUP_WRITE;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private static byte[] TEST_FAMILY = Bytes.toBytes("f1");<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  private static RSGroupAdminEndpoint rsGroupAdminEndpoint;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  private static AccessController accessController;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private static MasterCoprocessorEnvironment CP_ENV;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  private static ObserverContext&lt;MasterCoprocessorEnvironment&gt; CTX;<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  @BeforeClass<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public static void setupBeforeClass() throws Exception {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    // setup configuration<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    conf = TEST_UTIL.getConfiguration();<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    conf.set(HConstants.HBASE_MASTER_LOADBALANCER_CLASS,<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        RSGroupBasedLoadBalancer.class.getName());<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    // Enable security<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    enableSecurity(conf);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    // Verify enableSecurity sets up what we require<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    verifyConfiguration(conf);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    // Enable rsgroup<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    configureRSGroupAdminEndpoint(conf);<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>    TEST_UTIL.startMiniCluster();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    MasterCoprocessorHost masterCpHost =<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        TEST_UTIL.getMiniHBaseCluster().getMaster().getMasterCoprocessorHost();<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    rsGroupAdminEndpoint =<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        (RSGroupAdminEndpoint) masterCpHost.findCoprocessor(RSGroupAdminEndpoint.class.getName());<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    accessController =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>        (AccessController) masterCpHost.findCoprocessor(AccessController.class.getName());<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    CP_ENV =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        masterCpHost.createEnvironment(accessController, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    CTX = ObserverContextImpl.createAndPrepare(CP_ENV);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    // Wait for the ACL table to become available<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    TEST_UTIL.waitUntilAllRegionsAssigned(AccessControlLists.ACL_TABLE_NAME);<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>    // create a set of test users<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    SUPERUSER = User.createUserForTesting(conf, "admin", new String[] { "supergroup" });<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    USER_ADMIN = User.createUserForTesting(conf, "admin2", new String[0]);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    USER_RW = User.createUserForTesting(conf, "rwuser", new String[0]);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    USER_RO = User.createUserForTesting(conf, "rouser", new String[0]);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    USER_OWNER = User.createUserForTesting(conf, "owner", new String[0]);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    USER_CREATE = User.createUserForTesting(conf, "tbl_create", new String[0]);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    USER_NONE = User.createUserForTesting(conf, "nouser", new String[0]);<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>    USER_GROUP_ADMIN =<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        User.createUserForTesting(conf, "user_group_admin", new String[] { GROUP_ADMIN });<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    USER_GROUP_CREATE =<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        User.createUserForTesting(conf, "user_group_create", new String[] { GROUP_CREATE });<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    USER_GROUP_READ =<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        User.createUserForTesting(conf, "user_group_read", new String[] { GROUP_READ });<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    USER_GROUP_WRITE =<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        User.createUserForTesting(conf, "user_group_write", new String[] { GROUP_WRITE });<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>    systemUserConnection = TEST_UTIL.getConnection();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    setUpTableAndUserPermissions();<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
 <span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    grantOnTable(TEST_UTIL, USER_RW.getShortName(),<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        TEST_TABLE, TEST_FAMILY, null,<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        Permission.Action.READ,<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        Permission.Action.WRITE);<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>    // USER_CREATE is USER_RW plus CREATE permissions<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    grantOnTable(TEST_UTIL, USER_CREATE.getShortName(),<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        TEST_TABLE, null, null,<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        Permission.Action.CREATE,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        Permission.Action.READ,<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        Permission.Action.WRITE);<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>    grantOnTable(TEST_UTIL, USER_RO.getShortName(),<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        TEST_TABLE, TEST_FAMILY, null,<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        Permission.Action.READ);<a name="line.169"></a>
+<span class="sourceLineNo">155</span>  private static void setUpTableAndUserPermissions() throws Exception {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    TableDescriptorBuilder tableBuilder = TableDescriptorBuilder.newBuilder(TEST_TABLE);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    ColumnFamilyDescriptorBuilder cfd = ColumnFamilyDescriptorBuilder.newBuilder(TEST_FAMILY);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    cfd.setMaxVersions(100);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    tableBuilder.setColumnFamily(cfd.build());<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    tableBuilder.setValue(TableDescriptorBuilder.OWNER, USER_OWNER.getShortName());<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    createTable(TEST_UTIL, tableBuilder.build(),<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        new byte[][] { Bytes.toBytes("s") });<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>    // Set up initial grants<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    grantGlobal(TEST_UTIL, USER_ADMIN.getShortName(),<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        Permission.Action.ADMIN,<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        Permission.Action.CREATE,<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        Permission.Action.READ,<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        Permission.Action.WRITE);<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    grantGlobal(TEST_UTIL, toGroupEntry(GROUP_ADMIN), Permission.Action.ADMIN);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    grantGlobal(TEST_UTIL, toGroupEntry(GROUP_CREATE), Permission.Action.CREATE);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    grantGlobal(TEST_UTIL, toGroupEntry(GROUP_READ), Permission.Action.READ);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    grantGlobal(TEST_UTIL, toGroupEntry(GROUP_WRITE), Permission.Action.WRITE);<a name="line.174"></a>
+<span class="sourceLineNo">171</span>    grantOnTable(TEST_UTIL, USER_RW.getShortName(),<a name="line.171"></a>
+<span class="sourceLineNo">172</span>        TEST_TABLE, TEST_FAMILY, null,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        Permission.Action.READ,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        Permission.Action.WRITE);<a name="line.174"></a>
 <span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>    assertEquals(4, AccessControlLists.getTablePermissions(conf, TEST_TABLE).size());<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    try {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      assertEquals(4, AccessControlClient.getUserPermissions(systemUserConnection,<a name="line.178"></a>
-<span class="sourceLineNo">179</span>          TEST_TABLE.toString()).size());<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    } catch (Throwable e) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      LOG.error("error during call of AccessControlClient.getUserPermissions. ", e);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      fail("error during call of AccessControlClient.getUserPermissions.");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
-<span class="sourceLineNo">185</span><a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private static void cleanUp() throws Exception {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    // Clean the _acl_ table<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    try {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      deleteTable(TEST_UTIL, TEST_TABLE);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    } catch (TableNotFoundException ex) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      // Test deleted the table, no problem<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      LOG.info("Test deleted table " + TEST_TABLE);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    }<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    // Verify all table/namespace permissions are erased<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    assertEquals(0, AccessControlLists.getTablePermissions(conf, TEST_TABLE).size());<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    assertEquals(0, AccessControlLists.getNamespacePermissions(conf,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>            TEST_TABLE.getNamespaceAsString()).size());<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>  @AfterClass<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  public static void tearDownAfterClass() throws Exception {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    cleanUp();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    int total = TableAuthManager.getTotalRefCount();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    assertTrue("Unexpected reference count: " + total, total == 0);<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>  private static void configureRSGroupAdminEndpoint(Configuration conf) {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    String currentCoprocessors = conf.get(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    String coprocessors = RSGroupAdminEndpoint.class.getName();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    if (currentCoprocessors != null) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      coprocessors += "," + currentCoprocessors;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    conf.set(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, coprocessors);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    conf.set(HConstants.HBASE_MASTER_LOADBALANCER_CLASS,<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        RSGroupBasedLoadBalancer.class.getName());<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>  @Test<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  public void testGetRSGroupInfo() throws Exception {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    AccessTestAction action = () -&gt; {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      rsGroupAdminEndpoint.checkPermission("getRSGroupInfo");<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      return null;<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>    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO,<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        USER_NONE, USER_GROUP_READ, USER_GROUP_WRITE, USER_GROUP_CREATE);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  @Test<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  public void testGetRSGroupInfoOfTable() throws Exception {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    AccessTestAction action = () -&gt; {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      rsGroupAdminEndpoint.checkPermission("getRSGroupInfoOfTable");<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      return null;<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>    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO,<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        USER_NONE, USER_GROUP_READ, USER_GROUP_WRITE, USER_GROUP_CREATE);<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>  @Test<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  public void testMoveServers() throws Exception {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    AccessTestAction action = () -&gt; {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      rsGroupAdminEndpoint.checkPermission("moveServers");<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      return null;<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>    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO,<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        USER_NONE, USER_GROUP_READ, USER_GROUP_WRITE, USER_GROUP_CREATE);<a name="line.252"></a>
+<span class="sourceLineNo">176</span>    // USER_CREATE is USER_RW plus CREATE permissions<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    grantOnTable(TEST_UTIL, USER_CREATE.getShortName(),<a name="line.177"></a>
+<span class="sourceLineNo">178</span>        TEST_TABLE, null, null,<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        Permission.Action.CREATE,<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        Permission.Action.READ,<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        Permission.Action.WRITE);<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>    grantOnTable(TEST_UTIL, USER_RO.getShortName(),<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        TEST_TABLE, TEST_FAMILY, null,<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        Permission.Action.READ);<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>    grantGlobal(TEST_UTIL, toGroupEntry(GROUP_ADMIN), Permission.Action.ADMIN);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    grantGlobal(TEST_UTIL, toGroupEntry(GROUP_CREATE), Permission.Action.CREATE);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    grantGlobal(TEST_UTIL, toGroupEntry(GROUP_READ), Permission.Action.READ);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    grantGlobal(TEST_UTIL, toGroupEntry(GROUP_WRITE), Permission.Action.WRITE);<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    assertEquals(4, AccessControlLists.getTablePermissions(conf, TEST_TABLE).size());<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    try {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      assertEquals(4, AccessControlClient.getUserPermissions(systemUserConnection,<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          TEST_TABLE.toString()).size());<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    } catch (Throwable e) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      LOG.error("error during call of AccessControlClient.getUserPermissions. ", e);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      fail("error during call of AccessControlClient.getUserPermissions.");<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><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  private static void cleanUp() throws Exception {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    // Clean the _acl_ table<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    try {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      deleteTable(TEST_UTIL, TEST_TABLE);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    } catch (TableNotFoundException ex) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      // Test deleted the table, no problem<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.info("Test deleted table " + TEST_TABLE);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // Verify all table/namespace permissions are erased<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    assertEquals(0, AccessControlLists.getTablePermissions(conf, TEST_TABLE).size());<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    assertEquals(0, AccessControlLists.getNamespacePermissions(conf,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>            TEST_TABLE.getNamespaceAsString()).size());<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>  @AfterClass<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public static void tearDownAfterClass() throws Exception {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    cleanUp();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    int total = TableAuthManager.getTotalRefCount();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    assertTrue("Unexpected reference count: " + total, total == 0);<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>  private static void configureRSGroupAdminEndpoint(Configuration conf) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    String currentCoprocessors = conf.get(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    String coprocessors = RSGroupAdminEndpoint.class.getName();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    if (currentCoprocessors != null) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      coprocessors += "," + currentCoprocessors;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    conf.set(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, coprocessors);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    conf.set(HConstants.HBASE_MASTER_LOADBALANCER_CLASS,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        RSGroupBasedLoadBalancer.class.getName());<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  @Test<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public void testGetRSGroupInfo() throws Exception {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    AccessTestAction action = () -&gt; {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      rsGroupAdminEndpoint.checkPermission("getRSGroupInfo");<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      return null;<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>    validateAdminPermissions(action);<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>  @Test<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  public void testGetRSGroupInfoOfTable() throws Exception {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    AccessTestAction action = () -&gt; {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      rsGroupAdminEndpoint.checkPermission("getRSGroupInfoOfTable");<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      return null;<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>    validateAdminPermissions(action);<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>  @Test<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public void testMoveTables() throws Exception {<a name="line.256"></a>
+<span class="sourceLineNo">256</span>  public void testMoveServers() throws Exception {<a name="line.256"></a>
 <span class="sourceLineNo">257</span>    AccessTestAction action = () -&gt; {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      rsGroupAdminEndpoint.checkPermission("moveTables");<a name="line.258"></a>
+<span class="sourceLineNo">258</span>      accessController.preMoveServers(CTX, null, null);<a name="line.258"></a>
 <span class="sourceLineNo">259</span>      return null;<a name="line.259"></a>
 <span class="sourceLineNo">260</span>    };<a name="line.260"></a>
 <span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        USER_NONE, USER_GROUP_READ, USER_GROUP_WRITE, USER_GROUP_CREATE);<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>  @Test<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  public void testAddRSGroup() throws Exception {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    AccessTestAction action = () -&gt; {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      rsGroupAdminEndpoint.checkPermission("addRSGroup");<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      return null;<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>    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO,<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        USER_NONE, USER_GROUP_READ, USER_GROUP_WRITE, USER_GROUP_CREATE);<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<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  public void testRemoveRSGroup() throws Exception {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    AccessTestAction action = () -&gt; {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      rsGroupAdminEndpoint.checkPermission("removeRSGroup");<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return null;<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>    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO,<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        USER_NONE, USER_GROUP_READ, USER_GROUP_WRITE, USER_GROUP_CREATE);<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<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  public void testBalanceRSGroup() throws Exception {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    AccessTestAction action = () -&gt; {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      rsGroupAdminEndpoint.checkPermission("balanceRSGroup");<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      return null;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    };<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        USER_NONE, USER_GROUP_READ, USER_GROUP_WRITE, USER_GROUP_CREATE);<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>  @Test<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public void testListRSGroup() throws Exception {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    AccessTestAction action = () -&gt; {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      rsGroupAdminEndpoint.checkPermission("listRSGroup");<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      return null;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    };<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO,<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        USER_NONE, USER_GROUP_READ, USER_GROUP_WRITE, USER_GROUP_CREATE);<a name="line.312"></a>
+<span class="sourceLineNo">262</span>    validateAdminPermissions(action);<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>  @Test<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public void testMoveTables() throws Exception {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    AccessTestAction action = () -&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      accessController.preMoveTables(CTX, null, null);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      return null;<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>    validateAdminPermissions(action);<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>  @Test<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public void testAddRSGroup() throws Exception {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    AccessTestAction action = () -&gt; {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      accessController.preAddRSGroup(CTX, null);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return null;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    };<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>    validateAdminPermissions(action);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  @Test<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  public void testRemoveRSGroup() throws Exception {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    AccessTestAction action = () -&gt; {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      accessController.preRemoveRSGroup(CTX, null);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      return null;<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>    validateAdminPermissions(action);<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>  @Test<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  public void testBalanceRSGroup() throws Exception {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    AccessTestAction action = () -&gt; {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      accessController.preBalanceRSGroup(CTX, null);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      return null;<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>    validateAdminPermissions(action);<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>  @Test<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  public void testListRSGroup() throws Exception {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    AccessTestAction action = () -&gt; {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      rsGroupAdminEndpoint.checkPermission("listRSGroup");<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      return null;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    };<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>    validateAdminPermissions(action);<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>  @Test<a name="line.315"></a>
@@ -327,23 +327,35 @@
 <span class="sourceLineNo">319</span>      return null;<a name="line.319"></a>
 <span class="sourceLineNo">320</span>    };<a name="line.320"></a>
 <span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO,<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        USER_NONE, USER_GROUP_READ, USER_GROUP_WRITE, USER_GROUP_CREATE);<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>  @Test<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  public void testMoveServersAndTables() throws Exception {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    AccessTestAction action = () -&gt; {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      rsGroupAdminEndpoint.checkPermission("moveServersAndTables");<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      return null;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    };<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO,<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        USER_NONE, USER_GROUP_READ, USER_GROUP_WRITE, USER_GROUP_CREATE);<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">322</span>    validateAdminPermissions(action);<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>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  public void testMoveServersAndTables() throws Exception {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    AccessTestAction action = () -&gt; {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      accessController.preMoveServersAndTables(CTX, null, null, null);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      return null;<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>    validateAdminPermissions(action);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>  @Test<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  public void testRemoveServers() throws Exception {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    AccessTestAction action = () -&gt; {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      accessController.preRemoveServers(CTX, null);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return null;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    };<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    validateAdminPermissions(action);<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>  private void validateAdminPermissions(AccessTestAction action) throws Exception {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_GROUP_ADMIN);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    verifyDenied(action, USER_CREATE, USER_OWNER, USER_RW, USER_RO,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        USER_NONE, USER_GROUP_READ, USER_GROUP_WRITE, USER_GROUP_CREATE);<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>
 
 
 


[03/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
index 827d1f3..1b32e2b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
@@ -252,6332 +252,6333 @@
 <span class="sourceLineNo">244</span>    dir = TEST_UTIL.getDataTestDir("TestHRegion").toString();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    method = name.getMethodName();<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    tableName = TableName.valueOf(method);<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>  @After<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public void tearDown() throws Exception {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    TEST_UTIL.cleanupTestDir();<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @throws IOException<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Test<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void testSequenceId() throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // Open region again.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    byte [] value = Bytes.toBytes(method);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Make a random put against our cf.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Put put = new Put(value);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    region.put(put);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // No flush yet so init numbers should still be in place.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    region.flush(true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    long max = region.getMaxFlushedSeqId();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    region.close();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<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>   * Test for Bug 2 of HBASE-10466.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flushes for region close."<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * @throws IOException<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Test<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // Get some random bytes.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    byte [] value = Bytes.toBytes(method);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    // Make a random put against our cf.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    Put put = new Put(value);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    region.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    storeFlushCtx.prepare();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // Second put something in current memstore<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    region.put(put);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    region.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  /*<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * See HBASE-10845<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Test<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      StoreFlushContext storeFlushCtx;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.325"></a>
-<span class="sourceLineNo">326</span>          throws IOException {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        super(fs, rootDir, logName, conf);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>      @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      public void sync(long txid) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        storeFlushCtx.prepare();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        super.sync(txid);<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><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        COLUMN_FAMILY_BYTES);<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // Get some random bytes.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    byte [] value = Bytes.toBytes(method);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    Put put = new Put(value);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    boolean threwIOE = false;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      region.put(put);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    } catch (IOException ioe) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      threwIOE = true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    } finally {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        mss.getDataSize() == 0);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<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>   * Create a WAL outside of the usual helper in<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@code fs.file.impl}.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final Configuration walConf = new Configuration(conf);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return new WALFactory(walConf, callingMethod)<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Test<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootDir = new Path(dir + testName);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        COLUMN_FAMILY_BYTES);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // Put one value<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    byte [] value = Bytes.toBytes(method);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    Put put = new Put(value);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    region.put(put);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(onePutSize &gt; 0);<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    doThrow(new IOException())<a name="line.406"></a>
-<span class="sourceLineNo">407</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    put = new Put(value);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    try {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      region.put(put);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      fail("Should have failed with IOException");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (IOException expected) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    long expectedSize = onePutSize * 2;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    assertEquals("memstoreSize should be incremented",<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        expectedSize, region.getMemStoreDataSize());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    assertEquals("flushable size should be incremented",<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    region.setCoprocessorHost(null);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * if memstoreSize is not larger than 0."<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws Exception<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Test<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // Only retry once.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final User user =<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // Inject our faulty LocalFileSystem<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      public Object run() throws Exception {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        FileSystem fs = FileSystem.get(conf);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HRegion region = null;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        try {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          // Initialize region<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>              COLUMN_FAMILY_BYTES);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          long size = region.getMemStoreDataSize();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          Assert.assertEquals(0, size);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          Put p1 = new Put(row);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          region.put(p1);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          try {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            LOG.info("Flushing");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            region.flush(true);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          } catch (DroppedSnapshotException dse) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>            // What we are expecting<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // Make it so all writes succeed from here on out<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          ffs.fault.set(false);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // Check sizes.  Should still be the one entry.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          // subtract the right amount, the snapshot size only.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          Put p2 = new Put(row);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.488"></a>
-<span class="sourceLineNo">489</span>          region.put(p2);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          // it<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          region.flush(true);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          // Make sure our memory accounting is right.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } finally {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        return null;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    });<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Test<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    // Only retry once.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    final User user =<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Inject our faulty LocalFileSystem<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      @Override<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      public Object run() throws Exception {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        FileSystem fs = FileSystem.get(conf);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        HRegion region = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        try {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // Initialize region<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region = initHRegion(tableName, null, null, false,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          long size = region.getMemStoreDataSize();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          Assert.assertEquals(0, size);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          Put p1 = new Put(row);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          region.put(p1);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          StoreFlushContext storeFlushCtx =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          storeFlushCtx.prepare();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          // Now add two entries to the foreground memstore.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          Put p2 = new Put(row);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          region.put(p2);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          // Now try close on top of a failing flush.<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          region.close();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          fail();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } catch (DroppedSnapshotException dse) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          // Expected<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        } finally {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          ffs.fault.set(false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    });<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  @Test<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    byte[] family = Bytes.toBytes("family");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    region.put(put);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    region.flush(true);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    Scan scan = new Scan();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    scan.setMaxVersions(3);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    // open the first scanner<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    region.delete(delete);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    region.flush(true);<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    // open the second scanner<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    // make a major compaction<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    region.compact(true);<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>    // open the third scanner<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    scanner1.next(results);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    System.out.println(results);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assertEquals(1, results.size());<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    results.clear();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    scanner2.next(results);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    System.out.println(results);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    assertEquals(0, results.size());<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    results.clear();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scanner3.next(results);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    System.out.println(results);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    assertEquals(0, results.size());<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  @Test<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    byte[] family = Bytes.toBytes("family");<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    region.put(put);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    region.put(put);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.flush(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    Scan scan = new Scan();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    scan.setMaxVersions(3);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the first scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    region.compact(true);<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    scanner1.next(results);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Cell keyValue = results.get(0);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner1.close();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  @Test<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    byte[] family = Bytes.toBytes("family");<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    try {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>      long maxSeqId = 1050;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      long minSeqId = 1000;<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        fs.create(recoveredEdits);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>        long time = System.nanoTime();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        WALEdit edit = new WALEdit();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.662"></a>
-<span class="sourceLineNo">663</span>            .toBytes(i)));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>        writer.close();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      for (HStore store : region.getStores()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assertEquals(maxSeqId, seqId);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      region.getMVCC().advanceTo(seqId);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      Get get = new Get(row);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Result result = region.get(get);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        assertEquals(1, kvs.size());<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    } finally {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.region = null;<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      wals.close();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @Test<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    byte[] family = Bytes.toBytes("family");<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    try {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>      long maxSeqId = 1050;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      long minSeqId = 1000;<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        fs.create(recoveredEdits);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long time = System.nanoTime();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        WALEdit edit = new WALEdit();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.713"></a>
-<span class="sourceLineNo">714</span>            .toBytes(i)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>        writer.close();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      long recoverSeqId = 1030;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (HStore store : region.getStores()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertEquals(maxSeqId, seqId);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      region.getMVCC().advanceTo(seqId);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Get get = new Get(row);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      Result result = region.get(get);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        if (i &lt; recoverSeqId) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>          assertEquals(0, kvs.size());<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        } else {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          assertEquals(1, kvs.size());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    } finally {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      this.region = null;<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      wals.close();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  @Test<a name="line.747"></a>
-<span class="sourceLineNo">748</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    byte[] family = Bytes.toBytes("family");<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    try {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        dos.writeInt(i);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        dos.close();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      long minSeqId = 2000;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      dos.close();<a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, null);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      assertEquals(minSeqId, seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    } finally {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      this.region = null;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    byte[] family = Bytes.toBytes("family");<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    try {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>      long maxSeqId = 1050;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      long minSeqId = 1000;<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        fs.create(recoveredEdits);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>        long time = System.nanoTime();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        WALEdit edit = null;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        if (i == maxSeqId) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          CompactionDescriptor.newBuilder()<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          .build());<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        } else {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          edit = new WALEdit();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.815"></a>
-<span class="sourceLineNo">816</span>            .toBytes(i)));<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        }<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        writer.close();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>      long recoverSeqId = 1030;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      for (HStore store : region.getStores()) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      assertEquals(maxSeqId, seqId);<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>      // assert that the files are flushed<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.833"></a>
-<span class="sourceLineNo">834</span><a name="line.834"></a>
-<span class="sourceLineNo">835</span>    } finally {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      this.region = null;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      wals.close();<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    }<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Test<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    testRecoveredEditsReplayCompaction(false);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    testRecoveredEditsReplayCompaction(true);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    byte[] family = Bytes.toBytes("family");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    try {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>      long maxSeqId = 3;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      long minSeqId = 0;<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.862"></a>
-<span class="sourceLineNo">863</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        region.put(put);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        region.flush(true);<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>      // this will create a region with 3 files<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        storeFiles.add(sf.getPath());<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // disable compaction completion<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      region.compactStores();<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // ensure that nothing changed<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          + "from the compaction, could not find any";<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      assertNotNull(errorMsg, files);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      assertEquals(errorMsg, 1, files.length);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      // move the file inside region dir<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          files[0].getPath());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        // Mix the byte array to have a new encodedName<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.902"></a>
-<span class="sourceLineNo">903</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      fs.create(recoveredEdits);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      long time = System.nanoTime();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.916"></a>
-<span class="sourceLineNo">917</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          compactionDescriptor)));<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      writer.close();<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // close the region now, and reopen again<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      region.getTableDescriptor();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      region.getRegionInfo();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      region.close();<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      try {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        region = HRegion.openHRegion(region, null);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      } catch (WrongRegionException wre) {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // now check whether we have only one store file, the compacted one<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      for (HStoreFile sf : sfs) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      if (!mismatchedRegionName) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        Result result = region.get(get);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      }<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      this.region = null;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      wals.close();<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  @Test<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  public void testFlushMarkers() throws Exception {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    byte[] family = Bytes.toBytes("family");<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    try {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>      long maxSeqId = 3;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      long minSeqId = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        region.put(put);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        region.flush(true);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>      // this will create a region with 3 files from flush<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        storeFiles.add(sf.getPath().getName());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      }<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // now verify that the flush markers are written<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      wal.shutdown();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        TEST_UTIL.getConfiguration());<a name="line.993"></a>
-<span class="sourceLineNo">994</span>      try {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        long lastFlushSeqId = -1;<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        while (true) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          WAL.Entry entry = reader.next();<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          if (entry == null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            break;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>          }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            assertNotNull(flushDesc);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>            }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            } else {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>            flushDescriptors.add(entry);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        // now write those markers to the recovered edits again.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span><a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span><a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        fs.create(recoveredEdits);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          writer.append(entry);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        writer.close();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      } finally {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (null != reader) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          try {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            reader.close();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          } catch (IOException exception) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>            LOG.debug("exception details", exception);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
+<span class="sourceLineNo">247</span>    CONF.set(CompactingMemStore.IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY, String.valueOf(0.02));<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>  @After<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public void tearDown() throws Exception {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    TEST_UTIL.cleanupTestDir();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @throws IOException<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Test<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public void testSequenceId() throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    region.close();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // Open region again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    byte [] value = Bytes.toBytes(method);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // Make a random put against our cf.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    Put put = new Put(value);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    region.put(put);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // No flush yet so init numbers should still be in place.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    region.flush(true);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    long max = region.getMaxFlushedSeqId();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    region.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(max, region.getMaxFlushedSeqId());<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>  /**<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * Test for Bug 2 of HBASE-10466.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause 

<TRUNCATED>

[24/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.


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

Branch: refs/heads/asf-site
Commit: 387c169a5f088606f1f6f7738efc30a9020cf891
Parents: 31e53e2
Author: jenkins <bu...@apache.org>
Authored: Mon May 28 14:47:44 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Mon May 28 14:47:44 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     4 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       |   164 +-
 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                       |    14 +
 .../hadoop/hbase/backup/package-tree.html       |     2 +-
 .../hadoop/hbase/class-use/TableName.html       |    13 +
 .../hadoop/hbase/client/package-tree.html       |    22 +-
 .../class-use/MasterCoprocessorEnvironment.html |    77 +-
 .../coprocessor/class-use/ObserverContext.html  |   115 +-
 .../hadoop/hbase/filter/package-tree.html       |     6 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     2 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     4 +-
 .../hbase/master/balancer/package-tree.html     |     2 +-
 .../hadoop/hbase/master/package-tree.html       |     6 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../hadoop/hbase/net/class-use/Address.html     |    36 +
 .../apache/hadoop/hbase/net/package-use.html    |    24 +
 .../org/apache/hadoop/hbase/package-tree.html   |    16 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../hadoop/hbase/quotas/package-tree.html       |     8 +-
 .../hadoop/hbase/regionserver/package-tree.html |    18 +-
 .../regionserver/querymatcher/package-tree.html |     2 +-
 .../hbase/regionserver/wal/package-tree.html    |     2 +-
 .../replication/regionserver/package-tree.html  |     2 +-
 ...upAdminEndpoint.RSGroupAdminServiceImpl.html |    16 +-
 .../hbase/rsgroup/RSGroupAdminEndpoint.html     |    22 +-
 .../access/AccessController.OpType.html         |    30 +-
 .../hbase/security/access/AccessController.html |   710 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     6 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 ...upAdminEndpoint.RSGroupAdminServiceImpl.html |   643 +-
 .../hbase/rsgroup/RSGroupAdminEndpoint.html     |   643 +-
 .../access/AccessController.OpType.html         |  4899 +++----
 .../hbase/security/access/AccessController.html |  4899 +++----
 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 +-
 testdevapidocs/index-all.html                   |    10 +
 ...stJMXConnectorServer.MyAccessController.html |     4 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    10 +-
 .../hadoop/hbase/procedure/package-tree.html    |     8 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     4 +-
 .../regionserver/TestHRegion.Appender.html      |    18 +-
 .../regionserver/TestHRegion.FlushThread.html   |    16 +-
 .../TestHRegion.GetTillDoneOrException.html     |    14 +-
 .../TestHRegion.HRegionForTesting.html          |     8 +-
 .../TestHRegion.HRegionWithSeqId.html           |     6 +-
 .../TestHRegion.HStoreForTesting.html           |     6 +-
 .../regionserver/TestHRegion.Incrementer.html   |    18 +-
 .../TestHRegion.IsFlushWALMarker.html           |    10 +-
 .../regionserver/TestHRegion.PutThread.html     |    24 +-
 .../hadoop/hbase/regionserver/TestHRegion.html  |   258 +-
 .../hadoop/hbase/regionserver/package-tree.html |     4 +-
 .../hbase/rsgroup/TestRSGroupsWithACL.html      |   201 +-
 ...estAccessController2.MyAccessController.html |     4 +-
 ...ccessController3.FaultyAccessController.html |     4 +-
 .../SecureTestUtil.AccessTestAction.html        |    22 +
 .../hbase/security/access/package-use.html      |     6 +
 .../apache/hadoop/hbase/test/package-tree.html  |     2 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     4 +-
 .../regionserver/TestHRegion.Appender.html      | 12641 +++++++++--------
 .../regionserver/TestHRegion.FlushThread.html   | 12641 +++++++++--------
 .../TestHRegion.GetTillDoneOrException.html     | 12641 +++++++++--------
 .../TestHRegion.HRegionForTesting.html          | 12641 +++++++++--------
 .../TestHRegion.HRegionWithSeqId.html           | 12641 +++++++++--------
 .../TestHRegion.HStoreForTesting.html           | 12641 +++++++++--------
 .../regionserver/TestHRegion.Incrementer.html   | 12641 +++++++++--------
 .../TestHRegion.IsFlushWALMarker.html           | 12641 +++++++++--------
 .../regionserver/TestHRegion.PutThread.html     | 12641 +++++++++--------
 .../hadoop/hbase/regionserver/TestHRegion.html  | 12641 +++++++++--------
 .../hbase/rsgroup/TestRSGroupsWithACL.html      |   600 +-
 102 files changed, 70405 insertions(+), 69819 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 450de75..4c81f77 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 6deedf2..b6b34d8 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:20180527150829+00'00')
-/CreationDate (D:20180527150829+00'00')
+/ModDate (D:20180528144448+00'00')
+/CreationDate (D:20180528144448+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 2207bc8..d58fc4d 100644
--- a/book.html
+++ b/book.html
@@ -37955,7 +37955,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-05-27 14:29:47 UTC
+Last updated 2018-05-28 14:29:52 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index fd2d37a..d20a896 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 2028924..cb982d2 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -87799,319 +87799,319 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>258</td></tr>
+<td>259</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>293</td></tr>
+<td>294</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>440</td></tr>
+<td>441</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1403</td></tr>
+<td>1404</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
-<td>1405</td></tr>
+<td>1406</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1422</td></tr>
+<td>1423</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
-<td>1424</td></tr>
+<td>1425</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>1742</td></tr>
+<td>1743</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>1751</td></tr>
+<td>1752</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>1756</td></tr>
+<td>1757</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>1762</td></tr>
+<td>1763</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>1769</td></tr>
+<td>1770</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>1777</td></tr>
+<td>1778</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>1782</td></tr>
+<td>1783</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>1818</td></tr>
+<td>1819</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>1825</td></tr>
+<td>1826</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>1870</td></tr>
+<td>1871</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>1877</td></tr>
+<td>1878</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>2025</td></tr>
+<td>2026</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>2101</td></tr>
+<td>2102</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>2117</td></tr>
+<td>2118</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>2128</td></tr>
+<td>2129</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2872</td></tr>
+<td>2873</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3590</td></tr>
+<td>3591</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
-<td>3662</td></tr>
+<td>3663</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
-<td>3663</td></tr>
+<td>3664</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
-<td>3799</td></tr>
+<td>3800</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
-<td>3800</td></tr>
+<td>3801</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child have incorrect indentation level 10, expected level should be 8.</td>
-<td>3827</td></tr>
+<td>3828</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class PutThread should be declared as final.</td>
-<td>3838</td></tr>
+<td>3839</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>4014</td></tr>
+<td>4015</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
-<td>4082</td></tr>
+<td>4083</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
-<td>4083</td></tr>
+<td>4084</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4167</td></tr>
+<td>4168</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4168</td></tr>
+<td>4169</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4215</td></tr>
+<td>4216</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4216</td></tr>
+<td>4217</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4253</td></tr>
+<td>4254</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4262</td></tr>
+<td>4263</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4263</td></tr>
+<td>4264</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>4281</td></tr>
+<td>4282</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>4314</td></tr>
+<td>4315</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>4430</td></tr>
+<td>4431</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>4517</td></tr>
+<td>4518</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>4577</td></tr>
+<td>4578</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>4972</td></tr>
+<td>4973</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 165 lines (max allowed is 150).</td>
-<td>5437</td></tr>
+<td>5438</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>5927</td></tr>
+<td>5928</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>5928</td></tr>
+<td>5929</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' have incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>5943</td></tr>
+<td>5944</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>5971</td></tr>
+<td>5972</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
-<td>6090</td></tr>
+<td>6091</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
-<td>6097</td></tr></table></div>
+<td>6098</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java</h3>
 <table border="0" class="table table-striped">
@@ -102493,163 +102493,163 @@
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child have incorrect indentation level 10, expected level should be 6.</td>
-<td>291</td></tr>
+<td>292</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>307</td></tr>
+<td>308</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>392</td></tr>
+<td>393</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>533</td></tr>
+<td>534</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 166 lines (max allowed is 150).</td>
-<td>535</td></tr>
+<td>536</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>648</td></tr>
+<td>649</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>884</td></tr>
+<td>885</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1117</td></tr>
+<td>1118</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>1209</td></tr>
+<td>1210</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
-<td>1243</td></tr>
+<td>1244</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>1378</td></tr>
+<td>1421</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>1379</td></tr>
+<td>1422</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>1380</td></tr>
+<td>1423</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>1381</td></tr>
+<td>1424</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>1382</td></tr>
+<td>1425</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>1383</td></tr>
+<td>1426</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>1384</td></tr>
+<td>1427</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>1385</td></tr>
+<td>1428</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>1386</td></tr>
+<td>1429</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1986</td></tr>
+<td>2029</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1999</td></tr>
+<td>2042</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>MissingSwitchDefault</td>
 <td>switch without &quot;default&quot; clause.</td>
-<td>2048</td></tr>
+<td>2091</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 11, expected level should be 12.</td>
-<td>2057</td></tr>
+<td>2100</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>MissingSwitchDefault</td>
 <td>switch without &quot;default&quot; clause.</td>
-<td>2106</td></tr>
+<td>2149</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>2168</td></tr>
+<td>2211</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2354</td></tr>
+<td>2397</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2357</td></tr></table></div>
+<td>2400</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.AuthResult.java">org/apache/hadoop/hbase/security/access/AuthResult.java</h3>
 <table border="0" class="table table-striped">
@@ -123419,7 +123419,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 361d4e9..fd8daba 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 148ec46..22ef046 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 7be348f..7527c15 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index df16d3e..481104f 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index a359556..b35f7d2 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 331e179..d2b704f 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3768,21 +3768,21 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<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>"Sun May 27 15:02:42 UTC 2018"</code></td>
+<td class="colLast"><code>"Mon May 28 14:39:09 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<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>"1eabbb42954b94308f85434ed2a9a80ba3e03c5e"</code></td>
+<td class="colLast"><code>"1cd2b56802a58b833b78ab11093912417c9a226a"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<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>"3625a56d34adc99038c1c9b5df6a3db0"</code></td>
+<td class="colLast"><code>"42221ba251414a3ebe1df73881954c7c"</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/387c169a/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index ccaf215..67f58b7 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -81844,6 +81844,8 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preAddRSGroup-java.lang.String-">preAddRSGroup(String)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/AccessController.html#preAddRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preAddRSGroup(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, String)</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/AccessController.html" title="class in org.apache.hadoop.hbase.security.access">AccessController</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/ScanInfo.html#preadMaxBytes">preadMaxBytes</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/StoreScanner.html#preadMaxBytes">preadMaxBytes</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/StoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreScanner</a></dt>
@@ -81900,6 +81902,8 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preBalanceRSGroup-java.lang.String-">preBalanceRSGroup(String)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/AccessController.html#preBalanceRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preBalanceRSGroup(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, String)</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/AccessController.html" title="class in org.apache.hadoop.hbase.security.access">AccessController</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html#preBalanceSwitch-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preBalanceSwitch(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, boolean)</a></span> - Method in interface org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterObserver</a></dt>
 <dd>
 <div class="block">Called prior to modifying the flag used to enable/disable region balancing.</div>
@@ -82754,18 +82758,24 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preMoveServers-java.util.Set-java.lang.String-">preMoveServers(Set&lt;Address&gt;, String)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/AccessController.html#preMoveServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.lang.String-">preMoveServers(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, Set&lt;Address&gt;, String)</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/AccessController.html" title="class in org.apache.hadoop.hbase.security.access">AccessController</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html#preMoveServersAndTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.util.Set-java.lang.String-">preMoveServersAndTables(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, Set&lt;Address&gt;, Set&lt;TableName&gt;, String)</a></span> - Method in interface org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterObserver</a></dt>
 <dd>
 <div class="block">Called before servers are moved to target region server group</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preMoveServersAndTables-java.util.Set-java.util.Set-java.lang.String-">preMoveServersAndTables(Set&lt;Address&gt;, Set&lt;TableName&gt;, String)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/AccessController.html#preMoveServersAndTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.util.Set-java.lang.String-">preMoveServersAndTables(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, Set&lt;Address&gt;, Set&lt;TableName&gt;, String)</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/AccessController.html" title="class in org.apache.hadoop.hbase.security.access">AccessController</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html#preMoveTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.lang.String-">preMoveTables(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, Set&lt;TableName&gt;, String)</a></span> - Method in interface org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterObserver</a></dt>
 <dd>
 <div class="block">Called before tables are moved to target region server group</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preMoveTables-java.util.Set-java.lang.String-">preMoveTables(Set&lt;TableName&gt;, String)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/AccessController.html#preMoveTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.lang.String-">preMoveTables(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, Set&lt;TableName&gt;, String)</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/AccessController.html" title="class in org.apache.hadoop.hbase.security.access">AccessController</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt;)</a></span> - Method in interface org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></dt>
 <dd>
 <div class="block">Called before the region is reported as open to the master.</div>
@@ -83130,12 +83140,16 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preRemoveRSGroup-java.lang.String-">preRemoveRSGroup(String)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preRemoveRSGroup(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, String)</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/AccessController.html" title="class in org.apache.hadoop.hbase.security.access">AccessController</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html#preRemoveServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-">preRemoveServers(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, Set&lt;Address&gt;)</a></span> - Method in interface org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterObserver</a></dt>
 <dd>
 <div class="block">Called before servers are removed from rsgroup</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html#preRemoveServers-java.util.Set-">preRemoveServers(Set&lt;Address&gt;)</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-">preRemoveServers(ObserverContext&lt;MasterCoprocessorEnvironment&gt;, Set&lt;Address&gt;)</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/AccessController.html" title="class in org.apache.hadoop.hbase.security.access">AccessController</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt;, RegionInfo, Path)</a></span> - Method in interface org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></dt>
 <dd>
 <div class="block">Called before replaying WALs for this region.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 48a98fa..f2790ae 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -168,8 +168,8 @@
 <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>&lt;E&gt; (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>&lt;T&gt;, 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.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/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.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>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html b/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
index 43221ce..b0b7f0c 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/TableName.html
@@ -10481,6 +10481,19 @@ service.</div>
                       <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>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&gt;&nbsp;descriptors,
                       <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>&nbsp;regex)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveServersAndTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.util.Set-java.lang.String-">preMoveServersAndTables</a></span>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;tables,
+                       <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>&nbsp;targetGroup)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.lang.String-">preMoveTables</a></span>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;tables,
+             <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>&nbsp;targetGroup)</code>&nbsp;</td>
+</tr>
 </tbody>
 </table>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing constructors, and an explanation">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 7efc394..fcdadf0 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -550,24 +550,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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
 </ul>
 </li>
 </ul>


[15/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 9536d1d..df58b67 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index c1220be..2d74135 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index e02ef41..987152f 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index 6521a09..0066918 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 17df249..c55d294 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 5e892fd..54a2bc9 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 300e24e..a96c625 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 539c751..4700781 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -459,7 +459,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 1a4d2b3..db886ff 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 774ab1f..dbbb128 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 495c698..0f90c12 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 5d6ce7f..3baf1c6 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 586dbd0..f9cce91 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 63fbb6e..8e28d5e 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 05e3244..bd9d66e 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 5619b68..0334c06 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 034b0a3..1c34c42 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 9769893..86b9e3a 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index b60e4aa..d61d4c2 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 52ea97d..41fa09b 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 9a318af..180471e 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 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-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 15a7100..4091d21 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="20180527" />
+    <meta name="Date-Revision-yyyymmdd" content="20180528" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -730,7 +730,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-27</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-28</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index a538176..f5c28f3 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -390,6 +390,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#ACCESS_CONTROLLER">ACCESS_CONTROLLER</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html" title="class in org.apache.hadoop.hbase.security.access">TestWithDisabledAuthorization</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#accessController">accessController</a></span> - Static variable in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html" title="class in org.apache.hadoop.hbase.rsgroup">TestRSGroupsWithACL</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessReadAction.html#AccessReadAction-org.apache.hadoop.hbase.TableName-">AccessReadAction(TableName)</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessReadAction.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl.AccessReadAction</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessWriteAction.html#AccessWriteAction-org.apache.hadoop.hbase.TableName-">AccessWriteAction(TableName)</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessWriteAction.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl.AccessWriteAction</a></dt>
@@ -8960,6 +8962,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/compactions/PerfTestCompactionPolicies.html#cp">cp</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.compactions.<a href="org/apache/hadoop/hbase/regionserver/compactions/PerfTestCompactionPolicies.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">PerfTestCompactionPolicies</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#CP_ENV">CP_ENV</a></span> - Static variable in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html" title="class in org.apache.hadoop.hbase.rsgroup">TestRSGroupsWithACL</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessController.html#CP_ENV">CP_ENV</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessController.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessController</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessController3.html#CP_ENV">CP_ENV</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessController3.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessController3</a></dt>
@@ -10642,6 +10646,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/MultithreadedTestUtil.TestThread.html#ctx">ctx</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/MultithreadedTestUtil.TestThread.html" title="class in org.apache.hadoop.hbase">MultithreadedTestUtil.TestThread</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#CTX">CTX</a></span> - Static variable in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html" title="class in org.apache.hadoop.hbase.rsgroup">TestRSGroupsWithACL</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/NanoTimer.html#cumulate">cumulate</a></span> - Variable in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/NanoTimer.html" title="class in org.apache.hadoop.hbase.io.hfile">NanoTimer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/MultiThreadedReader.HBaseReaderThread.html#curKey">curKey</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/MultiThreadedReader.HBaseReaderThread.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedReader.HBaseReaderThread</a></dt>
@@ -57432,6 +57438,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.html#testRemoveServers--">testRemoveServers()</a></span> - Method in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsBase.html" title="class in org.apache.hadoop.hbase.rsgroup">TestRSGroupsBase</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#testRemoveServers--">testRemoveServers()</a></span> - Method in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html" title="class in org.apache.hadoop.hbase.rsgroup">TestRSGroupsWithACL</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestHFileArchiving.html#testRemovesRegionDirOnArchive--">testRemovesRegionDirOnArchive()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestHFileArchiving.html" title="class in org.apache.hadoop.hbase.backup">TestHFileArchiving</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestTableDescriptorBuilder.html#testRemoveString--">testRemoveString()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TestTableDescriptorBuilder</a></dt>
@@ -65454,6 +65462,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestVersionResource.html#validate-org.apache.hadoop.hbase.rest.model.VersionModel-">validate(VersionModel)</a></span> - Static method in class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestVersionResource.html" title="class in org.apache.hadoop.hbase.rest">TestVersionResource</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#validateAdminPermissions-org.apache.hadoop.hbase.security.access.SecureTestUtil.AccessTestAction-">validateAdminPermissions(SecureTestUtil.AccessTestAction)</a></span> - Method in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html" title="class in org.apache.hadoop.hbase.rsgroup">TestRSGroupsWithACL</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html#validateColumnFamilyAddition-org.apache.hadoop.hbase.master.HMaster-org.apache.hadoop.hbase.TableName-java.lang.String-">validateColumnFamilyAddition(HMaster, TableName, String)</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureTestingUtility</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html#validateColumnFamilyDeletion-org.apache.hadoop.hbase.master.HMaster-org.apache.hadoop.hbase.TableName-java.lang.String-">validateColumnFamilyDeletion(HMaster, TableName, String)</a></span> - Static method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureTestingUtility</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/TestJMXConnectorServer.MyAccessController.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestJMXConnectorServer.MyAccessController.html b/testdevapidocs/org/apache/hadoop/hbase/TestJMXConnectorServer.MyAccessController.html
index 06a9967..e039ba8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestJMXConnectorServer.MyAccessController.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestJMXConnectorServer.MyAccessController.html
@@ -222,7 +222,7 @@ extends org.apache.hadoop.hbase.security.access.AccessController</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.security.access.AccessController</h3>
-<code>checkLockPermissions, checkPermissions, getAuthManager, getBulkLoadObserver, getEndpointObserver, getMasterObserver, getRegion, getRegionObserver, getRegionServerObserver, getServices, getUserPermissions, grant, isCellAuthorizationSupported, postAbortProcedure, postCompletedCreateTableAction, postCreateReplicationEndPoint, postDelete, postDeleteNamespace, postDeleteTable, postEndpointInvocation, postGetTableDescriptors, postGetTableNames, postListNamespaceDescriptors, postModifyTable, postMutationBeforeWAL, postOpen, postPut, postRollWALWriterRequest, postScannerClose, postScannerFilterRow, postScannerOpen, postTruncateTable, preAbortProcedure, preAddReplicationPeer, preAppend, preAppendAfterRowLock, preAssign, preBalance, preBalanceSwitch, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCleanupBulkLoad, preClearCompactionQueues, preClearDeadServers, preCloneSnapshot, preClose, preCompact, preCr
 eateNamespace, preCreateTable, preDecommissionRegionServers, preDelete, preDeleteNamespace, preDeleteSnapshot, preDeleteTable, preDisableReplicationPeer, preDisableTable, preEnableReplicationPeer, preEnableTable, preEndpointInvocation, preExists, preFlush, preGetLocks, preGetNamespaceDescriptor, preGetOp, preGetProcedures, preGetReplicationPeerConfig, preGetTableDescriptors, preIncrement, preIncrementAfterRowLock, preListDecommissionedRegionServers, preListReplicationPeers, preListSnapshot, preLockHeartbeat, preMergeRegions, preModifyNamespace, preModifyTable, preMove, preOpen, prePrepareBulkLoad, prePut, preRecommissionRegionServer, preRegionOffline, preRemoveReplicationPeer, preReplicateLogEntries, preRequestLock, preRestoreSnapshot, preRollWALWriterRequest, preScannerClose, preScannerNext, preScannerOpen, preSetNamespaceQuota, preSetSplitOrMergeEnabled, preSetTableQuota, preSetUserQuota, preSetUserQuota, preSetUserQuota, preSnapshot, preSplitRegion, preTableFlush, preTruncateTabl
 e, preUnassign, preUpdateReplicationPeerConfig, requireAccess, requireGlobalPermission, requireGlobalPermission, requireNamespacePermission, requireNamespacePermission, requirePermission, requirePermission, requireTablePermission, revoke, start, stop</code></li>
+<code>checkLockPermissions, checkPermissions, getAuthManager, getBulkLoadObserver, getEndpointObserver, getMasterObserver, getRegion, getRegionObserver, getRegionServerObserver, getServices, getUserPermissions, grant, isCellAuthorizationSupported, postAbortProcedure, postCompletedCreateTableAction, postCreateReplicationEndPoint, postDelete, postDeleteNamespace, postDeleteTable, postEndpointInvocation, postGetTableDescriptors, postGetTableNames, postListNamespaceDescriptors, postModifyTable, postMutationBeforeWAL, postOpen, postPut, postRollWALWriterRequest, postScannerClose, postScannerFilterRow, postScannerOpen, postTruncateTable, preAbortProcedure, preAddReplicationPeer, preAddRSGroup, preAppend, preAppendAfterRowLock, preAssign, preBalance, preBalanceRSGroup, preBalanceSwitch, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCleanupBulkLoad, preClearCompactionQueues, preClearDeadServers, preCloneSna
 pshot, preClose, preCompact, preCreateNamespace, preCreateTable, preDecommissionRegionServers, preDelete, preDeleteNamespace, preDeleteSnapshot, preDeleteTable, preDisableReplicationPeer, preDisableTable, preEnableReplicationPeer, preEnableTable, preEndpointInvocation, preExists, preFlush, preGetLocks, preGetNamespaceDescriptor, preGetOp, preGetProcedures, preGetReplicationPeerConfig, preGetTableDescriptors, preIncrement, preIncrementAfterRowLock, preListDecommissionedRegionServers, preListReplicationPeers, preListSnapshot, preLockHeartbeat, preMergeRegions, preModifyNamespace, preModifyTable, preMove, preMoveServers, preMoveServersAndTables, preMoveTables, preOpen, prePrepareBulkLoad, prePut, preRecommissionRegionServer, preRegionOffline, preRemoveReplicationPeer, preRemoveRSGroup, preRemoveServers, preReplicateLogEntries, preRequestLock, preRestoreSnapshot, preRollWALWriterRequest, preScannerClose, preScannerNext, preScannerOpen, preSetNamespaceQuota, preSetSplitOrMergeEnabled, pr
 eSetTableQuota, preSetUserQuota, preSetUserQuota, preSetUserQuota, preSnapshot, preSplitRegion, preTableFlush, preTruncateTable, preUnassign, preUpdateReplicationPeerConfig, requireAccess, requireGlobalPermission, requireGlobalPermission, requireNamespacePermission, requireNamespacePermission, requirePermission, requirePermission, requireTablePermission, revoke, start, stop</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -236,7 +236,7 @@ extends org.apache.hadoop.hbase.security.access.AccessController</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.MasterObserver</h3>
-<code>postAddReplicationPeer, postAddRSGroup, postAssign, postBalance, postBalanceRSGroup, postBalanceSwitch, postClearDeadServers, postCloneSnapshot, postCompletedDeleteTableAction, postCompletedDisableTableAction, postCompletedEnableTableAction, postCompletedMergeRegionsAction, postCompletedModifyTableAction, postCompletedModifyTableAction, postCompletedSplitRegionAction, postCompletedTruncateTableAction, postCreateNamespace, postCreateTable, postDecommissionRegionServers, postDeleteSnapshot, postDisableReplicationPeer, postDisableTable, postEnableReplicationPeer, postEnableTable, postGetClusterMetrics, postGetLocks, postGetNamespaceDescriptor, postGetProcedures, postGetReplicationPeerConfig, postListDecommissionedRegionServers, postListReplicationPeers, postListSnapshot, postLockHeartbeat, postMergeRegions, postMergeRegionsCommitAction, postModifyNamespace, postModifyNamespace, postModifyTable, postMove, postMoveServers, postMoveServersAndTables, postMoveTables, postRecommissionR
 egionServer, postRegionOffline, postRemoveReplicationPeer, postRemoveRSGroup, postRemoveServers, postRequestLock, postRestoreSnapshot, postRollBackMergeRegionsAction, postRollBackSplitRegionAction, postSetNamespaceQuota, postSetSplitOrMergeEnabled, postSetTableQuota, postSetUserQuota, postSetUserQuota, postSetUserQuota, postSnapshot, postTableFlush, postUnassign, postUpdateReplicationPeerConfig, preAddRSGroup, preBalanceRSGroup, preCreateTableAction, preDeleteTableAction, preDisableTableAction, preEnableTableAction, preGetClusterMetrics, preGetTableNames, preListNamespaceDescriptors, preMasterInitialization, preMergeRegionsAction, preMergeRegionsCommitAction, preModifyNamespace, preModifyTable, preModifyTableAction, preModifyTableAction, preMoveServers, preMoveServersAndTables, preMoveTables, preRemoveRSGroup, preRemoveServers, preSplitRegionAction, preSplitRegionAfterMETAAction, preSplitRegionBeforeMETAAction, preTruncateTableAction</code></li>
+<code>postAddReplicationPeer, postAddRSGroup, postAssign, postBalance, postBalanceRSGroup, postBalanceSwitch, postClearDeadServers, postCloneSnapshot, postCompletedDeleteTableAction, postCompletedDisableTableAction, postCompletedEnableTableAction, postCompletedMergeRegionsAction, postCompletedModifyTableAction, postCompletedModifyTableAction, postCompletedSplitRegionAction, postCompletedTruncateTableAction, postCreateNamespace, postCreateTable, postDecommissionRegionServers, postDeleteSnapshot, postDisableReplicationPeer, postDisableTable, postEnableReplicationPeer, postEnableTable, postGetClusterMetrics, postGetLocks, postGetNamespaceDescriptor, postGetProcedures, postGetReplicationPeerConfig, postListDecommissionedRegionServers, postListReplicationPeers, postListSnapshot, postLockHeartbeat, postMergeRegions, postMergeRegionsCommitAction, postModifyNamespace, postModifyNamespace, postModifyTable, postMove, postMoveServers, postMoveServersAndTables, postMoveTables, postRecommissionR
 egionServer, postRegionOffline, postRemoveReplicationPeer, postRemoveRSGroup, postRemoveServers, postRequestLock, postRestoreSnapshot, postRollBackMergeRegionsAction, postRollBackSplitRegionAction, postSetNamespaceQuota, postSetSplitOrMergeEnabled, postSetTableQuota, postSetUserQuota, postSetUserQuota, postSetUserQuota, postSnapshot, postTableFlush, postUnassign, postUpdateReplicationPeerConfig, preCreateTableAction, preDeleteTableAction, preDisableTableAction, preEnableTableAction, preGetClusterMetrics, preGetTableNames, preListNamespaceDescriptors, preMasterInitialization, preMergeRegionsAction, preMergeRegionsCommitAction, preModifyNamespace, preModifyTable, preModifyTableAction, preModifyTableAction, preSplitRegionAction, preSplitRegionAfterMETAAction, preSplitRegionBeforeMETAAction, preTruncateTableAction</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionObserver">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index 7f52f3d..d479e67 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -576,15 +576,15 @@
 <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>&lt;E&gt; (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>&lt;T&gt;, 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/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
index 28973e0..a1c9b1d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
@@ -81,14 +81,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Object</span></a>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure&lt;TEnvironment&gt; (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>&lt;T&gt;)
+<li type="circle">org.apache.hadoop.hbase.procedure.Procedure (implements java.util.concurrent.<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>&lt;V&gt;, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedureDescriber.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedureDescriber.TestProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedure.LatchedProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedure.LatchedProcedure</span></a></li>
 </ul>
 </li>
-<li type="circle">org.apache.hadoop.hbase.procedure.Procedure (implements java.util.concurrent.<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>&lt;V&gt;, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
+<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure&lt;TEnvironment&gt; (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>&lt;T&gt;)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedure.LatchedProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedure.LatchedProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedureDescriber.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedureDescriber.TestProcedure</span></a></li>
 </ul>
 </li>
 <li type="circle">org.apache.hadoop.hbase.procedure.ProcedureManager

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index ca2f47e..b5bacb6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -205,9 +205,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>&lt;E&gt; (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>&lt;T&gt;, 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/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
index a3a800f..e78f126 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4485">TestHRegion.Appender</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4486">TestHRegion.Appender</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="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></pre>
 <div class="block">TestCase for append</div>
@@ -228,7 +228,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4486">region</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4487">region</a></pre>
 </li>
 </ul>
 <a name="appendRow">
@@ -237,7 +237,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>appendRow</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4487">appendRow</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4488">appendRow</a></pre>
 </li>
 </ul>
 <a name="family">
@@ -246,7 +246,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>family</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4488">family</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4489">family</a></pre>
 </li>
 </ul>
 <a name="qualifier">
@@ -255,7 +255,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>qualifier</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4489">qualifier</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4490">qualifier</a></pre>
 </li>
 </ul>
 <a name="CHAR">
@@ -264,7 +264,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>CHAR</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4490">CHAR</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4491">CHAR</a></pre>
 </li>
 </ul>
 <a name="appendCounter">
@@ -273,7 +273,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>appendCounter</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4491">appendCounter</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4492">appendCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -290,7 +290,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Appender</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4493">Appender</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4494">Appender</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                 int&nbsp;appendCounter)</pre>
 </li>
 </ul>
@@ -308,7 +308,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4499">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4500">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>&nbsp;in interface&nbsp;<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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
index aa2f731..6cf1758 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3686">TestHRegion.FlushThread</a>
+<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3687">TestHRegion.FlushThread</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>
 </li>
 </ul>
@@ -255,7 +255,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3687">done</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3688">done</a></pre>
 </li>
 </ul>
 <a name="error">
@@ -264,7 +264,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>error</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3688">error</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3689">error</a></pre>
 </li>
 </ul>
 </li>
@@ -281,7 +281,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FlushThread</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3690">FlushThread</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3691">FlushThread</a>()</pre>
 </li>
 </ul>
 </li>
@@ -298,7 +298,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3694">done</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3695">done</a>()</pre>
 </li>
 </ul>
 <a name="checkNoError--">
@@ -307,7 +307,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkNoError</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3701">checkNoError</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3702">checkNoError</a>()</pre>
 </li>
 </ul>
 <a name="run--">
@@ -316,7 +316,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&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3708">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3709">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>&nbsp;in interface&nbsp;<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>
@@ -331,7 +331,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>flush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3735">flush</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3736">flush</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
index dfcc2f4..35bed37 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1283">TestHRegion.GetTillDoneOrException</a>
+<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1284">TestHRegion.GetTillDoneOrException</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>
 </li>
 </ul>
@@ -254,7 +254,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>g</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.client.Get <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1284">g</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.client.Get <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1285">g</a></pre>
 </li>
 </ul>
 <a name="done">
@@ -263,7 +263,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>private final&nbsp;<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/regionserver/TestHRegion.GetTillDoneOrException.html#line.1285">done</a></pre>
+<pre>private final&nbsp;<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/regionserver/TestHRegion.GetTillDoneOrException.html#line.1286">done</a></pre>
 </li>
 </ul>
 <a name="count">
@@ -272,7 +272,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>count</h4>
-<pre>private final&nbsp;<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/regionserver/TestHRegion.GetTillDoneOrException.html#line.1286">count</a></pre>
+<pre>private final&nbsp;<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/regionserver/TestHRegion.GetTillDoneOrException.html#line.1287">count</a></pre>
 </li>
 </ul>
 <a name="e">
@@ -281,7 +281,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>e</h4>
-<pre>private&nbsp;<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/regionserver/TestHRegion.GetTillDoneOrException.html#line.1287">e</a></pre>
+<pre>private&nbsp;<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/regionserver/TestHRegion.GetTillDoneOrException.html#line.1288">e</a></pre>
 </li>
 </ul>
 </li>
@@ -298,7 +298,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>GetTillDoneOrException</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1289">GetTillDoneOrException</a>(int&nbsp;i,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1290">GetTillDoneOrException</a>(int&nbsp;i,
                        byte[]&nbsp;r,
                        <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>&nbsp;d,
                        <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>&nbsp;c)</pre>
@@ -318,7 +318,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1298">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1299">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>&nbsp;in interface&nbsp;<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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
index 998d3a8..86bb800 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6501">TestHRegion.HRegionForTesting</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6502">TestHRegion.HRegionForTesting</a>
 extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <div class="block">The same as HRegion class, the only difference is that instantiateHStore will
  create a different HStore - HStoreForTesting. [HBASE-8518]</div>
@@ -259,7 +259,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>HRegionForTesting</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6503">HRegionForTesting</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6504">HRegionForTesting</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
                          org.apache.hadoop.hbase.wal.WAL&nbsp;wal,
                          org.apache.hadoop.fs.FileSystem&nbsp;fs,
                          org.apache.hadoop.conf.Configuration&nbsp;confParam,
@@ -274,7 +274,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegionForTesting</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6510">HRegionForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegionFileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6511">HRegionForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegionFileSystem&nbsp;fs,
                          org.apache.hadoop.hbase.wal.WAL&nbsp;wal,
                          org.apache.hadoop.conf.Configuration&nbsp;confParam,
                          org.apache.hadoop.hbase.client.TableDescriptor&nbsp;htd,
@@ -295,7 +295,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>instantiateHStore</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HStore&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6521">instantiateHStore</a>(org.apache.hadoop.hbase.client.ColumnFamilyDescriptor&nbsp;family)
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HStore&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6522">instantiateHStore</a>(org.apache.hadoop.hbase.client.ColumnFamilyDescriptor&nbsp;family)
                                                                  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>
 <div class="block">Create HStore instance.</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
index 0d23704..ff53c2f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5892">TestHRegion.HRegionWithSeqId</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5893">TestHRegion.HRegionWithSeqId</a>
 extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 </li>
 </ul>
@@ -248,7 +248,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegionWithSeqId</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5893">HRegionWithSeqId</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5894">HRegionWithSeqId</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
                         org.apache.hadoop.hbase.wal.WAL&nbsp;wal,
                         org.apache.hadoop.fs.FileSystem&nbsp;fs,
                         org.apache.hadoop.conf.Configuration&nbsp;confParam,
@@ -271,7 +271,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getNextSequenceId</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5899">getNextSequenceId</a>(org.apache.hadoop.hbase.wal.WAL&nbsp;wal)
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5900">getNextSequenceId</a>(org.apache.hadoop.hbase.wal.WAL&nbsp;wal)
                           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">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
index 6b0b5d8..ea3db14 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6543">TestHRegion.HStoreForTesting</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6544">TestHRegion.HStoreForTesting</a>
 extends org.apache.hadoop.hbase.regionserver.HStore</pre>
 <div class="block">HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method
  of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which
@@ -234,7 +234,7 @@ extends org.apache.hadoop.hbase.regionserver.HStore</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HStoreForTesting</h4>
-<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6545">HStoreForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6546">HStoreForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                            org.apache.hadoop.hbase.client.ColumnFamilyDescriptor&nbsp;family,
                            org.apache.hadoop.conf.Configuration&nbsp;confParam)
                     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>
@@ -258,7 +258,7 @@ extends org.apache.hadoop.hbase.regionserver.HStore</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doCompaction</h4>
-<pre>protected&nbsp;<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>&lt;org.apache.hadoop.hbase.regionserver.HStoreFile&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6552">doCompaction</a>(org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl&nbsp;cr,
+<pre>protected&nbsp;<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>&lt;org.apache.hadoop.hbase.regionserver.HStoreFile&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6553">doCompaction</a>(org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl&nbsp;cr,
                                                                              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;org.apache.hadoop.hbase.regionserver.HStoreFile&gt;&nbsp;filesToCompact,
                                                                              org.apache.hadoop.hbase.security.User&nbsp;user,
                                                                              long&nbsp;compactionStartTime,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
index d24d37b..8b8de65 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4398">TestHRegion.Incrementer</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4399">TestHRegion.Incrementer</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="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></pre>
 <div class="block">TestCase for increment</div>
@@ -228,7 +228,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4399">region</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4400">region</a></pre>
 </li>
 </ul>
 <a name="incRow">
@@ -237,7 +237,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>incRow</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4400">incRow</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4401">incRow</a></pre>
 </li>
 </ul>
 <a name="family">
@@ -246,7 +246,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>family</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4401">family</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4402">family</a></pre>
 </li>
 </ul>
 <a name="qualifier">
@@ -255,7 +255,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>qualifier</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4402">qualifier</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4403">qualifier</a></pre>
 </li>
 </ul>
 <a name="ONE">
@@ -264,7 +264,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockList">
 <li class="blockList">
 <h4>ONE</h4>
-<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4403">ONE</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4404">ONE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestHRegion.Incrementer.ONE">Constant Field Values</a></dd>
@@ -277,7 +277,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>incCounter</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4404">incCounter</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4405">incCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -294,7 +294,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Incrementer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4406">Incrementer</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4407">Incrementer</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                    int&nbsp;incCounter)</pre>
 </li>
 </ul>
@@ -312,7 +312,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4412">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4413">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>&nbsp;in interface&nbsp;<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>


[23/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/MasterCoprocessorEnvironment.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/MasterCoprocessorEnvironment.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/MasterCoprocessorEnvironment.html
index fcb8070..3a8c9b2 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/MasterCoprocessorEnvironment.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/MasterCoprocessorEnvironment.html
@@ -1453,13 +1453,23 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preAddRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preAddRSGroup</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+             <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>&nbsp;name)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preAssign-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-">preAssign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
          <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preBalance-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preBalance</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c)</code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preBalanceRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preBalanceRSGroup</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                 <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>&nbsp;groupName)</code>&nbsp;</td>
+</tr>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preBalanceSwitch-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preBalanceSwitch</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
@@ -1611,115 +1621,144 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.lang.String-">preMoveServers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers,
+              <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>&nbsp;targetGroup)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveServersAndTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.util.Set-java.lang.String-">preMoveServersAndTables</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;tables,
+                       <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>&nbsp;targetGroup)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.lang.String-">preMoveTables</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;tables,
+             <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>&nbsp;targetGroup)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRecommissionRegionServer-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.ServerName-java.util.List-">preRecommissionRegionServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                            <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server,
                            <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>&lt;byte[]&gt;&nbsp;encodedRegionNames)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRegionOffline-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-">preRegionOffline</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
                 <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveReplicationPeer-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preRemoveReplicationPeer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                         <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>&nbsp;peerId)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preRemoveRSGroup</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                <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>&nbsp;name)</code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-">preRemoveServers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRequestLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.RegionInfo:A-java.lang.String-">preRequestLock</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
               <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>&nbsp;namespace,
               <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
               <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;regionInfos,
               <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>&nbsp;description)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRestoreSnapshot-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.SnapshotDescription-org.apache.hadoop.hbase.client.TableDescriptor-">preRestoreSnapshot</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                   <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot,
                   <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;hTableDescriptor)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetNamespaceQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetNamespaceQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                     <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>&nbsp;namespace,
                     <a href="../../../../../../org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.html" title="class in org.apache.hadoop.hbase.quotas">GlobalQuotaSettings</a>&nbsp;quotas)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetSplitOrMergeEnabled-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-org.apache.hadoop.hbase.client.MasterSwitchType-">preSetSplitOrMergeEnabled</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                          boolean&nbsp;newValue,
                          <a href="../../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client">MasterSwitchType</a>&nbsp;switchType)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetTableQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetTableQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                 <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                 <a href="../../../../../../org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.html" title="class in org.apache.hadoop.hbase.quotas">GlobalQuotaSettings</a>&nbsp;quotas)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetUserQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetUserQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <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>&nbsp;userName,
                <a href="../../../../../../org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.html" title="class in org.apache.hadoop.hbase.quotas">GlobalQuotaSettings</a>&nbsp;quotas)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetUserQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-java.lang.String-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetUserQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <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>&nbsp;userName,
                <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>&nbsp;namespace,
                <a href="../../../../../../org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.html" title="class in org.apache.hadoop.hbase.quotas">GlobalQuotaSettings</a>&nbsp;quotas)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetUserQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetUserQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <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>&nbsp;userName,
                <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                <a href="../../../../../../org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.html" title="class in org.apache.hadoop.hbase.quotas">GlobalQuotaSettings</a>&nbsp;quotas)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preShutdown-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preShutdown</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSnapshot-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.SnapshotDescription-org.apache.hadoop.hbase.client.TableDescriptor-">preSnapshot</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
            <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot,
            <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;hTableDescriptor)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSplitRegion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-byte:A-">preSplitRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
               <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
               byte[]&nbsp;splitRow)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preStopMaster-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preStopMaster</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preTableFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-">preTableFlush</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
              <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preTruncateTable-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-">preTruncateTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
                 <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preUnassign-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-boolean-">preUnassign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
            boolean&nbsp;force)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preUpdateReplicationPeerConfig-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.replication.ReplicationPeerConfig-">preUpdateReplicationPeerConfig</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                               <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>&nbsp;peerId,
                               <a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html" title="class in org.apache.hadoop.hbase.replication">ReplicationPeerConfig</a>&nbsp;peerConfig)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><span class="typeNameLabel">CoprocessorWhitelistMasterObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/CoprocessorWhitelistMasterObserver.html#verifyCoprocessors-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.TableDescriptor-">verifyCoprocessors</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                   <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)</code>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html
index e69ef81..91534cf 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html
@@ -2549,24 +2549,34 @@
                      <a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html" title="class in org.apache.hadoop.hbase.replication">ReplicationPeerConfig</a>&nbsp;peerConfig)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preAddRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preAddRSGroup</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+             <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>&nbsp;name)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a></code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
          <a href="../../../../../../org/apache/hadoop/hbase/client/Append.html" title="class in org.apache.hadoop.hbase.client">Append</a>&nbsp;append)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a></code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
                      <a href="../../../../../../org/apache/hadoop/hbase/client/Append.html" title="class in org.apache.hadoop.hbase.client">Append</a>&nbsp;append)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preAssign-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-">preAssign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
          <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preBalance-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preBalance</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preBalanceRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preBalanceRSGroup</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                 <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>&nbsp;groupName)</code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preBalanceSwitch-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preBalanceSwitch</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
@@ -2846,66 +2856,95 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.lang.String-">preMoveServers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers,
+              <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>&nbsp;targetGroup)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveServersAndTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.util.Set-java.lang.String-">preMoveServersAndTables</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;tables,
+                       <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>&nbsp;targetGroup)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.lang.String-">preMoveTables</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;tables,
+             <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>&nbsp;targetGroup)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#prePrepareBulkLoad-org.apache.hadoop.hbase.coprocessor.ObserverContext-">prePrepareBulkLoad</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>
 <div class="block">Authorization check for
  SecureBulkLoadProtocol.prepareBulkLoad()</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
       <a href="../../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;put,
       <a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit,
       <a href="../../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;durability)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRecommissionRegionServer-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.ServerName-java.util.List-">preRecommissionRegionServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                            <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server,
                            <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>&lt;byte[]&gt;&nbsp;encodedRegionNames)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRegionOffline-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-">preRegionOffline</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
                 <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveReplicationPeer-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preRemoveReplicationPeer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                         <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>&nbsp;peerId)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preRemoveRSGroup</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                <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>&nbsp;name)</code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preReplicateLogEntries-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preReplicateLogEntries</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionServerCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-">preRemoveServers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preReplicateLogEntries-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preReplicateLogEntries</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionServerCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRequestLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.RegionInfo:A-java.lang.String-">preRequestLock</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
               <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>&nbsp;namespace,
               <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
               <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;regionInfos,
               <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>&nbsp;description)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRestoreSnapshot-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.SnapshotDescription-org.apache.hadoop.hbase.client.TableDescriptor-">preRestoreSnapshot</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                   <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot,
                   <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;hTableDescriptor)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRollWALWriterRequest-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preRollWALWriterRequest</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionServerCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
                <a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;s)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
               <a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;s,
@@ -2913,110 +2952,110 @@
               int&nbsp;limit,
               boolean&nbsp;hasNext)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
               <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetNamespaceQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetNamespaceQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                     <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>&nbsp;namespace,
                     <a href="../../../../../../org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.html" title="class in org.apache.hadoop.hbase.quotas">GlobalQuotaSettings</a>&nbsp;quotas)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetSplitOrMergeEnabled-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-org.apache.hadoop.hbase.client.MasterSwitchType-">preSetSplitOrMergeEnabled</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                          boolean&nbsp;newValue,
                          <a href="../../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client">MasterSwitchType</a>&nbsp;switchType)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetTableQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetTableQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                 <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                 <a href="../../../../../../org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.html" title="class in org.apache.hadoop.hbase.quotas">GlobalQuotaSettings</a>&nbsp;quotas)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetUserQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetUserQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <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>&nbsp;userName,
                <a href="../../../../../../org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.html" title="class in org.apache.hadoop.hbase.quotas">GlobalQuotaSettings</a>&nbsp;quotas)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetUserQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-java.lang.String-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetUserQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <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>&nbsp;userName,
                <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>&nbsp;namespace,
                <a href="../../../../../../org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.html" title="class in org.apache.hadoop.hbase.quotas">GlobalQuotaSettings</a>&nbsp;quotas)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetUserQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetUserQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <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>&nbsp;userName,
                <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                <a href="../../../../../../org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.html" title="class in org.apache.hadoop.hbase.quotas">GlobalQuotaSettings</a>&nbsp;quotas)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preShutdown-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preShutdown</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSnapshot-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.SnapshotDescription-org.apache.hadoop.hbase.client.TableDescriptor-">preSnapshot</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
            <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot,
            <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;hTableDescriptor)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSplitRegion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-byte:A-">preSplitRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
               <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
               byte[]&nbsp;splitRow)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preStopMaster-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preStopMaster</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preStopRegionServer-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preStopRegionServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionServerCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preTableFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-">preTableFlush</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
              <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preTruncateTable-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-">preTruncateTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
                 <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preUnassign-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-boolean-">preUnassign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
            boolean&nbsp;force)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preUpdateReplicationPeerConfig-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.replication.ReplicationPeerConfig-">preUpdateReplicationPeerConfig</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                               <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>&nbsp;peerId,
                               <a href="../../../../../../org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html" title="class in org.apache.hadoop.hbase.replication">ReplicationPeerConfig</a>&nbsp;peerConfig)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#requireAccess-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.security.access.Permission.Action...-">requireAccess</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;?&gt;&nbsp;ctx,
              <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>&nbsp;request,
              <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
              <a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access">Permission.Action</a>...&nbsp;permissions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#requireGlobalPermission-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.security.access.Permission.Action-java.lang.String-">requireGlobalPermission</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;?&gt;&nbsp;ctx,
                        <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>&nbsp;request,
                        <a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access">Permission.Action</a>&nbsp;perm,
                        <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>&nbsp;namespace)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#requireGlobalPermission-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.security.access.Permission.Action-org.apache.hadoop.hbase.TableName-java.util.Map-">requireGlobalPermission</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;?&gt;&nbsp;ctx,
                        <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>&nbsp;request,
@@ -3024,14 +3063,14 @@
                        <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                        <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>&lt;byte[],? extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;byte[]&gt;&gt;&nbsp;familyMap)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#requireNamespacePermission-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-java.lang.String-org.apache.hadoop.hbase.security.access.Permission.Action...-">requireNamespacePermission</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;?&gt;&nbsp;ctx,
                           <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>&nbsp;request,
                           <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>&nbsp;namespace,
                           <a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access">Permission.Action</a>...&nbsp;permissions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#requireNamespacePermission-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-java.lang.String-org.apache.hadoop.hbase.TableName-java.util.Map-org.apache.hadoop.hbase.security.access.Permission.Action...-">requireNamespacePermission</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;?&gt;&nbsp;ctx,
                           <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>&nbsp;request,
@@ -3040,13 +3079,13 @@
                           <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>&lt;byte[],? extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;byte[]&gt;&gt;&nbsp;familyMap,
                           <a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access">Permission.Action</a>...&nbsp;permissions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#requirePermission-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.security.access.Permission.Action-">requirePermission</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;?&gt;&nbsp;ctx,
                  <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>&nbsp;request,
                  <a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access">Permission.Action</a>&nbsp;perm)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#requirePermission-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.TableName-byte:A-byte:A-org.apache.hadoop.hbase.security.access.Permission.Action...-">requirePermission</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;?&gt;&nbsp;ctx,
                  <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>&nbsp;request,
@@ -3055,7 +3094,7 @@
                  byte[]&nbsp;qualifier,
                  <a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access">Permission.Action</a>...&nbsp;permissions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#requireTablePermission-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.TableName-byte:A-byte:A-org.apache.hadoop.hbase.security.access.Permission.Action...-">requireTablePermission</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;?&gt;&nbsp;ctx,
                       <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>&nbsp;request,
@@ -3064,7 +3103,7 @@
                       byte[]&nbsp;qualifier,
                       <a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access">Permission.Action</a>...&nbsp;permissions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><span class="typeNameLabel">CoprocessorWhitelistMasterObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/CoprocessorWhitelistMasterObserver.html#verifyCoprocessors-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.TableDescriptor-">verifyCoprocessors</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                   <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)</code>


[11/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
index 827d1f3..1b32e2b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
@@ -252,6332 +252,6333 @@
 <span class="sourceLineNo">244</span>    dir = TEST_UTIL.getDataTestDir("TestHRegion").toString();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    method = name.getMethodName();<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    tableName = TableName.valueOf(method);<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>  @After<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public void tearDown() throws Exception {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    TEST_UTIL.cleanupTestDir();<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @throws IOException<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Test<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void testSequenceId() throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // Open region again.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    byte [] value = Bytes.toBytes(method);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Make a random put against our cf.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Put put = new Put(value);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    region.put(put);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // No flush yet so init numbers should still be in place.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    region.flush(true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    long max = region.getMaxFlushedSeqId();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    region.close();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<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>   * Test for Bug 2 of HBASE-10466.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flushes for region close."<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * @throws IOException<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Test<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // Get some random bytes.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    byte [] value = Bytes.toBytes(method);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    // Make a random put against our cf.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    Put put = new Put(value);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    region.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    storeFlushCtx.prepare();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // Second put something in current memstore<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    region.put(put);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    region.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  /*<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * See HBASE-10845<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Test<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      StoreFlushContext storeFlushCtx;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.325"></a>
-<span class="sourceLineNo">326</span>          throws IOException {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        super(fs, rootDir, logName, conf);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>      @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      public void sync(long txid) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        storeFlushCtx.prepare();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        super.sync(txid);<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><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        COLUMN_FAMILY_BYTES);<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // Get some random bytes.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    byte [] value = Bytes.toBytes(method);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    Put put = new Put(value);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    boolean threwIOE = false;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      region.put(put);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    } catch (IOException ioe) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      threwIOE = true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    } finally {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        mss.getDataSize() == 0);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<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>   * Create a WAL outside of the usual helper in<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@code fs.file.impl}.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final Configuration walConf = new Configuration(conf);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return new WALFactory(walConf, callingMethod)<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Test<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootDir = new Path(dir + testName);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        COLUMN_FAMILY_BYTES);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // Put one value<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    byte [] value = Bytes.toBytes(method);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    Put put = new Put(value);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    region.put(put);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(onePutSize &gt; 0);<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    doThrow(new IOException())<a name="line.406"></a>
-<span class="sourceLineNo">407</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    put = new Put(value);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    try {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      region.put(put);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      fail("Should have failed with IOException");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (IOException expected) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    long expectedSize = onePutSize * 2;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    assertEquals("memstoreSize should be incremented",<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        expectedSize, region.getMemStoreDataSize());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    assertEquals("flushable size should be incremented",<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    region.setCoprocessorHost(null);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * if memstoreSize is not larger than 0."<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws Exception<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Test<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // Only retry once.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final User user =<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // Inject our faulty LocalFileSystem<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      public Object run() throws Exception {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        FileSystem fs = FileSystem.get(conf);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HRegion region = null;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        try {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          // Initialize region<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>              COLUMN_FAMILY_BYTES);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          long size = region.getMemStoreDataSize();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          Assert.assertEquals(0, size);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          Put p1 = new Put(row);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          region.put(p1);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          try {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            LOG.info("Flushing");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            region.flush(true);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          } catch (DroppedSnapshotException dse) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>            // What we are expecting<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // Make it so all writes succeed from here on out<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          ffs.fault.set(false);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // Check sizes.  Should still be the one entry.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          // subtract the right amount, the snapshot size only.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          Put p2 = new Put(row);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.488"></a>
-<span class="sourceLineNo">489</span>          region.put(p2);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          // it<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          region.flush(true);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          // Make sure our memory accounting is right.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } finally {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        return null;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    });<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Test<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    // Only retry once.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    final User user =<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Inject our faulty LocalFileSystem<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      @Override<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      public Object run() throws Exception {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        FileSystem fs = FileSystem.get(conf);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        HRegion region = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        try {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // Initialize region<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region = initHRegion(tableName, null, null, false,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          long size = region.getMemStoreDataSize();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          Assert.assertEquals(0, size);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          Put p1 = new Put(row);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          region.put(p1);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          StoreFlushContext storeFlushCtx =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          storeFlushCtx.prepare();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          // Now add two entries to the foreground memstore.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          Put p2 = new Put(row);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          region.put(p2);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          // Now try close on top of a failing flush.<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          region.close();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          fail();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } catch (DroppedSnapshotException dse) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          // Expected<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        } finally {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          ffs.fault.set(false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    });<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  @Test<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    byte[] family = Bytes.toBytes("family");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    region.put(put);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    region.flush(true);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    Scan scan = new Scan();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    scan.setMaxVersions(3);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    // open the first scanner<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    region.delete(delete);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    region.flush(true);<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    // open the second scanner<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    // make a major compaction<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    region.compact(true);<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>    // open the third scanner<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    scanner1.next(results);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    System.out.println(results);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assertEquals(1, results.size());<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    results.clear();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    scanner2.next(results);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    System.out.println(results);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    assertEquals(0, results.size());<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    results.clear();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scanner3.next(results);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    System.out.println(results);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    assertEquals(0, results.size());<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  @Test<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    byte[] family = Bytes.toBytes("family");<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    region.put(put);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    region.put(put);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.flush(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    Scan scan = new Scan();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    scan.setMaxVersions(3);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the first scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    region.compact(true);<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    scanner1.next(results);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Cell keyValue = results.get(0);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner1.close();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  @Test<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    byte[] family = Bytes.toBytes("family");<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    try {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>      long maxSeqId = 1050;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      long minSeqId = 1000;<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        fs.create(recoveredEdits);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>        long time = System.nanoTime();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        WALEdit edit = new WALEdit();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.662"></a>
-<span class="sourceLineNo">663</span>            .toBytes(i)));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>        writer.close();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      for (HStore store : region.getStores()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assertEquals(maxSeqId, seqId);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      region.getMVCC().advanceTo(seqId);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      Get get = new Get(row);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Result result = region.get(get);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        assertEquals(1, kvs.size());<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    } finally {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.region = null;<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      wals.close();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @Test<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    byte[] family = Bytes.toBytes("family");<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    try {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>      long maxSeqId = 1050;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      long minSeqId = 1000;<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        fs.create(recoveredEdits);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long time = System.nanoTime();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        WALEdit edit = new WALEdit();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.713"></a>
-<span class="sourceLineNo">714</span>            .toBytes(i)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>        writer.close();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      long recoverSeqId = 1030;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (HStore store : region.getStores()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertEquals(maxSeqId, seqId);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      region.getMVCC().advanceTo(seqId);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Get get = new Get(row);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      Result result = region.get(get);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        if (i &lt; recoverSeqId) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>          assertEquals(0, kvs.size());<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        } else {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          assertEquals(1, kvs.size());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    } finally {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      this.region = null;<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      wals.close();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  @Test<a name="line.747"></a>
-<span class="sourceLineNo">748</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    byte[] family = Bytes.toBytes("family");<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    try {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        dos.writeInt(i);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        dos.close();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      long minSeqId = 2000;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      dos.close();<a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, null);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      assertEquals(minSeqId, seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    } finally {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      this.region = null;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    byte[] family = Bytes.toBytes("family");<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    try {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>      long maxSeqId = 1050;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      long minSeqId = 1000;<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        fs.create(recoveredEdits);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>        long time = System.nanoTime();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        WALEdit edit = null;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        if (i == maxSeqId) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          CompactionDescriptor.newBuilder()<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          .build());<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        } else {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          edit = new WALEdit();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.815"></a>
-<span class="sourceLineNo">816</span>            .toBytes(i)));<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        }<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        writer.close();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>      long recoverSeqId = 1030;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      for (HStore store : region.getStores()) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      assertEquals(maxSeqId, seqId);<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>      // assert that the files are flushed<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.833"></a>
-<span class="sourceLineNo">834</span><a name="line.834"></a>
-<span class="sourceLineNo">835</span>    } finally {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      this.region = null;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      wals.close();<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    }<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Test<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    testRecoveredEditsReplayCompaction(false);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    testRecoveredEditsReplayCompaction(true);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    byte[] family = Bytes.toBytes("family");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    try {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>      long maxSeqId = 3;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      long minSeqId = 0;<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.862"></a>
-<span class="sourceLineNo">863</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        region.put(put);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        region.flush(true);<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>      // this will create a region with 3 files<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        storeFiles.add(sf.getPath());<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // disable compaction completion<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      region.compactStores();<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // ensure that nothing changed<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          + "from the compaction, could not find any";<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      assertNotNull(errorMsg, files);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      assertEquals(errorMsg, 1, files.length);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      // move the file inside region dir<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          files[0].getPath());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        // Mix the byte array to have a new encodedName<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.902"></a>
-<span class="sourceLineNo">903</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      fs.create(recoveredEdits);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      long time = System.nanoTime();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.916"></a>
-<span class="sourceLineNo">917</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          compactionDescriptor)));<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      writer.close();<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // close the region now, and reopen again<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      region.getTableDescriptor();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      region.getRegionInfo();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      region.close();<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      try {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        region = HRegion.openHRegion(region, null);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      } catch (WrongRegionException wre) {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // now check whether we have only one store file, the compacted one<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      for (HStoreFile sf : sfs) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      if (!mismatchedRegionName) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        Result result = region.get(get);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      }<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      this.region = null;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      wals.close();<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  @Test<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  public void testFlushMarkers() throws Exception {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    byte[] family = Bytes.toBytes("family");<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    try {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>      long maxSeqId = 3;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      long minSeqId = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        region.put(put);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        region.flush(true);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>      // this will create a region with 3 files from flush<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        storeFiles.add(sf.getPath().getName());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      }<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // now verify that the flush markers are written<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      wal.shutdown();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        TEST_UTIL.getConfiguration());<a name="line.993"></a>
-<span class="sourceLineNo">994</span>      try {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        long lastFlushSeqId = -1;<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        while (true) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          WAL.Entry entry = reader.next();<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          if (entry == null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            break;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>          }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            assertNotNull(flushDesc);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>            }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            } else {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>            flushDescriptors.add(entry);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        // now write those markers to the recovered edits again.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span><a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span><a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        fs.create(recoveredEdits);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          writer.append(entry);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        writer.close();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      } finally {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (null != reader) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          try {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            reader.close();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          } catch (IOException exception) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>            LOG.debug("exception details", exception);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
+<span class="sourceLineNo">247</span>    CONF.set(CompactingMemStore.IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY, String.valueOf(0.02));<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>  @After<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public void tearDown() throws Exception {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    TEST_UTIL.cleanupTestDir();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @throws IOException<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Test<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public void testSequenceId() throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    region.close();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // Open region again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    byte [] value = Bytes.toBytes(method);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // Make a random put against our cf.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    Put put = new Put(value);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    region.put(put);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // No flush yet so init numbers should still be in place.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    region.flush(true);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    long max = region.getMaxFlushedSeqId();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    region.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(max, region.getMaxFlushedSeqId());<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>  /**<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * Test for Bug 2 of HBASE-10466.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss 

<TRUNCATED>

[19/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 13f949c..29d7634 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -191,9 +191,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>&lt;E&gt; (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>&lt;T&gt;, 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.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 41c2191..474f541 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -198,9 +198,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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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/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/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 bcc5862..c24eb46 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -532,11 +532,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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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>&lt;T&gt;)</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/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>&lt;T&gt;)</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>&lt;T&gt;)</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/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/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>&lt;T&gt;)</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/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/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 9ec5b35..c0e28b4 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>&lt;E&gt; (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>&lt;T&gt;, 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/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>
+<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 8cf12c3..40e8ead 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 = "1eabbb42954b94308f85434ed2a9a80ba3e03c5e";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "1cd2b56802a58b833b78ab11093912417c9a226a";<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 = "Sun May 27 15:02:42 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Mon May 28 14:39:09 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 = "3625a56d34adc99038c1c9b5df6a3db0";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "42221ba251414a3ebe1df73881954c7c";<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/387c169a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html
index d253aa8..149599e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html
@@ -213,337 +213,330 @@
 <span class="sourceLineNo">205</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>          master.getMasterCoprocessorHost().preMoveServers(hostPorts, request.getTargetGroup());<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        checkPermission("moveServers");<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        groupAdminServer.moveServers(hostPorts, request.getTargetGroup());<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          master.getMasterCoprocessorHost().postMoveServers(hostPorts, request.getTargetGroup());<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      } catch (IOException e) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      done.run(builder.build());<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>    @Override<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public void moveTables(RpcController controller, MoveTablesRequest request,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        RpcCallback&lt;MoveTablesResponse&gt; done) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      MoveTablesResponse.Builder builder = MoveTablesResponse.newBuilder();<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      Set&lt;TableName&gt; tables = new HashSet&lt;&gt;(request.getTableNameList().size());<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      for (HBaseProtos.TableName tableName : request.getTableNameList()) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        tables.add(ProtobufUtil.toTableName(tableName));<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      LOG.info(master.getClientIdAuditPrefix() + " move tables " + tables +" to rsgroup "<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          + request.getTargetGroup());<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      try {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          master.getMasterCoprocessorHost().preMoveTables(tables, request.getTargetGroup());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        checkPermission("moveTables");<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        groupAdminServer.moveTables(tables, request.getTargetGroup());<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          master.getMasterCoprocessorHost().postMoveTables(tables, request.getTargetGroup());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      } catch (IOException e) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      done.run(builder.build());<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>    @Override<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    public void addRSGroup(RpcController controller, AddRSGroupRequest request,<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        RpcCallback&lt;AddRSGroupResponse&gt; done) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      AddRSGroupResponse.Builder builder = AddRSGroupResponse.newBuilder();<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      LOG.info(master.getClientIdAuditPrefix() + " add rsgroup " + request.getRSGroupName());<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      try {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          master.getMasterCoprocessorHost().preAddRSGroup(request.getRSGroupName());<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        checkPermission("addRSGroup");<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        groupAdminServer.addRSGroup(request.getRSGroupName());<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          master.getMasterCoprocessorHost().postAddRSGroup(request.getRSGroupName());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      } catch (IOException e) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      done.run(builder.build());<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    @Override<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    public void removeRSGroup(RpcController controller,<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        RemoveRSGroupRequest request, RpcCallback&lt;RemoveRSGroupResponse&gt; done) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      RemoveRSGroupResponse.Builder builder =<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          RemoveRSGroupResponse.newBuilder();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      LOG.info(master.getClientIdAuditPrefix() + " remove rsgroup " + request.getRSGroupName());<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      try {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          master.getMasterCoprocessorHost().preRemoveRSGroup(request.getRSGroupName());<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        }<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        checkPermission("removeRSGroup");<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        groupAdminServer.removeRSGroup(request.getRSGroupName());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          master.getMasterCoprocessorHost().postRemoveRSGroup(request.getRSGroupName());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      } catch (IOException e) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      done.run(builder.build());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @Override<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    public void balanceRSGroup(RpcController controller,<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        BalanceRSGroupRequest request, RpcCallback&lt;BalanceRSGroupResponse&gt; done) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      BalanceRSGroupResponse.Builder builder = BalanceRSGroupResponse.newBuilder();<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      LOG.info(master.getClientIdAuditPrefix() + " balance rsgroup, group=" +<a name="line.289"></a>
-<span class="sourceLineNo">290</span>              request.getRSGroupName());<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          master.getMasterCoprocessorHost().preBalanceRSGroup(request.getRSGroupName());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        checkPermission("balanceRSGroup");<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        boolean balancerRan = groupAdminServer.balanceRSGroup(request.getRSGroupName());<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        builder.setBalanceRan(balancerRan);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          master.getMasterCoprocessorHost().postBalanceRSGroup(request.getRSGroupName(),<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              balancerRan);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      } catch (IOException e) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        builder.setBalanceRan(false);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      done.run(builder.build());<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 listRSGroupInfos(RpcController controller,<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        ListRSGroupInfosRequest request, RpcCallback&lt;ListRSGroupInfosResponse&gt; done) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      ListRSGroupInfosResponse.Builder builder = ListRSGroupInfosResponse.newBuilder();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      LOG.info(master.getClientIdAuditPrefix() + " list rsgroup");<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        checkPermission("listRSGroup");<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        for (RSGroupInfo RSGroupInfo : groupAdminServer.listRSGroups()) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          builder.addRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo));<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      } catch (IOException e) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      done.run(builder.build());<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>    @Override<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    public void getRSGroupInfoOfServer(RpcController controller,<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        GetRSGroupInfoOfServerRequest request, RpcCallback&lt;GetRSGroupInfoOfServerResponse&gt; done) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      GetRSGroupInfoOfServerResponse.Builder builder = GetRSGroupInfoOfServerResponse.newBuilder();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      Address hp = Address.fromParts(request.getServer().getHostName(),<a name="line.329"></a>
-<span class="sourceLineNo">330</span>          request.getServer().getPort());<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, server="<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          + hp);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      try {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        checkPermission("getRSGroupInfoOfServer");<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        RSGroupInfo info = groupAdminServer.getRSGroupOfServer(hp);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        if (info != null) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(info));<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      } catch (IOException e) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      done.run(builder.build());<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 moveServersAndTables(RpcController controller,<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        MoveServersAndTablesRequest request, RpcCallback&lt;MoveServersAndTablesResponse&gt; done) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      MoveServersAndTablesResponse.Builder builder = MoveServersAndTablesResponse.newBuilder();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      Set&lt;Address&gt; hostPorts = Sets.newHashSet();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      for (HBaseProtos.ServerName el : request.getServersList()) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        hostPorts.add(Address.fromParts(el.getHostName(), el.getPort()));<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      Set&lt;TableName&gt; tables = new HashSet&lt;&gt;(request.getTableNameList().size());<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      for (HBaseProtos.TableName tableName : request.getTableNameList()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        tables.add(ProtobufUtil.toTableName(tableName));<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts<a name="line.357"></a>
-<span class="sourceLineNo">358</span>          + " and tables " + tables + " to rsgroup" + request.getTargetGroup());<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      try {<a name="line.359"></a>
+<span class="sourceLineNo">208</span>        groupAdminServer.moveServers(hostPorts, request.getTargetGroup());<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          master.getMasterCoprocessorHost().postMoveServers(hostPorts, request.getTargetGroup());<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      } catch (IOException e) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      done.run(builder.build());<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>    @Override<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public void moveTables(RpcController controller, MoveTablesRequest request,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        RpcCallback&lt;MoveTablesResponse&gt; done) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      MoveTablesResponse.Builder builder = MoveTablesResponse.newBuilder();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      Set&lt;TableName&gt; tables = new HashSet&lt;&gt;(request.getTableNameList().size());<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      for (HBaseProtos.TableName tableName : request.getTableNameList()) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tables.add(ProtobufUtil.toTableName(tableName));<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      LOG.info(master.getClientIdAuditPrefix() + " move tables " + tables +" to rsgroup "<a name="line.226"></a>
+<span class="sourceLineNo">227</span>          + request.getTargetGroup());<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      try {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          master.getMasterCoprocessorHost().preMoveTables(tables, request.getTargetGroup());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        groupAdminServer.moveTables(tables, request.getTargetGroup());<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          master.getMasterCoprocessorHost().postMoveTables(tables, request.getTargetGroup());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      } catch (IOException e) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      done.run(builder.build());<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>    @Override<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    public void addRSGroup(RpcController controller, AddRSGroupRequest request,<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        RpcCallback&lt;AddRSGroupResponse&gt; done) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      AddRSGroupResponse.Builder builder = AddRSGroupResponse.newBuilder();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      LOG.info(master.getClientIdAuditPrefix() + " add rsgroup " + request.getRSGroupName());<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      try {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          master.getMasterCoprocessorHost().preAddRSGroup(request.getRSGroupName());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        groupAdminServer.addRSGroup(request.getRSGroupName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          master.getMasterCoprocessorHost().postAddRSGroup(request.getRSGroupName());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        }<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      } catch (IOException e) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      done.run(builder.build());<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>    @Override<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    public void removeRSGroup(RpcController controller,<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        RemoveRSGroupRequest request, RpcCallback&lt;RemoveRSGroupResponse&gt; done) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      RemoveRSGroupResponse.Builder builder =<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          RemoveRSGroupResponse.newBuilder();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      LOG.info(master.getClientIdAuditPrefix() + " remove rsgroup " + request.getRSGroupName());<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      try {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          master.getMasterCoprocessorHost().preRemoveRSGroup(request.getRSGroupName());<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        }<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        groupAdminServer.removeRSGroup(request.getRSGroupName());<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          master.getMasterCoprocessorHost().postRemoveRSGroup(request.getRSGroupName());<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      } catch (IOException e) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      done.run(builder.build());<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>    @Override<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    public void balanceRSGroup(RpcController controller,<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        BalanceRSGroupRequest request, RpcCallback&lt;BalanceRSGroupResponse&gt; done) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      BalanceRSGroupResponse.Builder builder = BalanceRSGroupResponse.newBuilder();<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      LOG.info(master.getClientIdAuditPrefix() + " balance rsgroup, group=" +<a name="line.285"></a>
+<span class="sourceLineNo">286</span>              request.getRSGroupName());<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>          master.getMasterCoprocessorHost().preBalanceRSGroup(request.getRSGroupName());<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        }<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        boolean balancerRan = groupAdminServer.balanceRSGroup(request.getRSGroupName());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        builder.setBalanceRan(balancerRan);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          master.getMasterCoprocessorHost().postBalanceRSGroup(request.getRSGroupName(),<a name="line.294"></a>
+<span class="sourceLineNo">295</span>              balancerRan);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      } catch (IOException e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        builder.setBalanceRan(false);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      done.run(builder.build());<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>    @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    public void listRSGroupInfos(RpcController controller,<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        ListRSGroupInfosRequest request, RpcCallback&lt;ListRSGroupInfosResponse&gt; done) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      ListRSGroupInfosResponse.Builder builder = ListRSGroupInfosResponse.newBuilder();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      LOG.info(master.getClientIdAuditPrefix() + " list rsgroup");<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        checkPermission("listRSGroup");<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        for (RSGroupInfo RSGroupInfo : groupAdminServer.listRSGroups()) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          builder.addRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo));<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      } catch (IOException e) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      done.run(builder.build());<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">320</span>    @Override<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    public void getRSGroupInfoOfServer(RpcController controller,<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        GetRSGroupInfoOfServerRequest request, RpcCallback&lt;GetRSGroupInfoOfServerResponse&gt; done) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      GetRSGroupInfoOfServerResponse.Builder builder = GetRSGroupInfoOfServerResponse.newBuilder();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      Address hp = Address.fromParts(request.getServer().getHostName(),<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          request.getServer().getPort());<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, server="<a name="line.326"></a>
+<span class="sourceLineNo">327</span>          + hp);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        checkPermission("getRSGroupInfoOfServer");<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        RSGroupInfo info = groupAdminServer.getRSGroupOfServer(hp);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        if (info != null) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(info));<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      done.run(builder.build());<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>    public void moveServersAndTables(RpcController controller,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        MoveServersAndTablesRequest request, RpcCallback&lt;MoveServersAndTablesResponse&gt; done) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      MoveServersAndTablesResponse.Builder builder = MoveServersAndTablesResponse.newBuilder();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      Set&lt;Address&gt; hostPorts = Sets.newHashSet();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      for (HBaseProtos.ServerName el : request.getServersList()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        hostPorts.add(Address.fromParts(el.getHostName(), el.getPort()));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      Set&lt;TableName&gt; tables = new HashSet&lt;&gt;(request.getTableNameList().size());<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      for (HBaseProtos.TableName tableName : request.getTableNameList()) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        tables.add(ProtobufUtil.toTableName(tableName));<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts<a name="line.352"></a>
+<span class="sourceLineNo">353</span>          + " and tables " + tables + " to rsgroup" + request.getTargetGroup());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          master.getMasterCoprocessorHost().preMoveServersAndTables(hostPorts, tables,<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              request.getTargetGroup());<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        groupAdminServer.moveServersAndTables(hostPorts, tables, request.getTargetGroup());<a name="line.359"></a>
 <span class="sourceLineNo">360</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          master.getMasterCoprocessorHost().preMoveServersAndTables(hostPorts, tables,<a name="line.361"></a>
+<span class="sourceLineNo">361</span>          master.getMasterCoprocessorHost().postMoveServersAndTables(hostPorts, tables,<a name="line.361"></a>
 <span class="sourceLineNo">362</span>              request.getTargetGroup());<a name="line.362"></a>
 <span class="sourceLineNo">363</span>        }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        checkPermission("moveServersAndTables");<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        groupAdminServer.moveServersAndTables(hostPorts, tables, request.getTargetGroup());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          master.getMasterCoprocessorHost().postMoveServersAndTables(hostPorts, tables,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              request.getTargetGroup());<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      } catch (IOException e) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      done.run(builder.build());<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>
-<span class="sourceLineNo">376</span>    @Override<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    public void removeServers(RpcController controller,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        RemoveServersRequest request,<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        RpcCallback&lt;RemoveServersResponse&gt; done) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      RemoveServersResponse.Builder builder =<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          RemoveServersResponse.newBuilder();<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      Set&lt;Address&gt; servers = Sets.newHashSet();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      for (HBaseProtos.ServerName el : request.getServersList()) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        servers.add(Address.fromParts(el.getHostName(), el.getPort()));<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info(master.getClientIdAuditPrefix()<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          + " remove decommissioned servers from rsgroup: " + servers);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      try {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          master.getMasterCoprocessorHost().preRemoveServers(servers);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        }<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        checkPermission("removeServers");<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        groupAdminServer.removeServers(servers);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          master.getMasterCoprocessorHost().postRemoveServers(servers);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      } catch (IOException e) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      done.run(builder.build());<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><a name="line.403"></a>
-<span class="sourceLineNo">404</span>  boolean rsgroupHasServersOnline(TableDescriptor desc) throws IOException {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    String groupName;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    try {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      groupName =<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString())<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      if (groupName == null) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    } catch (MasterNotRunningException | PleaseHoldException e) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      LOG.info("Master has not initialized yet; temporarily using default RSGroup '" +<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          RSGroupInfo.DEFAULT_GROUP + "' for deploy of system table");<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    }<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (rsGroupInfo == null) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      throw new ConstraintException(<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          "Default RSGroup (" + groupName + ") for this table's " + "namespace does not exist.");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (ServerName onlineServer : master.getServerManager().createDestinationServersList()) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      if (rsGroupInfo.getServers().contains(onlineServer.getAddress())) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        return true;<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>    return false;<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>  void assignTableToGroup(TableDescriptor desc) throws IOException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    String groupName =<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString())<a name="line.435"></a>
-<span class="sourceLineNo">436</span>                .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    if (groupName == null) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    if (rsGroupInfo == null) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      throw new ConstraintException("Default RSGroup (" + groupName + ") for this table's "<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          + "namespace does not exist.");<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    if (!rsGroupInfo.containsTable(desc.getTableName())) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      LOG.debug("Pre-moving table " + desc.getTableName() + " to RSGroup " + groupName);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      groupAdminServer.moveTables(Sets.newHashSet(desc.getTableName()), groupName);<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><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  /////////////////////////////////////////////////////////////////////////////<a name="line.451"></a>
-<span class="sourceLineNo">452</span>  // MasterObserver overrides<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  /////////////////////////////////////////////////////////////////////////////<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void preCreateTableAction(<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      final TableDescriptor desc,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final RegionInfo[] regions) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    if (!desc.getTableName().isSystemTable() &amp;&amp; !rsgroupHasServersOnline(desc)) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throw new HBaseIOException("No online servers in the rsgroup, which table " +<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          desc.getTableName().getNameAsString() + " belongs to");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      done.run(builder.build());<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>    @Override<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    public void removeServers(RpcController controller,<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        RemoveServersRequest request,<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        RpcCallback&lt;RemoveServersResponse&gt; done) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      RemoveServersResponse.Builder builder =<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          RemoveServersResponse.newBuilder();<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      Set&lt;Address&gt; servers = Sets.newHashSet();<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      for (HBaseProtos.ServerName el : request.getServersList()) {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        servers.add(Address.fromParts(el.getHostName(), el.getPort()));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      LOG.info(master.getClientIdAuditPrefix()<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          + " remove decommissioned servers from rsgroup: " + servers);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      try {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          master.getMasterCoprocessorHost().preRemoveServers(servers);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        groupAdminServer.removeServers(servers);<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          master.getMasterCoprocessorHost().postRemoveServers(servers);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      } catch (IOException e) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      done.run(builder.build());<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><a name="line.396"></a>
+<span class="sourceLineNo">397</span>  boolean rsgroupHasServersOnline(TableDescriptor desc) throws IOException {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    String groupName;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    try {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      groupName =<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString())<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      if (groupName == null) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    } catch (MasterNotRunningException | PleaseHoldException e) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      LOG.info("Master has not initialized yet; temporarily using default RSGroup '" +<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          RSGroupInfo.DEFAULT_GROUP + "' for deploy of system table");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    }<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    if (rsGroupInfo == null) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      throw new ConstraintException(<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          "Default RSGroup (" + groupName + ") for this table's " + "namespace does not exist.");<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>    for (ServerName onlineServer : master.getServerManager().createDestinationServersList()) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      if (rsGroupInfo.getServers().contains(onlineServer.getAddress())) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        return true;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return false;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>  void assignTableToGroup(TableDescriptor desc) throws IOException {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    String groupName =<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString())<a name="line.428"></a>
+<span class="sourceLineNo">429</span>                .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    if (groupName == null) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    }<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    if (rsGroupInfo == null) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      throw new ConstraintException("Default RSGroup (" + groupName + ") for this table's "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>          + "namespace does not exist.");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    if (!rsGroupInfo.containsTable(desc.getTableName())) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      LOG.debug("Pre-moving table " + desc.getTableName() + " to RSGroup " + groupName);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      groupAdminServer.moveTables(Sets.newHashSet(desc.getTableName()), groupName);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<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>  /////////////////////////////////////////////////////////////////////////////<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  // MasterObserver overrides<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  /////////////////////////////////////////////////////////////////////////////<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  @Override<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  public void preCreateTableAction(<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      final TableDescriptor desc,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      final RegionInfo[] regions) throws IOException {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    if (!desc.getTableName().isSystemTable() &amp;&amp; !rsgroupHasServersOnline(desc)) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      throw new HBaseIOException("No online servers in the rsgroup, which table " +<a name="line.454"></a>
+<span class="sourceLineNo">455</span>          desc.getTableName().getNameAsString() + " belongs to");<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>  // Assign table to default RSGroup.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>  @Override<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  public void postCreateTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      TableDescriptor desc, RegionInfo[] regions) throws IOException {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    assignTableToGroup(desc);<a name="line.463"></a>
 <span class="sourceLineNo">464</span>  }<a name="line.464"></a>
 <span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  // Assign table to default RSGroup.<a name="line.466"></a>
+<span class="sourceLineNo">466</span>  // Remove table from its RSGroup.<a name="line.466"></a>
 <span class="sourceLineNo">467</span>  @Override<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  public void postCreateTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      TableDescriptor desc, RegionInfo[] regions) throws IOException {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    assignTableToGroup(desc);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>  // Remove table from its RSGroup.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void postDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.475"></a>
-<span class="sourceLineNo">476</span>                              TableName tableName) throws IOException {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    try {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      RSGroupInfo group = groupAdminServer.getRSGroupInfoOfTable(tableName);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (group != null) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        LOG.debug(String.format("Removing deleted table '%s' from rsgroup '%s'", tableName,<a name="line.480"></a>
-<span class="sourceLineNo">481</span>            group.getName()));<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        groupAdminServer.moveTables(Sets.newHashSet(tableName), null);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    } catch (IOException ex) {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      LOG.debug("Failed to perform RSGroup information cleanup for table: " + tableName, ex);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>  @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>  public void preCreateNamespace(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.490"></a>
-<span class="sourceLineNo">491</span>                                 NamespaceDescriptor ns) throws IOException {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    String group = ns.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    if(group != null &amp;&amp; groupAdminServer.getRSGroupInfo(group) == null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      throw new ConstraintException("Region server group "+group+" does not exit");<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>  @Override<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  public void preModifyNamespace(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      NamespaceDescriptor ns) throws IOException {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    preCreateNamespace(ctx, ns);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>  }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>  @Override<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  public void preCloneSnapshot(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      SnapshotDescription snapshot, TableDescriptor desc) throws IOException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    assignTableToGroup(desc);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  }<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>  @Override<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  public void postClearDeadServers(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      List&lt;ServerName&gt; servers, List&lt;ServerName&gt; notClearedServers)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      throws IOException {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    Set&lt;Address&gt; clearedServer = servers.stream().<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        filter(server -&gt; !notClearedServers.contains(server)).<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        map(ServerName::getAddress).<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        collect(Collectors.toSet());<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    groupAdminServer.removeServers(clearedServer);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  public void checkPermission(String request) throws IOException {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    accessChecker.requirePermission(getActiveUser(), request, Action.ADMIN);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  /**<a name="line.525"></a>
-<span class="sourceLineNo">526</span>   * Returns the active user to which authorization checks should be applied.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>   * If we are in the context of an RPC call, the remote user is used,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * otherwise the currently logged in user is used.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private User getActiveUser() throws IOException {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    // for non-rpc handling, fallback to system user<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    Optional&lt;User&gt; optionalUser = RpcServer.getRequestUser();<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    if (optionalUser.isPresent()) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return optionalUser.get();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    return userProvider.getCurrent();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>}<a name="line.538"></a>
+<span class="sourceLineNo">468</span>  public void postDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.468"></a>
+<span class="sourceLineNo">469</span>                              TableName tableName) throws IOException {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    try {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      RSGroupInfo group = groupAdminServer.getRSGroupInfoOfTable(tableName);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      if (group != null) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        LOG.debug(String.format("Removing deleted table '%s' from rsgroup '%s'", tableName,<a name="line.473"></a>
+<span class="sourceLineNo">474</span>            group.getName()));<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        groupAdminServer.moveTables(Sets.newHashSet(tableName), null);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      }<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    } catch (IOException ex) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      LOG.debug("Failed to perform RSGroup information cleanup for table: " + tableName, ex);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  @Override<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  public void preCreateNamespace(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.483"></a>
+<span class="sourceLineNo">484</span>                                 NamespaceDescriptor ns) throws IOException {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    String group = ns.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    if(group != null &amp;&amp; groupAdminServer.getRSGroupInfo(group) == null) {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      throw new ConstraintException("Region server group "+group+" does not exit");<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  @Override<a name="line.491"></a>
+<span class="sourceLineNo">492</span>  public void preModifyNamespace(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      NamespaceDescriptor ns) throws IOException {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    preCreateNamespace(ctx, ns);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  public void preCloneSnapshot(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      SnapshotDescription snapshot, TableDescriptor desc) throws IOException {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    assignTableToGroup(desc);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  @Override<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  public void postClearDeadServers(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      List&lt;ServerName&gt; servers, List&lt;ServerName&gt; notClearedServers)<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      throws IOException {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    Set&lt;Address&gt; clearedServer = servers.stream().<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        filter(server -&gt; !notClearedServers.contains(server)).<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        map(ServerName::getAddress).<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        collect(Collectors.toSet());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    groupAdminServer.removeServers(clearedServer);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>  }<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>  public void checkPermission(String request) throws IOException {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    accessChecker.requirePermission(getActiveUser(), request, Action.ADMIN);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>  }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>  /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>   * Returns the active user to which authorization checks should be applied.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * If we are in the context of an RPC call, the remote user is used,<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   * otherwise the currently logged in user is used.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>   */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  private User getActiveUser() throws IOException {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    // for non-rpc handling, fallback to system user<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    Optional&lt;User&gt; optionalUser = RpcServer.getRequestUser();<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    if (optionalUser.isPresent()) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      return optionalUser.get();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return userProvider.getCurrent();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>}<a name="line.531"></a>
 
 
 


[17/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html b/devapidocs/src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html
index 2bbc0f9..7149b2e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html
@@ -103,2456 +103,2499 @@
 <span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.95"></a>
 <span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils;<a name="line.96"></a>
 <span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.ipc.RpcServer;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.AccessControlService;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.quotas.GlobalQuotaSettings;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.regionserver.InternalScanner;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.regionserver.Region;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.regionserver.RegionScanner;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.regionserver.ScanType;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.regionserver.ScannerContext;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.replication.ReplicationEndpoint;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.security.Superusers;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.security.User;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.security.access.Permission.Action;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.util.ByteRange;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.util.SimpleMutableByteRange;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.slf4j.Logger;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.slf4j.LoggerFactory;<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hbase.thirdparty.com.google.common.collect.ArrayListMultimap;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hbase.thirdparty.com.google.common.collect.MapMaker;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hbase.thirdparty.com.google.common.collect.Sets;<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>/**<a name="line.140"></a>
-<span class="sourceLineNo">141</span> * Provides basic authorization checks for data access and administrative<a name="line.141"></a>
-<span class="sourceLineNo">142</span> * operations.<a name="line.142"></a>
-<span class="sourceLineNo">143</span> *<a name="line.143"></a>
-<span class="sourceLineNo">144</span> * &lt;p&gt;<a name="line.144"></a>
-<span class="sourceLineNo">145</span> * {@code AccessController} performs authorization checks for HBase operations<a name="line.145"></a>
-<span class="sourceLineNo">146</span> * based on:<a name="line.146"></a>
-<span class="sourceLineNo">147</span> * &lt;/p&gt;<a name="line.147"></a>
-<span class="sourceLineNo">148</span> * &lt;ul&gt;<a name="line.148"></a>
-<span class="sourceLineNo">149</span> *   &lt;li&gt;the identity of the user performing the operation&lt;/li&gt;<a name="line.149"></a>
-<span class="sourceLineNo">150</span> *   &lt;li&gt;the scope over which the operation is performed, in increasing<a name="line.150"></a>
-<span class="sourceLineNo">151</span> *   specificity: global, table, column family, or qualifier&lt;/li&gt;<a name="line.151"></a>
-<span class="sourceLineNo">152</span> *   &lt;li&gt;the type of action being performed (as mapped to<a name="line.152"></a>
-<span class="sourceLineNo">153</span> *   {@link Permission.Action} values)&lt;/li&gt;<a name="line.153"></a>
-<span class="sourceLineNo">154</span> * &lt;/ul&gt;<a name="line.154"></a>
-<span class="sourceLineNo">155</span> * &lt;p&gt;<a name="line.155"></a>
-<span class="sourceLineNo">156</span> * If the authorization check fails, an {@link AccessDeniedException}<a name="line.156"></a>
-<span class="sourceLineNo">157</span> * will be thrown for the operation.<a name="line.157"></a>
-<span class="sourceLineNo">158</span> * &lt;/p&gt;<a name="line.158"></a>
-<span class="sourceLineNo">159</span> *<a name="line.159"></a>
-<span class="sourceLineNo">160</span> * &lt;p&gt;<a name="line.160"></a>
-<span class="sourceLineNo">161</span> * To perform authorization checks, {@code AccessController} relies on the<a name="line.161"></a>
-<span class="sourceLineNo">162</span> * RpcServerEngine being loaded to provide<a name="line.162"></a>
-<span class="sourceLineNo">163</span> * the user identities for remote requests.<a name="line.163"></a>
-<span class="sourceLineNo">164</span> * &lt;/p&gt;<a name="line.164"></a>
-<span class="sourceLineNo">165</span> *<a name="line.165"></a>
-<span class="sourceLineNo">166</span> * &lt;p&gt;<a name="line.166"></a>
-<span class="sourceLineNo">167</span> * The access control lists used for authorization can be manipulated via the<a name="line.167"></a>
-<span class="sourceLineNo">168</span> * exposed {@link AccessControlService} Interface implementation, and the associated<a name="line.168"></a>
-<span class="sourceLineNo">169</span> * {@code grant}, {@code revoke}, and {@code user_permission} HBase shell<a name="line.169"></a>
-<span class="sourceLineNo">170</span> * commands.<a name="line.170"></a>
-<span class="sourceLineNo">171</span> * &lt;/p&gt;<a name="line.171"></a>
-<span class="sourceLineNo">172</span> */<a name="line.172"></a>
-<span class="sourceLineNo">173</span>@CoreCoprocessor<a name="line.173"></a>
-<span class="sourceLineNo">174</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.174"></a>
-<span class="sourceLineNo">175</span>public class AccessController implements MasterCoprocessor, RegionCoprocessor,<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    RegionServerCoprocessor, AccessControlService.Interface,<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    MasterObserver, RegionObserver, RegionServerObserver, EndpointObserver, BulkLoadObserver {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  // TODO: encapsulate observer functions into separate class/sub-class.<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  private static final Logger LOG = LoggerFactory.getLogger(AccessController.class);<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>  private static final Logger AUDITLOG =<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    LoggerFactory.getLogger("SecurityLogger."+AccessController.class.getName());<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  private static final String CHECK_COVERING_PERM = "check_covering_perm";<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  private static final String TAG_CHECK_PASSED = "tag_check_passed";<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private static final byte[] TRUE = Bytes.toBytes(true);<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private AccessChecker accessChecker;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /** flags if we are running on a region of the _acl_ table */<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private boolean aclRegion = false;<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>  /** defined only for Endpoint implementation, so it can have way to<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   access region services */<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  private RegionCoprocessorEnvironment regionEnv;<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /** Mapping of scanner instances to the user who created them */<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  private Map&lt;InternalScanner,String&gt; scannerOwners =<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      new MapMaker().weakKeys().makeMap();<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>  private Map&lt;TableName, List&lt;UserPermission&gt;&gt; tableAcls;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  /** Provider for mapping principal names to Users */<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  private UserProvider userProvider;<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /** if we are active, usually false, only true if "hbase.security.authorization"<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   has been set to true in site configuration */<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  private boolean authorizationEnabled;<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /** if we are able to support cell ACLs */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  private boolean cellFeaturesEnabled;<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  /** if we should check EXEC permissions */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  private boolean shouldCheckExecPermission;<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  /** if we should terminate access checks early as soon as table or CF grants<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    allow access; pre-0.98 compatible behavior */<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  private boolean compatibleEarlyTermination;<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>  /** if we have been successfully initialized */<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  private volatile boolean initialized = false;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  /** if the ACL table is available, only relevant in the master */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private volatile boolean aclTabAvailable = false;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  public static boolean isCellAuthorizationSupported(Configuration conf) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    return AccessChecker.isAuthorizationSupported(conf) &amp;&amp;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public Region getRegion() {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    return regionEnv != null ? regionEnv.getRegion() : null;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public TableAuthManager getAuthManager() {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    return accessChecker.getAuthManager();<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>  private void initialize(RegionCoprocessorEnvironment e) throws IOException {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    final Region region = e.getRegion();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Configuration conf = e.getConfiguration();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    Map&lt;byte[], ListMultimap&lt;String,TablePermission&gt;&gt; tables =<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        AccessControlLists.loadAll(region);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    // For each table, write out the table's permissions to the respective<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    // znode for that table.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    for (Map.Entry&lt;byte[], ListMultimap&lt;String,TablePermission&gt;&gt; t:<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      tables.entrySet()) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      byte[] entry = t.getKey();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      ListMultimap&lt;String,TablePermission&gt; perms = t.getValue();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      byte[] serialized = AccessControlLists.writePermissionsAsBytes(perms, conf);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      getAuthManager().getZKPermissionWatcher().writeToZookeeper(entry, serialized);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    initialized = true;<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Writes all table ACLs for the tables in the given Map up into ZooKeeper<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * znodes.  This is called to synchronize ACL changes following {@code _acl_}<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * table updates.<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private void updateACL(RegionCoprocessorEnvironment e,<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    Set&lt;byte[]&gt; entries = new TreeSet&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    for (Map.Entry&lt;byte[], List&lt;Cell&gt;&gt; f : familyMap.entrySet()) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      List&lt;Cell&gt; cells = f.getValue();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      for (Cell cell: cells) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        if (CellUtil.matchingFamily(cell, AccessControlLists.ACL_LIST_FAMILY)) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          entries.add(CellUtil.cloneRow(cell));<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>    }<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    ZKPermissionWatcher zkw = getAuthManager().getZKPermissionWatcher();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Configuration conf = regionEnv.getConfiguration();<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    byte [] currentEntry = null;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // TODO: Here we are already on the ACL region. (And it is single<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // region) We can even just get the region from the env and do get<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    // directly. The short circuit connection would avoid the RPC overhead<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // so no socket communication, req write/read ..  But we have the PB<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    // to and fro conversion overhead. get req is converted to PB req<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    // and results are converted to PB results 1st and then to POJOs<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // again. We could have avoided such at least in ACL table context..<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    try (Table t = e.getConnection().getTable(AccessControlLists.ACL_TABLE_NAME)) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      for (byte[] entry : entries) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        currentEntry = entry;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        ListMultimap&lt;String, TablePermission&gt; perms =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>            AccessControlLists.getPermissions(conf, entry, t);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        byte[] serialized = AccessControlLists.writePermissionsAsBytes(perms, conf);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        zkw.writeToZookeeper(entry, serialized);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } catch(IOException ex) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          LOG.error("Failed updating permissions mirror for '" +<a name="line.291"></a>
-<span class="sourceLineNo">292</span>                  (currentEntry == null? "null": Bytes.toString(currentEntry)) + "'", ex);<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><a name="line.295"></a>
-<span class="sourceLineNo">296</span>  /**<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * Check the current user for authorization to perform a specific action<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * against the given set of row data.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   *<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * &lt;p&gt;Note: Ordering of the authorization checks<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * has been carefully optimized to short-circuit the most common requests<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * and minimize the amount of processing required.&lt;/p&gt;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   *<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * @param permRequest the action being requested<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   * @param e the coprocessor environment<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * @param families the map of column families to qualifiers present in<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * the request<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   * @return an authorization result<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  private AuthResult permissionGranted(String request, User user, Action permRequest,<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      RegionCoprocessorEnvironment e,<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      Map&lt;byte [], ? extends Collection&lt;?&gt;&gt; families) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    RegionInfo hri = e.getRegion().getRegionInfo();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    TableName tableName = hri.getTable();<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    // 1. All users need read access to hbase:meta table.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    // this is a very common operation, so deal with it quickly.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    if (hri.isMetaRegion()) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if (permRequest == Action.READ) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        return AuthResult.allow(request, "All users allowed", user,<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          permRequest, tableName, families);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      }<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>    if (user == null) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      return AuthResult.deny(request, "No user associated with request!", null,<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        permRequest, tableName, families);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // 2. check for the table-level, if successful we can short-circuit<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    if (getAuthManager().authorize(user, tableName, (byte[])null, permRequest)) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      return AuthResult.allow(request, "Table permission granted", user,<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        permRequest, tableName, families);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    }<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    // 3. check permissions against the requested families<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (families != null &amp;&amp; families.size() &gt; 0) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      // all families must pass<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      for (Map.Entry&lt;byte [], ? extends Collection&lt;?&gt;&gt; family : families.entrySet()) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        // a) check for family level access<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        if (getAuthManager().authorize(user, tableName, family.getKey(),<a name="line.341"></a>
-<span class="sourceLineNo">342</span>            permRequest)) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          continue;  // family-level permission overrides per-qualifier<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>        // b) qualifier level access can still succeed<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        if ((family.getValue() != null) &amp;&amp; (family.getValue().size() &gt; 0)) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>          if (family.getValue() instanceof Set) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>            // for each qualifier of the family<a name="line.349"></a>
-<span class="sourceLineNo">350</span>            Set&lt;byte[]&gt; familySet = (Set&lt;byte[]&gt;)family.getValue();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>            for (byte[] qualifier : familySet) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              if (!getAuthManager().authorize(user, tableName, family.getKey(),<a name="line.352"></a>
-<span class="sourceLineNo">353</span>                                         qualifier, permRequest)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>                return AuthResult.deny(request, "Failed qualifier check", user,<a name="line.354"></a>
-<span class="sourceLineNo">355</span>                    permRequest, tableName, makeFamilyMap(family.getKey(), qualifier));<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>          } else if (family.getValue() instanceof List) { // List&lt;Cell&gt;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>            List&lt;Cell&gt; cellList = (List&lt;Cell&gt;)family.getValue();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>            for (Cell cell : cellList) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>              if (!getAuthManager().authorize(user, tableName, family.getKey(),<a name="line.361"></a>
-<span class="sourceLineNo">362</span>                CellUtil.cloneQualifier(cell), permRequest)) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>                return AuthResult.deny(request, "Failed qualifier check", user, permRequest,<a name="line.363"></a>
-<span class="sourceLineNo">364</span>                  tableName, makeFamilyMap(family.getKey(), CellUtil.cloneQualifier(cell)));<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>            }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          }<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        } else {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          // no qualifiers and family-level check already failed<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          return AuthResult.deny(request, "Failed family check", user, permRequest,<a name="line.370"></a>
-<span class="sourceLineNo">371</span>              tableName, makeFamilyMap(family.getKey(), null));<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>      // all family checks passed<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      return AuthResult.allow(request, "All family checks passed", user, permRequest,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          tableName, families);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>    // 4. no families to check and table level access failed<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    return AuthResult.deny(request, "No families to check and table permission failed",<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        user, permRequest, tableName, families);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  }<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>  /**<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   * Check the current user for authorization to perform a specific action<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * against the given set of row data.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * @param opType the operation type<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * @param user the user<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @param e the coprocessor environment<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @param families the map of column families to qualifiers present in<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * the request<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * @param actions the desired actions<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   * @return an authorization result<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   */<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  private AuthResult permissionGranted(OpType opType, User user, RegionCoprocessorEnvironment e,<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      Map&lt;byte [], ? extends Collection&lt;?&gt;&gt; families, Action... actions) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    AuthResult result = null;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    for (Action action: actions) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      result = permissionGranted(opType.toString(), user, action, e, families);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      if (!result.isAllowed()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        return result;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    return result;<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>  public void requireAccess(ObserverContext&lt;?&gt; ctx, String request, TableName tableName,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      Action... permissions) throws IOException {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    accessChecker.requireAccess(getActiveUser(ctx), request, tableName, permissions);<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>  public void requirePermission(ObserverContext&lt;?&gt; ctx, String request,<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      Action perm) throws IOException {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    accessChecker.requirePermission(getActiveUser(ctx), request, perm);<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>  public void requireGlobalPermission(ObserverContext&lt;?&gt; ctx, String request,<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      Action perm, TableName tableName,<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      Map&lt;byte[], ? extends Collection&lt;byte[]&gt;&gt; familyMap) throws IOException {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    accessChecker.requireGlobalPermission(getActiveUser(ctx),<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        request, perm,tableName, familyMap);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public void requireGlobalPermission(ObserverContext&lt;?&gt; ctx, String request,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      Action perm, String namespace) throws IOException {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    accessChecker.requireGlobalPermission(getActiveUser(ctx),<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        request, perm, namespace);<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 void requireNamespacePermission(ObserverContext&lt;?&gt; ctx, String request, String namespace,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      Action... permissions) throws IOException {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    accessChecker.requireNamespacePermission(getActiveUser(ctx),<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        request, namespace, permissions);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  public void requireNamespacePermission(ObserverContext&lt;?&gt; ctx, String request, String namespace,<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      TableName tableName, Map&lt;byte[], ? extends Collection&lt;byte[]&gt;&gt; familyMap,<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      Action... permissions) throws IOException {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    accessChecker.requireNamespacePermission(getActiveUser(ctx),<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        request, namespace, tableName, familyMap,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        permissions);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void requirePermission(ObserverContext&lt;?&gt; ctx, String request, TableName tableName,<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      byte[] family, byte[] qualifier, Action... permissions) throws IOException {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    accessChecker.requirePermission(getActiveUser(ctx), request,<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        tableName, family, qualifier, permissions);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public void requireTablePermission(ObserverContext&lt;?&gt; ctx, String request,<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      TableName tableName,byte[] family, byte[] qualifier,<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Action... permissions) throws IOException {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    accessChecker.requireTablePermission(getActiveUser(ctx),<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        request, tableName, family, qualifier, permissions);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public void checkLockPermissions(ObserverContext&lt;?&gt; ctx, String namespace,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      TableName tableName, RegionInfo[] regionInfos, String reason)<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      throws IOException {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    accessChecker.checkLockPermissions(getActiveUser(ctx),<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        namespace, tableName, regionInfos, reason);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  /**<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * Returns &lt;code&gt;true&lt;/code&gt; if the current user is allowed the given action<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * over at least one of the column qualifiers in the given column families.<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   */<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  private boolean hasFamilyQualifierPermission(User user,<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      Action perm,<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      RegionCoprocessorEnvironment env,<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      Map&lt;byte[], ? extends Collection&lt;byte[]&gt;&gt; familyMap)<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    throws IOException {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    RegionInfo hri = env.getRegion().getRegionInfo();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    TableName tableName = hri.getTable();<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    if (user == null) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      return false;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>    if (familyMap != null &amp;&amp; familyMap.size() &gt; 0) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      // at least one family must be allowed<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      for (Map.Entry&lt;byte[], ? extends Collection&lt;byte[]&gt;&gt; family :<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          familyMap.entrySet()) {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>        if (family.getValue() != null &amp;&amp; !family.getValue().isEmpty()) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          for (byte[] qualifier : family.getValue()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>            if (getAuthManager().matchPermission(user, tableName,<a name="line.487"></a>
-<span class="sourceLineNo">488</span>                family.getKey(), qualifier, perm)) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>              return true;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>            }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          }<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        } else {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          if (getAuthManager().matchPermission(user, tableName, family.getKey(),<a name="line.493"></a>
-<span class="sourceLineNo">494</span>              perm)) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>            return true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        }<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    } else if (LOG.isDebugEnabled()) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      LOG.debug("Empty family map passed for permission check");<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return false;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private enum OpType {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    GET("get"),<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    EXISTS("exists"),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    SCAN("scan"),<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    PUT("put"),<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    DELETE("delete"),<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    CHECK_AND_PUT("checkAndPut"),<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    CHECK_AND_DELETE("checkAndDelete"),<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    INCREMENT_COLUMN_VALUE("incrementColumnValue"),<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    APPEND("append"),<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    INCREMENT("increment");<a name="line.516"></a>
-<span class="sourceLineNo">517</span><a name="line.517"></a>
-<span class="sourceLineNo">518</span>    private String type;<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    private OpType(String type) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      this.type = type;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return type;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    }<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
-<span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>  /**<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * Determine if cell ACLs covered by the operation grant access. This is expensive.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * @return false if cell ACLs failed to grant access, true otherwise<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @throws IOException<a name="line.533"></a>
-<span class="sourceLineNo">534</span>   */<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  private boolean checkCoveringPermission(User user, OpType request, RegionCoprocessorEnvironment e,<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      byte[] row, Map&lt;byte[], ? extends Collection&lt;?&gt;&gt; familyMap, long opTs, Action... actions)<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      throws IOException {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    if (!cellFeaturesEnabled) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      return false;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    }<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    long cellGrants = 0;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    long latestCellTs = 0;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Get get = new Get(row);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    // Only in case of Put/Delete op, consider TS within cell (if set for individual cells).<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    // When every cell, within a Mutation, can be linked with diff TS we can not rely on only one<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    // version. We have to get every cell version and check its TS against the TS asked for in<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Mutation and skip those Cells which is outside this Mutation TS.In case of Put, we have to<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    // consider only one such passing cell. In case of Delete we have to consider all the cell<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    // versions under this passing version. When Delete Mutation contains columns which are a<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    // version delete just consider only one version for those column cells.<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    boolean considerCellTs  = (request == OpType.PUT || request == OpType.DELETE);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    if (considerCellTs) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      get.setMaxVersions();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    } else {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      get.setMaxVersions(1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    boolean diffCellTsFromOpTs = false;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    for (Map.Entry&lt;byte[], ? extends Collection&lt;?&gt;&gt; entry: familyMap.entrySet()) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      byte[] col = entry.getKey();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      // TODO: HBASE-7114 could possibly unify the collection type in family<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // maps so we would not need to do this<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      if (entry.getValue() instanceof Set) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        Set&lt;byte[]&gt; set = (Set&lt;byte[]&gt;)entry.getValue();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        if (set == null || set.isEmpty()) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          get.addFamily(col);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        } else {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          for (byte[] qual: set) {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>            get.addColumn(col, qual);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        }<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      } else if (entry.getValue() instanceof List) {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>        List&lt;Cell&gt; list = (List&lt;Cell&gt;)entry.getValue();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        if (list == null || list.isEmpty()) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          get.addFamily(col);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        } else {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          // In case of family delete, a Cell will be added into the list with Qualifier as null.<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          for (Cell cell : list) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>            if (cell.getQualifierLength() == 0<a name="line.578"></a>
-<span class="sourceLineNo">579</span>                &amp;&amp; (cell.getTypeByte() == Type.DeleteFamily.getCode()<a name="line.579"></a>
-<span class="sourceLineNo">580</span>                || cell.getTypeByte() == Type.DeleteFamilyVersion.getCode())) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              get.addFamily(col);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>            } else {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>              get.addColumn(col, CellUtil.cloneQualifier(cell));<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            if (considerCellTs) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>              long cellTs = cell.getTimestamp();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>              latestCellTs = Math.max(latestCellTs, cellTs);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>              diffCellTsFromOpTs = diffCellTsFromOpTs || (opTs != cellTs);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>            }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      } else if (entry.getValue() == null) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        get.addFamily(col);<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      } else {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        throw new RuntimeException("Unhandled collection type " +<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          entry.getValue().getClass().getName());<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      }<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    // We want to avoid looking into the future. So, if the cells of the<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    // operation specify a timestamp, or the operation itself specifies a<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    // timestamp, then we use the maximum ts found. Otherwise, we bound<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    // the Get to the current server time. We add 1 to the timerange since<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    // the upper bound of a timerange is exclusive yet we need to examine<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    // any cells found there inclusively.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    long latestTs = Math.max(opTs, latestCellTs);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    if (latestTs == 0 || latestTs == HConstants.LATEST_TIMESTAMP) {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      latestTs = EnvironmentEdgeManager.currentTime();<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    get.setTimeRange(0, latestTs + 1);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    // In case of Put operation we set to read all versions. This was done to consider the case<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    // where columns are added with TS other than the Mutation TS. But normally this wont be the<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    // case with Put. There no need to get all versions but get latest version only.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    if (!diffCellTsFromOpTs &amp;&amp; request == OpType.PUT) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      get.setMaxVersions(1);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    if (LOG.isTraceEnabled()) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>      LOG.trace("Scanning for cells with " + get);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    }<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    // This Map is identical to familyMap. The key is a BR rather than byte[].<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // It will be easy to do gets over this new Map as we can create get keys over the Cell cf by<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    // new SimpleByteRange(cell.familyArray, cell.familyOffset, cell.familyLen)<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    Map&lt;ByteRange, List&lt;Cell&gt;&gt; familyMap1 = new HashMap&lt;&gt;();<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    for (Entry&lt;byte[], ? extends Collection&lt;?&gt;&gt; entry : familyMap.entrySet()) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      if (entry.getValue() instanceof List) {<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        familyMap1.put(new SimpleMutableByteRange(entry.getKey()), (List&lt;Cell&gt;) entry.getValue());<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    RegionScanner scanner = getRegion(e).getScanner(new Scan(get));<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    List&lt;Cell&gt; cells = Lists.newArrayList();<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    Cell prevCell = null;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    ByteRange curFam = new SimpleMutableByteRange();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    boolean curColAllVersions = (request == OpType.DELETE);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    long curColCheckTs = opTs;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    boolean foundColumn = false;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    try {<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      boolean more = false;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(1).build();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>      do {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>        cells.clear();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>        // scan with limit as 1 to hold down memory use on wide rows<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        more = scanner.next(cells, scannerContext);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>        for (Cell cell: cells) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>          if (LOG.isTraceEnabled()) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>            LOG.trace("Found cell " + cell);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          }<a name="line.646"></a>
-<span class="sourceLineNo">647</span>          boolean colChange = prevCell == null || !CellUtil.matchingColumn(prevCell, cell);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>          if (colChange) foundColumn = false;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          prevCell = cell;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>          if (!curColAllVersions &amp;&amp; foundColumn) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            continue;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>          }<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          if (colChange &amp;&amp; considerCellTs) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>            curFam.set(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());<a name="line.654"></a>
-<span class="sourceLineNo">655</span>            List&lt;Cell&gt; cols = familyMap1.get(curFam);<a name="line.655"></a>
-<span class="sourceLineNo">656</span>            for (Cell col : cols) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>              // null/empty qualifier is used to denote a Family delete. The TS and delete type<a name="line.657"></a>
-<span class="sourceLineNo">658</span>              // associated with this is applicable for all columns within the family. That is<a name="line.658"></a>
-<span class="sourceLineNo">659</span>              // why the below (col.getQualifierLength() == 0) check.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>              if ((col.getQualifierLength() == 0 &amp;&amp; request == OpType.DELETE)<a name="line.660"></a>
-<span class="sourceLineNo">661</span>                  || CellUtil.matchingQualifier(cell, col)) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>                byte type = col.getTypeByte();<a name="line.662"></a>
-<span class="sourceLineNo">663</span>                if (considerCellTs) {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>                  curColCheckTs = col.getTimestamp();<a name="line.664"></a>
-<span class="sourceLineNo">665</span>                }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>                // For a Delete op we pass allVersions as true. When a Delete Mutation contains<a name="line.666"></a>
-<span class="sourceLineNo">667</span>                // a version delete for a column no need to check all the covering cells within<a name="line.667"></a>
-<span class="sourceLineNo">668</span>                // that column. Check all versions when Type is DeleteColumn or DeleteFamily<a name="line.668"></a>
-<span class="sourceLineNo">669</span>                // One version delete types are Delete/DeleteFamilyVersion<a name="line.669"></a>
-<span class="sourceLineNo">670</span>                curColAllVersions = (KeyValue.Type.DeleteColumn.getCode() == type)<a name="line.670"></a>
-<span class="sourceLineNo">671</span>                    || (KeyValue.Type.DeleteFamily.getCode() == type);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>                break;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>              }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>            }<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>          if (cell.getTimestamp() &gt; curColCheckTs) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>            // Just ignore this cell. This is not a covering cell.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            continue;<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>          foundColumn = true;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>          for (Action action: actions) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>            // Are there permissions for this user for the cell?<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            if (!getAuthManager().authorize(user, getTableName(e), cell, action)) {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>              // We can stop if the cell ACL denies access<a name="line.684"></a>
-<span class="sourceLineNo">685</span>              return false;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>            }<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          }<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          cellGrants++;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        }<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      } while (more);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    } catch (AccessDeniedException ex) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      throw ex;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    } catch (IOException ex) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      LOG.error("Exception while getting cells to calculate covering permission", ex);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } finally {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      scanner.close();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // We should not authorize unless we have found one or more cell ACLs that<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    // grant access. This code is used to check for additional permissions<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    // after no table or CF grants are found.<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    return cellGrants &gt; 0;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>  private static void addCellPermissions(final byte[] perms, Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // Iterate over the entries in the familyMap, replacing the cells therein<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    // with new cells including the ACL data<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    for (Map.Entry&lt;byte[], List&lt;Cell&gt;&gt; e: familyMap.entrySet()) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      List&lt;Cell&gt; newCells = Lists.newArrayList();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      for (Cell cell: e.getValue()) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        // Prepend the supplied perms in a new ACL tag to an update list of tags for the cell<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        List&lt;Tag&gt; tags = new ArrayList&lt;&gt;();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        tags.add(new ArrayBackedTag(AccessControlLists.ACL_TAG_TYPE, perms));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        Iterator&lt;Tag&gt; tagIterator = PrivateCellUtil.tagsIterator(cell);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        while (tagIterator.hasNext()) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          tags.add(tagIterator.next());<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        }<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        newCells.add(PrivateCellUtil.createCell(cell, tags));<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      // This is supposed to be safe, won't CME<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      e.setValue(newCells);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  }<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>  // Checks whether incoming cells contain any tag with type as ACL_TAG_TYPE. This tag<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  // type is reserved and should not be explicitly set by user.<a name="line.725"></a>
-<span class="sourceLineNo">726</span>  private void checkForReservedTagPresence(User user, Mutation m) throws IOException {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    // No need to check if we're not going to throw<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    if (!authorizationEnabled) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      m.setAttribute(TAG_CHECK_PASSED, TRUE);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    // Superusers are allowed to store cells unconditionally.<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    if (Superusers.isSuperUser(user)) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      m.setAttribute(TAG_CHECK_PASSED, TRUE);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      return;<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    // We already checked (prePut vs preBatchMutation)<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    if (m.getAttribute(TAG_CHECK_PASSED) != null) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      return;<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    }<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    for (CellScanner cellScanner = m.cellScanner(); cellScanner.advance();) {<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      Iterator&lt;Tag&gt; tagsItr = PrivateCellUtil.tagsIterator(cellScanner.current());<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      while (tagsItr.hasNext()) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        if (tagsItr.next().getType() == AccessControlLists.ACL_TAG_TYPE) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>          throw new AccessDeniedException("Mutation contains cell with reserved type tag");<a name="line.745"></a>
-<span class="sourceLineNo">746</span>        }<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      }<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    m.setAttribute(TAG_CHECK_PASSED, TRUE);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>  /* ---- MasterObserver implementation ---- */<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  @Override<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  public void start(CoprocessorEnvironment env) throws IOException {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    CompoundConfiguration conf = new CompoundConfiguration();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    conf.add(env.getConfiguration());<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    authorizationEnabled = AccessChecker.isAuthorizationSupported(conf);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    if (!authorizationEnabled) {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      LOG.warn("AccessController has been loaded with authorization checks DISABLED!");<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    }<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>    shouldCheckExecPermission = conf.getBoolean(AccessControlConstants.EXEC_PERMISSION_CHECKS_KEY,<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      AccessControlConstants.DEFAULT_EXEC_PERMISSION_CHECKS);<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span>    cellFeaturesEnabled = (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    if (!cellFeaturesEnabled) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      LOG.info("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          + " is required to persist cell ACLs. Consider setting " + HFile.FORMAT_VERSION_KEY<a name="line.769"></a>
-<span class="sourceLineNo">770</span>          + " accordingly.");<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    ZKWatcher zk = null;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    if (env instanceof MasterCoprocessorEnvironment) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      // if running on HMaster<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      MasterCoprocessorEnvironment mEnv = (MasterCoprocessorEnvironment)env;<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      if (mEnv instanceof HasMasterServices) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>        zk = ((HasMasterServices)mEnv).getMasterServices().getZooKeeper();<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      }<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    } else if (env instanceof RegionServerCoprocessorEnvironment) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      RegionServerCoprocessorEnvironment rsEnv = (RegionServerCoprocessorEnvironment)env;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      if (rsEnv instanceof HasRegionServerServices) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>        zk = ((HasRegionServerServices)rsEnv).getRegionServerServices().getZooKeeper();<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    } else if (env instanceof RegionCoprocessorEnvironment) {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      // if running at region<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      regionEnv = (RegionCoprocessorEnvironment) env;<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      conf.addBytesMap(regionEnv.getRegion().getTableDescriptor().getValues());<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      compatibleEarlyTermination = conf.getBoolean(AccessControlConstants.CF_ATTRIBUTE_EARLY_OUT,<a name="line.789"></a>
-<span class="sourceLineNo">790</span>          AccessControlConstants.DEFAULT_ATTRIBUTE_EARLY_OUT);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      if (regionEnv instanceof HasRegionServerServices) {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        zk = ((HasRegionServerServices)regionEnv).getRegionServerServices().getZooKeeper();<a name="line.792"></a>
-<span class="sourceLineNo">793</span>      }<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    // set the user-provider.<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    this.userProvider = UserProvider.instantiate(env.getConfiguration());<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    // Throws RuntimeException if fails to load TableAuthManager so that coprocessor is unloaded.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    accessChecker = new AccessChecker(env.getConfiguration(), zk);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    tableAcls = new MapMaker().weakValues().makeMap();<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>  public void stop(CoprocessorEnvironment env) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    accessChecker.stop();<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  /*********************************** Observer/Service Getters ***********************************/<a name="line.808"></a>
-<span class="sourceLineNo">809</span>  @Override<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return Optional.of(this);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>  public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    return Optional.of(this);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>  @Override<a name="line.819"></a>
-<span class="sourceLineNo">820</span>  public Optional&lt;EndpointObserver&gt; getEndpointObserver() {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    return Optional.of(this);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>  }<a name="line.822"></a>
-<span class="sourceLineNo">823</span><a name="line.823"></a>
-<span class="sourceLineNo">824</span>  @Override<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public Optional&lt;BulkLoadObserver&gt; getBulkLoadObserver() {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return Optional.of(this);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  @Override<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    return Optional.of(this);<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>  @Override<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  public Iterable&lt;Service&gt; getServices() {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    return Collections.singleton(<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        AccessControlProtos.AccessControlService.newReflectiveService(this));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>  /*********************************** Observer implementations ***********************************/<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Override<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void preCreateTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; c,<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      TableDescriptor desc, RegionInfo[] regions) throws IOException {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    Set&lt;byte[]&gt; families = desc.getColumnFamilyNames();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    Map&lt;byte[], Set&lt;byte[]&gt;&gt; familyMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    for (byte[] family: families) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      familyMap.put(family, null);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    requireNamespacePermission(c, "createTable",<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        desc.getTableName().getNamespaceAsString(), desc.getTableName(), familyMap, Action.CREATE);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>  }<a name="line.852"></a>
-<span class="sourceLineNo">853</span><a name="line.853"></a>
-<span class="sourceLineNo">854</span>  @Override<a name="line.854"></a>
-<span class="sourceLineNo">855</span>  public void postCompletedCreateTableAction(<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      final ObserverContext&lt;MasterCoprocessorEnvironment&gt; c,<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      final TableDescriptor desc,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      final RegionInfo[] regions) throws IOException {<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    // When AC is used, it should be configured as the 1st CP.<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    // In Master, the table operations like create, are handled by a Thread pool but the max size<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    // for this pool is 1. So if multiple CPs create tables on startup, these creations will happen<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    // sequentially only.<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    // Related code in HMaster#startServiceThreads<a name="line.863"></a>
-<span class="sourceLineNo">864</span>    // {code}<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    //   // We depend on there being only one instance of this executor running<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    //   // at a time. To do concurrency, would need fencing of enable/disable of<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    //   // tables.<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    //   this.service.startExecutorService(ExecutorType.MASTER_TABLE_OPERATIONS, 1);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    // {code}<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    // In future if we change this pool to have more threads, then there is a chance for thread,<a name="line.870"></a>
-<span class="sourceLineNo">871</span>    // creating acl table, getting delayed and by that time another table creation got over and<a name="line.871"></a>
-<span class="sourceLineNo">872</span>    // this hook is getting called. In such a case, we will need a wait logic here which will<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    // wait till the acl table is created.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>    if (AccessControlLists.isAclTable(desc)) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      this.aclTabAvailable = true;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    } else if (!(TableName.NAMESPACE_TABLE_NAME.equals(desc.getTableName()))) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if (!aclTabAvailable) {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>        LOG.warn("Not adding owner permission for table " + desc.getTableName() + ". "<a name="line.878"></a>
-<span class="sourceLineNo">879</span>            + AccessControlLists.ACL_TABLE_NAME + " is not yet created. "<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            + getClass().getSimpleName() + " should be configured as the first Coprocessor");<a name="line.880"></a>
-<span class="sourceLineNo">881</span>      } else {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        String owner = desc.getOwnerString();<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        // default the table owner to current user, if not specified.<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        if (owner == null)<a name="line.884"></a>
-<span class="sourceLineNo">885</span>          owner = getActiveUser(c).getShortName();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>        final UserPermission userperm = new UserPermission(Bytes.toBytes(owner),<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            desc.getTableName(), null, Action.values());<a name="line.887"></a>
-<span class="sourceLineNo">888</span>        // switch to the real hbase master user for doing the RPC on the ACL table<a name="line.888"></a>
-<span class="sourceLineNo">889</span>        User.runAsLoginUser(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>          @Override<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          public Void run() throws Exception {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>            try (Table table = c.getEnvironment().getConnection().<a name="line.892"></a>
-<span class="sourceLineNo">893</span>                getTable(AccessControlLists.ACL_TABLE_NAME)) {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>              AccessControlLists.addUserPermission(c.getEnvironment().getConfiguration(),<a name="line.894"></a>
-<span class="sourceLineNo">895</span>                  userperm, table);<a name="line.895"></a>
-<span class="sourceLineNo">896</span>            }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>            return null;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          }<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        });<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      }<a name="line.900"></a>
-<span class="sourceLineNo">901</span>    }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>  }<a name="line.902"></a>
-<span class="sourceLineNo">903</span><a name="line.903"></a>
-<span class="sourceLineNo">904</span>  @Override<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  public void preDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; c, TableName tableName)<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      throws IOException {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    requirePermission(c, "deleteTable",<a name="line.907"></a>
-<span class="sourceLineNo">908</span>        tableName, null, null, Action.ADMIN, Action.CREATE);<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>  @Override<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  public void postDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; c,<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      final TableName tableName) throws IOException {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    final Configuration conf = c.getEnvironment().getConfiguration();<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    User.runAsLoginUser(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      @Override<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      public Void run() throws Exception {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>        try (Table table = c.getEnvironment().getConnection().<a name="line.918"></a>
-<span class="sourceLineNo">919</span>            getTable(AccessControlLists.ACL_TABLE_NAME)) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>          AccessControlLists.removeTablePermissions(conf, tableName, table);<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        }<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        return null;<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      }<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    });<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    getAuthManager().getZKPermissionWatcher().deleteTableACLNode(tableName);<a name="line.925"></a>
-<span class="sourceLineNo">926</span>  }<a name="line.926"></a>
-<span class="sourceLineNo">927</span><a name="line.927"></a>
-<span class="sourceLineNo">928</span>  @Override<a name="line.928"></a>
-<span class="sourceLineNo">929</span>  public void preTruncateTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; c,<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      final TableName tableName) throws IOException {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    requirePermission(c, "truncateTable",<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        tableName, null, null, Action.ADMIN, Action.CREATE);<a name="line.932"></a>
-<span class="sourceLineNo">933</span><a name="line.933"></a>
-<span class="sourceLineNo">934</span>    final Configuration conf = c.getEnvironment().getConfiguration();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    User.runAsLoginUser(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      @Override<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      public Void run() throws Exception {<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        List&lt;UserPermission&gt; acls = AccessControlLists.getUserTablePermissions(conf, tableName);<a name="line.938"></a>
-<span class="sourceLineNo">939</span>        if (acls != null) {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          tableAcls.put(tableName, acls);<a name="line.940"></a>
-<span class="sourceLineNo">941</span>        }<a name="line.941"></a>
-<span class="sourceLineNo">942</span>        return null;<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    });<a name="line.944"></a>
-<span class="sourceLineNo">945</span>  }<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>  @Ove

<TRUNCATED>

[10/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
index 827d1f3..1b32e2b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
@@ -252,6332 +252,6333 @@
 <span class="sourceLineNo">244</span>    dir = TEST_UTIL.getDataTestDir("TestHRegion").toString();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    method = name.getMethodName();<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    tableName = TableName.valueOf(method);<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>  @After<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public void tearDown() throws Exception {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    TEST_UTIL.cleanupTestDir();<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @throws IOException<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Test<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void testSequenceId() throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // Open region again.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    byte [] value = Bytes.toBytes(method);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Make a random put against our cf.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Put put = new Put(value);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    region.put(put);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // No flush yet so init numbers should still be in place.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    region.flush(true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    long max = region.getMaxFlushedSeqId();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    region.close();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<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>   * Test for Bug 2 of HBASE-10466.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flushes for region close."<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * @throws IOException<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Test<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // Get some random bytes.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    byte [] value = Bytes.toBytes(method);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    // Make a random put against our cf.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    Put put = new Put(value);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    region.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    storeFlushCtx.prepare();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // Second put something in current memstore<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    region.put(put);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    region.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  /*<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * See HBASE-10845<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Test<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      StoreFlushContext storeFlushCtx;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.325"></a>
-<span class="sourceLineNo">326</span>          throws IOException {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        super(fs, rootDir, logName, conf);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>      @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      public void sync(long txid) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        storeFlushCtx.prepare();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        super.sync(txid);<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><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        COLUMN_FAMILY_BYTES);<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // Get some random bytes.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    byte [] value = Bytes.toBytes(method);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    Put put = new Put(value);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    boolean threwIOE = false;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      region.put(put);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    } catch (IOException ioe) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      threwIOE = true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    } finally {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        mss.getDataSize() == 0);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<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>   * Create a WAL outside of the usual helper in<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@code fs.file.impl}.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final Configuration walConf = new Configuration(conf);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return new WALFactory(walConf, callingMethod)<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Test<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootDir = new Path(dir + testName);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        COLUMN_FAMILY_BYTES);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // Put one value<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    byte [] value = Bytes.toBytes(method);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    Put put = new Put(value);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    region.put(put);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(onePutSize &gt; 0);<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    doThrow(new IOException())<a name="line.406"></a>
-<span class="sourceLineNo">407</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    put = new Put(value);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    try {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      region.put(put);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      fail("Should have failed with IOException");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (IOException expected) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    long expectedSize = onePutSize * 2;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    assertEquals("memstoreSize should be incremented",<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        expectedSize, region.getMemStoreDataSize());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    assertEquals("flushable size should be incremented",<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    region.setCoprocessorHost(null);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * if memstoreSize is not larger than 0."<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws Exception<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Test<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // Only retry once.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final User user =<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // Inject our faulty LocalFileSystem<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      public Object run() throws Exception {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        FileSystem fs = FileSystem.get(conf);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HRegion region = null;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        try {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          // Initialize region<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>              COLUMN_FAMILY_BYTES);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          long size = region.getMemStoreDataSize();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          Assert.assertEquals(0, size);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          Put p1 = new Put(row);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          region.put(p1);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          try {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            LOG.info("Flushing");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            region.flush(true);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          } catch (DroppedSnapshotException dse) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>            // What we are expecting<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // Make it so all writes succeed from here on out<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          ffs.fault.set(false);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // Check sizes.  Should still be the one entry.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          // subtract the right amount, the snapshot size only.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          Put p2 = new Put(row);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.488"></a>
-<span class="sourceLineNo">489</span>          region.put(p2);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          // it<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          region.flush(true);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          // Make sure our memory accounting is right.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } finally {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        return null;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    });<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Test<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    // Only retry once.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    final User user =<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Inject our faulty LocalFileSystem<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      @Override<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      public Object run() throws Exception {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        FileSystem fs = FileSystem.get(conf);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        HRegion region = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        try {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // Initialize region<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region = initHRegion(tableName, null, null, false,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          long size = region.getMemStoreDataSize();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          Assert.assertEquals(0, size);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          Put p1 = new Put(row);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          region.put(p1);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          StoreFlushContext storeFlushCtx =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          storeFlushCtx.prepare();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          // Now add two entries to the foreground memstore.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          Put p2 = new Put(row);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          region.put(p2);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          // Now try close on top of a failing flush.<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          region.close();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          fail();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } catch (DroppedSnapshotException dse) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          // Expected<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        } finally {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          ffs.fault.set(false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    });<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  @Test<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    byte[] family = Bytes.toBytes("family");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    region.put(put);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    region.flush(true);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    Scan scan = new Scan();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    scan.setMaxVersions(3);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    // open the first scanner<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    region.delete(delete);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    region.flush(true);<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    // open the second scanner<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    // make a major compaction<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    region.compact(true);<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>    // open the third scanner<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    scanner1.next(results);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    System.out.println(results);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assertEquals(1, results.size());<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    results.clear();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    scanner2.next(results);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    System.out.println(results);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    assertEquals(0, results.size());<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    results.clear();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scanner3.next(results);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    System.out.println(results);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    assertEquals(0, results.size());<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  @Test<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    byte[] family = Bytes.toBytes("family");<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    region.put(put);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    region.put(put);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.flush(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    Scan scan = new Scan();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    scan.setMaxVersions(3);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the first scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    region.compact(true);<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    scanner1.next(results);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Cell keyValue = results.get(0);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner1.close();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  @Test<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    byte[] family = Bytes.toBytes("family");<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    try {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>      long maxSeqId = 1050;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      long minSeqId = 1000;<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        fs.create(recoveredEdits);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>        long time = System.nanoTime();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        WALEdit edit = new WALEdit();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.662"></a>
-<span class="sourceLineNo">663</span>            .toBytes(i)));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>        writer.close();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      for (HStore store : region.getStores()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assertEquals(maxSeqId, seqId);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      region.getMVCC().advanceTo(seqId);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      Get get = new Get(row);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Result result = region.get(get);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        assertEquals(1, kvs.size());<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    } finally {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.region = null;<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      wals.close();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @Test<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    byte[] family = Bytes.toBytes("family");<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    try {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>      long maxSeqId = 1050;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      long minSeqId = 1000;<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        fs.create(recoveredEdits);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long time = System.nanoTime();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        WALEdit edit = new WALEdit();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.713"></a>
-<span class="sourceLineNo">714</span>            .toBytes(i)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>        writer.close();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      long recoverSeqId = 1030;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (HStore store : region.getStores()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertEquals(maxSeqId, seqId);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      region.getMVCC().advanceTo(seqId);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Get get = new Get(row);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      Result result = region.get(get);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        if (i &lt; recoverSeqId) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>          assertEquals(0, kvs.size());<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        } else {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          assertEquals(1, kvs.size());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    } finally {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      this.region = null;<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      wals.close();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  @Test<a name="line.747"></a>
-<span class="sourceLineNo">748</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    byte[] family = Bytes.toBytes("family");<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    try {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        dos.writeInt(i);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        dos.close();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      long minSeqId = 2000;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      dos.close();<a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, null);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      assertEquals(minSeqId, seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    } finally {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      this.region = null;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    byte[] family = Bytes.toBytes("family");<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    try {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>      long maxSeqId = 1050;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      long minSeqId = 1000;<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        fs.create(recoveredEdits);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>        long time = System.nanoTime();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        WALEdit edit = null;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        if (i == maxSeqId) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          CompactionDescriptor.newBuilder()<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          .build());<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        } else {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          edit = new WALEdit();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.815"></a>
-<span class="sourceLineNo">816</span>            .toBytes(i)));<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        }<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        writer.close();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>      long recoverSeqId = 1030;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      for (HStore store : region.getStores()) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      assertEquals(maxSeqId, seqId);<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>      // assert that the files are flushed<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.833"></a>
-<span class="sourceLineNo">834</span><a name="line.834"></a>
-<span class="sourceLineNo">835</span>    } finally {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      this.region = null;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      wals.close();<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    }<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Test<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    testRecoveredEditsReplayCompaction(false);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    testRecoveredEditsReplayCompaction(true);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    byte[] family = Bytes.toBytes("family");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    try {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>      long maxSeqId = 3;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      long minSeqId = 0;<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.862"></a>
-<span class="sourceLineNo">863</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        region.put(put);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        region.flush(true);<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>      // this will create a region with 3 files<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        storeFiles.add(sf.getPath());<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // disable compaction completion<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      region.compactStores();<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // ensure that nothing changed<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          + "from the compaction, could not find any";<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      assertNotNull(errorMsg, files);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      assertEquals(errorMsg, 1, files.length);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      // move the file inside region dir<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          files[0].getPath());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        // Mix the byte array to have a new encodedName<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.902"></a>
-<span class="sourceLineNo">903</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      fs.create(recoveredEdits);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      long time = System.nanoTime();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.916"></a>
-<span class="sourceLineNo">917</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          compactionDescriptor)));<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      writer.close();<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // close the region now, and reopen again<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      region.getTableDescriptor();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      region.getRegionInfo();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      region.close();<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      try {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        region = HRegion.openHRegion(region, null);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      } catch (WrongRegionException wre) {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // now check whether we have only one store file, the compacted one<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      for (HStoreFile sf : sfs) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      if (!mismatchedRegionName) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        Result result = region.get(get);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      }<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      this.region = null;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      wals.close();<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  @Test<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  public void testFlushMarkers() throws Exception {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    byte[] family = Bytes.toBytes("family");<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    try {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>      long maxSeqId = 3;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      long minSeqId = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        region.put(put);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        region.flush(true);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>      // this will create a region with 3 files from flush<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        storeFiles.add(sf.getPath().getName());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      }<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // now verify that the flush markers are written<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      wal.shutdown();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        TEST_UTIL.getConfiguration());<a name="line.993"></a>
-<span class="sourceLineNo">994</span>      try {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        long lastFlushSeqId = -1;<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        while (true) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          WAL.Entry entry = reader.next();<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          if (entry == null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            break;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>          }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            assertNotNull(flushDesc);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>            }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            } else {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>            flushDescriptors.add(entry);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        // now write those markers to the recovered edits again.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span><a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span><a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        fs.create(recoveredEdits);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          writer.append(entry);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        writer.close();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      } finally {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (null != reader) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          try {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            reader.close();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          } catch (IOException exception) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>            LOG.debug("exception details", exception);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
+<span class="sourceLineNo">247</span>    CONF.set(CompactingMemStore.IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY, String.valueOf(0.02));<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>  @After<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public void tearDown() throws Exception {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    TEST_UTIL.cleanupTestDir();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @throws IOException<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Test<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public void testSequenceId() throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    region.close();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // Open region again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    byte [] value = Bytes.toBytes(method);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // Make a random put against our cf.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    Put put = new Put(value);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    region.put(put);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // No flush yet so init numbers should still be in place.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    region.flush(true);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    long max = region.getMaxFlushedSeqId();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    region.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(max, region.getMaxFlushedSeqId());<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>  /**<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * Test for Bug 2 of HBASE-10466.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * case previous flush fails and leaves some data in snapshot. The bug co

<TRUNCATED>

[18/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html b/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html
index d253aa8..149599e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html
@@ -213,337 +213,330 @@
 <span class="sourceLineNo">205</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.205"></a>
 <span class="sourceLineNo">206</span>          master.getMasterCoprocessorHost().preMoveServers(hostPorts, request.getTargetGroup());<a name="line.206"></a>
 <span class="sourceLineNo">207</span>        }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        checkPermission("moveServers");<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        groupAdminServer.moveServers(hostPorts, request.getTargetGroup());<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          master.getMasterCoprocessorHost().postMoveServers(hostPorts, request.getTargetGroup());<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      } catch (IOException e) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      done.run(builder.build());<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>    @Override<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public void moveTables(RpcController controller, MoveTablesRequest request,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        RpcCallback&lt;MoveTablesResponse&gt; done) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      MoveTablesResponse.Builder builder = MoveTablesResponse.newBuilder();<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      Set&lt;TableName&gt; tables = new HashSet&lt;&gt;(request.getTableNameList().size());<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      for (HBaseProtos.TableName tableName : request.getTableNameList()) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        tables.add(ProtobufUtil.toTableName(tableName));<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      LOG.info(master.getClientIdAuditPrefix() + " move tables " + tables +" to rsgroup "<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          + request.getTargetGroup());<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      try {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          master.getMasterCoprocessorHost().preMoveTables(tables, request.getTargetGroup());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        checkPermission("moveTables");<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        groupAdminServer.moveTables(tables, request.getTargetGroup());<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          master.getMasterCoprocessorHost().postMoveTables(tables, request.getTargetGroup());<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      } catch (IOException e) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      done.run(builder.build());<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>    @Override<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    public void addRSGroup(RpcController controller, AddRSGroupRequest request,<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        RpcCallback&lt;AddRSGroupResponse&gt; done) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      AddRSGroupResponse.Builder builder = AddRSGroupResponse.newBuilder();<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      LOG.info(master.getClientIdAuditPrefix() + " add rsgroup " + request.getRSGroupName());<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      try {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          master.getMasterCoprocessorHost().preAddRSGroup(request.getRSGroupName());<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        checkPermission("addRSGroup");<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        groupAdminServer.addRSGroup(request.getRSGroupName());<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          master.getMasterCoprocessorHost().postAddRSGroup(request.getRSGroupName());<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      } catch (IOException e) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      done.run(builder.build());<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    @Override<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    public void removeRSGroup(RpcController controller,<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        RemoveRSGroupRequest request, RpcCallback&lt;RemoveRSGroupResponse&gt; done) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      RemoveRSGroupResponse.Builder builder =<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          RemoveRSGroupResponse.newBuilder();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      LOG.info(master.getClientIdAuditPrefix() + " remove rsgroup " + request.getRSGroupName());<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      try {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          master.getMasterCoprocessorHost().preRemoveRSGroup(request.getRSGroupName());<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        }<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        checkPermission("removeRSGroup");<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        groupAdminServer.removeRSGroup(request.getRSGroupName());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          master.getMasterCoprocessorHost().postRemoveRSGroup(request.getRSGroupName());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      } catch (IOException e) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      done.run(builder.build());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>    @Override<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    public void balanceRSGroup(RpcController controller,<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        BalanceRSGroupRequest request, RpcCallback&lt;BalanceRSGroupResponse&gt; done) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      BalanceRSGroupResponse.Builder builder = BalanceRSGroupResponse.newBuilder();<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      LOG.info(master.getClientIdAuditPrefix() + " balance rsgroup, group=" +<a name="line.289"></a>
-<span class="sourceLineNo">290</span>              request.getRSGroupName());<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          master.getMasterCoprocessorHost().preBalanceRSGroup(request.getRSGroupName());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        checkPermission("balanceRSGroup");<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        boolean balancerRan = groupAdminServer.balanceRSGroup(request.getRSGroupName());<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        builder.setBalanceRan(balancerRan);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          master.getMasterCoprocessorHost().postBalanceRSGroup(request.getRSGroupName(),<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              balancerRan);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      } catch (IOException e) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        builder.setBalanceRan(false);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      done.run(builder.build());<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 listRSGroupInfos(RpcController controller,<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        ListRSGroupInfosRequest request, RpcCallback&lt;ListRSGroupInfosResponse&gt; done) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      ListRSGroupInfosResponse.Builder builder = ListRSGroupInfosResponse.newBuilder();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      LOG.info(master.getClientIdAuditPrefix() + " list rsgroup");<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        checkPermission("listRSGroup");<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        for (RSGroupInfo RSGroupInfo : groupAdminServer.listRSGroups()) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          builder.addRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo));<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      } catch (IOException e) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      done.run(builder.build());<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>    @Override<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    public void getRSGroupInfoOfServer(RpcController controller,<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        GetRSGroupInfoOfServerRequest request, RpcCallback&lt;GetRSGroupInfoOfServerResponse&gt; done) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      GetRSGroupInfoOfServerResponse.Builder builder = GetRSGroupInfoOfServerResponse.newBuilder();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      Address hp = Address.fromParts(request.getServer().getHostName(),<a name="line.329"></a>
-<span class="sourceLineNo">330</span>          request.getServer().getPort());<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, server="<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          + hp);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      try {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        checkPermission("getRSGroupInfoOfServer");<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        RSGroupInfo info = groupAdminServer.getRSGroupOfServer(hp);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        if (info != null) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>          builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(info));<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      } catch (IOException e) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      done.run(builder.build());<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 moveServersAndTables(RpcController controller,<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        MoveServersAndTablesRequest request, RpcCallback&lt;MoveServersAndTablesResponse&gt; done) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      MoveServersAndTablesResponse.Builder builder = MoveServersAndTablesResponse.newBuilder();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>      Set&lt;Address&gt; hostPorts = Sets.newHashSet();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      for (HBaseProtos.ServerName el : request.getServersList()) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        hostPorts.add(Address.fromParts(el.getHostName(), el.getPort()));<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      Set&lt;TableName&gt; tables = new HashSet&lt;&gt;(request.getTableNameList().size());<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      for (HBaseProtos.TableName tableName : request.getTableNameList()) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        tables.add(ProtobufUtil.toTableName(tableName));<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts<a name="line.357"></a>
-<span class="sourceLineNo">358</span>          + " and tables " + tables + " to rsgroup" + request.getTargetGroup());<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      try {<a name="line.359"></a>
+<span class="sourceLineNo">208</span>        groupAdminServer.moveServers(hostPorts, request.getTargetGroup());<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          master.getMasterCoprocessorHost().postMoveServers(hostPorts, request.getTargetGroup());<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      } catch (IOException e) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      done.run(builder.build());<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>    @Override<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public void moveTables(RpcController controller, MoveTablesRequest request,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        RpcCallback&lt;MoveTablesResponse&gt; done) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      MoveTablesResponse.Builder builder = MoveTablesResponse.newBuilder();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      Set&lt;TableName&gt; tables = new HashSet&lt;&gt;(request.getTableNameList().size());<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      for (HBaseProtos.TableName tableName : request.getTableNameList()) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        tables.add(ProtobufUtil.toTableName(tableName));<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      LOG.info(master.getClientIdAuditPrefix() + " move tables " + tables +" to rsgroup "<a name="line.226"></a>
+<span class="sourceLineNo">227</span>          + request.getTargetGroup());<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      try {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          master.getMasterCoprocessorHost().preMoveTables(tables, request.getTargetGroup());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        groupAdminServer.moveTables(tables, request.getTargetGroup());<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          master.getMasterCoprocessorHost().postMoveTables(tables, request.getTargetGroup());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      } catch (IOException e) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      done.run(builder.build());<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>    @Override<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    public void addRSGroup(RpcController controller, AddRSGroupRequest request,<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        RpcCallback&lt;AddRSGroupResponse&gt; done) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      AddRSGroupResponse.Builder builder = AddRSGroupResponse.newBuilder();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      LOG.info(master.getClientIdAuditPrefix() + " add rsgroup " + request.getRSGroupName());<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      try {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          master.getMasterCoprocessorHost().preAddRSGroup(request.getRSGroupName());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        groupAdminServer.addRSGroup(request.getRSGroupName());<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          master.getMasterCoprocessorHost().postAddRSGroup(request.getRSGroupName());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        }<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      } catch (IOException e) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      done.run(builder.build());<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>    @Override<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    public void removeRSGroup(RpcController controller,<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        RemoveRSGroupRequest request, RpcCallback&lt;RemoveRSGroupResponse&gt; done) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      RemoveRSGroupResponse.Builder builder =<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          RemoveRSGroupResponse.newBuilder();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      LOG.info(master.getClientIdAuditPrefix() + " remove rsgroup " + request.getRSGroupName());<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      try {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          master.getMasterCoprocessorHost().preRemoveRSGroup(request.getRSGroupName());<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        }<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        groupAdminServer.removeRSGroup(request.getRSGroupName());<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          master.getMasterCoprocessorHost().postRemoveRSGroup(request.getRSGroupName());<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      } catch (IOException e) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      done.run(builder.build());<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>    @Override<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    public void balanceRSGroup(RpcController controller,<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        BalanceRSGroupRequest request, RpcCallback&lt;BalanceRSGroupResponse&gt; done) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      BalanceRSGroupResponse.Builder builder = BalanceRSGroupResponse.newBuilder();<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      LOG.info(master.getClientIdAuditPrefix() + " balance rsgroup, group=" +<a name="line.285"></a>
+<span class="sourceLineNo">286</span>              request.getRSGroupName());<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>          master.getMasterCoprocessorHost().preBalanceRSGroup(request.getRSGroupName());<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        }<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        boolean balancerRan = groupAdminServer.balanceRSGroup(request.getRSGroupName());<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        builder.setBalanceRan(balancerRan);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          master.getMasterCoprocessorHost().postBalanceRSGroup(request.getRSGroupName(),<a name="line.294"></a>
+<span class="sourceLineNo">295</span>              balancerRan);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      } catch (IOException e) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        builder.setBalanceRan(false);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      done.run(builder.build());<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>    @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    public void listRSGroupInfos(RpcController controller,<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        ListRSGroupInfosRequest request, RpcCallback&lt;ListRSGroupInfosResponse&gt; done) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      ListRSGroupInfosResponse.Builder builder = ListRSGroupInfosResponse.newBuilder();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      LOG.info(master.getClientIdAuditPrefix() + " list rsgroup");<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        checkPermission("listRSGroup");<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        for (RSGroupInfo RSGroupInfo : groupAdminServer.listRSGroups()) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          builder.addRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(RSGroupInfo));<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      } catch (IOException e) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      done.run(builder.build());<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">320</span>    @Override<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    public void getRSGroupInfoOfServer(RpcController controller,<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        GetRSGroupInfoOfServerRequest request, RpcCallback&lt;GetRSGroupInfoOfServerResponse&gt; done) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      GetRSGroupInfoOfServerResponse.Builder builder = GetRSGroupInfoOfServerResponse.newBuilder();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      Address hp = Address.fromParts(request.getServer().getHostName(),<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          request.getServer().getPort());<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      LOG.info(master.getClientIdAuditPrefix() + " initiates rsgroup info retrieval, server="<a name="line.326"></a>
+<span class="sourceLineNo">327</span>          + hp);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        checkPermission("getRSGroupInfoOfServer");<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        RSGroupInfo info = groupAdminServer.getRSGroupOfServer(hp);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        if (info != null) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          builder.setRSGroupInfo(RSGroupProtobufUtil.toProtoGroupInfo(info));<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      } catch (IOException e) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      done.run(builder.build());<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>    public void moveServersAndTables(RpcController controller,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        MoveServersAndTablesRequest request, RpcCallback&lt;MoveServersAndTablesResponse&gt; done) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      MoveServersAndTablesResponse.Builder builder = MoveServersAndTablesResponse.newBuilder();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      Set&lt;Address&gt; hostPorts = Sets.newHashSet();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      for (HBaseProtos.ServerName el : request.getServersList()) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        hostPorts.add(Address.fromParts(el.getHostName(), el.getPort()));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      Set&lt;TableName&gt; tables = new HashSet&lt;&gt;(request.getTableNameList().size());<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      for (HBaseProtos.TableName tableName : request.getTableNameList()) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        tables.add(ProtobufUtil.toTableName(tableName));<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      }<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      LOG.info(master.getClientIdAuditPrefix() + " move servers " + hostPorts<a name="line.352"></a>
+<span class="sourceLineNo">353</span>          + " and tables " + tables + " to rsgroup" + request.getTargetGroup());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      try {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          master.getMasterCoprocessorHost().preMoveServersAndTables(hostPorts, tables,<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              request.getTargetGroup());<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        groupAdminServer.moveServersAndTables(hostPorts, tables, request.getTargetGroup());<a name="line.359"></a>
 <span class="sourceLineNo">360</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          master.getMasterCoprocessorHost().preMoveServersAndTables(hostPorts, tables,<a name="line.361"></a>
+<span class="sourceLineNo">361</span>          master.getMasterCoprocessorHost().postMoveServersAndTables(hostPorts, tables,<a name="line.361"></a>
 <span class="sourceLineNo">362</span>              request.getTargetGroup());<a name="line.362"></a>
 <span class="sourceLineNo">363</span>        }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        checkPermission("moveServersAndTables");<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        groupAdminServer.moveServersAndTables(hostPorts, tables, request.getTargetGroup());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          master.getMasterCoprocessorHost().postMoveServersAndTables(hostPorts, tables,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              request.getTargetGroup());<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      } catch (IOException e) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      done.run(builder.build());<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>
-<span class="sourceLineNo">376</span>    @Override<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    public void removeServers(RpcController controller,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        RemoveServersRequest request,<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        RpcCallback&lt;RemoveServersResponse&gt; done) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      RemoveServersResponse.Builder builder =<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          RemoveServersResponse.newBuilder();<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      Set&lt;Address&gt; servers = Sets.newHashSet();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      for (HBaseProtos.ServerName el : request.getServersList()) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        servers.add(Address.fromParts(el.getHostName(), el.getPort()));<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info(master.getClientIdAuditPrefix()<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          + " remove decommissioned servers from rsgroup: " + servers);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      try {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          master.getMasterCoprocessorHost().preRemoveServers(servers);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        }<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        checkPermission("removeServers");<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        groupAdminServer.removeServers(servers);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          master.getMasterCoprocessorHost().postRemoveServers(servers);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      } catch (IOException e) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      done.run(builder.build());<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><a name="line.403"></a>
-<span class="sourceLineNo">404</span>  boolean rsgroupHasServersOnline(TableDescriptor desc) throws IOException {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    String groupName;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    try {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      groupName =<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString())<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      if (groupName == null) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    } catch (MasterNotRunningException | PleaseHoldException e) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      LOG.info("Master has not initialized yet; temporarily using default RSGroup '" +<a name="line.414"></a>
-<span class="sourceLineNo">415</span>          RSGroupInfo.DEFAULT_GROUP + "' for deploy of system table");<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    }<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (rsGroupInfo == null) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      throw new ConstraintException(<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          "Default RSGroup (" + groupName + ") for this table's " + "namespace does not exist.");<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (ServerName onlineServer : master.getServerManager().createDestinationServersList()) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      if (rsGroupInfo.getServers().contains(onlineServer.getAddress())) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        return true;<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>    return false;<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>  void assignTableToGroup(TableDescriptor desc) throws IOException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    String groupName =<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString())<a name="line.435"></a>
-<span class="sourceLineNo">436</span>                .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    if (groupName == null) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    if (rsGroupInfo == null) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      throw new ConstraintException("Default RSGroup (" + groupName + ") for this table's "<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          + "namespace does not exist.");<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    if (!rsGroupInfo.containsTable(desc.getTableName())) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      LOG.debug("Pre-moving table " + desc.getTableName() + " to RSGroup " + groupName);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      groupAdminServer.moveTables(Sets.newHashSet(desc.getTableName()), groupName);<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><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  /////////////////////////////////////////////////////////////////////////////<a name="line.451"></a>
-<span class="sourceLineNo">452</span>  // MasterObserver overrides<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  /////////////////////////////////////////////////////////////////////////////<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void preCreateTableAction(<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      final TableDescriptor desc,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final RegionInfo[] regions) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    if (!desc.getTableName().isSystemTable() &amp;&amp; !rsgroupHasServersOnline(desc)) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throw new HBaseIOException("No online servers in the rsgroup, which table " +<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          desc.getTableName().getNameAsString() + " belongs to");<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      done.run(builder.build());<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>    @Override<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    public void removeServers(RpcController controller,<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        RemoveServersRequest request,<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        RpcCallback&lt;RemoveServersResponse&gt; done) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      RemoveServersResponse.Builder builder =<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          RemoveServersResponse.newBuilder();<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      Set&lt;Address&gt; servers = Sets.newHashSet();<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      for (HBaseProtos.ServerName el : request.getServersList()) {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        servers.add(Address.fromParts(el.getHostName(), el.getPort()));<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      LOG.info(master.getClientIdAuditPrefix()<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          + " remove decommissioned servers from rsgroup: " + servers);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      try {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          master.getMasterCoprocessorHost().preRemoveServers(servers);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        groupAdminServer.removeServers(servers);<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        if (master.getMasterCoprocessorHost() != null) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          master.getMasterCoprocessorHost().postRemoveServers(servers);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      } catch (IOException e) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        CoprocessorRpcUtils.setControllerException(controller, e);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      done.run(builder.build());<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><a name="line.396"></a>
+<span class="sourceLineNo">397</span>  boolean rsgroupHasServersOnline(TableDescriptor desc) throws IOException {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    String groupName;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    try {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      groupName =<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString())<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      if (groupName == null) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    } catch (MasterNotRunningException | PleaseHoldException e) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      LOG.info("Master has not initialized yet; temporarily using default RSGroup '" +<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          RSGroupInfo.DEFAULT_GROUP + "' for deploy of system table");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    }<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    if (rsGroupInfo == null) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      throw new ConstraintException(<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          "Default RSGroup (" + groupName + ") for this table's " + "namespace does not exist.");<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>    for (ServerName onlineServer : master.getServerManager().createDestinationServersList()) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      if (rsGroupInfo.getServers().contains(onlineServer.getAddress())) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        return true;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return false;<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>  void assignTableToGroup(TableDescriptor desc) throws IOException {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    String groupName =<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        master.getClusterSchema().getNamespace(desc.getTableName().getNamespaceAsString())<a name="line.428"></a>
+<span class="sourceLineNo">429</span>                .getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    if (groupName == null) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      groupName = RSGroupInfo.DEFAULT_GROUP;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    }<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    RSGroupInfo rsGroupInfo = groupAdminServer.getRSGroupInfo(groupName);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    if (rsGroupInfo == null) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      throw new ConstraintException("Default RSGroup (" + groupName + ") for this table's "<a name="line.435"></a>
+<span class="sourceLineNo">436</span>          + "namespace does not exist.");<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    if (!rsGroupInfo.containsTable(desc.getTableName())) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      LOG.debug("Pre-moving table " + desc.getTableName() + " to RSGroup " + groupName);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      groupAdminServer.moveTables(Sets.newHashSet(desc.getTableName()), groupName);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<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>  /////////////////////////////////////////////////////////////////////////////<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  // MasterObserver overrides<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  /////////////////////////////////////////////////////////////////////////////<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  @Override<a name="line.448"></a>
+<span class="sourceLineNo">449</span>  public void preCreateTableAction(<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      final ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      final TableDescriptor desc,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      final RegionInfo[] regions) throws IOException {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    if (!desc.getTableName().isSystemTable() &amp;&amp; !rsgroupHasServersOnline(desc)) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      throw new HBaseIOException("No online servers in the rsgroup, which table " +<a name="line.454"></a>
+<span class="sourceLineNo">455</span>          desc.getTableName().getNameAsString() + " belongs to");<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>  // Assign table to default RSGroup.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>  @Override<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  public void postCreateTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      TableDescriptor desc, RegionInfo[] regions) throws IOException {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    assignTableToGroup(desc);<a name="line.463"></a>
 <span class="sourceLineNo">464</span>  }<a name="line.464"></a>
 <span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  // Assign table to default RSGroup.<a name="line.466"></a>
+<span class="sourceLineNo">466</span>  // Remove table from its RSGroup.<a name="line.466"></a>
 <span class="sourceLineNo">467</span>  @Override<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  public void postCreateTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      TableDescriptor desc, RegionInfo[] regions) throws IOException {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    assignTableToGroup(desc);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>  // Remove table from its RSGroup.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void postDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.475"></a>
-<span class="sourceLineNo">476</span>                              TableName tableName) throws IOException {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    try {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      RSGroupInfo group = groupAdminServer.getRSGroupInfoOfTable(tableName);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      if (group != null) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        LOG.debug(String.format("Removing deleted table '%s' from rsgroup '%s'", tableName,<a name="line.480"></a>
-<span class="sourceLineNo">481</span>            group.getName()));<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        groupAdminServer.moveTables(Sets.newHashSet(tableName), null);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    } catch (IOException ex) {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      LOG.debug("Failed to perform RSGroup information cleanup for table: " + tableName, ex);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>  @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>  public void preCreateNamespace(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.490"></a>
-<span class="sourceLineNo">491</span>                                 NamespaceDescriptor ns) throws IOException {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    String group = ns.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    if(group != null &amp;&amp; groupAdminServer.getRSGroupInfo(group) == null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      throw new ConstraintException("Region server group "+group+" does not exit");<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>  @Override<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  public void preModifyNamespace(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      NamespaceDescriptor ns) throws IOException {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    preCreateNamespace(ctx, ns);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>  }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>  @Override<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  public void preCloneSnapshot(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      SnapshotDescription snapshot, TableDescriptor desc) throws IOException {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    assignTableToGroup(desc);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  }<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>  @Override<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  public void postClearDeadServers(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      List&lt;ServerName&gt; servers, List&lt;ServerName&gt; notClearedServers)<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      throws IOException {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    Set&lt;Address&gt; clearedServer = servers.stream().<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        filter(server -&gt; !notClearedServers.contains(server)).<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        map(ServerName::getAddress).<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        collect(Collectors.toSet());<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    groupAdminServer.removeServers(clearedServer);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  }<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>  public void checkPermission(String request) throws IOException {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    accessChecker.requirePermission(getActiveUser(), request, Action.ADMIN);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  /**<a name="line.525"></a>
-<span class="sourceLineNo">526</span>   * Returns the active user to which authorization checks should be applied.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>   * If we are in the context of an RPC call, the remote user is used,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * otherwise the currently logged in user is used.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   */<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  private User getActiveUser() throws IOException {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    // for non-rpc handling, fallback to system user<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    Optional&lt;User&gt; optionalUser = RpcServer.getRequestUser();<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    if (optionalUser.isPresent()) {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return optionalUser.get();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    return userProvider.getCurrent();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>}<a name="line.538"></a>
+<span class="sourceLineNo">468</span>  public void postDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.468"></a>
+<span class="sourceLineNo">469</span>                              TableName tableName) throws IOException {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    try {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      RSGroupInfo group = groupAdminServer.getRSGroupInfoOfTable(tableName);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      if (group != null) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        LOG.debug(String.format("Removing deleted table '%s' from rsgroup '%s'", tableName,<a name="line.473"></a>
+<span class="sourceLineNo">474</span>            group.getName()));<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        groupAdminServer.moveTables(Sets.newHashSet(tableName), null);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      }<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    } catch (IOException ex) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      LOG.debug("Failed to perform RSGroup information cleanup for table: " + tableName, ex);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  @Override<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  public void preCreateNamespace(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.483"></a>
+<span class="sourceLineNo">484</span>                                 NamespaceDescriptor ns) throws IOException {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    String group = ns.getConfigurationValue(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    if(group != null &amp;&amp; groupAdminServer.getRSGroupInfo(group) == null) {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      throw new ConstraintException("Region server group "+group+" does not exit");<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  @Override<a name="line.491"></a>
+<span class="sourceLineNo">492</span>  public void preModifyNamespace(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      NamespaceDescriptor ns) throws IOException {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    preCreateNamespace(ctx, ns);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>  public void preCloneSnapshot(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      SnapshotDescription snapshot, TableDescriptor desc) throws IOException {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    assignTableToGroup(desc);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  @Override<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  public void postClearDeadServers(ObserverContext&lt;MasterCoprocessorEnvironment&gt; ctx,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      List&lt;ServerName&gt; servers, List&lt;ServerName&gt; notClearedServers)<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      throws IOException {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    Set&lt;Address&gt; clearedServer = servers.stream().<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        filter(server -&gt; !notClearedServers.contains(server)).<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        map(ServerName::getAddress).<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        collect(Collectors.toSet());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    groupAdminServer.removeServers(clearedServer);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>  }<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>  public void checkPermission(String request) throws IOException {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    accessChecker.requirePermission(getActiveUser(), request, Action.ADMIN);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>  }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>  /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>   * Returns the active user to which authorization checks should be applied.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * If we are in the context of an RPC call, the remote user is used,<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   * otherwise the currently logged in user is used.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>   */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  private User getActiveUser() throws IOException {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    // for non-rpc handling, fallback to system user<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    Optional&lt;User&gt; optionalUser = RpcServer.getRequestUser();<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    if (optionalUser.isPresent()) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      return optionalUser.get();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    return userProvider.getCurrent();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>}<a name="line.531"></a>
 
 
 


[21/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.OpType.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.OpType.html b/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.OpType.html
index dfcafa1..5731302 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.OpType.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.OpType.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static enum <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.html#line.506">AccessController.OpType</a>
+<pre>private static enum <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.html#line.507">AccessController.OpType</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>&lt;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a>&gt;</pre>
 </li>
 </ul>
@@ -257,7 +257,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>GET</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.507">GET</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.508">GET</a></pre>
 </li>
 </ul>
 <a name="EXISTS">
@@ -266,7 +266,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>EXISTS</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.508">EXISTS</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.509">EXISTS</a></pre>
 </li>
 </ul>
 <a name="SCAN">
@@ -275,7 +275,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>SCAN</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.509">SCAN</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.510">SCAN</a></pre>
 </li>
 </ul>
 <a name="PUT">
@@ -284,7 +284,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>PUT</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.510">PUT</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.511">PUT</a></pre>
 </li>
 </ul>
 <a name="DELETE">
@@ -293,7 +293,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>DELETE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.511">DELETE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.512">DELETE</a></pre>
 </li>
 </ul>
 <a name="CHECK_AND_PUT">
@@ -302,7 +302,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>CHECK_AND_PUT</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.512">CHECK_AND_PUT</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.513">CHECK_AND_PUT</a></pre>
 </li>
 </ul>
 <a name="CHECK_AND_DELETE">
@@ -311,7 +311,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>CHECK_AND_DELETE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.513">CHECK_AND_DELETE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.514">CHECK_AND_DELETE</a></pre>
 </li>
 </ul>
 <a name="INCREMENT_COLUMN_VALUE">
@@ -320,7 +320,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>INCREMENT_COLUMN_VALUE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.514">INCREMENT_COLUMN_VALUE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.515">INCREMENT_COLUMN_VALUE</a></pre>
 </li>
 </ul>
 <a name="APPEND">
@@ -329,7 +329,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>APPEND</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.515">APPEND</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.516">APPEND</a></pre>
 </li>
 </ul>
 <a name="INCREMENT">
@@ -338,7 +338,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>INCREMENT</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.516">INCREMENT</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.517">INCREMENT</a></pre>
 </li>
 </ul>
 </li>
@@ -355,7 +355,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>type</h4>
-<pre>private&nbsp;<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/security/access/AccessController.OpType.html#line.518">type</a></pre>
+<pre>private&nbsp;<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/security/access/AccessController.OpType.html#line.519">type</a></pre>
 </li>
 </ul>
 </li>
@@ -372,7 +372,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.506">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.507">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:
@@ -392,7 +392,7 @@ for (AccessController.OpType c : AccessController.OpType.values())
 <ul class="blockList">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.506">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>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.507">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>&nbsp;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 
@@ -414,7 +414,7 @@ not permitted.)</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<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>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.525">toString</a>()</pre>
+<pre>public&nbsp;<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>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.OpType.html#line.526">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/Enum.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><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>&lt;<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access">AccessController.OpType</a>&gt;</code></dd>


[22/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 648238b..d90d39c 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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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/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/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/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/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/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/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/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 09d03b4..76b740b 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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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/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/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.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/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/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index 928ae20..29a79fd 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -350,8 +350,8 @@
 <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>&lt;E&gt; (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>&lt;T&gt;, 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.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 81c504b..730b7cf 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -293,10 +293,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>&lt;E&gt; (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>&lt;T&gt;, 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/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/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</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>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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>&lt;E&gt; (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>&lt;T&gt;, 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/387c169a/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 c22e730..55a97e3 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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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.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>
 <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/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/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 550d779..e602642 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -208,8 +208,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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/net/class-use/Address.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/net/class-use/Address.html b/devapidocs/org/apache/hadoop/hbase/net/class-use/Address.html
index 388f232..5cc472a 100644
--- a/devapidocs/org/apache/hadoop/hbase/net/class-use/Address.html
+++ b/devapidocs/org/apache/hadoop/hbase/net/class-use/Address.html
@@ -105,6 +105,10 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.security.access">org.apache.hadoop.hbase.security.access</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.tmpl.master">org.apache.hadoop.hbase.tmpl.master</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
@@ -572,6 +576,38 @@
 </tbody>
 </table>
 </li>
+<li class="blockList"><a name="org.apache.hadoop.hbase.security.access">
+<!--   -->
+</a>
+<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a> in <a href="../../../../../../org/apache/hadoop/hbase/security/access/package-summary.html">org.apache.hadoop.hbase.security.access</a></h3>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
+<caption><span>Method parameters in <a href="../../../../../../org/apache/hadoop/hbase/security/access/package-summary.html">org.apache.hadoop.hbase.security.access</a> with type arguments of type <a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a></span><span class="tabEnd">&nbsp;</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>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.lang.String-">preMoveServers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers,
+              <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>&nbsp;targetGroup)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveServersAndTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.util.Set-java.lang.String-">preMoveServersAndTables</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;tables,
+                       <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>&nbsp;targetGroup)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">AccessController.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-">preRemoveServers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers)</code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+</li>
 <li class="blockList"><a name="org.apache.hadoop.hbase.tmpl.master">
 <!--   -->
 </a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/net/package-use.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/net/package-use.html b/devapidocs/org/apache/hadoop/hbase/net/package-use.html
index f5811e1..60176ad 100644
--- a/devapidocs/org/apache/hadoop/hbase/net/package-use.html
+++ b/devapidocs/org/apache/hadoop/hbase/net/package-use.html
@@ -105,6 +105,10 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.security.access">org.apache.hadoop.hbase.security.access</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.tmpl.master">org.apache.hadoop.hbase.tmpl.master</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
@@ -211,6 +215,26 @@
 </tbody>
 </table>
 </li>
+<li class="blockList"><a name="org.apache.hadoop.hbase.security.access">
+<!--   -->
+</a>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing classes, and an explanation">
+<caption><span>Classes in <a href="../../../../../org/apache/hadoop/hbase/net/package-summary.html">org.apache.hadoop.hbase.net</a> used by <a href="../../../../../org/apache/hadoop/hbase/security/access/package-summary.html">org.apache.hadoop.hbase.security.access</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Class and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/net/class-use/Address.html#org.apache.hadoop.hbase.security.access">Address</a>
+<div class="block">An immutable type to hold a hostname and port combo, like an Endpoint
+ or java.net.InetSocketAddress (but without danger of our calling
+ resolve -- we do NOT want a resolve happening every time we want
+ to hold a hostname and port combo).</div>
+</td>
+</tr>
+</tbody>
+</table>
+</li>
 <li class="blockList"><a name="org.apache.hadoop.hbase.tmpl.master">
 <!--   -->
 </a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 7a840cb..b7e4bfe 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -437,18 +437,18 @@
 <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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 9b43ec8..a1cb2a7 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -212,8 +212,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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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/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/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/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/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 7dce4a6..c6da314 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -229,13 +229,13 @@
 <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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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/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/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/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/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/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/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/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 f679c7b..712ac25 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -703,20 +703,20 @@
 <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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 3bd22b5..2731576 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -131,8 +131,8 @@
 <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>&lt;E&gt; (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>&lt;T&gt;, 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/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/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/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/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 a4ab1b7..f6fc79b 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -238,8 +238,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>&lt;E&gt; (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>&lt;T&gt;, 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/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/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
index 193a3a3032..d1e114d 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -198,8 +198,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>&lt;E&gt; (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>&lt;T&gt;, 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.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html b/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html
index 9415d46..d8ea5ac 100644
--- a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html
@@ -343,7 +343,7 @@ extends org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RSGroupAdm
 <ul class="blockList">
 <li class="blockList">
 <h4>moveTables</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.220">moveTables</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.219">moveTables</a>(com.google.protobuf.RpcController&nbsp;controller,
                        org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveTablesRequest&nbsp;request,
                        com.google.protobuf.RpcCallback&lt;org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveTablesResponse&gt;&nbsp;done)</pre>
 <dl>
@@ -358,7 +358,7 @@ extends org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RSGroupAdm
 <ul class="blockList">
 <li class="blockList">
 <h4>addRSGroup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.245">addRSGroup</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.243">addRSGroup</a>(com.google.protobuf.RpcController&nbsp;controller,
                        org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.AddRSGroupRequest&nbsp;request,
                        com.google.protobuf.RpcCallback&lt;org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.AddRSGroupResponse&gt;&nbsp;done)</pre>
 <dl>
@@ -373,7 +373,7 @@ extends org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RSGroupAdm
 <ul class="blockList">
 <li class="blockList">
 <h4>removeRSGroup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.265">removeRSGroup</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.262">removeRSGroup</a>(com.google.protobuf.RpcController&nbsp;controller,
                           org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupRequest&nbsp;request,
                           com.google.protobuf.RpcCallback&lt;org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveRSGroupResponse&gt;&nbsp;done)</pre>
 <dl>
@@ -388,7 +388,7 @@ extends org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RSGroupAdm
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceRSGroup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.286">balanceRSGroup</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.282">balanceRSGroup</a>(com.google.protobuf.RpcController&nbsp;controller,
                            org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.BalanceRSGroupRequest&nbsp;request,
                            com.google.protobuf.RpcCallback&lt;org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.BalanceRSGroupResponse&gt;&nbsp;done)</pre>
 <dl>
@@ -403,7 +403,7 @@ extends org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RSGroupAdm
 <ul class="blockList">
 <li class="blockList">
 <h4>listRSGroupInfos</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.310">listRSGroupInfos</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.305">listRSGroupInfos</a>(com.google.protobuf.RpcController&nbsp;controller,
                              org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.ListRSGroupInfosRequest&nbsp;request,
                              com.google.protobuf.RpcCallback&lt;org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.ListRSGroupInfosResponse&gt;&nbsp;done)</pre>
 <dl>
@@ -418,7 +418,7 @@ extends org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RSGroupAdm
 <ul class="blockList">
 <li class="blockList">
 <h4>getRSGroupInfoOfServer</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.326">getRSGroupInfoOfServer</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.321">getRSGroupInfoOfServer</a>(com.google.protobuf.RpcController&nbsp;controller,
                                    org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfServerRequest&nbsp;request,
                                    com.google.protobuf.RpcCallback&lt;org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.GetRSGroupInfoOfServerResponse&gt;&nbsp;done)</pre>
 <dl>
@@ -433,7 +433,7 @@ extends org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RSGroupAdm
 <ul class="blockList">
 <li class="blockList">
 <h4>moveServersAndTables</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.346">moveServersAndTables</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.341">moveServersAndTables</a>(com.google.protobuf.RpcController&nbsp;controller,
                                  org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveServersAndTablesRequest&nbsp;request,
                                  com.google.protobuf.RpcCallback&lt;org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.MoveServersAndTablesResponse&gt;&nbsp;done)</pre>
 <dl>
@@ -448,7 +448,7 @@ extends org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RSGroupAdm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>removeServers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.377">removeServers</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.RSGroupAdminServiceImpl.html#line.371">removeServers</a>(com.google.protobuf.RpcController&nbsp;controller,
                           org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveServersRequest&nbsp;request,
                           com.google.protobuf.RpcCallback&lt;org.apache.hadoop.hbase.protobuf.generated.RSGroupAdminProtos.RemoveServersResponse&gt;&nbsp;done)</pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html b/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html
index b749ad3..025de16 100644
--- a/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html
+++ b/devapidocs/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html
@@ -532,7 +532,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCop
 <ul class="blockList">
 <li class="blockList">
 <h4>rsgroupHasServersOnline</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.404">rsgroupHasServersOnline</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;desc)
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.397">rsgroupHasServersOnline</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;desc)
                          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>
@@ -546,7 +546,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCop
 <ul class="blockList">
 <li class="blockList">
 <h4>assignTableToGroup</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.433">assignTableToGroup</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;desc)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.426">assignTableToGroup</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;desc)
                  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>
@@ -560,7 +560,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCop
 <ul class="blockList">
 <li class="blockList">
 <h4>preCreateTableAction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.456">preCreateTableAction</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.449">preCreateTableAction</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                                  <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;desc,
                                  <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;regions)
                           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>
@@ -586,7 +586,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCop
 <ul class="blockList">
 <li class="blockList">
 <h4>postCreateTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.468">postCreateTable</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.461">postCreateTable</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                             <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;desc,
                             <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;regions)
                      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>
@@ -611,7 +611,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCop
 <ul class="blockList">
 <li class="blockList">
 <h4>postDeleteTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.475">postDeleteTable</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.468">postDeleteTable</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                             <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                      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>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterObserver.html#postDeleteTable-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-">MasterObserver</a></code></span></div>
@@ -634,7 +634,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCop
 <ul class="blockList">
 <li class="blockList">
 <h4>preCreateNamespace</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.490">preCreateNamespace</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.483">preCreateNamespace</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                                <a href="../../../../../org/apache/hadoop/hbase/NamespaceDescriptor.html" title="class in org.apache.hadoop.hbase">NamespaceDescriptor</a>&nbsp;ns)
                         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>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterObserver.html#preCreateNamespace-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.NamespaceDescriptor-">MasterObserver</a></code></span></div>
@@ -657,7 +657,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCop
 <ul class="blockList">
 <li class="blockList">
 <h4>preModifyNamespace</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.499">preModifyNamespace</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.492">preModifyNamespace</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                                <a href="../../../../../org/apache/hadoop/hbase/NamespaceDescriptor.html" title="class in org.apache.hadoop.hbase">NamespaceDescriptor</a>&nbsp;ns)
                         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>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterObserver.html#preModifyNamespace-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.NamespaceDescriptor-">MasterObserver</a></code></span></div>
@@ -679,7 +679,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCop
 <ul class="blockList">
 <li class="blockList">
 <h4>preCloneSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.505">preCloneSnapshot</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.498">preCloneSnapshot</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                              <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot,
                              <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;desc)
                       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>
@@ -704,7 +704,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCop
 <ul class="blockList">
 <li class="blockList">
 <h4>postClearDeadServers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.511">postClearDeadServers</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.504">postClearDeadServers</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                                  <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>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
                                  <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>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;notClearedServers)
                           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>
@@ -724,7 +724,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCop
 <ul class="blockList">
 <li class="blockList">
 <h4>checkPermission</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.521">checkPermission</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>&nbsp;request)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.514">checkPermission</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>&nbsp;request)
                      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>
@@ -738,7 +738,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/coprocessor/MasterCop
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getActiveUser</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.530">getActiveUser</a>()
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.html#line.523">getActiveUser</a>()
                     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>
 <div class="block">Returns the active user to which authorization checks should be applied.
  If we are in the context of an RPC call, the remote user is used,


[13/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html
index a1593ca..b943e37 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html
@@ -1273,7 +1273,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.250">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.251">tearDown</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>
@@ -1287,7 +1287,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSequenceId</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.261">testSequenceId</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.262">testSequenceId</a>()
                     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>
 <div class="block">Test that I can use the max flushed sequence id after the close.</div>
 <dl>
@@ -1302,7 +1302,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCloseCarryingSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.296">testCloseCarryingSnapshot</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.297">testCloseCarryingSnapshot</a>()
                                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>
 <div class="block">Test for Bug 2 of HBASE-10466.
  "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize
@@ -1323,7 +1323,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMemstoreSnapshotSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.322">testMemstoreSnapshotSize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.323">testMemstoreSnapshotSize</a>()
                               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>
@@ -1337,7 +1337,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALCompatibleWithFaultyFileSystem</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.wal.WAL&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.377">createWALCompatibleWithFaultyFileSystem</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>&nbsp;callingMethod,
+<pre>private static&nbsp;org.apache.hadoop.hbase.wal.WAL&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.378">createWALCompatibleWithFaultyFileSystem</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>&nbsp;callingMethod,
                                                                                        org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                                        org.apache.hadoop.hbase.TableName&nbsp;tableName)
                                                                                 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>
@@ -1359,7 +1359,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMemstoreSizeAccountingWithFailedPostBatchMutate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.387">testMemstoreSizeAccountingWithFailedPostBatchMutate</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.388">testMemstoreSizeAccountingWithFailedPostBatchMutate</a>()
                                                          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>
@@ -1373,7 +1373,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushSizeAccounting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.443">testFlushSizeAccounting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.444">testFlushSizeAccounting</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>
 <div class="block">Test we do not lose data if we fail a flush and then close.
  Part of HBase-10466.  Tests the following from the issue description:
@@ -1399,7 +1399,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCloseWithFailingFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.508">testCloseWithFailingFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.509">testCloseWithFailingFlush</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>
@@ -1413,7 +1413,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCompactionAffectedByScanners</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.563">testCompactionAffectedByScanners</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.564">testCompactionAffectedByScanners</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>
@@ -1427,7 +1427,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testToShowNPEOnRegionScannerReseek</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.611">testToShowNPEOnRegionScannerReseek</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.612">testToShowNPEOnRegionScannerReseek</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>
@@ -1441,7 +1441,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplay</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.641">testSkipRecoveredEditsReplay</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.642">testSkipRecoveredEditsReplay</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>
@@ -1455,7 +1455,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplaySomeIgnored</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.692">testSkipRecoveredEditsReplaySomeIgnored</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.693">testSkipRecoveredEditsReplaySomeIgnored</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>
@@ -1469,7 +1469,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplayAllIgnored</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.748">testSkipRecoveredEditsReplayAllIgnored</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.749">testSkipRecoveredEditsReplayAllIgnored</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>
@@ -1483,7 +1483,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplayTheLastFileIgnored</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.780">testSkipRecoveredEditsReplayTheLastFileIgnored</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.781">testSkipRecoveredEditsReplayTheLastFileIgnored</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>
@@ -1497,7 +1497,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRecoveredEditsReplayCompaction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.843">testRecoveredEditsReplayCompaction</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.844">testRecoveredEditsReplayCompaction</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>
@@ -1511,7 +1511,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRecoveredEditsReplayCompaction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.848">testRecoveredEditsReplayCompaction</a>(boolean&nbsp;mismatchedRegionName)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.849">testRecoveredEditsReplayCompaction</a>(boolean&nbsp;mismatchedRegionName)
                                         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>
@@ -1525,7 +1525,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushMarkers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.957">testFlushMarkers</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.958">testFlushMarkers</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>
@@ -1539,7 +1539,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushMarkersWALFail</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1109">testFlushMarkersWALFail</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1110">testFlushMarkersWALFail</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>
@@ -1553,7 +1553,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetWhileRegionClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1225">testGetWhileRegionClose</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1226">testGetWhileRegionClose</a>()
                              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>
@@ -1567,7 +1567,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testWeirdCacheBehaviour</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1315">testWeirdCacheBehaviour</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1316">testWeirdCacheBehaviour</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>
@@ -1581,7 +1581,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAppendWithReadOnlyTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1358">testAppendWithReadOnlyTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1359">testAppendWithReadOnlyTable</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>
@@ -1595,7 +1595,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testIncrWithReadOnlyTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1378">testIncrWithReadOnlyTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1379">testIncrWithReadOnlyTable</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>
@@ -1609,7 +1609,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteColumns</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1396">deleteColumns</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1397">deleteColumns</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                            <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>&nbsp;value,
                            <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>&nbsp;keyPrefix)
                     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>
@@ -1625,7 +1625,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumberOfRows</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1415">getNumberOfRows</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>&nbsp;keyPrefix,
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1416">getNumberOfRows</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>&nbsp;keyPrefix,
                             <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>&nbsp;value,
                             org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r)
                      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>
@@ -1641,7 +1641,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>buildScanner</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1434">buildScanner</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>&nbsp;keyPrefix,
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1435">buildScanner</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>&nbsp;keyPrefix,
                                                                           <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>&nbsp;value,
                                                                           org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r)
                                                                    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>
@@ -1657,7 +1657,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>putRows</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1454">putRows</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1455">putRows</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                      int&nbsp;numRows,
                      <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>&nbsp;value,
                      <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>&nbsp;key)
@@ -1674,7 +1674,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFamilyWithAndWithoutColon</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1470">testFamilyWithAndWithoutColon</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1471">testFamilyWithAndWithoutColon</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>
@@ -1688,7 +1688,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBatchPut_whileNoRowLocksHeld</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1491">testBatchPut_whileNoRowLocksHeld</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1492">testBatchPut_whileNoRowLocksHeld</a>()
                                       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>
@@ -1702,7 +1702,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBatchPut_whileMultipleRowLocksHeld</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1521">testBatchPut_whileMultipleRowLocksHeld</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1522">testBatchPut_whileMultipleRowLocksHeld</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>
@@ -1716,7 +1716,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForCounter</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1599">waitForCounter</a>(org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource&nbsp;source,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1600">waitForCounter</a>(org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource&nbsp;source,
                             <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>&nbsp;metricName,
                             long&nbsp;expectedCount)
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
@@ -1732,7 +1732,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAtomicBatchPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1613">testAtomicBatchPut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1614">testAtomicBatchPut</a>()
                         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>
@@ -1746,7 +1746,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBatchPutWithTsSlop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1682">testBatchPutWithTsSlop</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1683">testBatchPutWithTsSlop</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>
@@ -1760,7 +1760,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareRegionForBachPut</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1706">prepareRegionForBachPut</a>(org.apache.hadoop.hbase.client.Put[]&nbsp;puts,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1707">prepareRegionForBachPut</a>(org.apache.hadoop.hbase.client.Put[]&nbsp;puts,
                                      org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource&nbsp;source,
                                      boolean&nbsp;slop)
                               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>
@@ -1778,7 +1778,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithEmptyRowValue</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1726">testCheckAndMutate_WithEmptyRowValue</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1727">testCheckAndMutate_WithEmptyRowValue</a>()
                                           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>
@@ -1792,7 +1792,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithWrongValue</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1800">testCheckAndMutate_WithWrongValue</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1801">testCheckAndMutate_WithWrongValue</a>()
                                        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>
@@ -1806,7 +1806,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithCorrectValue</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1854">testCheckAndMutate_WithCorrectValue</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1855">testCheckAndMutate_WithCorrectValue</a>()
                                          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>
@@ -1820,7 +1820,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithNonEqualCompareOp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1906">testCheckAndMutate_WithNonEqualCompareOp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1907">testCheckAndMutate_WithNonEqualCompareOp</a>()
                                               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>
@@ -1834,7 +1834,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndPut_ThatPutWasWritten</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2000">testCheckAndPut_ThatPutWasWritten</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2001">testCheckAndPut_ThatPutWasWritten</a>()
                                        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>
@@ -1848,7 +1848,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndPut_wrongRowInPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2046">testCheckAndPut_wrongRowInPut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2047">testCheckAndPut_wrongRowInPut</a>()
                                    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>
@@ -1862,7 +1862,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndDelete_ThatDeleteWasWritten</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2065">testCheckAndDelete_ThatDeleteWasWritten</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2066">testCheckAndDelete_ThatDeleteWasWritten</a>()
                                              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>
@@ -1876,7 +1876,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_multiDeleteColumn</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2144">testDelete_multiDeleteColumn</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2145">testDelete_multiDeleteColumn</a>()
                                   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>
@@ -1890,7 +1890,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_CheckFamily</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2175">testDelete_CheckFamily</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2176">testDelete_CheckFamily</a>()
                             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>
@@ -1904,7 +1904,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_mixed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2216">testDelete_mixed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2217">testDelete_mixed</a>()
                       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>,
                              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -1920,7 +1920,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteRowWithFutureTs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2283">testDeleteRowWithFutureTs</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2284">testDeleteRowWithFutureTs</a>()
                                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>
@@ -1934,7 +1934,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testPutWithLatestTS</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2325">testPutWithLatestTS</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2326">testPutWithLatestTS</a>()
                          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>
 <div class="block">Tests that the special LATEST_TIMESTAMP option for puts gets replaced by
  the actual timestamp</div>
@@ -1950,7 +1950,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testPutWithTsSlop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2376">testPutWithTsSlop</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2377">testPutWithTsSlop</a>()
                        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>
 <div class="block">Tests that there is server-side filtering for invalid timestamp upper
  bound. Note that the timestamp lower bound is automatically handled for us
@@ -1967,7 +1967,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_DeleteOneFamilyNotAnother</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2404">testScanner_DeleteOneFamilyNotAnother</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2405">testScanner_DeleteOneFamilyNotAnother</a>()
                                            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>
@@ -1981,7 +1981,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDataInMemoryWithoutWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2446">testDataInMemoryWithoutWAL</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2447">testDataInMemoryWithoutWAL</a>()
                                 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>
@@ -1995,7 +1995,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDataInMemoryWithoutWAL</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2494">testDataInMemoryWithoutWAL</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2495">testDataInMemoryWithoutWAL</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                                                org.apache.hadoop.hbase.client.Put&nbsp;originalPut,
                                                org.apache.hadoop.hbase.client.Put&nbsp;addPut,
                                                long&nbsp;delta)
@@ -2012,7 +2012,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteColumns_PostInsert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2519">testDeleteColumns_PostInsert</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2520">testDeleteColumns_PostInsert</a>()
                                   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>,
                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -2028,7 +2028,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testaddFamily_PostInsert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2526">testaddFamily_PostInsert</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2527">testaddFamily_PostInsert</a>()
                               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>,
                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -2044,7 +2044,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>doTestDelete_AndPostInsert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2532">doTestDelete_AndPostInsert</a>(org.apache.hadoop.hbase.client.Delete&nbsp;delete)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2533">doTestDelete_AndPostInsert</a>(org.apache.hadoop.hbase.client.Delete&nbsp;delete)
                                 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>,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -2060,7 +2060,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_CheckTimestampUpdated</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2577">testDelete_CheckTimestampUpdated</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2578">testDelete_CheckTimestampUpdated</a>()
                                       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>
@@ -2074,7 +2074,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGet_FamilyChecker</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2617">testGet_FamilyChecker</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2618">testGet_FamilyChecker</a>()
                            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>
@@ -2088,7 +2088,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGet_Basic</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2644">testGet_Basic</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2645">testGet_Basic</a>()
                    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>
@@ -2102,7 +2102,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGet_Empty</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2695">testGet_Empty</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2696">testGet_Empty</a>()
                    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>
@@ -2116,7 +2116,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetWithFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2713">testGetWithFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2714">testGetWithFilter</a>()
                        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>,
                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -2132,7 +2132,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithOkFamilies</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2778">testGetScanner_WithOkFamilies</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2779">testGetScanner_WithOkFamilies</a>()
                                    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>
@@ -2146,7 +2146,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithNotOkFamilies</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2802">testGetScanner_WithNotOkFamilies</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2803">testGetScanner_WithNotOkFamilies</a>()
                                       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>
@@ -2160,7 +2160,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithNoFamilies</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2827">testGetScanner_WithNoFamilies</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2828">testGetScanner_WithNoFamilies</a>()
                                    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>
@@ -2174,7 +2174,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithRegionClosed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2875">testGetScanner_WithRegionClosed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2876">testGetScanner_WithRegionClosed</a>()
                                      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>
 <div class="block">This method tests https://issues.apache.org/jira/browse/HBASE-2516.</div>
 <dl>
@@ -2189,7 +2189,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionScanner_Next</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2907">testRegionScanner_Next</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2908">testRegionScanner_Next</a>()
                             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>
@@ -2203,7 +2203,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_ExplicitColumns_FromMemStore_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2972">testScanner_ExplicitColumns_FromMemStore_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2973">testScanner_ExplicitColumns_FromMemStore_EnforceVersions</a>()
                                                               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>
@@ -2217,7 +2217,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3030">testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3031">testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions</a>()
                                                                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>
@@ -2231,7 +2231,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3092">testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3093">testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions</a>()
                                                                       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>
@@ -2245,7 +2245,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_Wildcard_FromMemStore_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3174">testScanner_Wildcard_FromMemStore_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3175">testScanner_Wildcard_FromMemStore_EnforceVersions</a>()
                                                        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>
@@ -2259,7 +2259,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_Wildcard_FromFilesOnly_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3234">testScanner_Wildcard_FromFilesOnly_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3235">testScanner_Wildcard_FromFilesOnly_EnforceVersions</a>()
                                                         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>
@@ -2273,7 +2273,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_StopRow1542</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3294">testScanner_StopRow1542</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3295">testScanner_StopRow1542</a>()
                              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>
@@ -2287,7 +2287,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3342">testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3343">testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions</a>()
                                                                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>
@@ -2301,7 +2301,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_JoinedScanners</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3426">testScanner_JoinedScanners</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3427">testScanner_JoinedScanners</a>()
                                 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>
 <div class="block">Added for HBASE-5416
 
@@ -2319,7 +2319,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_JoinedScannersWithLimits</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3494">testScanner_JoinedScannersWithLimits</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3495">testScanner_JoinedScannersWithLimits</a>()
                                           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>
 <div class="block">HBASE-5416
 
@@ -2336,7 +2336,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testLongQualifier</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3593">testLongQualifier</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3594">testLongQualifier</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>
 <div class="block">Write an HFile block full with Cells whose qualifier that are identical between
  0 and Short.MAX_VALUE. See HBASE-13329.</div>
@@ -2352,7 +2352,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushCacheWhileScanning</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3621">testFlushCacheWhileScanning</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3622">testFlushCacheWhileScanning</a>()
                                  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>,
                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Flushes the cache in a thread while scanning. The tests verify that the
@@ -2371,7 +2371,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testWritesWhileScanning</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3752">testWritesWhileScanning</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3753">testWritesWhileScanning</a>()
                              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>,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Writes very wide records and scans for the latest every time.. Flushes and
@@ -2389,7 +2389,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testWritesWhileGetting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3926">testWritesWhileGetting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3927">testWritesWhileGetting</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>
 <div class="block">Writes very wide records and gets the latest row every time.. Flushes and
  compacts the region aggressivly to catch issues.</div>
@@ -2407,7 +2407,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testHolesInMeta</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4031">testHolesInMeta</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4032">testHolesInMeta</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>
@@ -2421,7 +2421,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testIndexesScanWithOneDeletedRow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4054">testIndexesScanWithOneDeletedRow</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4055">testIndexesScanWithOneDeletedRow</a>()
                                       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>
@@ -2435,7 +2435,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBloomFilterSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4095">testBloomFilterSize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4096">testBloomFilterSize</a>()
                          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>
@@ -2449,7 +2449,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAllColumnsWithBloomFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4154">testAllColumnsWithBloomFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4155">testAllColumnsWithBloomFilter</a>()
                                    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>
@@ -2463,7 +2463,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteRowWithBloomFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4202">testDeleteRowWithBloomFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4203">testDeleteRowWithBloomFilter</a>()
                                   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>
 <div class="block">Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when
  issuing delete row on columns with bloom filter set to row+col
@@ -2480,7 +2480,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testgetHDFSBlocksDistribution</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4240">testgetHDFSBlocksDistribution</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4241">testgetHDFSBlocksDistribution</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>
@@ -2494,7 +2494,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4317">testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4318">testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization</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>
 <div class="block">Testcase to check state of region initialization task set to ABORTED or not
  if any exceptions during initialization</div>
@@ -2510,7 +2510,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionInfoFileCreation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4351">testRegionInfoFileCreation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4352">testRegionInfoFileCreation</a>()
                                 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>
 <div class="block">Verifies that the .regioninfo file is written on region creation and that
  is recreated if missing during region opening.</div>
@@ -2526,7 +2526,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testParallelIncrementWithMemStoreFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4433">testParallelIncrementWithMemStoreFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4434">testParallelIncrementWithMemStoreFlush</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>
 <div class="block">Test case to check increment function with memstore flushing</div>
 <dl>
@@ -2541,7 +2541,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testParallelAppendWithMemStoreFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4520">testParallelAppendWithMemStoreFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4521">testParallelAppendWithMemStoreFlush</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>
 <div class="block">Test case to check append function with memstore flushing</div>
 <dl>
@@ -2556,7 +2556,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testPutWithMemStoreFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4580">testPutWithMemStoreFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4581">testPutWithMemStoreFlush</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>
 <div class="block">Test case to check put function with memstore flushing for same row, same ts</div>
 <dl>
@@ -2571,7 +2571,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDurability</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4635">testDurability</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4636">testDurability</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>
@@ -2585,7 +2585,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>durabilityTest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4684">durabilityTest</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>&nbsp;method,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4685">durabilityTest</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>&nbsp;method,
                             org.apache.hadoop.hbase.client.Durability&nbsp;tableDurability,
                             org.apache.hadoop.hbase.client.Durability&nbsp;mutationDurability,
                             long&nbsp;timeout,
@@ -2605,7 +2605,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionReplicaSecondary</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4739">testRegionReplicaSecondary</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4740">testRegionReplicaSecondary</a>()
                                 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>
@@ -2619,7 +2619,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionReplicaSecondaryIsReadOnly</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4789">testRegionReplicaSecondaryIsReadOnly</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4790">testRegionReplicaSecondaryIsReadOnly</a>()
                                           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>
@@ -2633,7 +2633,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALFactory</h4>
-<pre>static&nbsp;org.apache.hadoop.hbase.wal.WALFactory&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4843">createWALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>static&nbsp;org.apache.hadoop.hbase.wal.WALFactory&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4844">createWALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                org.apache.hadoop.fs.Path&nbsp;rootDir)
                                                         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>
@@ -2648,7 +2648,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCompactionFromPrimary</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4850">testCompactionFromPrimary</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4851">testCompactionFromPrimary</a>()
                                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>
@@ -2662,7 +2662,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>putData</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4904">putData</a>(int&nbsp;startRow,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4905">putData</a>(int&nbsp;startRow,
                      int&nbsp;numRows,
                      byte[]&nbsp;qf,
                      byte[]...&nbsp;families)
@@ -2679,7 +2679,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>putData</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4909">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4910">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                      int&nbsp;startRow,
                      int&nbsp;numRows,
                      byte[]&nbsp;qf,
@@ -2697,7 +2697,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>putData</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4914">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4915">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                     org.apache.hadoop.hbase.client.Durability&nbsp;durability,
                     int&nbsp;startRow,
                     int&nbsp;numRows,
@@ -2716,7 +2716,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyData</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4927">verifyData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;newReg,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4928">verifyData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;newReg,
                        int&nbsp;startRow,
                        int&nbsp;numRows,
                        byte[]&nbsp;qf,
@@ -2734,7 +2734,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assertGet</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4946">assertGet</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4947">assertGet</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                       byte[]&nbsp;family,
                       byte[]&nbsp;k)
                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>
@@ -2750,7 +2750,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assertScan</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4968">assertScan</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4969">assertScan</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                           byte[]&nbsp;fs,
                           byte[]&nbsp;firstValue)
                    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>
@@ -2766,7 +2766,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushResult</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5000">testFlushResult</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5001">testFlushResult</a>()
                      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>
 <div class="block">Test that we get the expected flush results back</div>
 <dl>
@@ -2781,7 +2781,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initSplit</h4>
-<pre>protected&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5029">initSplit</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5030">initSplit</a>()</pre>
 </li>
 </ul>
 <a name="initHRegion-org.apache.hadoop.hbase.TableName-java.lang.String-org.apache.hadoop.conf.Configuration-byte:A...-">
@@ -2790,7 +2790,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5048">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5049">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                    <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>&nbsp;callingMethod,
                                                                    org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                    byte[]...&nbsp;families)
@@ -2810,7 +2810,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5057">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5058">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                    <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>&nbsp;callingMethod,
                                                                    org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                    boolean&nbsp;isReadOnly,
@@ -2831,7 +2831,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5062">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5063">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                    byte[]&nbsp;startKey,
                                                                    byte[]&nbsp;stopKey,
                                                                    <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>&nbsp;callingMethod,
@@ -2851,7 +2851,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5077">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5078">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                 byte[]&nbsp;startKey,
                                                                 byte[]&nbsp;stopKey,
                                                                 boolean&nbsp;isReadOnly,
@@ -2874,7 +2874,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkOneCell</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5087">checkOneCell</a>(org.apache.hadoop.hbase.Cell&nbsp;kv,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5088">checkOneCell</a>(org.apache.hadoop.hbase.Cell&nbsp;kv,
                           byte[]&nbsp;cf,
                           int&nbsp;rowIdx,
                           int&nbsp;colIdx,
@@ -2889,7 +2889,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_FromMemStore_SingleCF_Normal</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5101">testReverseScanner_FromMemStore_SingleCF_Normal</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5102">testReverseScanner_FromMemStore_SingleCF_Normal</a>()
                                                      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>
@@ -2903,7 +2903,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_FromMemStore_SingleCF_LargerKey</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5159">testReverseScanner_FromMemStore_SingleCF_LargerKey</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5160">testReverseScanner_FromMemStore_SingleCF_LargerKey</a>()
                                                         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><sp

<TRUNCATED>

[02/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html
index 827d1f3..1b32e2b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html
@@ -252,6332 +252,6333 @@
 <span class="sourceLineNo">244</span>    dir = TEST_UTIL.getDataTestDir("TestHRegion").toString();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    method = name.getMethodName();<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    tableName = TableName.valueOf(method);<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>  @After<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public void tearDown() throws Exception {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    TEST_UTIL.cleanupTestDir();<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @throws IOException<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Test<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void testSequenceId() throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // Open region again.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    byte [] value = Bytes.toBytes(method);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Make a random put against our cf.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Put put = new Put(value);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    region.put(put);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // No flush yet so init numbers should still be in place.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    region.flush(true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    long max = region.getMaxFlushedSeqId();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    region.close();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<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>   * Test for Bug 2 of HBASE-10466.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flushes for region close."<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * @throws IOException<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Test<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // Get some random bytes.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    byte [] value = Bytes.toBytes(method);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    // Make a random put against our cf.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    Put put = new Put(value);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    region.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    storeFlushCtx.prepare();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // Second put something in current memstore<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    region.put(put);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    region.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  /*<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * See HBASE-10845<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Test<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      StoreFlushContext storeFlushCtx;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.325"></a>
-<span class="sourceLineNo">326</span>          throws IOException {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        super(fs, rootDir, logName, conf);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>      @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      public void sync(long txid) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        storeFlushCtx.prepare();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        super.sync(txid);<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><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        COLUMN_FAMILY_BYTES);<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // Get some random bytes.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    byte [] value = Bytes.toBytes(method);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    Put put = new Put(value);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    boolean threwIOE = false;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      region.put(put);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    } catch (IOException ioe) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      threwIOE = true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    } finally {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        mss.getDataSize() == 0);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<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>   * Create a WAL outside of the usual helper in<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@code fs.file.impl}.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final Configuration walConf = new Configuration(conf);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return new WALFactory(walConf, callingMethod)<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Test<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootDir = new Path(dir + testName);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        COLUMN_FAMILY_BYTES);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // Put one value<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    byte [] value = Bytes.toBytes(method);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    Put put = new Put(value);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    region.put(put);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(onePutSize &gt; 0);<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    doThrow(new IOException())<a name="line.406"></a>
-<span class="sourceLineNo">407</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    put = new Put(value);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    try {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      region.put(put);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      fail("Should have failed with IOException");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (IOException expected) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    long expectedSize = onePutSize * 2;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    assertEquals("memstoreSize should be incremented",<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        expectedSize, region.getMemStoreDataSize());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    assertEquals("flushable size should be incremented",<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    region.setCoprocessorHost(null);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * if memstoreSize is not larger than 0."<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws Exception<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Test<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // Only retry once.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final User user =<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // Inject our faulty LocalFileSystem<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      public Object run() throws Exception {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        FileSystem fs = FileSystem.get(conf);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HRegion region = null;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        try {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          // Initialize region<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>              COLUMN_FAMILY_BYTES);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          long size = region.getMemStoreDataSize();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          Assert.assertEquals(0, size);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          Put p1 = new Put(row);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          region.put(p1);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          try {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            LOG.info("Flushing");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            region.flush(true);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          } catch (DroppedSnapshotException dse) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>            // What we are expecting<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // Make it so all writes succeed from here on out<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          ffs.fault.set(false);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // Check sizes.  Should still be the one entry.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          // subtract the right amount, the snapshot size only.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          Put p2 = new Put(row);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.488"></a>
-<span class="sourceLineNo">489</span>          region.put(p2);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          // it<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          region.flush(true);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          // Make sure our memory accounting is right.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } finally {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        return null;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    });<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Test<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    // Only retry once.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    final User user =<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Inject our faulty LocalFileSystem<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      @Override<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      public Object run() throws Exception {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        FileSystem fs = FileSystem.get(conf);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        HRegion region = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        try {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // Initialize region<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region = initHRegion(tableName, null, null, false,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          long size = region.getMemStoreDataSize();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          Assert.assertEquals(0, size);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          Put p1 = new Put(row);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          region.put(p1);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          StoreFlushContext storeFlushCtx =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          storeFlushCtx.prepare();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          // Now add two entries to the foreground memstore.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          Put p2 = new Put(row);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          region.put(p2);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          // Now try close on top of a failing flush.<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          region.close();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          fail();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } catch (DroppedSnapshotException dse) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          // Expected<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        } finally {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          ffs.fault.set(false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    });<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  @Test<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    byte[] family = Bytes.toBytes("family");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    region.put(put);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    region.flush(true);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    Scan scan = new Scan();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    scan.setMaxVersions(3);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    // open the first scanner<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    region.delete(delete);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    region.flush(true);<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    // open the second scanner<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    // make a major compaction<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    region.compact(true);<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>    // open the third scanner<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    scanner1.next(results);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    System.out.println(results);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assertEquals(1, results.size());<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    results.clear();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    scanner2.next(results);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    System.out.println(results);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    assertEquals(0, results.size());<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    results.clear();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scanner3.next(results);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    System.out.println(results);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    assertEquals(0, results.size());<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  @Test<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    byte[] family = Bytes.toBytes("family");<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    region.put(put);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    region.put(put);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.flush(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    Scan scan = new Scan();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    scan.setMaxVersions(3);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the first scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    region.compact(true);<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    scanner1.next(results);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Cell keyValue = results.get(0);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner1.close();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  @Test<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    byte[] family = Bytes.toBytes("family");<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    try {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>      long maxSeqId = 1050;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      long minSeqId = 1000;<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        fs.create(recoveredEdits);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>        long time = System.nanoTime();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        WALEdit edit = new WALEdit();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.662"></a>
-<span class="sourceLineNo">663</span>            .toBytes(i)));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>        writer.close();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      for (HStore store : region.getStores()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assertEquals(maxSeqId, seqId);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      region.getMVCC().advanceTo(seqId);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      Get get = new Get(row);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Result result = region.get(get);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        assertEquals(1, kvs.size());<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    } finally {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.region = null;<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      wals.close();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @Test<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    byte[] family = Bytes.toBytes("family");<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    try {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>      long maxSeqId = 1050;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      long minSeqId = 1000;<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        fs.create(recoveredEdits);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long time = System.nanoTime();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        WALEdit edit = new WALEdit();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.713"></a>
-<span class="sourceLineNo">714</span>            .toBytes(i)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>        writer.close();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      long recoverSeqId = 1030;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (HStore store : region.getStores()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertEquals(maxSeqId, seqId);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      region.getMVCC().advanceTo(seqId);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Get get = new Get(row);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      Result result = region.get(get);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        if (i &lt; recoverSeqId) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>          assertEquals(0, kvs.size());<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        } else {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          assertEquals(1, kvs.size());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    } finally {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      this.region = null;<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      wals.close();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  @Test<a name="line.747"></a>
-<span class="sourceLineNo">748</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    byte[] family = Bytes.toBytes("family");<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    try {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        dos.writeInt(i);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        dos.close();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      long minSeqId = 2000;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      dos.close();<a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, null);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      assertEquals(minSeqId, seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    } finally {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      this.region = null;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    byte[] family = Bytes.toBytes("family");<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    try {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>      long maxSeqId = 1050;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      long minSeqId = 1000;<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        fs.create(recoveredEdits);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>        long time = System.nanoTime();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        WALEdit edit = null;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        if (i == maxSeqId) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          CompactionDescriptor.newBuilder()<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          .build());<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        } else {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          edit = new WALEdit();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.815"></a>
-<span class="sourceLineNo">816</span>            .toBytes(i)));<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        }<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        writer.close();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>      long recoverSeqId = 1030;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      for (HStore store : region.getStores()) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      assertEquals(maxSeqId, seqId);<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>      // assert that the files are flushed<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.833"></a>
-<span class="sourceLineNo">834</span><a name="line.834"></a>
-<span class="sourceLineNo">835</span>    } finally {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      this.region = null;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      wals.close();<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    }<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Test<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    testRecoveredEditsReplayCompaction(false);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    testRecoveredEditsReplayCompaction(true);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    byte[] family = Bytes.toBytes("family");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    try {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>      long maxSeqId = 3;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      long minSeqId = 0;<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.862"></a>
-<span class="sourceLineNo">863</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        region.put(put);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        region.flush(true);<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>      // this will create a region with 3 files<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        storeFiles.add(sf.getPath());<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // disable compaction completion<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      region.compactStores();<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // ensure that nothing changed<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          + "from the compaction, could not find any";<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      assertNotNull(errorMsg, files);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      assertEquals(errorMsg, 1, files.length);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      // move the file inside region dir<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          files[0].getPath());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        // Mix the byte array to have a new encodedName<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.902"></a>
-<span class="sourceLineNo">903</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      fs.create(recoveredEdits);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      long time = System.nanoTime();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.916"></a>
-<span class="sourceLineNo">917</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          compactionDescriptor)));<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      writer.close();<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // close the region now, and reopen again<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      region.getTableDescriptor();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      region.getRegionInfo();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      region.close();<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      try {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        region = HRegion.openHRegion(region, null);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      } catch (WrongRegionException wre) {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // now check whether we have only one store file, the compacted one<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      for (HStoreFile sf : sfs) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      if (!mismatchedRegionName) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        Result result = region.get(get);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      }<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      this.region = null;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      wals.close();<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  @Test<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  public void testFlushMarkers() throws Exception {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    byte[] family = Bytes.toBytes("family");<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    try {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>      long maxSeqId = 3;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      long minSeqId = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        region.put(put);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        region.flush(true);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>      // this will create a region with 3 files from flush<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        storeFiles.add(sf.getPath().getName());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      }<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // now verify that the flush markers are written<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      wal.shutdown();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        TEST_UTIL.getConfiguration());<a name="line.993"></a>
-<span class="sourceLineNo">994</span>      try {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        long lastFlushSeqId = -1;<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        while (true) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          WAL.Entry entry = reader.next();<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          if (entry == null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            break;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>          }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            assertNotNull(flushDesc);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>            }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            } else {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>            flushDescriptors.add(entry);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        // now write those markers to the recovered edits again.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span><a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span><a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        fs.create(recoveredEdits);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          writer.append(entry);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        writer.close();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      } finally {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (null != reader) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          try {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            reader.close();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          } catch (IOException exception) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>            LOG.debug("exception details", exception);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
+<span class="sourceLineNo">247</span>    CONF.set(CompactingMemStore.IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY, String.valueOf(0.02));<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>  @After<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public void tearDown() throws Exception {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    TEST_UTIL.cleanupTestDir();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @throws IOException<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Test<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public void testSequenceId() throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    region.close();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // Open region again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    byte [] value = Bytes.toBytes(method);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // Make a random put against our cf.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    Put put = new Put(value);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    region.put(put);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // No flush yet so init numbers should still be in place.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    region.flush(true);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    long max = region.getMaxFlushedSeqId();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    region.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(max, region.getMaxFlushedSeqId());<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>  /**<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * Test for Bug 2 of HBASE-10466.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.291"></a>
+<span class="

<TRUNCATED>

[08/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
index 827d1f3..1b32e2b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
@@ -252,6332 +252,6333 @@
 <span class="sourceLineNo">244</span>    dir = TEST_UTIL.getDataTestDir("TestHRegion").toString();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    method = name.getMethodName();<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    tableName = TableName.valueOf(method);<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>  @After<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public void tearDown() throws Exception {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    TEST_UTIL.cleanupTestDir();<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @throws IOException<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Test<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void testSequenceId() throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // Open region again.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    byte [] value = Bytes.toBytes(method);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Make a random put against our cf.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Put put = new Put(value);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    region.put(put);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // No flush yet so init numbers should still be in place.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    region.flush(true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    long max = region.getMaxFlushedSeqId();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    region.close();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<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>   * Test for Bug 2 of HBASE-10466.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flushes for region close."<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * @throws IOException<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Test<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // Get some random bytes.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    byte [] value = Bytes.toBytes(method);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    // Make a random put against our cf.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    Put put = new Put(value);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    region.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    storeFlushCtx.prepare();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // Second put something in current memstore<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    region.put(put);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    region.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  /*<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * See HBASE-10845<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Test<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      StoreFlushContext storeFlushCtx;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.325"></a>
-<span class="sourceLineNo">326</span>          throws IOException {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        super(fs, rootDir, logName, conf);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>      @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      public void sync(long txid) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        storeFlushCtx.prepare();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        super.sync(txid);<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><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        COLUMN_FAMILY_BYTES);<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // Get some random bytes.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    byte [] value = Bytes.toBytes(method);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    Put put = new Put(value);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    boolean threwIOE = false;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      region.put(put);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    } catch (IOException ioe) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      threwIOE = true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    } finally {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        mss.getDataSize() == 0);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<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>   * Create a WAL outside of the usual helper in<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@code fs.file.impl}.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final Configuration walConf = new Configuration(conf);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return new WALFactory(walConf, callingMethod)<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Test<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootDir = new Path(dir + testName);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        COLUMN_FAMILY_BYTES);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // Put one value<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    byte [] value = Bytes.toBytes(method);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    Put put = new Put(value);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    region.put(put);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(onePutSize &gt; 0);<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    doThrow(new IOException())<a name="line.406"></a>
-<span class="sourceLineNo">407</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    put = new Put(value);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    try {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      region.put(put);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      fail("Should have failed with IOException");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (IOException expected) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    long expectedSize = onePutSize * 2;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    assertEquals("memstoreSize should be incremented",<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        expectedSize, region.getMemStoreDataSize());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    assertEquals("flushable size should be incremented",<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    region.setCoprocessorHost(null);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * if memstoreSize is not larger than 0."<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws Exception<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Test<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // Only retry once.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final User user =<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // Inject our faulty LocalFileSystem<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      public Object run() throws Exception {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        FileSystem fs = FileSystem.get(conf);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HRegion region = null;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        try {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          // Initialize region<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>              COLUMN_FAMILY_BYTES);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          long size = region.getMemStoreDataSize();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          Assert.assertEquals(0, size);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          Put p1 = new Put(row);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          region.put(p1);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          try {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            LOG.info("Flushing");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            region.flush(true);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          } catch (DroppedSnapshotException dse) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>            // What we are expecting<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // Make it so all writes succeed from here on out<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          ffs.fault.set(false);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // Check sizes.  Should still be the one entry.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          // subtract the right amount, the snapshot size only.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          Put p2 = new Put(row);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.488"></a>
-<span class="sourceLineNo">489</span>          region.put(p2);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          // it<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          region.flush(true);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          // Make sure our memory accounting is right.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } finally {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        return null;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    });<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Test<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    // Only retry once.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    final User user =<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Inject our faulty LocalFileSystem<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      @Override<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      public Object run() throws Exception {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        FileSystem fs = FileSystem.get(conf);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        HRegion region = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        try {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // Initialize region<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region = initHRegion(tableName, null, null, false,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          long size = region.getMemStoreDataSize();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          Assert.assertEquals(0, size);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          Put p1 = new Put(row);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          region.put(p1);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          StoreFlushContext storeFlushCtx =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          storeFlushCtx.prepare();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          // Now add two entries to the foreground memstore.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          Put p2 = new Put(row);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          region.put(p2);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          // Now try close on top of a failing flush.<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          region.close();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          fail();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } catch (DroppedSnapshotException dse) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          // Expected<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        } finally {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          ffs.fault.set(false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    });<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  @Test<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    byte[] family = Bytes.toBytes("family");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    region.put(put);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    region.flush(true);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    Scan scan = new Scan();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    scan.setMaxVersions(3);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    // open the first scanner<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    region.delete(delete);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    region.flush(true);<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    // open the second scanner<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    // make a major compaction<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    region.compact(true);<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>    // open the third scanner<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    scanner1.next(results);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    System.out.println(results);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assertEquals(1, results.size());<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    results.clear();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    scanner2.next(results);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    System.out.println(results);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    assertEquals(0, results.size());<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    results.clear();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scanner3.next(results);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    System.out.println(results);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    assertEquals(0, results.size());<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  @Test<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    byte[] family = Bytes.toBytes("family");<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    region.put(put);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    region.put(put);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.flush(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    Scan scan = new Scan();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    scan.setMaxVersions(3);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the first scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    region.compact(true);<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    scanner1.next(results);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Cell keyValue = results.get(0);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner1.close();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  @Test<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    byte[] family = Bytes.toBytes("family");<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    try {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>      long maxSeqId = 1050;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      long minSeqId = 1000;<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        fs.create(recoveredEdits);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>        long time = System.nanoTime();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        WALEdit edit = new WALEdit();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.662"></a>
-<span class="sourceLineNo">663</span>            .toBytes(i)));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>        writer.close();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      for (HStore store : region.getStores()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assertEquals(maxSeqId, seqId);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      region.getMVCC().advanceTo(seqId);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      Get get = new Get(row);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Result result = region.get(get);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        assertEquals(1, kvs.size());<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    } finally {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.region = null;<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      wals.close();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @Test<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    byte[] family = Bytes.toBytes("family");<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    try {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>      long maxSeqId = 1050;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      long minSeqId = 1000;<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        fs.create(recoveredEdits);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long time = System.nanoTime();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        WALEdit edit = new WALEdit();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.713"></a>
-<span class="sourceLineNo">714</span>            .toBytes(i)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>        writer.close();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      long recoverSeqId = 1030;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (HStore store : region.getStores()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertEquals(maxSeqId, seqId);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      region.getMVCC().advanceTo(seqId);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Get get = new Get(row);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      Result result = region.get(get);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        if (i &lt; recoverSeqId) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>          assertEquals(0, kvs.size());<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        } else {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          assertEquals(1, kvs.size());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    } finally {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      this.region = null;<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      wals.close();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  @Test<a name="line.747"></a>
-<span class="sourceLineNo">748</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    byte[] family = Bytes.toBytes("family");<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    try {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        dos.writeInt(i);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        dos.close();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      long minSeqId = 2000;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      dos.close();<a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, null);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      assertEquals(minSeqId, seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    } finally {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      this.region = null;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    byte[] family = Bytes.toBytes("family");<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    try {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>      long maxSeqId = 1050;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      long minSeqId = 1000;<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        fs.create(recoveredEdits);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>        long time = System.nanoTime();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        WALEdit edit = null;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        if (i == maxSeqId) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          CompactionDescriptor.newBuilder()<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          .build());<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        } else {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          edit = new WALEdit();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.815"></a>
-<span class="sourceLineNo">816</span>            .toBytes(i)));<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        }<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        writer.close();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>      long recoverSeqId = 1030;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      for (HStore store : region.getStores()) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      assertEquals(maxSeqId, seqId);<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>      // assert that the files are flushed<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.833"></a>
-<span class="sourceLineNo">834</span><a name="line.834"></a>
-<span class="sourceLineNo">835</span>    } finally {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      this.region = null;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      wals.close();<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    }<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Test<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    testRecoveredEditsReplayCompaction(false);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    testRecoveredEditsReplayCompaction(true);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    byte[] family = Bytes.toBytes("family");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    try {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>      long maxSeqId = 3;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      long minSeqId = 0;<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.862"></a>
-<span class="sourceLineNo">863</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        region.put(put);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        region.flush(true);<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>      // this will create a region with 3 files<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        storeFiles.add(sf.getPath());<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // disable compaction completion<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      region.compactStores();<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // ensure that nothing changed<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          + "from the compaction, could not find any";<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      assertNotNull(errorMsg, files);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      assertEquals(errorMsg, 1, files.length);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      // move the file inside region dir<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          files[0].getPath());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        // Mix the byte array to have a new encodedName<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.902"></a>
-<span class="sourceLineNo">903</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      fs.create(recoveredEdits);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      long time = System.nanoTime();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.916"></a>
-<span class="sourceLineNo">917</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          compactionDescriptor)));<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      writer.close();<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // close the region now, and reopen again<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      region.getTableDescriptor();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      region.getRegionInfo();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      region.close();<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      try {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        region = HRegion.openHRegion(region, null);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      } catch (WrongRegionException wre) {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // now check whether we have only one store file, the compacted one<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      for (HStoreFile sf : sfs) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      if (!mismatchedRegionName) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        Result result = region.get(get);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      }<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      this.region = null;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      wals.close();<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  @Test<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  public void testFlushMarkers() throws Exception {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    byte[] family = Bytes.toBytes("family");<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    try {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>      long maxSeqId = 3;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      long minSeqId = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        region.put(put);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        region.flush(true);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>      // this will create a region with 3 files from flush<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        storeFiles.add(sf.getPath().getName());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      }<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // now verify that the flush markers are written<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      wal.shutdown();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        TEST_UTIL.getConfiguration());<a name="line.993"></a>
-<span class="sourceLineNo">994</span>      try {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        long lastFlushSeqId = -1;<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        while (true) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          WAL.Entry entry = reader.next();<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          if (entry == null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            break;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>          }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            assertNotNull(flushDesc);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>            }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            } else {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>            flushDescriptors.add(entry);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        // now write those markers to the recovered edits again.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span><a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span><a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        fs.create(recoveredEdits);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          writer.append(entry);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        writer.close();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      } finally {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (null != reader) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          try {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            reader.close();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          } catch (IOException exception) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>            LOG.debug("exception details", exception);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
+<span class="sourceLineNo">247</span>    CONF.set(CompactingMemStore.IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY, String.valueOf(0.02));<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>  @After<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public void tearDown() throws Exception {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    TEST_UTIL.cleanupTestDir();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @throws IOException<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Test<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public void testSequenceId() throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    region.close();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // Open region again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    byte [] value = Bytes.toBytes(method);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // Make a random put against our cf.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    Put put = new Put(value);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    region.put(put);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // No flush yet so init numbers should still be in place.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    region.flush(true);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    long max = region.getMaxFlushedSeqId();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    region.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(max, region.getMaxFlushedSeqId());<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>  /**<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * Test for Bug 2 of HBASE-10466.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * case previous flush fails and leaves som

<TRUNCATED>

[16/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/src-html/org/apache/hadoop/hbase/security/access/AccessController.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/security/access/AccessController.html b/devapidocs/src-html/org/apache/hadoop/hbase/security/access/AccessController.html
index 2bbc0f9..7149b2e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/security/access/AccessController.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/security/access/AccessController.html
@@ -103,2456 +103,2499 @@
 <span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.95"></a>
 <span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils;<a name="line.96"></a>
 <span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.ipc.RpcServer;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.AccessControlService;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.quotas.GlobalQuotaSettings;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.regionserver.InternalScanner;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.regionserver.Region;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.regionserver.RegionScanner;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.regionserver.ScanType;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.regionserver.ScannerContext;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.replication.ReplicationEndpoint;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.security.Superusers;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.security.User;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.security.access.Permission.Action;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.util.ByteRange;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.util.SimpleMutableByteRange;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.slf4j.Logger;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.slf4j.LoggerFactory;<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hbase.thirdparty.com.google.common.collect.ArrayListMultimap;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hbase.thirdparty.com.google.common.collect.ListMultimap;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hbase.thirdparty.com.google.common.collect.MapMaker;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hbase.thirdparty.com.google.common.collect.Sets;<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>/**<a name="line.140"></a>
-<span class="sourceLineNo">141</span> * Provides basic authorization checks for data access and administrative<a name="line.141"></a>
-<span class="sourceLineNo">142</span> * operations.<a name="line.142"></a>
-<span class="sourceLineNo">143</span> *<a name="line.143"></a>
-<span class="sourceLineNo">144</span> * &lt;p&gt;<a name="line.144"></a>
-<span class="sourceLineNo">145</span> * {@code AccessController} performs authorization checks for HBase operations<a name="line.145"></a>
-<span class="sourceLineNo">146</span> * based on:<a name="line.146"></a>
-<span class="sourceLineNo">147</span> * &lt;/p&gt;<a name="line.147"></a>
-<span class="sourceLineNo">148</span> * &lt;ul&gt;<a name="line.148"></a>
-<span class="sourceLineNo">149</span> *   &lt;li&gt;the identity of the user performing the operation&lt;/li&gt;<a name="line.149"></a>
-<span class="sourceLineNo">150</span> *   &lt;li&gt;the scope over which the operation is performed, in increasing<a name="line.150"></a>
-<span class="sourceLineNo">151</span> *   specificity: global, table, column family, or qualifier&lt;/li&gt;<a name="line.151"></a>
-<span class="sourceLineNo">152</span> *   &lt;li&gt;the type of action being performed (as mapped to<a name="line.152"></a>
-<span class="sourceLineNo">153</span> *   {@link Permission.Action} values)&lt;/li&gt;<a name="line.153"></a>
-<span class="sourceLineNo">154</span> * &lt;/ul&gt;<a name="line.154"></a>
-<span class="sourceLineNo">155</span> * &lt;p&gt;<a name="line.155"></a>
-<span class="sourceLineNo">156</span> * If the authorization check fails, an {@link AccessDeniedException}<a name="line.156"></a>
-<span class="sourceLineNo">157</span> * will be thrown for the operation.<a name="line.157"></a>
-<span class="sourceLineNo">158</span> * &lt;/p&gt;<a name="line.158"></a>
-<span class="sourceLineNo">159</span> *<a name="line.159"></a>
-<span class="sourceLineNo">160</span> * &lt;p&gt;<a name="line.160"></a>
-<span class="sourceLineNo">161</span> * To perform authorization checks, {@code AccessController} relies on the<a name="line.161"></a>
-<span class="sourceLineNo">162</span> * RpcServerEngine being loaded to provide<a name="line.162"></a>
-<span class="sourceLineNo">163</span> * the user identities for remote requests.<a name="line.163"></a>
-<span class="sourceLineNo">164</span> * &lt;/p&gt;<a name="line.164"></a>
-<span class="sourceLineNo">165</span> *<a name="line.165"></a>
-<span class="sourceLineNo">166</span> * &lt;p&gt;<a name="line.166"></a>
-<span class="sourceLineNo">167</span> * The access control lists used for authorization can be manipulated via the<a name="line.167"></a>
-<span class="sourceLineNo">168</span> * exposed {@link AccessControlService} Interface implementation, and the associated<a name="line.168"></a>
-<span class="sourceLineNo">169</span> * {@code grant}, {@code revoke}, and {@code user_permission} HBase shell<a name="line.169"></a>
-<span class="sourceLineNo">170</span> * commands.<a name="line.170"></a>
-<span class="sourceLineNo">171</span> * &lt;/p&gt;<a name="line.171"></a>
-<span class="sourceLineNo">172</span> */<a name="line.172"></a>
-<span class="sourceLineNo">173</span>@CoreCoprocessor<a name="line.173"></a>
-<span class="sourceLineNo">174</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.174"></a>
-<span class="sourceLineNo">175</span>public class AccessController implements MasterCoprocessor, RegionCoprocessor,<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    RegionServerCoprocessor, AccessControlService.Interface,<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    MasterObserver, RegionObserver, RegionServerObserver, EndpointObserver, BulkLoadObserver {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  // TODO: encapsulate observer functions into separate class/sub-class.<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  private static final Logger LOG = LoggerFactory.getLogger(AccessController.class);<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>  private static final Logger AUDITLOG =<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    LoggerFactory.getLogger("SecurityLogger."+AccessController.class.getName());<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  private static final String CHECK_COVERING_PERM = "check_covering_perm";<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  private static final String TAG_CHECK_PASSED = "tag_check_passed";<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private static final byte[] TRUE = Bytes.toBytes(true);<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private AccessChecker accessChecker;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /** flags if we are running on a region of the _acl_ table */<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private boolean aclRegion = false;<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>  /** defined only for Endpoint implementation, so it can have way to<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   access region services */<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  private RegionCoprocessorEnvironment regionEnv;<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /** Mapping of scanner instances to the user who created them */<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  private Map&lt;InternalScanner,String&gt; scannerOwners =<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      new MapMaker().weakKeys().makeMap();<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>  private Map&lt;TableName, List&lt;UserPermission&gt;&gt; tableAcls;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  /** Provider for mapping principal names to Users */<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  private UserProvider userProvider;<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /** if we are active, usually false, only true if "hbase.security.authorization"<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   has been set to true in site configuration */<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  private boolean authorizationEnabled;<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /** if we are able to support cell ACLs */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  private boolean cellFeaturesEnabled;<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  /** if we should check EXEC permissions */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  private boolean shouldCheckExecPermission;<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  /** if we should terminate access checks early as soon as table or CF grants<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    allow access; pre-0.98 compatible behavior */<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  private boolean compatibleEarlyTermination;<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>  /** if we have been successfully initialized */<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  private volatile boolean initialized = false;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>  /** if the ACL table is available, only relevant in the master */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private volatile boolean aclTabAvailable = false;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  public static boolean isCellAuthorizationSupported(Configuration conf) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    return AccessChecker.isAuthorizationSupported(conf) &amp;&amp;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public Region getRegion() {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    return regionEnv != null ? regionEnv.getRegion() : null;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public TableAuthManager getAuthManager() {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    return accessChecker.getAuthManager();<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>  private void initialize(RegionCoprocessorEnvironment e) throws IOException {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    final Region region = e.getRegion();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Configuration conf = e.getConfiguration();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    Map&lt;byte[], ListMultimap&lt;String,TablePermission&gt;&gt; tables =<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        AccessControlLists.loadAll(region);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    // For each table, write out the table's permissions to the respective<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    // znode for that table.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    for (Map.Entry&lt;byte[], ListMultimap&lt;String,TablePermission&gt;&gt; t:<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      tables.entrySet()) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      byte[] entry = t.getKey();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      ListMultimap&lt;String,TablePermission&gt; perms = t.getValue();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      byte[] serialized = AccessControlLists.writePermissionsAsBytes(perms, conf);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      getAuthManager().getZKPermissionWatcher().writeToZookeeper(entry, serialized);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    initialized = true;<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Writes all table ACLs for the tables in the given Map up into ZooKeeper<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * znodes.  This is called to synchronize ACL changes following {@code _acl_}<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * table updates.<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  private void updateACL(RegionCoprocessorEnvironment e,<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    Set&lt;byte[]&gt; entries = new TreeSet&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    for (Map.Entry&lt;byte[], List&lt;Cell&gt;&gt; f : familyMap.entrySet()) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      List&lt;Cell&gt; cells = f.getValue();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      for (Cell cell: cells) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        if (CellUtil.matchingFamily(cell, AccessControlLists.ACL_LIST_FAMILY)) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          entries.add(CellUtil.cloneRow(cell));<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>    }<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    ZKPermissionWatcher zkw = getAuthManager().getZKPermissionWatcher();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Configuration conf = regionEnv.getConfiguration();<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    byte [] currentEntry = null;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // TODO: Here we are already on the ACL region. (And it is single<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // region) We can even just get the region from the env and do get<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    // directly. The short circuit connection would avoid the RPC overhead<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    // so no socket communication, req write/read ..  But we have the PB<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    // to and fro conversion overhead. get req is converted to PB req<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    // and results are converted to PB results 1st and then to POJOs<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // again. We could have avoided such at least in ACL table context..<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    try (Table t = e.getConnection().getTable(AccessControlLists.ACL_TABLE_NAME)) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      for (byte[] entry : entries) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        currentEntry = entry;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        ListMultimap&lt;String, TablePermission&gt; perms =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>            AccessControlLists.getPermissions(conf, entry, t);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        byte[] serialized = AccessControlLists.writePermissionsAsBytes(perms, conf);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        zkw.writeToZookeeper(entry, serialized);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } catch(IOException ex) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          LOG.error("Failed updating permissions mirror for '" +<a name="line.291"></a>
-<span class="sourceLineNo">292</span>                  (currentEntry == null? "null": Bytes.toString(currentEntry)) + "'", ex);<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><a name="line.295"></a>
-<span class="sourceLineNo">296</span>  /**<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * Check the current user for authorization to perform a specific action<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * against the given set of row data.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   *<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * &lt;p&gt;Note: Ordering of the authorization checks<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * has been carefully optimized to short-circuit the most common requests<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * and minimize the amount of processing required.&lt;/p&gt;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   *<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * @param permRequest the action being requested<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   * @param e the coprocessor environment<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * @param families the map of column families to qualifiers present in<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * the request<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   * @return an authorization result<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   */<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  private AuthResult permissionGranted(String request, User user, Action permRequest,<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      RegionCoprocessorEnvironment e,<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      Map&lt;byte [], ? extends Collection&lt;?&gt;&gt; families) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    RegionInfo hri = e.getRegion().getRegionInfo();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    TableName tableName = hri.getTable();<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>    // 1. All users need read access to hbase:meta table.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    // this is a very common operation, so deal with it quickly.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    if (hri.isMetaRegion()) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if (permRequest == Action.READ) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        return AuthResult.allow(request, "All users allowed", user,<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          permRequest, tableName, families);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      }<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>    if (user == null) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      return AuthResult.deny(request, "No user associated with request!", null,<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        permRequest, tableName, families);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // 2. check for the table-level, if successful we can short-circuit<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    if (getAuthManager().authorize(user, tableName, (byte[])null, permRequest)) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      return AuthResult.allow(request, "Table permission granted", user,<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        permRequest, tableName, families);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    }<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    // 3. check permissions against the requested families<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (families != null &amp;&amp; families.size() &gt; 0) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      // all families must pass<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      for (Map.Entry&lt;byte [], ? extends Collection&lt;?&gt;&gt; family : families.entrySet()) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        // a) check for family level access<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        if (getAuthManager().authorize(user, tableName, family.getKey(),<a name="line.341"></a>
-<span class="sourceLineNo">342</span>            permRequest)) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          continue;  // family-level permission overrides per-qualifier<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        }<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>        // b) qualifier level access can still succeed<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        if ((family.getValue() != null) &amp;&amp; (family.getValue().size() &gt; 0)) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>          if (family.getValue() instanceof Set) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>            // for each qualifier of the family<a name="line.349"></a>
-<span class="sourceLineNo">350</span>            Set&lt;byte[]&gt; familySet = (Set&lt;byte[]&gt;)family.getValue();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>            for (byte[] qualifier : familySet) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              if (!getAuthManager().authorize(user, tableName, family.getKey(),<a name="line.352"></a>
-<span class="sourceLineNo">353</span>                                         qualifier, permRequest)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>                return AuthResult.deny(request, "Failed qualifier check", user,<a name="line.354"></a>
-<span class="sourceLineNo">355</span>                    permRequest, tableName, makeFamilyMap(family.getKey(), qualifier));<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>          } else if (family.getValue() instanceof List) { // List&lt;Cell&gt;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>            List&lt;Cell&gt; cellList = (List&lt;Cell&gt;)family.getValue();<a name="line.359"></a>
-<span class="sourceLineNo">360</span>            for (Cell cell : cellList) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>              if (!getAuthManager().authorize(user, tableName, family.getKey(),<a name="line.361"></a>
-<span class="sourceLineNo">362</span>                CellUtil.cloneQualifier(cell), permRequest)) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>                return AuthResult.deny(request, "Failed qualifier check", user, permRequest,<a name="line.363"></a>
-<span class="sourceLineNo">364</span>                  tableName, makeFamilyMap(family.getKey(), CellUtil.cloneQualifier(cell)));<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>            }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          }<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        } else {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          // no qualifiers and family-level check already failed<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          return AuthResult.deny(request, "Failed family check", user, permRequest,<a name="line.370"></a>
-<span class="sourceLineNo">371</span>              tableName, makeFamilyMap(family.getKey(), null));<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>      // all family checks passed<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      return AuthResult.allow(request, "All family checks passed", user, permRequest,<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          tableName, families);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>    // 4. no families to check and table level access failed<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    return AuthResult.deny(request, "No families to check and table permission failed",<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        user, permRequest, tableName, families);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  }<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>  /**<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   * Check the current user for authorization to perform a specific action<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * against the given set of row data.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * @param opType the operation type<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   * @param user the user<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @param e the coprocessor environment<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @param families the map of column families to qualifiers present in<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * the request<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * @param actions the desired actions<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   * @return an authorization result<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   */<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  private AuthResult permissionGranted(OpType opType, User user, RegionCoprocessorEnvironment e,<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      Map&lt;byte [], ? extends Collection&lt;?&gt;&gt; families, Action... actions) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    AuthResult result = null;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    for (Action action: actions) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      result = permissionGranted(opType.toString(), user, action, e, families);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      if (!result.isAllowed()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        return result;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    return result;<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>  public void requireAccess(ObserverContext&lt;?&gt; ctx, String request, TableName tableName,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      Action... permissions) throws IOException {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    accessChecker.requireAccess(getActiveUser(ctx), request, tableName, permissions);<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>  public void requirePermission(ObserverContext&lt;?&gt; ctx, String request,<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      Action perm) throws IOException {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    accessChecker.requirePermission(getActiveUser(ctx), request, perm);<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>  public void requireGlobalPermission(ObserverContext&lt;?&gt; ctx, String request,<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      Action perm, TableName tableName,<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      Map&lt;byte[], ? extends Collection&lt;byte[]&gt;&gt; familyMap) throws IOException {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    accessChecker.requireGlobalPermission(getActiveUser(ctx),<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        request, perm,tableName, familyMap);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public void requireGlobalPermission(ObserverContext&lt;?&gt; ctx, String request,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      Action perm, String namespace) throws IOException {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    accessChecker.requireGlobalPermission(getActiveUser(ctx),<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        request, perm, namespace);<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 void requireNamespacePermission(ObserverContext&lt;?&gt; ctx, String request, String namespace,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      Action... permissions) throws IOException {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    accessChecker.requireNamespacePermission(getActiveUser(ctx),<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        request, namespace, permissions);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  public void requireNamespacePermission(ObserverContext&lt;?&gt; ctx, String request, String namespace,<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      TableName tableName, Map&lt;byte[], ? extends Collection&lt;byte[]&gt;&gt; familyMap,<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      Action... permissions) throws IOException {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    accessChecker.requireNamespacePermission(getActiveUser(ctx),<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        request, namespace, tableName, familyMap,<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        permissions);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void requirePermission(ObserverContext&lt;?&gt; ctx, String request, TableName tableName,<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      byte[] family, byte[] qualifier, Action... permissions) throws IOException {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    accessChecker.requirePermission(getActiveUser(ctx), request,<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        tableName, family, qualifier, permissions);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public void requireTablePermission(ObserverContext&lt;?&gt; ctx, String request,<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      TableName tableName,byte[] family, byte[] qualifier,<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Action... permissions) throws IOException {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    accessChecker.requireTablePermission(getActiveUser(ctx),<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        request, tableName, family, qualifier, permissions);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public void checkLockPermissions(ObserverContext&lt;?&gt; ctx, String namespace,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      TableName tableName, RegionInfo[] regionInfos, String reason)<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      throws IOException {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    accessChecker.checkLockPermissions(getActiveUser(ctx),<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        namespace, tableName, regionInfos, reason);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
-<span class="sourceLineNo">464</span><a name="line.464"></a>
-<span class="sourceLineNo">465</span>  /**<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * Returns &lt;code&gt;true&lt;/code&gt; if the current user is allowed the given action<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * over at least one of the column qualifiers in the given column families.<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   */<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  private boolean hasFamilyQualifierPermission(User user,<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      Action perm,<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      RegionCoprocessorEnvironment env,<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      Map&lt;byte[], ? extends Collection&lt;byte[]&gt;&gt; familyMap)<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    throws IOException {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    RegionInfo hri = env.getRegion().getRegionInfo();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    TableName tableName = hri.getTable();<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    if (user == null) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      return false;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>    if (familyMap != null &amp;&amp; familyMap.size() &gt; 0) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      // at least one family must be allowed<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      for (Map.Entry&lt;byte[], ? extends Collection&lt;byte[]&gt;&gt; family :<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          familyMap.entrySet()) {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>        if (family.getValue() != null &amp;&amp; !family.getValue().isEmpty()) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          for (byte[] qualifier : family.getValue()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>            if (getAuthManager().matchPermission(user, tableName,<a name="line.487"></a>
-<span class="sourceLineNo">488</span>                family.getKey(), qualifier, perm)) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>              return true;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>            }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          }<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        } else {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          if (getAuthManager().matchPermission(user, tableName, family.getKey(),<a name="line.493"></a>
-<span class="sourceLineNo">494</span>              perm)) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>            return true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        }<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      }<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    } else if (LOG.isDebugEnabled()) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      LOG.debug("Empty family map passed for permission check");<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return false;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  private enum OpType {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    GET("get"),<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    EXISTS("exists"),<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    SCAN("scan"),<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    PUT("put"),<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    DELETE("delete"),<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    CHECK_AND_PUT("checkAndPut"),<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    CHECK_AND_DELETE("checkAndDelete"),<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    INCREMENT_COLUMN_VALUE("incrementColumnValue"),<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    APPEND("append"),<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    INCREMENT("increment");<a name="line.516"></a>
-<span class="sourceLineNo">517</span><a name="line.517"></a>
-<span class="sourceLineNo">518</span>    private String type;<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    private OpType(String type) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      this.type = type;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return type;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    }<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
-<span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>  /**<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * Determine if cell ACLs covered by the operation grant access. This is expensive.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * @return false if cell ACLs failed to grant access, true otherwise<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @throws IOException<a name="line.533"></a>
-<span class="sourceLineNo">534</span>   */<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  private boolean checkCoveringPermission(User user, OpType request, RegionCoprocessorEnvironment e,<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      byte[] row, Map&lt;byte[], ? extends Collection&lt;?&gt;&gt; familyMap, long opTs, Action... actions)<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      throws IOException {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    if (!cellFeaturesEnabled) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      return false;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    }<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    long cellGrants = 0;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    long latestCellTs = 0;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Get get = new Get(row);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    // Only in case of Put/Delete op, consider TS within cell (if set for individual cells).<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    // When every cell, within a Mutation, can be linked with diff TS we can not rely on only one<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    // version. We have to get every cell version and check its TS against the TS asked for in<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Mutation and skip those Cells which is outside this Mutation TS.In case of Put, we have to<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    // consider only one such passing cell. In case of Delete we have to consider all the cell<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    // versions under this passing version. When Delete Mutation contains columns which are a<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    // version delete just consider only one version for those column cells.<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    boolean considerCellTs  = (request == OpType.PUT || request == OpType.DELETE);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    if (considerCellTs) {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      get.setMaxVersions();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    } else {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      get.setMaxVersions(1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    boolean diffCellTsFromOpTs = false;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    for (Map.Entry&lt;byte[], ? extends Collection&lt;?&gt;&gt; entry: familyMap.entrySet()) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      byte[] col = entry.getKey();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      // TODO: HBASE-7114 could possibly unify the collection type in family<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // maps so we would not need to do this<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      if (entry.getValue() instanceof Set) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        Set&lt;byte[]&gt; set = (Set&lt;byte[]&gt;)entry.getValue();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        if (set == null || set.isEmpty()) {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>          get.addFamily(col);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        } else {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>          for (byte[] qual: set) {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>            get.addColumn(col, qual);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        }<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      } else if (entry.getValue() instanceof List) {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>        List&lt;Cell&gt; list = (List&lt;Cell&gt;)entry.getValue();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        if (list == null || list.isEmpty()) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          get.addFamily(col);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        } else {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          // In case of family delete, a Cell will be added into the list with Qualifier as null.<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          for (Cell cell : list) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>            if (cell.getQualifierLength() == 0<a name="line.578"></a>
-<span class="sourceLineNo">579</span>                &amp;&amp; (cell.getTypeByte() == Type.DeleteFamily.getCode()<a name="line.579"></a>
-<span class="sourceLineNo">580</span>                || cell.getTypeByte() == Type.DeleteFamilyVersion.getCode())) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              get.addFamily(col);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>            } else {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>              get.addColumn(col, CellUtil.cloneQualifier(cell));<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            if (considerCellTs) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>              long cellTs = cell.getTimestamp();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>              latestCellTs = Math.max(latestCellTs, cellTs);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>              diffCellTsFromOpTs = diffCellTsFromOpTs || (opTs != cellTs);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>            }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      } else if (entry.getValue() == null) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        get.addFamily(col);<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      } else {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        throw new RuntimeException("Unhandled collection type " +<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          entry.getValue().getClass().getName());<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      }<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    // We want to avoid looking into the future. So, if the cells of the<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    // operation specify a timestamp, or the operation itself specifies a<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    // timestamp, then we use the maximum ts found. Otherwise, we bound<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    // the Get to the current server time. We add 1 to the timerange since<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    // the upper bound of a timerange is exclusive yet we need to examine<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    // any cells found there inclusively.<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    long latestTs = Math.max(opTs, latestCellTs);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    if (latestTs == 0 || latestTs == HConstants.LATEST_TIMESTAMP) {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      latestTs = EnvironmentEdgeManager.currentTime();<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    get.setTimeRange(0, latestTs + 1);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    // In case of Put operation we set to read all versions. This was done to consider the case<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    // where columns are added with TS other than the Mutation TS. But normally this wont be the<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    // case with Put. There no need to get all versions but get latest version only.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    if (!diffCellTsFromOpTs &amp;&amp; request == OpType.PUT) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      get.setMaxVersions(1);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    if (LOG.isTraceEnabled()) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>      LOG.trace("Scanning for cells with " + get);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    }<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    // This Map is identical to familyMap. The key is a BR rather than byte[].<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    // It will be easy to do gets over this new Map as we can create get keys over the Cell cf by<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    // new SimpleByteRange(cell.familyArray, cell.familyOffset, cell.familyLen)<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    Map&lt;ByteRange, List&lt;Cell&gt;&gt; familyMap1 = new HashMap&lt;&gt;();<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    for (Entry&lt;byte[], ? extends Collection&lt;?&gt;&gt; entry : familyMap.entrySet()) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      if (entry.getValue() instanceof List) {<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        familyMap1.put(new SimpleMutableByteRange(entry.getKey()), (List&lt;Cell&gt;) entry.getValue());<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    RegionScanner scanner = getRegion(e).getScanner(new Scan(get));<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    List&lt;Cell&gt; cells = Lists.newArrayList();<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    Cell prevCell = null;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    ByteRange curFam = new SimpleMutableByteRange();<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    boolean curColAllVersions = (request == OpType.DELETE);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    long curColCheckTs = opTs;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    boolean foundColumn = false;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    try {<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      boolean more = false;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(1).build();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>      do {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>        cells.clear();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>        // scan with limit as 1 to hold down memory use on wide rows<a name="line.641"></a>
-<span class="sourceLineNo">642</span>        more = scanner.next(cells, scannerContext);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>        for (Cell cell: cells) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>          if (LOG.isTraceEnabled()) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>            LOG.trace("Found cell " + cell);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>          }<a name="line.646"></a>
-<span class="sourceLineNo">647</span>          boolean colChange = prevCell == null || !CellUtil.matchingColumn(prevCell, cell);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>          if (colChange) foundColumn = false;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>          prevCell = cell;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>          if (!curColAllVersions &amp;&amp; foundColumn) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            continue;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>          }<a name="line.652"></a>
-<span class="sourceLineNo">653</span>          if (colChange &amp;&amp; considerCellTs) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>            curFam.set(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());<a name="line.654"></a>
-<span class="sourceLineNo">655</span>            List&lt;Cell&gt; cols = familyMap1.get(curFam);<a name="line.655"></a>
-<span class="sourceLineNo">656</span>            for (Cell col : cols) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>              // null/empty qualifier is used to denote a Family delete. The TS and delete type<a name="line.657"></a>
-<span class="sourceLineNo">658</span>              // associated with this is applicable for all columns within the family. That is<a name="line.658"></a>
-<span class="sourceLineNo">659</span>              // why the below (col.getQualifierLength() == 0) check.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>              if ((col.getQualifierLength() == 0 &amp;&amp; request == OpType.DELETE)<a name="line.660"></a>
-<span class="sourceLineNo">661</span>                  || CellUtil.matchingQualifier(cell, col)) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>                byte type = col.getTypeByte();<a name="line.662"></a>
-<span class="sourceLineNo">663</span>                if (considerCellTs) {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>                  curColCheckTs = col.getTimestamp();<a name="line.664"></a>
-<span class="sourceLineNo">665</span>                }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>                // For a Delete op we pass allVersions as true. When a Delete Mutation contains<a name="line.666"></a>
-<span class="sourceLineNo">667</span>                // a version delete for a column no need to check all the covering cells within<a name="line.667"></a>
-<span class="sourceLineNo">668</span>                // that column. Check all versions when Type is DeleteColumn or DeleteFamily<a name="line.668"></a>
-<span class="sourceLineNo">669</span>                // One version delete types are Delete/DeleteFamilyVersion<a name="line.669"></a>
-<span class="sourceLineNo">670</span>                curColAllVersions = (KeyValue.Type.DeleteColumn.getCode() == type)<a name="line.670"></a>
-<span class="sourceLineNo">671</span>                    || (KeyValue.Type.DeleteFamily.getCode() == type);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>                break;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>              }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>            }<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>          if (cell.getTimestamp() &gt; curColCheckTs) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>            // Just ignore this cell. This is not a covering cell.<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            continue;<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>          foundColumn = true;<a name="line.680"></a>
-<span class="sourceLineNo">681</span>          for (Action action: actions) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>            // Are there permissions for this user for the cell?<a name="line.682"></a>
-<span class="sourceLineNo">683</span>            if (!getAuthManager().authorize(user, getTableName(e), cell, action)) {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>              // We can stop if the cell ACL denies access<a name="line.684"></a>
-<span class="sourceLineNo">685</span>              return false;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>            }<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          }<a name="line.687"></a>
-<span class="sourceLineNo">688</span>          cellGrants++;<a name="line.688"></a>
-<span class="sourceLineNo">689</span>        }<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      } while (more);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    } catch (AccessDeniedException ex) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      throw ex;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    } catch (IOException ex) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      LOG.error("Exception while getting cells to calculate covering permission", ex);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } finally {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      scanner.close();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // We should not authorize unless we have found one or more cell ACLs that<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    // grant access. This code is used to check for additional permissions<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    // after no table or CF grants are found.<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    return cellGrants &gt; 0;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  }<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>  private static void addCellPermissions(final byte[] perms, Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // Iterate over the entries in the familyMap, replacing the cells therein<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    // with new cells including the ACL data<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    for (Map.Entry&lt;byte[], List&lt;Cell&gt;&gt; e: familyMap.entrySet()) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      List&lt;Cell&gt; newCells = Lists.newArrayList();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      for (Cell cell: e.getValue()) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        // Prepend the supplied perms in a new ACL tag to an update list of tags for the cell<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        List&lt;Tag&gt; tags = new ArrayList&lt;&gt;();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        tags.add(new ArrayBackedTag(AccessControlLists.ACL_TAG_TYPE, perms));<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        Iterator&lt;Tag&gt; tagIterator = PrivateCellUtil.tagsIterator(cell);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        while (tagIterator.hasNext()) {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          tags.add(tagIterator.next());<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        }<a name="line.716"></a>
-<span class="sourceLineNo">717</span>        newCells.add(PrivateCellUtil.createCell(cell, tags));<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      // This is supposed to be safe, won't CME<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      e.setValue(newCells);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  }<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>  // Checks whether incoming cells contain any tag with type as ACL_TAG_TYPE. This tag<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  // type is reserved and should not be explicitly set by user.<a name="line.725"></a>
-<span class="sourceLineNo">726</span>  private void checkForReservedTagPresence(User user, Mutation m) throws IOException {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    // No need to check if we're not going to throw<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    if (!authorizationEnabled) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      m.setAttribute(TAG_CHECK_PASSED, TRUE);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    // Superusers are allowed to store cells unconditionally.<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    if (Superusers.isSuperUser(user)) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      m.setAttribute(TAG_CHECK_PASSED, TRUE);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      return;<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    // We already checked (prePut vs preBatchMutation)<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    if (m.getAttribute(TAG_CHECK_PASSED) != null) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      return;<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    }<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    for (CellScanner cellScanner = m.cellScanner(); cellScanner.advance();) {<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      Iterator&lt;Tag&gt; tagsItr = PrivateCellUtil.tagsIterator(cellScanner.current());<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      while (tagsItr.hasNext()) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        if (tagsItr.next().getType() == AccessControlLists.ACL_TAG_TYPE) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>          throw new AccessDeniedException("Mutation contains cell with reserved type tag");<a name="line.745"></a>
-<span class="sourceLineNo">746</span>        }<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      }<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    m.setAttribute(TAG_CHECK_PASSED, TRUE);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>  /* ---- MasterObserver implementation ---- */<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  @Override<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  public void start(CoprocessorEnvironment env) throws IOException {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    CompoundConfiguration conf = new CompoundConfiguration();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    conf.add(env.getConfiguration());<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    authorizationEnabled = AccessChecker.isAuthorizationSupported(conf);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    if (!authorizationEnabled) {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      LOG.warn("AccessController has been loaded with authorization checks DISABLED!");<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    }<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>    shouldCheckExecPermission = conf.getBoolean(AccessControlConstants.EXEC_PERMISSION_CHECKS_KEY,<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      AccessControlConstants.DEFAULT_EXEC_PERMISSION_CHECKS);<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span>    cellFeaturesEnabled = (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    if (!cellFeaturesEnabled) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      LOG.info("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS<a name="line.768"></a>
-<span class="sourceLineNo">769</span>          + " is required to persist cell ACLs. Consider setting " + HFile.FORMAT_VERSION_KEY<a name="line.769"></a>
-<span class="sourceLineNo">770</span>          + " accordingly.");<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
-<span class="sourceLineNo">772</span><a name="line.772"></a>
-<span class="sourceLineNo">773</span>    ZKWatcher zk = null;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    if (env instanceof MasterCoprocessorEnvironment) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      // if running on HMaster<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      MasterCoprocessorEnvironment mEnv = (MasterCoprocessorEnvironment)env;<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      if (mEnv instanceof HasMasterServices) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>        zk = ((HasMasterServices)mEnv).getMasterServices().getZooKeeper();<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      }<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    } else if (env instanceof RegionServerCoprocessorEnvironment) {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      RegionServerCoprocessorEnvironment rsEnv = (RegionServerCoprocessorEnvironment)env;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      if (rsEnv instanceof HasRegionServerServices) {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>        zk = ((HasRegionServerServices)rsEnv).getRegionServerServices().getZooKeeper();<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    } else if (env instanceof RegionCoprocessorEnvironment) {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      // if running at region<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      regionEnv = (RegionCoprocessorEnvironment) env;<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      conf.addBytesMap(regionEnv.getRegion().getTableDescriptor().getValues());<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      compatibleEarlyTermination = conf.getBoolean(AccessControlConstants.CF_ATTRIBUTE_EARLY_OUT,<a name="line.789"></a>
-<span class="sourceLineNo">790</span>          AccessControlConstants.DEFAULT_ATTRIBUTE_EARLY_OUT);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      if (regionEnv instanceof HasRegionServerServices) {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>        zk = ((HasRegionServerServices)regionEnv).getRegionServerServices().getZooKeeper();<a name="line.792"></a>
-<span class="sourceLineNo">793</span>      }<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    }<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    // set the user-provider.<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    this.userProvider = UserProvider.instantiate(env.getConfiguration());<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    // Throws RuntimeException if fails to load TableAuthManager so that coprocessor is unloaded.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    accessChecker = new AccessChecker(env.getConfiguration(), zk);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    tableAcls = new MapMaker().weakValues().makeMap();<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>  public void stop(CoprocessorEnvironment env) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    accessChecker.stop();<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  /*********************************** Observer/Service Getters ***********************************/<a name="line.808"></a>
-<span class="sourceLineNo">809</span>  @Override<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return Optional.of(this);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>  public Optional&lt;MasterObserver&gt; getMasterObserver() {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    return Optional.of(this);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>  @Override<a name="line.819"></a>
-<span class="sourceLineNo">820</span>  public Optional&lt;EndpointObserver&gt; getEndpointObserver() {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    return Optional.of(this);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>  }<a name="line.822"></a>
-<span class="sourceLineNo">823</span><a name="line.823"></a>
-<span class="sourceLineNo">824</span>  @Override<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public Optional&lt;BulkLoadObserver&gt; getBulkLoadObserver() {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return Optional.of(this);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  @Override<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  public Optional&lt;RegionServerObserver&gt; getRegionServerObserver() {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    return Optional.of(this);<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>  @Override<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  public Iterable&lt;Service&gt; getServices() {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    return Collections.singleton(<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        AccessControlProtos.AccessControlService.newReflectiveService(this));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
-<span class="sourceLineNo">839</span><a name="line.839"></a>
-<span class="sourceLineNo">840</span>  /*********************************** Observer implementations ***********************************/<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Override<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void preCreateTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; c,<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      TableDescriptor desc, RegionInfo[] regions) throws IOException {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    Set&lt;byte[]&gt; families = desc.getColumnFamilyNames();<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    Map&lt;byte[], Set&lt;byte[]&gt;&gt; familyMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    for (byte[] family: families) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      familyMap.put(family, null);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    requireNamespacePermission(c, "createTable",<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        desc.getTableName().getNamespaceAsString(), desc.getTableName(), familyMap, Action.CREATE);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>  }<a name="line.852"></a>
-<span class="sourceLineNo">853</span><a name="line.853"></a>
-<span class="sourceLineNo">854</span>  @Override<a name="line.854"></a>
-<span class="sourceLineNo">855</span>  public void postCompletedCreateTableAction(<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      final ObserverContext&lt;MasterCoprocessorEnvironment&gt; c,<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      final TableDescriptor desc,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      final RegionInfo[] regions) throws IOException {<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    // When AC is used, it should be configured as the 1st CP.<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    // In Master, the table operations like create, are handled by a Thread pool but the max size<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    // for this pool is 1. So if multiple CPs create tables on startup, these creations will happen<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    // sequentially only.<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    // Related code in HMaster#startServiceThreads<a name="line.863"></a>
-<span class="sourceLineNo">864</span>    // {code}<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    //   // We depend on there being only one instance of this executor running<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    //   // at a time. To do concurrency, would need fencing of enable/disable of<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    //   // tables.<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    //   this.service.startExecutorService(ExecutorType.MASTER_TABLE_OPERATIONS, 1);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    // {code}<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    // In future if we change this pool to have more threads, then there is a chance for thread,<a name="line.870"></a>
-<span class="sourceLineNo">871</span>    // creating acl table, getting delayed and by that time another table creation got over and<a name="line.871"></a>
-<span class="sourceLineNo">872</span>    // this hook is getting called. In such a case, we will need a wait logic here which will<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    // wait till the acl table is created.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>    if (AccessControlLists.isAclTable(desc)) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      this.aclTabAvailable = true;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    } else if (!(TableName.NAMESPACE_TABLE_NAME.equals(desc.getTableName()))) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      if (!aclTabAvailable) {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>        LOG.warn("Not adding owner permission for table " + desc.getTableName() + ". "<a name="line.878"></a>
-<span class="sourceLineNo">879</span>            + AccessControlLists.ACL_TABLE_NAME + " is not yet created. "<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            + getClass().getSimpleName() + " should be configured as the first Coprocessor");<a name="line.880"></a>
-<span class="sourceLineNo">881</span>      } else {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        String owner = desc.getOwnerString();<a name="line.882"></a>
-<span class="sourceLineNo">883</span>        // default the table owner to current user, if not specified.<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        if (owner == null)<a name="line.884"></a>
-<span class="sourceLineNo">885</span>          owner = getActiveUser(c).getShortName();<a name="line.885"></a>
-<span class="sourceLineNo">886</span>        final UserPermission userperm = new UserPermission(Bytes.toBytes(owner),<a name="line.886"></a>
-<span class="sourceLineNo">887</span>            desc.getTableName(), null, Action.values());<a name="line.887"></a>
-<span class="sourceLineNo">888</span>        // switch to the real hbase master user for doing the RPC on the ACL table<a name="line.888"></a>
-<span class="sourceLineNo">889</span>        User.runAsLoginUser(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.889"></a>
-<span class="sourceLineNo">890</span>          @Override<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          public Void run() throws Exception {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>            try (Table table = c.getEnvironment().getConnection().<a name="line.892"></a>
-<span class="sourceLineNo">893</span>                getTable(AccessControlLists.ACL_TABLE_NAME)) {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>              AccessControlLists.addUserPermission(c.getEnvironment().getConfiguration(),<a name="line.894"></a>
-<span class="sourceLineNo">895</span>                  userperm, table);<a name="line.895"></a>
-<span class="sourceLineNo">896</span>            }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>            return null;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          }<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        });<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      }<a name="line.900"></a>
-<span class="sourceLineNo">901</span>    }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>  }<a name="line.902"></a>
-<span class="sourceLineNo">903</span><a name="line.903"></a>
-<span class="sourceLineNo">904</span>  @Override<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  public void preDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; c, TableName tableName)<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      throws IOException {<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    requirePermission(c, "deleteTable",<a name="line.907"></a>
-<span class="sourceLineNo">908</span>        tableName, null, null, Action.ADMIN, Action.CREATE);<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  }<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>  @Override<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  public void postDeleteTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; c,<a name="line.912"></a>
-<span class="sourceLineNo">913</span>      final TableName tableName) throws IOException {<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    final Configuration conf = c.getEnvironment().getConfiguration();<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    User.runAsLoginUser(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      @Override<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      public Void run() throws Exception {<a name="line.917"></a>
-<span class="sourceLineNo">918</span>        try (Table table = c.getEnvironment().getConnection().<a name="line.918"></a>
-<span class="sourceLineNo">919</span>            getTable(AccessControlLists.ACL_TABLE_NAME)) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>          AccessControlLists.removeTablePermissions(conf, tableName, table);<a name="line.920"></a>
-<span class="sourceLineNo">921</span>        }<a name="line.921"></a>
-<span class="sourceLineNo">922</span>        return null;<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      }<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    });<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    getAuthManager().getZKPermissionWatcher().deleteTableACLNode(tableName);<a name="line.925"></a>
-<span class="sourceLineNo">926</span>  }<a name="line.926"></a>
-<span class="sourceLineNo">927</span><a name="line.927"></a>
-<span class="sourceLineNo">928</span>  @Override<a name="line.928"></a>
-<span class="sourceLineNo">929</span>  public void preTruncateTable(ObserverContext&lt;MasterCoprocessorEnvironment&gt; c,<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      final TableName tableName) throws IOException {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    requirePermission(c, "truncateTable",<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        tableName, null, null, Action.ADMIN, Action.CREATE);<a name="line.932"></a>
-<span class="sourceLineNo">933</span><a name="line.933"></a>
-<span class="sourceLineNo">934</span>    final Configuration conf = c.getEnvironment().getConfiguration();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    User.runAsLoginUser(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      @Override<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      public Void run() throws Exception {<a name="line.937"></a>
-<span class="sourceLineNo">938</span>        List&lt;UserPermission&gt; acls = AccessControlLists.getUserTablePermissions(conf, tableName);<a name="line.938"></a>
-<span class="sourceLineNo">939</span>        if (acls != null) {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          tableAcls.put(tableName, acls);<a name="line.940"></a>
-<span class="sourceLineNo">941</span>        }<a name="line.941"></a>
-<span class="sourceLineNo">942</span>        return null;<a name="line.942"></a>
-<span class="sourceLineNo">943</span>      }<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    });<a name="line.944"></a>
-<span class="sourceLineNo">945</span>  }<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>  @Override<a name="line.947"></a>
-<span

<TRUNCATED>

[20/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.html b/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.html
index 3a370e4..2e16dc4 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":9,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":9,"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,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10,"i78":10,"i79":10,"i80":10,"i81":10,"i82":10,"i83":10,"i84":10,"i85":10,"i86":10,"i87":10,"i88":10,"i89":10,"i90":10,"i91":10,"i92":10,"i93":10,"i94":10,"i95":10,"i96":10,"i97":10,"i98":10,"i99":10,"i100":10,"i101":10,"i102":10,"i103":10,"i104":10,"i105":10,"i106":10,"i107":10,"i108":10,"i109
 ":10,"i110":10,"i111":10,"i112":10,"i113":10,"i114":10,"i115":10,"i116":10,"i117":10,"i118":10,"i119":10,"i120":10,"i121":10,"i122":10,"i123":10,"i124":10,"i125":10,"i126":10,"i127":10,"i128":10,"i129":10,"i130":10,"i131":10,"i132":10,"i133":10,"i134":10,"i135":10,"i136":10,"i137":10,"i138":10};
+var methods = {"i0":9,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":9,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":9,"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,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10,"i78":10,"i79":10,"i80":10,"i81":10,"i82":10,"i83":10,"i84":10,"i85":10,"i86":10,"i87":10,"i88":10,"i89":10,"i90":10,"i91":10,"i92":10,"i93":10,"i94":10,"i95":10,"i96":10,"i97":10,"i98":10,"i99":10,"i100":10,"i101":10,"i102":10,"i103":10,"i104":10,"i105":10,"i106":10,"i107":10,"i108":10,"i109
 ":10,"i110":10,"i111":10,"i112":10,"i113":10,"i114":10,"i115":10,"i116":10,"i117":10,"i118":10,"i119":10,"i120":10,"i121":10,"i122":10,"i123":10,"i124":10,"i125":10,"i126":10,"i127":10,"i128":10,"i129":10,"i130":10,"i131":10,"i132":10,"i133":10,"i134":10,"i135":10,"i136":10,"i137":10,"i138":10,"i139":10,"i140":10,"i141":10,"i142":10,"i143":10,"i144":10,"i145":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.LimitedPrivate(value="Configuration")
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.html#line.175">AccessController</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/AccessController.html#line.176">AccessController</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/coprocessor/MasterCoprocessor.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessor</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessor.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessor</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessor.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionServerCoprocessor</a>, org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.AccessControlService.Interface, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterObserver</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a>, <a href="../../../../../../org/apache/hadoop/hbase/copro
 cessor/RegionServerObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionServerObserver</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/EndpointObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">EndpointObserver</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/BulkLoadObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">BulkLoadObserver</a></pre>
 <div class="block">Provides basic authorization checks for data access and administrative
@@ -665,48 +665,62 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 </td>
 </tr>
 <tr id="i50" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preAddRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preAddRSGroup</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+             <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>&nbsp;name)</code>
+<div class="block">Called before a new region server group is added</div>
+</td>
+</tr>
+<tr id="i51" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
          <a href="../../../../../../org/apache/hadoop/hbase/client/Append.html" title="class in org.apache.hadoop.hbase.client">Append</a>&nbsp;append)</code>
 <div class="block">Called before Append.</div>
 </td>
 </tr>
-<tr id="i51" class="rowColor">
+<tr id="i52" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
                      <a href="../../../../../../org/apache/hadoop/hbase/client/Append.html" title="class in org.apache.hadoop.hbase.client">Append</a>&nbsp;append)</code>
 <div class="block">Called before Append but after acquiring rowlock.</div>
 </td>
 </tr>
-<tr id="i52" class="altColor">
+<tr id="i53" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preAssign-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-">preAssign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
          <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Called prior to assigning a specific region.</div>
 </td>
 </tr>
-<tr id="i53" class="rowColor">
+<tr id="i54" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preBalance-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preBalance</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c)</code>
 <div class="block">Called prior to requesting rebalancing of the cluster regions, though after
  the initial checks for regions in transition and the balance switch flag.</div>
 </td>
 </tr>
-<tr id="i54" class="altColor">
+<tr id="i55" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preBalanceRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preBalanceRSGroup</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                 <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>&nbsp;groupName)</code>
+<div class="block">Called before a region server group is removed</div>
+</td>
+</tr>
+<tr id="i56" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preBalanceSwitch-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preBalanceSwitch</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
                 boolean&nbsp;newValue)</code>
 <div class="block">Called prior to modifying the flag used to enable/disable region balancing.</div>
 </td>
 </tr>
-<tr id="i55" class="rowColor">
+<tr id="i57" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
               <a href="../../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp)</code>
 <div class="block">This will be called for every batch mutation operation happening at the server.</div>
 </td>
 </tr>
-<tr id="i56" class="altColor">
+<tr id="i58" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                 <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>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],<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>&gt;&gt;&nbsp;familyPaths)</code>
@@ -715,7 +729,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
  request.</div>
 </td>
 </tr>
-<tr id="i57" class="rowColor">
+<tr id="i59" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
                  byte[]&nbsp;row,
@@ -728,7 +742,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before checkAndDelete.</div>
 </td>
 </tr>
-<tr id="i58" class="altColor">
+<tr id="i60" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
                              byte[]&nbsp;row,
@@ -741,7 +755,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before checkAndDelete but after acquiring rowock.</div>
 </td>
 </tr>
-<tr id="i59" class="rowColor">
+<tr id="i61" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
               byte[]&nbsp;row,
@@ -754,7 +768,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before checkAndPut.</div>
 </td>
 </tr>
-<tr id="i60" class="altColor">
+<tr id="i62" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
                           byte[]&nbsp;row,
@@ -767,26 +781,26 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before checkAndPut but after acquiring rowlock.</div>
 </td>
 </tr>
-<tr id="i61" class="rowColor">
+<tr id="i63" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preCleanupBulkLoad-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preCleanupBulkLoad</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>
 <div class="block">Authorization security check for
  SecureBulkLoadProtocol.cleanupBulkLoad()</div>
 </td>
 </tr>
-<tr id="i62" class="altColor">
+<tr id="i64" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preClearCompactionQueues-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preClearCompactionQueues</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionServerCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>
 <div class="block">This will be called before clearing compaction queues</div>
 </td>
 </tr>
-<tr id="i63" class="rowColor">
+<tr id="i65" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preClearDeadServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preClearDeadServers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>
 <div class="block">Called before clear dead region servers.</div>
 </td>
 </tr>
-<tr id="i64" class="altColor">
+<tr id="i66" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preCloneSnapshot-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.SnapshotDescription-org.apache.hadoop.hbase.client.TableDescriptor-">preCloneSnapshot</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                 <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot,
@@ -794,14 +808,14 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before a snapshot is cloned.</div>
 </td>
 </tr>
-<tr id="i65" class="rowColor">
+<tr id="i67" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
         boolean&nbsp;abortRequested)</code>
 <div class="block">Called before the region is reported as closed to the master.</div>
 </td>
 </tr>
-<tr id="i66" class="altColor">
+<tr id="i68" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
           <a href="../../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;store,
@@ -813,7 +827,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
  <code>StoreFile</code>.</div>
 </td>
 </tr>
-<tr id="i67" class="rowColor">
+<tr id="i69" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preCreateNamespace-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.NamespaceDescriptor-">preCreateNamespace</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                   <a href="../../../../../../org/apache/hadoop/hbase/NamespaceDescriptor.html" title="class in org.apache.hadoop.hbase">NamespaceDescriptor</a>&nbsp;ns)</code>
@@ -821,7 +835,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
  <a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master"><code>HMaster</code></a>.</div>
 </td>
 </tr>
-<tr id="i68" class="altColor">
+<tr id="i70" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preCreateTable-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.TableDescriptor-org.apache.hadoop.hbase.client.RegionInfo:A-">preCreateTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
               <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;desc,
@@ -829,7 +843,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Observer implementations</div>
 </td>
 </tr>
-<tr id="i69" class="rowColor">
+<tr id="i71" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preDecommissionRegionServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-boolean-">preDecommissionRegionServers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                             <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>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
@@ -837,7 +851,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before decommission region servers.</div>
 </td>
 </tr>
-<tr id="i70" class="altColor">
+<tr id="i72" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
          <a href="../../../../../../org/apache/hadoop/hbase/client/Delete.html" title="class in org.apache.hadoop.hbase.client">Delete</a>&nbsp;delete,
@@ -846,7 +860,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before the client deletes a value.</div>
 </td>
 </tr>
-<tr id="i71" class="rowColor">
+<tr id="i73" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preDeleteNamespace-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preDeleteNamespace</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                   <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>&nbsp;namespace)</code>
@@ -854,14 +868,14 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
  namespace</div>
 </td>
 </tr>
-<tr id="i72" class="altColor">
+<tr id="i74" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preDeleteSnapshot-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.SnapshotDescription-">preDeleteSnapshot</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                  <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot)</code>
 <div class="block">Called before a snapshot is deleted.</div>
 </td>
 </tr>
-<tr id="i73" class="rowColor">
+<tr id="i75" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preDeleteTable-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-">preDeleteTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
               <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
@@ -869,35 +883,35 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
  table.</div>
 </td>
 </tr>
-<tr id="i74" class="altColor">
+<tr id="i76" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preDisableReplicationPeer-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preDisableReplicationPeer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                          <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>&nbsp;peerId)</code>
 <div class="block">Called before disable a replication peer</div>
 </td>
 </tr>
-<tr id="i75" class="rowColor">
+<tr id="i77" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preDisableTable-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-">preDisableTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
                <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Called prior to disabling a table.</div>
 </td>
 </tr>
-<tr id="i76" class="altColor">
+<tr id="i78" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preEnableReplicationPeer-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preEnableReplicationPeer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                         <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>&nbsp;peerId)</code>
 <div class="block">Called before enable a replication peer</div>
 </td>
 </tr>
-<tr id="i77" class="rowColor">
+<tr id="i79" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preEnableTable-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-">preEnableTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
               <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Called prior to enabling a table.</div>
 </td>
 </tr>
-<tr id="i78" class="altColor">
+<tr id="i80" class="altColor">
 <td class="colFirst"><code>com.google.protobuf.Message</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preEndpointInvocation-org.apache.hadoop.hbase.coprocessor.ObserverContext-com.google.protobuf.Service-java.lang.String-com.google.protobuf.Message-">preEndpointInvocation</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                      com.google.protobuf.Service&nbsp;service,
@@ -906,13 +920,13 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before an Endpoint service method is invoked.</div>
 </td>
 </tr>
-<tr id="i79" class="rowColor">
+<tr id="i81" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preExecuteProcedures-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preExecuteProcedures</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionServerCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>
 <div class="block">This will be called before executing procedures</div>
 </td>
 </tr>
-<tr id="i80" class="altColor">
+<tr id="i82" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
          <a href="../../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get,
@@ -920,27 +934,27 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before the client tests for existence using a Get.</div>
 </td>
 </tr>
-<tr id="i81" class="rowColor">
+<tr id="i83" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
         <a href="../../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</code>
 <div class="block">Called before the memstore is flushed to disk.</div>
 </td>
 </tr>
-<tr id="i82" class="altColor">
+<tr id="i84" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preGetLocks-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preGetLocks</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>
 <div class="block">Called before a getLocks request has been processed.</div>
 </td>
 </tr>
-<tr id="i83" class="rowColor">
+<tr id="i85" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preGetNamespaceDescriptor-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preGetNamespaceDescriptor</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                          <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>&nbsp;namespace)</code>
 <div class="block">Called before a getNamespaceDescriptor request has been processed.</div>
 </td>
 </tr>
-<tr id="i84" class="altColor">
+<tr id="i86" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
         <a href="../../../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;get,
@@ -948,20 +962,20 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before the client performs a Get</div>
 </td>
 </tr>
-<tr id="i85" class="rowColor">
+<tr id="i87" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preGetProcedures-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preGetProcedures</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>
 <div class="block">Called before a getProcedures request has been processed.</div>
 </td>
 </tr>
-<tr id="i86" class="altColor">
+<tr id="i88" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preGetReplicationPeerConfig-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preGetReplicationPeerConfig</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                            <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>&nbsp;peerId)</code>
 <div class="block">Called before get the configured ReplicationPeerConfig for the specified peer</div>
 </td>
 </tr>
-<tr id="i87" class="rowColor">
+<tr id="i89" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preGetTableDescriptors-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.List-java.lang.String-">preGetTableDescriptors</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                       <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>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;tableNamesList,
@@ -970,41 +984,41 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before a getTableDescriptors request has been processed.</div>
 </td>
 </tr>
-<tr id="i88" class="altColor">
+<tr id="i90" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
             <a href="../../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;increment)</code>
 <div class="block">Called before Increment.</div>
 </td>
 </tr>
-<tr id="i89" class="rowColor">
+<tr id="i91" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
                         <a href="../../../../../../org/apache/hadoop/hbase/client/Increment.html" title="class in org.apache.hadoop.hbase.client">Increment</a>&nbsp;increment)</code>
 <div class="block">Called before Increment but after acquiring rowlock.</div>
 </td>
 </tr>
-<tr id="i90" class="altColor">
+<tr id="i92" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preListDecommissionedRegionServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preListDecommissionedRegionServers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>
 <div class="block">Called before list decommissioned region servers.</div>
 </td>
 </tr>
-<tr id="i91" class="rowColor">
+<tr id="i93" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preListReplicationPeers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preListReplicationPeers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                        <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>&nbsp;regex)</code>
 <div class="block">Called before list replication peers.</div>
 </td>
 </tr>
-<tr id="i92" class="altColor">
+<tr id="i94" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preListSnapshot-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.SnapshotDescription-">preListSnapshot</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot)</code>
 <div class="block">Called before listSnapshots request has been processed.</div>
 </td>
 </tr>
-<tr id="i93" class="rowColor">
+<tr id="i95" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preLockHeartbeat-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-java.lang.String-">preLockHeartbeat</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                 <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -1012,21 +1026,21 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before heartbeat to a lock.</div>
 </td>
 </tr>
-<tr id="i94" class="altColor">
+<tr id="i96" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMergeRegions-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo:A-">preMergeRegions</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>[]&nbsp;regionsToMerge)</code>
 <div class="block">Called before merge regions request.</div>
 </td>
 </tr>
-<tr id="i95" class="rowColor">
+<tr id="i97" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preModifyNamespace-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.NamespaceDescriptor-">preModifyNamespace</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                   <a href="../../../../../../org/apache/hadoop/hbase/NamespaceDescriptor.html" title="class in org.apache.hadoop.hbase">NamespaceDescriptor</a>&nbsp;ns)</code>
 <div class="block">Called prior to modifying a namespace's properties.</div>
 </td>
 </tr>
-<tr id="i96" class="altColor">
+<tr id="i98" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preModifyTable-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.TableDescriptor-">preModifyTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
               <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -1034,7 +1048,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called prior to modifying a table's properties.</div>
 </td>
 </tr>
-<tr id="i97" class="rowColor">
+<tr id="i99" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMove-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.ServerName-">preMove</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
        <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
@@ -1043,20 +1057,45 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called prior to moving a given region from one region server to another.</div>
 </td>
 </tr>
-<tr id="i98" class="altColor">
+<tr id="i100" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.lang.String-">preMoveServers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers,
+              <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>&nbsp;targetGroup)</code>
+<div class="block">Called before servers are moved to target region server group</div>
+</td>
+</tr>
+<tr id="i101" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveServersAndTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.util.Set-java.lang.String-">preMoveServersAndTables</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers,
+                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;tables,
+                       <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>&nbsp;targetGroup)</code>
+<div class="block">Called before servers are moved to target region server group</div>
+</td>
+</tr>
+<tr id="i102" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preMoveTables-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-java.lang.String-">preMoveTables</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&gt;&nbsp;tables,
+             <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>&nbsp;targetGroup)</code>
+<div class="block">Called before tables are moved to target region server group</div>
+</td>
+</tr>
+<tr id="i103" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c)</code>
 <div class="block">Called before the region is reported as open to the master.</div>
 </td>
 </tr>
-<tr id="i99" class="rowColor">
+<tr id="i104" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#prePrepareBulkLoad-org.apache.hadoop.hbase.coprocessor.ObserverContext-">prePrepareBulkLoad</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>
 <div class="block">Authorization check for
  SecureBulkLoadProtocol.prepareBulkLoad()</div>
 </td>
 </tr>
-<tr id="i100" class="altColor">
+<tr id="i105" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
       <a href="../../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;put,
@@ -1065,7 +1104,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before the client stores a value.</div>
 </td>
 </tr>
-<tr id="i101" class="rowColor">
+<tr id="i106" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRecommissionRegionServer-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.ServerName-java.util.List-">preRecommissionRegionServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                            <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server,
@@ -1073,27 +1112,41 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before recommission region server.</div>
 </td>
 </tr>
-<tr id="i102" class="altColor">
+<tr id="i107" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRegionOffline-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-">preRegionOffline</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c,
                 <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Called prior to marking a given region as offline.</div>
 </td>
 </tr>
-<tr id="i103" class="rowColor">
+<tr id="i108" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveReplicationPeer-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preRemoveReplicationPeer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                         <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>&nbsp;peerId)</code>
 <div class="block">Called before remove a replication peer</div>
 </td>
 </tr>
-<tr id="i104" class="altColor">
+<tr id="i109" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveRSGroup-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-">preRemoveRSGroup</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                <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>&nbsp;name)</code>
+<div class="block">Called before a region server group is removed</div>
+</td>
+</tr>
+<tr id="i110" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRemoveServers-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.Set-">preRemoveServers</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>&gt;&nbsp;servers)</code>
+<div class="block">Called before servers are removed from rsgroup</div>
+</td>
+</tr>
+<tr id="i111" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preReplicateLogEntries-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preReplicateLogEntries</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionServerCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>
 <div class="block">This will be called before executing replication request to shipping log entries.</div>
 </td>
 </tr>
-<tr id="i105" class="rowColor">
+<tr id="i112" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRequestLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.RegionInfo:A-java.lang.String-">preRequestLock</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
               <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>&nbsp;namespace,
@@ -1103,7 +1156,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before new LockProcedure is queued.</div>
 </td>
 </tr>
-<tr id="i106" class="altColor">
+<tr id="i113" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRestoreSnapshot-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.SnapshotDescription-org.apache.hadoop.hbase.client.TableDescriptor-">preRestoreSnapshot</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                   <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot,
@@ -1111,20 +1164,20 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before a snapshot is restored.</div>
 </td>
 </tr>
-<tr id="i107" class="rowColor">
+<tr id="i114" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preRollWALWriterRequest-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preRollWALWriterRequest</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionServerCoprocessorEnvironment</a>&gt;&nbsp;ctx)</code>
 <div class="block">This will be called before executing user request to roll a region server WAL.</div>
 </td>
 </tr>
-<tr id="i108" class="altColor">
+<tr id="i115" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
                <a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;s)</code>
 <div class="block">Called before the client closes a scanner.</div>
 </td>
 </tr>
-<tr id="i109" class="rowColor">
+<tr id="i116" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
               <a href="../../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">InternalScanner</a>&nbsp;s,
@@ -1134,14 +1187,14 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before the client asks for the next row on a scanner.</div>
 </td>
 </tr>
-<tr id="i110" class="altColor">
+<tr id="i117" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;c,
               <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</code>
 <div class="block">Called before the client opens a new scanner.</div>
 </td>
 </tr>
-<tr id="i111" class="rowColor">
+<tr id="i118" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetNamespaceQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetNamespaceQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                     <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>&nbsp;namespace,
@@ -1149,7 +1202,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before the quota for the namespace is stored.</div>
 </td>
 </tr>
-<tr id="i112" class="altColor">
+<tr id="i119" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetSplitOrMergeEnabled-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-org.apache.hadoop.hbase.client.MasterSwitchType-">preSetSplitOrMergeEnabled</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                          boolean&nbsp;newValue,
@@ -1158,7 +1211,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
  Supports Coprocessor 'bypass'.</div>
 </td>
 </tr>
-<tr id="i113" class="rowColor">
+<tr id="i120" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetTableQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetTableQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                 <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -1166,7 +1219,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before the quota for the table is stored.</div>
 </td>
 </tr>
-<tr id="i114" class="altColor">
+<tr id="i121" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetUserQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetUserQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <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>&nbsp;userName,
@@ -1174,7 +1227,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before the quota for the user is stored.</div>
 </td>
 </tr>
-<tr id="i115" class="rowColor">
+<tr id="i122" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetUserQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-java.lang.String-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetUserQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <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>&nbsp;userName,
@@ -1183,7 +1236,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before the quota for the user on the specified namespace is stored.</div>
 </td>
 </tr>
-<tr id="i116" class="altColor">
+<tr id="i123" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSetUserQuota-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.quotas.GlobalQuotaSettings-">preSetUserQuota</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
                <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>&nbsp;userName,
@@ -1192,14 +1245,14 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before the quota for the user on the specified table is stored.</div>
 </td>
 </tr>
-<tr id="i117" class="rowColor">
+<tr id="i124" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preShutdown-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preShutdown</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c)</code>
 <div class="block">Called prior to shutting down the full HBase cluster, including this
  <a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master"><code>HMaster</code></a> process.</div>
 </td>
 </tr>
-<tr id="i118" class="altColor">
+<tr id="i125" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSnapshot-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.SnapshotDescription-org.apache.hadoop.hbase.client.TableDescriptor-">preSnapshot</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
            <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot,
@@ -1207,7 +1260,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before a new snapshot is taken.</div>
 </td>
 </tr>
-<tr id="i119" class="rowColor">
+<tr id="i126" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preSplitRegion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.TableName-byte:A-">preSplitRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;ctx,
               <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -1215,27 +1268,27 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/Master
 <div class="block">Called before the split region procedure is called.</div>
 </td>
 </tr>
-<tr id="i120" class="altColor">
+<tr id="i127" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.html#preStopMaster-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preStopMaster</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MasterCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">MasterCoprocessorEnvironment</a>&gt;&nbsp;c)</code>
 <div class="block">Called immediately prior to stopping this
  <a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master"><code>HMaster</code></a> process.</div>
 </td>
 </tr>
-<tr id="i121" class="rowColor">
+<tr id="i128" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink

<TRUNCATED>

[12/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index d2a8bfd..57979ea 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -659,11 +659,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>&lt;E&gt; (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>&lt;T&gt;, 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/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html b/testdevapidocs/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html
index 046a589..d08fee2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.57">TestRSGroupsWithACL</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.63">TestRSGroupsWithACL</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.html" title="class in org.apache.hadoop.hbase.security.access">SecureTestUtil</a></pre>
 <div class="block">Performs authorization checks for rsgroup operations, according to different
  levels of authorized users.</div>
@@ -152,94 +152,106 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>private static org.apache.hadoop.hbase.security.access.AccessController</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#accessController">accessController</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.conf.Configuration</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#conf">conf</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#CP_ENV">CP_ENV</a></span></code>&nbsp;</td>
+</tr>
 <tr class="altColor">
+<td class="colFirst"><code>private static org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#CTX">CTX</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private static <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 class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#GROUP_ADMIN">GROUP_ADMIN</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <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 class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#GROUP_CREATE">GROUP_CREATE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <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 class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#GROUP_READ">GROUP_READ</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <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 class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#GROUP_WRITE">GROUP_WRITE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpoint</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#rsGroupAdminEndpoint">rsGroupAdminEndpoint</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#SUPERUSER">SUPERUSER</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.client.Connection</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#systemUserConnection">systemUserConnection</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#TEST_FAMILY">TEST_FAMILY</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.TableName</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#USER_ADMIN">USER_ADMIN</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#USER_CREATE">USER_CREATE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#USER_GROUP_ADMIN">USER_GROUP_ADMIN</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#USER_GROUP_CREATE">USER_GROUP_CREATE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#USER_GROUP_READ">USER_GROUP_READ</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#USER_GROUP_WRITE">USER_GROUP_WRITE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#USER_NONE">USER_NONE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#USER_OWNER">USER_OWNER</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#USER_RO">USER_RO</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#USER_RW">USER_RW</a></span></code>&nbsp;</td>
 </tr>
@@ -335,6 +347,14 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#testRemoveRSGroup--">testRemoveRSGroup</a></span>()</code>&nbsp;</td>
 </tr>
+<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/rsgroup/TestRSGroupsWithACL.html#testRemoveServers--">testRemoveServers</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i16" class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#validateAdminPermissions-org.apache.hadoop.hbase.security.access.SecureTestUtil.AccessTestAction-">validateAdminPermissions</a></span>(<a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.AccessTestAction.html" title="interface in org.apache.hadoop.hbase.security.access">SecureTestUtil.AccessTestAction</a>&nbsp;action)</code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.security.access.SecureTestUtil">
@@ -370,7 +390,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<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/rsgroup/TestRSGroupsWithACL.html#line.60">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<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/rsgroup/TestRSGroupsWithACL.html#line.66">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -379,7 +399,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.63">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.69">LOG</a></pre>
 </li>
 </ul>
 <a name="TEST_TABLE">
@@ -388,7 +408,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_TABLE</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.64">TEST_TABLE</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.70">TEST_TABLE</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -397,7 +417,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.65">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.71">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -406,7 +426,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.66">conf</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.72">conf</a></pre>
 </li>
 </ul>
 <a name="systemUserConnection">
@@ -415,7 +435,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>systemUserConnection</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.68">systemUserConnection</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.74">systemUserConnection</a></pre>
 </li>
 </ul>
 <a name="SUPERUSER">
@@ -424,7 +444,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>SUPERUSER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.70">SUPERUSER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.76">SUPERUSER</a></pre>
 </li>
 </ul>
 <a name="USER_ADMIN">
@@ -433,7 +453,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_ADMIN</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.72">USER_ADMIN</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.78">USER_ADMIN</a></pre>
 </li>
 </ul>
 <a name="USER_RW">
@@ -442,7 +462,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_RW</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.74">USER_RW</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.80">USER_RW</a></pre>
 </li>
 </ul>
 <a name="USER_RO">
@@ -451,7 +471,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_RO</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.76">USER_RO</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.82">USER_RO</a></pre>
 </li>
 </ul>
 <a name="USER_OWNER">
@@ -460,7 +480,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_OWNER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.78">USER_OWNER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.84">USER_OWNER</a></pre>
 </li>
 </ul>
 <a name="USER_CREATE">
@@ -469,7 +489,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_CREATE</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.80">USER_CREATE</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.86">USER_CREATE</a></pre>
 </li>
 </ul>
 <a name="USER_NONE">
@@ -478,7 +498,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_NONE</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.82">USER_NONE</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.88">USER_NONE</a></pre>
 </li>
 </ul>
 <a name="GROUP_ADMIN">
@@ -487,7 +507,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>GROUP_ADMIN</h4>
-<pre>private static final&nbsp;<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/rsgroup/TestRSGroupsWithACL.html#line.84">GROUP_ADMIN</a></pre>
+<pre>private static final&nbsp;<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/rsgroup/TestRSGroupsWithACL.html#line.90">GROUP_ADMIN</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.rsgroup.TestRSGroupsWithACL.GROUP_ADMIN">Constant Field Values</a></dd>
@@ -500,7 +520,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>GROUP_CREATE</h4>
-<pre>private static final&nbsp;<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/rsgroup/TestRSGroupsWithACL.html#line.85">GROUP_CREATE</a></pre>
+<pre>private static final&nbsp;<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/rsgroup/TestRSGroupsWithACL.html#line.91">GROUP_CREATE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.rsgroup.TestRSGroupsWithACL.GROUP_CREATE">Constant Field Values</a></dd>
@@ -513,7 +533,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>GROUP_READ</h4>
-<pre>private static final&nbsp;<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/rsgroup/TestRSGroupsWithACL.html#line.86">GROUP_READ</a></pre>
+<pre>private static final&nbsp;<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/rsgroup/TestRSGroupsWithACL.html#line.92">GROUP_READ</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.rsgroup.TestRSGroupsWithACL.GROUP_READ">Constant Field Values</a></dd>
@@ -526,7 +546,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>GROUP_WRITE</h4>
-<pre>private static final&nbsp;<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/rsgroup/TestRSGroupsWithACL.html#line.87">GROUP_WRITE</a></pre>
+<pre>private static final&nbsp;<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/rsgroup/TestRSGroupsWithACL.html#line.93">GROUP_WRITE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.rsgroup.TestRSGroupsWithACL.GROUP_WRITE">Constant Field Values</a></dd>
@@ -539,7 +559,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_GROUP_ADMIN</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.89">USER_GROUP_ADMIN</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.95">USER_GROUP_ADMIN</a></pre>
 </li>
 </ul>
 <a name="USER_GROUP_CREATE">
@@ -548,7 +568,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_GROUP_CREATE</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.90">USER_GROUP_CREATE</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.96">USER_GROUP_CREATE</a></pre>
 </li>
 </ul>
 <a name="USER_GROUP_READ">
@@ -557,7 +577,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_GROUP_READ</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.91">USER_GROUP_READ</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.97">USER_GROUP_READ</a></pre>
 </li>
 </ul>
 <a name="USER_GROUP_WRITE">
@@ -566,7 +586,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_GROUP_WRITE</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.92">USER_GROUP_WRITE</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.98">USER_GROUP_WRITE</a></pre>
 </li>
 </ul>
 <a name="TEST_FAMILY">
@@ -575,16 +595,43 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_FAMILY</h4>
-<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.94">TEST_FAMILY</a></pre>
+<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.100">TEST_FAMILY</a></pre>
 </li>
 </ul>
 <a name="rsGroupAdminEndpoint">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>rsGroupAdminEndpoint</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpoint <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.96">rsGroupAdminEndpoint</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpoint <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.102">rsGroupAdminEndpoint</a></pre>
+</li>
+</ul>
+<a name="accessController">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>accessController</h4>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.access.AccessController <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.103">accessController</a></pre>
+</li>
+</ul>
+<a name="CP_ENV">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CP_ENV</h4>
+<pre>private static&nbsp;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.104">CP_ENV</a></pre>
+</li>
+</ul>
+<a name="CTX">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>CTX</h4>
+<pre>private static&nbsp;org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.105">CTX</a></pre>
 </li>
 </ul>
 </li>
@@ -601,7 +648,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestRSGroupsWithACL</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.57">TestRSGroupsWithACL</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.63">TestRSGroupsWithACL</a>()</pre>
 </li>
 </ul>
 </li>
@@ -618,7 +665,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>setupBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.99">setupBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.108">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>
@@ -632,7 +679,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>setUpTableAndUserPermissions</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.139">setUpTableAndUserPermissions</a>()
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.155">setUpTableAndUserPermissions</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>
@@ -646,7 +693,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanUp</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.186">cleanUp</a>()
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.202">cleanUp</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>
@@ -660,7 +707,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.201">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.217">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>
@@ -674,7 +721,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>configureRSGroupAdminEndpoint</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.208">configureRSGroupAdminEndpoint</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.224">configureRSGroupAdminEndpoint</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="testGetRSGroupInfo--">
@@ -683,7 +730,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetRSGroupInfo</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.220">testGetRSGroupInfo</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.236">testGetRSGroupInfo</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>
@@ -697,7 +744,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetRSGroupInfoOfTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.232">testGetRSGroupInfoOfTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.246">testGetRSGroupInfoOfTable</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>
@@ -711,7 +758,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>testMoveServers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.244">testMoveServers</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.256">testMoveServers</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>
@@ -725,7 +772,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>testMoveTables</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.256">testMoveTables</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.266">testMoveTables</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>
@@ -739,7 +786,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>testAddRSGroup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.268">testAddRSGroup</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.276">testAddRSGroup</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>
@@ -753,7 +800,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>testRemoveRSGroup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.280">testRemoveRSGroup</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.286">testRemoveRSGroup</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>
@@ -767,7 +814,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>testBalanceRSGroup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.292">testBalanceRSGroup</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.296">testBalanceRSGroup</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>
@@ -781,7 +828,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <ul class="blockList">
 <li class="blockList">
 <h4>testListRSGroup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.304">testListRSGroup</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.306">testListRSGroup</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>
@@ -806,10 +853,10 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 <a name="testMoveServersAndTables--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testMoveServersAndTables</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.328">testMoveServersAndTables</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.326">testMoveServersAndTables</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>
@@ -817,6 +864,34 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 </dl>
 </li>
 </ul>
+<a name="testRemoveServers--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testRemoveServers</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.336">testRemoveServers</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>
+<dd><code><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></code></dd>
+</dl>
+</li>
+</ul>
+<a name="validateAdminPermissions-org.apache.hadoop.hbase.security.access.SecureTestUtil.AccessTestAction-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>validateAdminPermissions</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#line.345">validateAdminPermissions</a>(<a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.AccessTestAction.html" title="interface in org.apache.hadoop.hbase.security.access">SecureTestUtil.AccessTestAction</a>&nbsp;action)
+                               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>
+<dd><code><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></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
index b463e0d..fe4500d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
@@ -189,7 +189,7 @@ extends org.apache.hadoop.hbase.security.access.AccessController</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.security.access.AccessController</h3>
-<code>checkLockPermissions, checkPermissions, getAuthManager, getBulkLoadObserver, getEndpointObserver, getMasterObserver, getRegion, getRegionObserver, getRegionServerObserver, getServices, getUserPermissions, grant, isCellAuthorizationSupported, postAbortProcedure, postCompletedCreateTableAction, postCreateReplicationEndPoint, postDelete, postDeleteNamespace, postDeleteTable, postEndpointInvocation, postGetTableDescriptors, postGetTableNames, postListNamespaceDescriptors, postModifyTable, postMutationBeforeWAL, postOpen, postPut, postRollWALWriterRequest, postScannerClose, postScannerFilterRow, postScannerOpen, postStartMaster, postTruncateTable, preAbortProcedure, preAddReplicationPeer, preAppend, preAppendAfterRowLock, preAssign, preBalance, preBalanceSwitch, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCleanupBulkLoad, preClearCompactionQueues, preClearDeadServers, preCloneSnapshot, preClose, 
 preCompact, preCreateNamespace, preCreateTable, preDecommissionRegionServers, preDelete, preDeleteNamespace, preDeleteSnapshot, preDeleteTable, preDisableReplicationPeer, preDisableTable, preEnableReplicationPeer, preEnableTable, preEndpointInvocation, preExecuteProcedures, preExists, preFlush, preGetLocks, preGetNamespaceDescriptor, preGetOp, preGetProcedures, preGetReplicationPeerConfig, preGetTableDescriptors, preIncrement, preIncrementAfterRowLock, preListDecommissionedRegionServers, preListReplicationPeers, preListSnapshot, preLockHeartbeat, preMergeRegions, preModifyNamespace, preModifyTable, preMove, preOpen, prePrepareBulkLoad, prePut, preRecommissionRegionServer, preRegionOffline, preRemoveReplicationPeer, preReplicateLogEntries, preRequestLock, preRestoreSnapshot, preRollWALWriterRequest, preScannerClose, preScannerNext, preScannerOpen, preSetNamespaceQuota, preSetSplitOrMergeEnabled, preSetTableQuota, preSetUserQuota, preSetUserQuota, preSetUserQuota, preShutdown, preSnap
 shot, preSplitRegion, preStopMaster, preStopRegionServer, preTableFlush, preTruncateTable, preUnassign, preUpdateReplicationPeerConfig, requireAccess, requireGlobalPermission, requireGlobalPermission, requireNamespacePermission, requireNamespacePermission, requirePermission, requirePermission, requireTablePermission, revoke, start, stop</code></li>
+<code>checkLockPermissions, checkPermissions, getAuthManager, getBulkLoadObserver, getEndpointObserver, getMasterObserver, getRegion, getRegionObserver, getRegionServerObserver, getServices, getUserPermissions, grant, isCellAuthorizationSupported, postAbortProcedure, postCompletedCreateTableAction, postCreateReplicationEndPoint, postDelete, postDeleteNamespace, postDeleteTable, postEndpointInvocation, postGetTableDescriptors, postGetTableNames, postListNamespaceDescriptors, postModifyTable, postMutationBeforeWAL, postOpen, postPut, postRollWALWriterRequest, postScannerClose, postScannerFilterRow, postScannerOpen, postStartMaster, postTruncateTable, preAbortProcedure, preAddReplicationPeer, preAddRSGroup, preAppend, preAppendAfterRowLock, preAssign, preBalance, preBalanceRSGroup, preBalanceSwitch, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCleanupBulkLoad, preClearCompactionQueues, preClearDeadSer
 vers, preCloneSnapshot, preClose, preCompact, preCreateNamespace, preCreateTable, preDecommissionRegionServers, preDelete, preDeleteNamespace, preDeleteSnapshot, preDeleteTable, preDisableReplicationPeer, preDisableTable, preEnableReplicationPeer, preEnableTable, preEndpointInvocation, preExecuteProcedures, preExists, preFlush, preGetLocks, preGetNamespaceDescriptor, preGetOp, preGetProcedures, preGetReplicationPeerConfig, preGetTableDescriptors, preIncrement, preIncrementAfterRowLock, preListDecommissionedRegionServers, preListReplicationPeers, preListSnapshot, preLockHeartbeat, preMergeRegions, preModifyNamespace, preModifyTable, preMove, preMoveServers, preMoveServersAndTables, preMoveTables, preOpen, prePrepareBulkLoad, prePut, preRecommissionRegionServer, preRegionOffline, preRemoveReplicationPeer, preRemoveRSGroup, preRemoveServers, preReplicateLogEntries, preRequestLock, preRestoreSnapshot, preRollWALWriterRequest, preScannerClose, preScannerNext, preScannerOpen, preSetNamesp
 aceQuota, preSetSplitOrMergeEnabled, preSetTableQuota, preSetUserQuota, preSetUserQuota, preSetUserQuota, preShutdown, preSnapshot, preSplitRegion, preStopMaster, preStopRegionServer, preTableFlush, preTruncateTable, preUnassign, preUpdateReplicationPeerConfig, requireAccess, requireGlobalPermission, requireGlobalPermission, requireNamespacePermission, requireNamespacePermission, requirePermission, requirePermission, requireTablePermission, revoke, start, stop</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -203,7 +203,7 @@ extends org.apache.hadoop.hbase.security.access.AccessController</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.MasterObserver</h3>
-<code>postAddReplicationPeer, postAddRSGroup, postAssign, postBalance, postBalanceRSGroup, postBalanceSwitch, postClearDeadServers, postCloneSnapshot, postCompletedDeleteTableAction, postCompletedDisableTableAction, postCompletedEnableTableAction, postCompletedMergeRegionsAction, postCompletedModifyTableAction, postCompletedModifyTableAction, postCompletedSplitRegionAction, postCompletedTruncateTableAction, postCreateNamespace, postCreateTable, postDecommissionRegionServers, postDeleteSnapshot, postDisableReplicationPeer, postDisableTable, postEnableReplicationPeer, postEnableTable, postGetClusterMetrics, postGetLocks, postGetNamespaceDescriptor, postGetProcedures, postGetReplicationPeerConfig, postListDecommissionedRegionServers, postListReplicationPeers, postListSnapshot, postLockHeartbeat, postMergeRegions, postMergeRegionsCommitAction, postModifyNamespace, postModifyNamespace, postModifyTable, postMove, postMoveServers, postMoveServersAndTables, postMoveTables, postRecommissionR
 egionServer, postRegionOffline, postRemoveReplicationPeer, postRemoveRSGroup, postRemoveServers, postRequestLock, postRestoreSnapshot, postRollBackMergeRegionsAction, postRollBackSplitRegionAction, postSetNamespaceQuota, postSetSplitOrMergeEnabled, postSetTableQuota, postSetUserQuota, postSetUserQuota, postSetUserQuota, postSnapshot, postTableFlush, postUnassign, postUpdateReplicationPeerConfig, preAddRSGroup, preBalanceRSGroup, preCreateTableAction, preDeleteTableAction, preDisableTableAction, preEnableTableAction, preGetClusterMetrics, preGetTableNames, preListNamespaceDescriptors, preMasterInitialization, preMergeRegionsAction, preMergeRegionsCommitAction, preModifyNamespace, preModifyTable, preModifyTableAction, preModifyTableAction, preMoveServers, preMoveServersAndTables, preMoveTables, preRemoveRSGroup, preRemoveServers, preSplitRegionAction, preSplitRegionAfterMETAAction, preSplitRegionBeforeMETAAction, preTruncateTableAction</code></li>
+<code>postAddReplicationPeer, postAddRSGroup, postAssign, postBalance, postBalanceRSGroup, postBalanceSwitch, postClearDeadServers, postCloneSnapshot, postCompletedDeleteTableAction, postCompletedDisableTableAction, postCompletedEnableTableAction, postCompletedMergeRegionsAction, postCompletedModifyTableAction, postCompletedModifyTableAction, postCompletedSplitRegionAction, postCompletedTruncateTableAction, postCreateNamespace, postCreateTable, postDecommissionRegionServers, postDeleteSnapshot, postDisableReplicationPeer, postDisableTable, postEnableReplicationPeer, postEnableTable, postGetClusterMetrics, postGetLocks, postGetNamespaceDescriptor, postGetProcedures, postGetReplicationPeerConfig, postListDecommissionedRegionServers, postListReplicationPeers, postListSnapshot, postLockHeartbeat, postMergeRegions, postMergeRegionsCommitAction, postModifyNamespace, postModifyNamespace, postModifyTable, postMove, postMoveServers, postMoveServersAndTables, postMoveTables, postRecommissionR
 egionServer, postRegionOffline, postRemoveReplicationPeer, postRemoveRSGroup, postRemoveServers, postRequestLock, postRestoreSnapshot, postRollBackMergeRegionsAction, postRollBackSplitRegionAction, postSetNamespaceQuota, postSetSplitOrMergeEnabled, postSetTableQuota, postSetUserQuota, postSetUserQuota, postSetUserQuota, postSnapshot, postTableFlush, postUnassign, postUpdateReplicationPeerConfig, preCreateTableAction, preDeleteTableAction, preDisableTableAction, preEnableTableAction, preGetClusterMetrics, preGetTableNames, preListNamespaceDescriptors, preMasterInitialization, preMergeRegionsAction, preMergeRegionsCommitAction, preModifyNamespace, preModifyTable, preModifyTableAction, preModifyTableAction, preSplitRegionAction, preSplitRegionAfterMETAAction, preSplitRegionBeforeMETAAction, preTruncateTableAction</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionObserver">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController3.FaultyAccessController.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController3.FaultyAccessController.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController3.FaultyAccessController.html
index b7c9a12..3e8bcc9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController3.FaultyAccessController.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController3.FaultyAccessController.html
@@ -206,7 +206,7 @@ extends org.apache.hadoop.hbase.security.access.AccessController</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.security.access.AccessController</h3>
-<code>checkLockPermissions, checkPermissions, getAuthManager, getBulkLoadObserver, getEndpointObserver, getMasterObserver, getRegion, getRegionObserver, getRegionServerObserver, getServices, getUserPermissions, grant, isCellAuthorizationSupported, postAbortProcedure, postCompletedCreateTableAction, postCreateReplicationEndPoint, postDelete, postDeleteNamespace, postDeleteTable, postEndpointInvocation, postGetTableDescriptors, postGetTableNames, postListNamespaceDescriptors, postModifyTable, postMutationBeforeWAL, postOpen, postPut, postRollWALWriterRequest, postScannerClose, postScannerFilterRow, postScannerOpen, postStartMaster, postTruncateTable, preAbortProcedure, preAddReplicationPeer, preAppend, preAppendAfterRowLock, preAssign, preBalance, preBalanceSwitch, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCleanupBulkLoad, preClearCompactionQueues, preClearDeadServers, preCloneSnapshot, preClose, 
 preCompact, preCreateNamespace, preCreateTable, preDecommissionRegionServers, preDelete, preDeleteNamespace, preDeleteSnapshot, preDeleteTable, preDisableReplicationPeer, preDisableTable, preEnableReplicationPeer, preEnableTable, preEndpointInvocation, preExecuteProcedures, preExists, preFlush, preGetLocks, preGetNamespaceDescriptor, preGetOp, preGetProcedures, preGetReplicationPeerConfig, preGetTableDescriptors, preIncrement, preIncrementAfterRowLock, preListDecommissionedRegionServers, preListReplicationPeers, preListSnapshot, preLockHeartbeat, preMergeRegions, preModifyNamespace, preModifyTable, preMove, preOpen, prePrepareBulkLoad, prePut, preRecommissionRegionServer, preRegionOffline, preRemoveReplicationPeer, preReplicateLogEntries, preRequestLock, preRestoreSnapshot, preRollWALWriterRequest, preScannerClose, preScannerNext, preScannerOpen, preSetNamespaceQuota, preSetSplitOrMergeEnabled, preSetTableQuota, preSetUserQuota, preSetUserQuota, preSetUserQuota, preShutdown, preSnap
 shot, preSplitRegion, preStopMaster, preStopRegionServer, preTableFlush, preTruncateTable, preUnassign, preUpdateReplicationPeerConfig, requireAccess, requireGlobalPermission, requireGlobalPermission, requireNamespacePermission, requireNamespacePermission, requirePermission, requirePermission, requireTablePermission, revoke, start</code></li>
+<code>checkLockPermissions, checkPermissions, getAuthManager, getBulkLoadObserver, getEndpointObserver, getMasterObserver, getRegion, getRegionObserver, getRegionServerObserver, getServices, getUserPermissions, grant, isCellAuthorizationSupported, postAbortProcedure, postCompletedCreateTableAction, postCreateReplicationEndPoint, postDelete, postDeleteNamespace, postDeleteTable, postEndpointInvocation, postGetTableDescriptors, postGetTableNames, postListNamespaceDescriptors, postModifyTable, postMutationBeforeWAL, postOpen, postPut, postRollWALWriterRequest, postScannerClose, postScannerFilterRow, postScannerOpen, postStartMaster, postTruncateTable, preAbortProcedure, preAddReplicationPeer, preAddRSGroup, preAppend, preAppendAfterRowLock, preAssign, preBalance, preBalanceRSGroup, preBalanceSwitch, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCleanupBulkLoad, preClearCompactionQueues, preClearDeadSer
 vers, preCloneSnapshot, preClose, preCompact, preCreateNamespace, preCreateTable, preDecommissionRegionServers, preDelete, preDeleteNamespace, preDeleteSnapshot, preDeleteTable, preDisableReplicationPeer, preDisableTable, preEnableReplicationPeer, preEnableTable, preEndpointInvocation, preExecuteProcedures, preExists, preFlush, preGetLocks, preGetNamespaceDescriptor, preGetOp, preGetProcedures, preGetReplicationPeerConfig, preGetTableDescriptors, preIncrement, preIncrementAfterRowLock, preListDecommissionedRegionServers, preListReplicationPeers, preListSnapshot, preLockHeartbeat, preMergeRegions, preModifyNamespace, preModifyTable, preMove, preMoveServers, preMoveServersAndTables, preMoveTables, preOpen, prePrepareBulkLoad, prePut, preRecommissionRegionServer, preRegionOffline, preRemoveReplicationPeer, preRemoveRSGroup, preRemoveServers, preReplicateLogEntries, preRequestLock, preRestoreSnapshot, preRollWALWriterRequest, preScannerClose, preScannerNext, preScannerOpen, preSetNamesp
 aceQuota, preSetSplitOrMergeEnabled, preSetTableQuota, preSetUserQuota, preSetUserQuota, preSetUserQuota, preShutdown, preSnapshot, preSplitRegion, preStopMaster, preStopRegionServer, preTableFlush, preTruncateTable, preUnassign, preUpdateReplicationPeerConfig, requireAccess, requireGlobalPermission, requireGlobalPermission, requireNamespacePermission, requireNamespacePermission, requirePermission, requirePermission, requireTablePermission, revoke, start</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -220,7 +220,7 @@ extends org.apache.hadoop.hbase.security.access.AccessController</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.MasterObserver</h3>
-<code>postAddReplicationPeer, postAddRSGroup, postAssign, postBalance, postBalanceRSGroup, postBalanceSwitch, postClearDeadServers, postCloneSnapshot, postCompletedDeleteTableAction, postCompletedDisableTableAction, postCompletedEnableTableAction, postCompletedMergeRegionsAction, postCompletedModifyTableAction, postCompletedModifyTableAction, postCompletedSplitRegionAction, postCompletedTruncateTableAction, postCreateNamespace, postCreateTable, postDecommissionRegionServers, postDeleteSnapshot, postDisableReplicationPeer, postDisableTable, postEnableReplicationPeer, postEnableTable, postGetClusterMetrics, postGetLocks, postGetNamespaceDescriptor, postGetProcedures, postGetReplicationPeerConfig, postListDecommissionedRegionServers, postListReplicationPeers, postListSnapshot, postLockHeartbeat, postMergeRegions, postMergeRegionsCommitAction, postModifyNamespace, postModifyNamespace, postModifyTable, postMove, postMoveServers, postMoveServersAndTables, postMoveTables, postRecommissionR
 egionServer, postRegionOffline, postRemoveReplicationPeer, postRemoveRSGroup, postRemoveServers, postRequestLock, postRestoreSnapshot, postRollBackMergeRegionsAction, postRollBackSplitRegionAction, postSetNamespaceQuota, postSetSplitOrMergeEnabled, postSetTableQuota, postSetUserQuota, postSetUserQuota, postSetUserQuota, postSnapshot, postTableFlush, postUnassign, postUpdateReplicationPeerConfig, preAddRSGroup, preBalanceRSGroup, preCreateTableAction, preDeleteTableAction, preDisableTableAction, preEnableTableAction, preGetClusterMetrics, preGetTableNames, preListNamespaceDescriptors, preMasterInitialization, preMergeRegionsAction, preMergeRegionsCommitAction, preModifyNamespace, preModifyTable, preModifyTableAction, preModifyTableAction, preMoveServers, preMoveServersAndTables, preMoveTables, preRemoveRSGroup, preRemoveServers, preSplitRegionAction, preSplitRegionAfterMETAAction, preSplitRegionBeforeMETAAction, preTruncateTableAction</code></li>
+<code>postAddReplicationPeer, postAddRSGroup, postAssign, postBalance, postBalanceRSGroup, postBalanceSwitch, postClearDeadServers, postCloneSnapshot, postCompletedDeleteTableAction, postCompletedDisableTableAction, postCompletedEnableTableAction, postCompletedMergeRegionsAction, postCompletedModifyTableAction, postCompletedModifyTableAction, postCompletedSplitRegionAction, postCompletedTruncateTableAction, postCreateNamespace, postCreateTable, postDecommissionRegionServers, postDeleteSnapshot, postDisableReplicationPeer, postDisableTable, postEnableReplicationPeer, postEnableTable, postGetClusterMetrics, postGetLocks, postGetNamespaceDescriptor, postGetProcedures, postGetReplicationPeerConfig, postListDecommissionedRegionServers, postListReplicationPeers, postListSnapshot, postLockHeartbeat, postMergeRegions, postMergeRegionsCommitAction, postModifyNamespace, postModifyNamespace, postModifyTable, postMove, postMoveServers, postMoveServersAndTables, postMoveTables, postRecommissionR
 egionServer, postRegionOffline, postRemoveReplicationPeer, postRemoveRSGroup, postRemoveServers, postRequestLock, postRestoreSnapshot, postRollBackMergeRegionsAction, postRollBackSplitRegionAction, postSetNamespaceQuota, postSetSplitOrMergeEnabled, postSetTableQuota, postSetUserQuota, postSetUserQuota, postSetUserQuota, postSnapshot, postTableFlush, postUnassign, postUpdateReplicationPeerConfig, preCreateTableAction, preDeleteTableAction, preDisableTableAction, preEnableTableAction, preGetClusterMetrics, preGetTableNames, preListNamespaceDescriptors, preMasterInitialization, preMergeRegionsAction, preMergeRegionsCommitAction, preModifyNamespace, preModifyTable, preModifyTableAction, preModifyTableAction, preSplitRegionAction, preSplitRegionAfterMETAAction, preSplitRegionBeforeMETAAction, preTruncateTableAction</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionObserver">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/security/access/class-use/SecureTestUtil.AccessTestAction.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/class-use/SecureTestUtil.AccessTestAction.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/class-use/SecureTestUtil.AccessTestAction.html
index bcdec1e..7230844f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/class-use/SecureTestUtil.AccessTestAction.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/class-use/SecureTestUtil.AccessTestAction.html
@@ -87,6 +87,10 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.rsgroup">org.apache.hadoop.hbase.rsgroup</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.security.access">org.apache.hadoop.hbase.security.access</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
@@ -117,6 +121,24 @@
 </tbody>
 </table>
 </li>
+<li class="blockList"><a name="org.apache.hadoop.hbase.rsgroup">
+<!--   -->
+</a>
+<h3>Uses of <a href="../../../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.AccessTestAction.html" title="interface in org.apache.hadoop.hbase.security.access">SecureTestUtil.AccessTestAction</a> in <a href="../../../../../../../org/apache/hadoop/hbase/rsgroup/package-summary.html">org.apache.hadoop.hbase.rsgroup</a></h3>
+<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/rsgroup/package-summary.html">org.apache.hadoop.hbase.rsgroup</a> with parameters of type <a href="../../../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.AccessTestAction.html" title="interface in org.apache.hadoop.hbase.security.access">SecureTestUtil.AccessTestAction</a></span><span class="tabEnd">&nbsp;</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>private void</code></td>
+<td class="colLast"><span class="typeNameLabel">TestRSGroupsWithACL.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#validateAdminPermissions-org.apache.hadoop.hbase.security.access.SecureTestUtil.AccessTestAction-">validateAdminPermissions</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.AccessTestAction.html" title="interface in org.apache.hadoop.hbase.security.access">SecureTestUtil.AccessTestAction</a>&nbsp;action)</code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+</li>
 <li class="blockList"><a name="org.apache.hadoop.hbase.security.access">
 <!--   -->
 </a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/security/access/package-use.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/package-use.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/package-use.html
index de31221..9f0012e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/package-use.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/package-use.html
@@ -134,6 +134,12 @@
 <div class="block">Utility methods for testing security</div>
 </td>
 </tr>
+<tr class="rowColor">
+<td class="colOne"><a href="../../../../../../org/apache/hadoop/hbase/security/access/class-use/SecureTestUtil.AccessTestAction.html#org.apache.hadoop.hbase.rsgroup">SecureTestUtil.AccessTestAction</a>
+<div class="block">An AccessTestAction performs an action that will be examined to confirm
+ the results conform to expected access rights.</div>
+</td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index 1a628fe..ecfaabf 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,8 +253,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>&lt;E&gt; (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>&lt;T&gt;, 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.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 434a274..84112c6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -139,9 +139,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>&lt;E&gt; (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>&lt;T&gt;, 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/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 </ul>
 </li>
 </ul>


[06/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
index 827d1f3..1b32e2b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
@@ -252,6332 +252,6333 @@
 <span class="sourceLineNo">244</span>    dir = TEST_UTIL.getDataTestDir("TestHRegion").toString();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    method = name.getMethodName();<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    tableName = TableName.valueOf(method);<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>  @After<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public void tearDown() throws Exception {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    TEST_UTIL.cleanupTestDir();<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @throws IOException<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Test<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void testSequenceId() throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // Open region again.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    byte [] value = Bytes.toBytes(method);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Make a random put against our cf.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Put put = new Put(value);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    region.put(put);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // No flush yet so init numbers should still be in place.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    region.flush(true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    long max = region.getMaxFlushedSeqId();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    region.close();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<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>   * Test for Bug 2 of HBASE-10466.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flushes for region close."<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * @throws IOException<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Test<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // Get some random bytes.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    byte [] value = Bytes.toBytes(method);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    // Make a random put against our cf.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    Put put = new Put(value);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    region.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    storeFlushCtx.prepare();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // Second put something in current memstore<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    region.put(put);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    region.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  /*<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * See HBASE-10845<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Test<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      StoreFlushContext storeFlushCtx;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.325"></a>
-<span class="sourceLineNo">326</span>          throws IOException {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        super(fs, rootDir, logName, conf);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>      @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      public void sync(long txid) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        storeFlushCtx.prepare();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        super.sync(txid);<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><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        COLUMN_FAMILY_BYTES);<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // Get some random bytes.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    byte [] value = Bytes.toBytes(method);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    Put put = new Put(value);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    boolean threwIOE = false;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      region.put(put);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    } catch (IOException ioe) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      threwIOE = true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    } finally {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        mss.getDataSize() == 0);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<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>   * Create a WAL outside of the usual helper in<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@code fs.file.impl}.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final Configuration walConf = new Configuration(conf);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return new WALFactory(walConf, callingMethod)<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Test<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootDir = new Path(dir + testName);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        COLUMN_FAMILY_BYTES);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // Put one value<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    byte [] value = Bytes.toBytes(method);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    Put put = new Put(value);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    region.put(put);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(onePutSize &gt; 0);<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    doThrow(new IOException())<a name="line.406"></a>
-<span class="sourceLineNo">407</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    put = new Put(value);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    try {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      region.put(put);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      fail("Should have failed with IOException");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (IOException expected) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    long expectedSize = onePutSize * 2;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    assertEquals("memstoreSize should be incremented",<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        expectedSize, region.getMemStoreDataSize());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    assertEquals("flushable size should be incremented",<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    region.setCoprocessorHost(null);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * if memstoreSize is not larger than 0."<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws Exception<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Test<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // Only retry once.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final User user =<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // Inject our faulty LocalFileSystem<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      public Object run() throws Exception {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        FileSystem fs = FileSystem.get(conf);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HRegion region = null;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        try {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          // Initialize region<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>              COLUMN_FAMILY_BYTES);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          long size = region.getMemStoreDataSize();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          Assert.assertEquals(0, size);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          Put p1 = new Put(row);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          region.put(p1);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          try {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            LOG.info("Flushing");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            region.flush(true);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          } catch (DroppedSnapshotException dse) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>            // What we are expecting<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // Make it so all writes succeed from here on out<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          ffs.fault.set(false);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // Check sizes.  Should still be the one entry.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          // subtract the right amount, the snapshot size only.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          Put p2 = new Put(row);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.488"></a>
-<span class="sourceLineNo">489</span>          region.put(p2);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          // it<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          region.flush(true);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          // Make sure our memory accounting is right.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } finally {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        return null;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    });<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Test<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    // Only retry once.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    final User user =<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Inject our faulty LocalFileSystem<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      @Override<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      public Object run() throws Exception {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        FileSystem fs = FileSystem.get(conf);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        HRegion region = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        try {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // Initialize region<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region = initHRegion(tableName, null, null, false,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          long size = region.getMemStoreDataSize();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          Assert.assertEquals(0, size);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          Put p1 = new Put(row);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          region.put(p1);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          StoreFlushContext storeFlushCtx =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          storeFlushCtx.prepare();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          // Now add two entries to the foreground memstore.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          Put p2 = new Put(row);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          region.put(p2);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          // Now try close on top of a failing flush.<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          region.close();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          fail();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } catch (DroppedSnapshotException dse) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          // Expected<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        } finally {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          ffs.fault.set(false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    });<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  @Test<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    byte[] family = Bytes.toBytes("family");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    region.put(put);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    region.flush(true);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    Scan scan = new Scan();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    scan.setMaxVersions(3);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    // open the first scanner<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    region.delete(delete);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    region.flush(true);<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    // open the second scanner<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    // make a major compaction<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    region.compact(true);<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>    // open the third scanner<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    scanner1.next(results);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    System.out.println(results);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assertEquals(1, results.size());<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    results.clear();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    scanner2.next(results);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    System.out.println(results);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    assertEquals(0, results.size());<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    results.clear();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scanner3.next(results);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    System.out.println(results);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    assertEquals(0, results.size());<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  @Test<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    byte[] family = Bytes.toBytes("family");<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    region.put(put);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    region.put(put);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.flush(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    Scan scan = new Scan();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    scan.setMaxVersions(3);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the first scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    region.compact(true);<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    scanner1.next(results);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Cell keyValue = results.get(0);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner1.close();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  @Test<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    byte[] family = Bytes.toBytes("family");<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    try {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>      long maxSeqId = 1050;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      long minSeqId = 1000;<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        fs.create(recoveredEdits);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>        long time = System.nanoTime();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        WALEdit edit = new WALEdit();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.662"></a>
-<span class="sourceLineNo">663</span>            .toBytes(i)));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>        writer.close();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      for (HStore store : region.getStores()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assertEquals(maxSeqId, seqId);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      region.getMVCC().advanceTo(seqId);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      Get get = new Get(row);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Result result = region.get(get);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        assertEquals(1, kvs.size());<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    } finally {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.region = null;<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      wals.close();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @Test<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    byte[] family = Bytes.toBytes("family");<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    try {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>      long maxSeqId = 1050;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      long minSeqId = 1000;<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        fs.create(recoveredEdits);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long time = System.nanoTime();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        WALEdit edit = new WALEdit();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.713"></a>
-<span class="sourceLineNo">714</span>            .toBytes(i)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>        writer.close();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      long recoverSeqId = 1030;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (HStore store : region.getStores()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertEquals(maxSeqId, seqId);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      region.getMVCC().advanceTo(seqId);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Get get = new Get(row);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      Result result = region.get(get);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        if (i &lt; recoverSeqId) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>          assertEquals(0, kvs.size());<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        } else {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          assertEquals(1, kvs.size());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    } finally {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      this.region = null;<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      wals.close();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  @Test<a name="line.747"></a>
-<span class="sourceLineNo">748</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    byte[] family = Bytes.toBytes("family");<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    try {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        dos.writeInt(i);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        dos.close();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      long minSeqId = 2000;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      dos.close();<a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, null);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      assertEquals(minSeqId, seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    } finally {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      this.region = null;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    byte[] family = Bytes.toBytes("family");<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    try {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>      long maxSeqId = 1050;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      long minSeqId = 1000;<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        fs.create(recoveredEdits);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>        long time = System.nanoTime();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        WALEdit edit = null;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        if (i == maxSeqId) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          CompactionDescriptor.newBuilder()<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          .build());<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        } else {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          edit = new WALEdit();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.815"></a>
-<span class="sourceLineNo">816</span>            .toBytes(i)));<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        }<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        writer.close();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>      long recoverSeqId = 1030;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      for (HStore store : region.getStores()) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      assertEquals(maxSeqId, seqId);<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>      // assert that the files are flushed<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.833"></a>
-<span class="sourceLineNo">834</span><a name="line.834"></a>
-<span class="sourceLineNo">835</span>    } finally {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      this.region = null;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      wals.close();<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    }<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Test<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    testRecoveredEditsReplayCompaction(false);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    testRecoveredEditsReplayCompaction(true);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    byte[] family = Bytes.toBytes("family");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    try {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>      long maxSeqId = 3;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      long minSeqId = 0;<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.862"></a>
-<span class="sourceLineNo">863</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        region.put(put);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        region.flush(true);<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>      // this will create a region with 3 files<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        storeFiles.add(sf.getPath());<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // disable compaction completion<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      region.compactStores();<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // ensure that nothing changed<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          + "from the compaction, could not find any";<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      assertNotNull(errorMsg, files);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      assertEquals(errorMsg, 1, files.length);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      // move the file inside region dir<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          files[0].getPath());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        // Mix the byte array to have a new encodedName<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.902"></a>
-<span class="sourceLineNo">903</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      fs.create(recoveredEdits);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      long time = System.nanoTime();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.916"></a>
-<span class="sourceLineNo">917</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          compactionDescriptor)));<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      writer.close();<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // close the region now, and reopen again<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      region.getTableDescriptor();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      region.getRegionInfo();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      region.close();<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      try {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        region = HRegion.openHRegion(region, null);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      } catch (WrongRegionException wre) {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // now check whether we have only one store file, the compacted one<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      for (HStoreFile sf : sfs) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      if (!mismatchedRegionName) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        Result result = region.get(get);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      }<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      this.region = null;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      wals.close();<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  @Test<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  public void testFlushMarkers() throws Exception {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    byte[] family = Bytes.toBytes("family");<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    try {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>      long maxSeqId = 3;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      long minSeqId = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        region.put(put);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        region.flush(true);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>      // this will create a region with 3 files from flush<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        storeFiles.add(sf.getPath().getName());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      }<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // now verify that the flush markers are written<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      wal.shutdown();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        TEST_UTIL.getConfiguration());<a name="line.993"></a>
-<span class="sourceLineNo">994</span>      try {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        long lastFlushSeqId = -1;<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        while (true) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          WAL.Entry entry = reader.next();<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          if (entry == null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            break;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>          }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            assertNotNull(flushDesc);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>            }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            } else {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>            flushDescriptors.add(entry);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        // now write those markers to the recovered edits again.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span><a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span><a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        fs.create(recoveredEdits);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          writer.append(entry);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        writer.close();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      } finally {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (null != reader) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          try {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            reader.close();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          } catch (IOException exception) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>            LOG.debug("exception details", exception);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
+<span class="sourceLineNo">247</span>    CONF.set(CompactingMemStore.IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY, String.valueOf(0.02));<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>  @After<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public void tearDown() throws Exception {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    TEST_UTIL.cleanupTestDir();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @throws IOException<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Test<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public void testSequenceId() throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    region.close();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // Open region again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    byte [] value = Bytes.toBytes(method);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // Make a random put against our cf.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    Put put = new Put(value);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    region.put(put);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // No flush yet so init numbers should still be in place.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    region.flush(true);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    long max = region.getMaxFlushedSeqId();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    region.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(max, region.getMaxFlushedSeqId());<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>  /**<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * Test for Bug 2 of HBASE-10466.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * case previous flush fails and leaves some dat

<TRUNCATED>

[14/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
index 94cfb29..9b93f95 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1073">TestHRegion.IsFlushWALMarker</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1074">TestHRegion.IsFlushWALMarker</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.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt;</pre>
 </li>
@@ -210,7 +210,7 @@ implements org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt
 <ul class="blockListLast">
 <li class="blockList">
 <h4>actions</h4>
-<pre>volatile&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1074">actions</a></pre>
+<pre>volatile&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1075">actions</a></pre>
 </li>
 </ul>
 </li>
@@ -227,7 +227,7 @@ implements org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt
 <ul class="blockListLast">
 <li class="blockList">
 <h4>IsFlushWALMarker</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1075">IsFlushWALMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1076">IsFlushWALMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
 </li>
 </ul>
 </li>
@@ -244,7 +244,7 @@ implements org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt
 <ul class="blockList">
 <li class="blockList">
 <h4>matches</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1079">matches</a>(org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1080">matches</a>(org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>matches</code>&nbsp;in interface&nbsp;<code>org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt;</code></dd>
@@ -257,7 +257,7 @@ implements org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt
 <ul class="blockListLast">
 <li class="blockList">
 <h4>set</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegion.IsFlushWALMarker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1102">set</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegion.IsFlushWALMarker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1103">set</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
index 17678f0..a80be93 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3838">TestHRegion.PutThread</a>
+<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3839">TestHRegion.PutThread</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>
 </li>
 </ul>
@@ -277,7 +277,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3839">done</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3840">done</a></pre>
 </li>
 </ul>
 <a name="numPutsFinished">
@@ -286,7 +286,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>numPutsFinished</h4>
-<pre>private volatile&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3840">numPutsFinished</a></pre>
+<pre>private volatile&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3841">numPutsFinished</a></pre>
 </li>
 </ul>
 <a name="error">
@@ -295,7 +295,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>error</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3842">error</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3843">error</a></pre>
 </li>
 </ul>
 <a name="numRows">
@@ -304,7 +304,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>numRows</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3843">numRows</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3844">numRows</a></pre>
 </li>
 </ul>
 <a name="families">
@@ -313,7 +313,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>families</h4>
-<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3844">families</a></pre>
+<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3845">families</a></pre>
 </li>
 </ul>
 <a name="qualifiers">
@@ -322,7 +322,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>qualifiers</h4>
-<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3845">qualifiers</a></pre>
+<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3846">qualifiers</a></pre>
 </li>
 </ul>
 </li>
@@ -339,7 +339,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PutThread</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3847">PutThread</a>(int&nbsp;numRows,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3848">PutThread</a>(int&nbsp;numRows,
                   byte[][]&nbsp;families,
                   byte[][]&nbsp;qualifiers)</pre>
 </li>
@@ -358,7 +358,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForFirstPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3857">waitForFirstPut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3858">waitForFirstPut</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Block calling thread until this instance of PutThread has put at least one row.</div>
 <dl>
@@ -373,7 +373,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3865">done</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3866">done</a>()</pre>
 </li>
 </ul>
 <a name="checkNoError--">
@@ -382,7 +382,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkNoError</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3872">checkNoError</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3873">checkNoError</a>()</pre>
 </li>
 </ul>
 <a name="run--">
@@ -391,7 +391,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3879">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3880">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>&nbsp;in interface&nbsp;<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>


[05/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
index 827d1f3..1b32e2b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
@@ -252,6332 +252,6333 @@
 <span class="sourceLineNo">244</span>    dir = TEST_UTIL.getDataTestDir("TestHRegion").toString();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    method = name.getMethodName();<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    tableName = TableName.valueOf(method);<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>  @After<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public void tearDown() throws Exception {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    TEST_UTIL.cleanupTestDir();<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @throws IOException<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Test<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void testSequenceId() throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // Open region again.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    byte [] value = Bytes.toBytes(method);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Make a random put against our cf.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Put put = new Put(value);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    region.put(put);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // No flush yet so init numbers should still be in place.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    region.flush(true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    long max = region.getMaxFlushedSeqId();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    region.close();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<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>   * Test for Bug 2 of HBASE-10466.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flushes for region close."<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * @throws IOException<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Test<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // Get some random bytes.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    byte [] value = Bytes.toBytes(method);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    // Make a random put against our cf.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    Put put = new Put(value);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    region.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    storeFlushCtx.prepare();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // Second put something in current memstore<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    region.put(put);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    region.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  /*<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * See HBASE-10845<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Test<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      StoreFlushContext storeFlushCtx;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.325"></a>
-<span class="sourceLineNo">326</span>          throws IOException {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        super(fs, rootDir, logName, conf);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>      @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      public void sync(long txid) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        storeFlushCtx.prepare();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        super.sync(txid);<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><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        COLUMN_FAMILY_BYTES);<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // Get some random bytes.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    byte [] value = Bytes.toBytes(method);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    Put put = new Put(value);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    boolean threwIOE = false;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      region.put(put);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    } catch (IOException ioe) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      threwIOE = true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    } finally {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        mss.getDataSize() == 0);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<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>   * Create a WAL outside of the usual helper in<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@code fs.file.impl}.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final Configuration walConf = new Configuration(conf);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return new WALFactory(walConf, callingMethod)<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Test<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootDir = new Path(dir + testName);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        COLUMN_FAMILY_BYTES);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // Put one value<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    byte [] value = Bytes.toBytes(method);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    Put put = new Put(value);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    region.put(put);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(onePutSize &gt; 0);<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    doThrow(new IOException())<a name="line.406"></a>
-<span class="sourceLineNo">407</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    put = new Put(value);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    try {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      region.put(put);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      fail("Should have failed with IOException");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (IOException expected) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    long expectedSize = onePutSize * 2;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    assertEquals("memstoreSize should be incremented",<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        expectedSize, region.getMemStoreDataSize());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    assertEquals("flushable size should be incremented",<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    region.setCoprocessorHost(null);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * if memstoreSize is not larger than 0."<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws Exception<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Test<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // Only retry once.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final User user =<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // Inject our faulty LocalFileSystem<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      public Object run() throws Exception {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        FileSystem fs = FileSystem.get(conf);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HRegion region = null;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        try {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          // Initialize region<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>              COLUMN_FAMILY_BYTES);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          long size = region.getMemStoreDataSize();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          Assert.assertEquals(0, size);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          Put p1 = new Put(row);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          region.put(p1);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          try {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            LOG.info("Flushing");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            region.flush(true);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          } catch (DroppedSnapshotException dse) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>            // What we are expecting<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // Make it so all writes succeed from here on out<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          ffs.fault.set(false);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // Check sizes.  Should still be the one entry.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          // subtract the right amount, the snapshot size only.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          Put p2 = new Put(row);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.488"></a>
-<span class="sourceLineNo">489</span>          region.put(p2);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          // it<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          region.flush(true);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          // Make sure our memory accounting is right.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } finally {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        return null;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    });<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Test<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    // Only retry once.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    final User user =<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Inject our faulty LocalFileSystem<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      @Override<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      public Object run() throws Exception {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        FileSystem fs = FileSystem.get(conf);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        HRegion region = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        try {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // Initialize region<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region = initHRegion(tableName, null, null, false,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          long size = region.getMemStoreDataSize();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          Assert.assertEquals(0, size);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          Put p1 = new Put(row);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          region.put(p1);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          StoreFlushContext storeFlushCtx =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          storeFlushCtx.prepare();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          // Now add two entries to the foreground memstore.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          Put p2 = new Put(row);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          region.put(p2);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          // Now try close on top of a failing flush.<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          region.close();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          fail();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } catch (DroppedSnapshotException dse) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          // Expected<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        } finally {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          ffs.fault.set(false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    });<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  @Test<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    byte[] family = Bytes.toBytes("family");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    region.put(put);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    region.flush(true);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    Scan scan = new Scan();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    scan.setMaxVersions(3);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    // open the first scanner<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    region.delete(delete);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    region.flush(true);<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    // open the second scanner<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    // make a major compaction<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    region.compact(true);<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>    // open the third scanner<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    scanner1.next(results);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    System.out.println(results);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assertEquals(1, results.size());<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    results.clear();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    scanner2.next(results);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    System.out.println(results);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    assertEquals(0, results.size());<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    results.clear();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scanner3.next(results);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    System.out.println(results);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    assertEquals(0, results.size());<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  @Test<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    byte[] family = Bytes.toBytes("family");<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    region.put(put);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    region.put(put);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.flush(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    Scan scan = new Scan();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    scan.setMaxVersions(3);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the first scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    region.compact(true);<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    scanner1.next(results);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Cell keyValue = results.get(0);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner1.close();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  @Test<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    byte[] family = Bytes.toBytes("family");<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    try {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>      long maxSeqId = 1050;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      long minSeqId = 1000;<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        fs.create(recoveredEdits);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>        long time = System.nanoTime();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        WALEdit edit = new WALEdit();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.662"></a>
-<span class="sourceLineNo">663</span>            .toBytes(i)));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>        writer.close();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      for (HStore store : region.getStores()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assertEquals(maxSeqId, seqId);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      region.getMVCC().advanceTo(seqId);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      Get get = new Get(row);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Result result = region.get(get);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        assertEquals(1, kvs.size());<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    } finally {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.region = null;<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      wals.close();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @Test<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    byte[] family = Bytes.toBytes("family");<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    try {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>      long maxSeqId = 1050;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      long minSeqId = 1000;<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        fs.create(recoveredEdits);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long time = System.nanoTime();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        WALEdit edit = new WALEdit();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.713"></a>
-<span class="sourceLineNo">714</span>            .toBytes(i)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>        writer.close();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      long recoverSeqId = 1030;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (HStore store : region.getStores()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertEquals(maxSeqId, seqId);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      region.getMVCC().advanceTo(seqId);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Get get = new Get(row);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      Result result = region.get(get);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        if (i &lt; recoverSeqId) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>          assertEquals(0, kvs.size());<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        } else {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          assertEquals(1, kvs.size());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    } finally {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      this.region = null;<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      wals.close();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  @Test<a name="line.747"></a>
-<span class="sourceLineNo">748</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    byte[] family = Bytes.toBytes("family");<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    try {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        dos.writeInt(i);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        dos.close();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      long minSeqId = 2000;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      dos.close();<a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, null);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      assertEquals(minSeqId, seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    } finally {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      this.region = null;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    byte[] family = Bytes.toBytes("family");<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    try {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>      long maxSeqId = 1050;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      long minSeqId = 1000;<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        fs.create(recoveredEdits);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>        long time = System.nanoTime();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        WALEdit edit = null;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        if (i == maxSeqId) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          CompactionDescriptor.newBuilder()<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          .build());<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        } else {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          edit = new WALEdit();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.815"></a>
-<span class="sourceLineNo">816</span>            .toBytes(i)));<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        }<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        writer.close();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>      long recoverSeqId = 1030;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      for (HStore store : region.getStores()) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      assertEquals(maxSeqId, seqId);<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>      // assert that the files are flushed<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.833"></a>
-<span class="sourceLineNo">834</span><a name="line.834"></a>
-<span class="sourceLineNo">835</span>    } finally {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      this.region = null;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      wals.close();<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    }<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Test<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    testRecoveredEditsReplayCompaction(false);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    testRecoveredEditsReplayCompaction(true);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    byte[] family = Bytes.toBytes("family");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    try {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>      long maxSeqId = 3;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      long minSeqId = 0;<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.862"></a>
-<span class="sourceLineNo">863</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        region.put(put);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        region.flush(true);<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>      // this will create a region with 3 files<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        storeFiles.add(sf.getPath());<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // disable compaction completion<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      region.compactStores();<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // ensure that nothing changed<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          + "from the compaction, could not find any";<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      assertNotNull(errorMsg, files);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      assertEquals(errorMsg, 1, files.length);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      // move the file inside region dir<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          files[0].getPath());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        // Mix the byte array to have a new encodedName<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.902"></a>
-<span class="sourceLineNo">903</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      fs.create(recoveredEdits);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      long time = System.nanoTime();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.916"></a>
-<span class="sourceLineNo">917</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          compactionDescriptor)));<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      writer.close();<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // close the region now, and reopen again<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      region.getTableDescriptor();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      region.getRegionInfo();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      region.close();<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      try {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        region = HRegion.openHRegion(region, null);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      } catch (WrongRegionException wre) {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // now check whether we have only one store file, the compacted one<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      for (HStoreFile sf : sfs) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      if (!mismatchedRegionName) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        Result result = region.get(get);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      }<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      this.region = null;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      wals.close();<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  @Test<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  public void testFlushMarkers() throws Exception {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    byte[] family = Bytes.toBytes("family");<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    try {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>      long maxSeqId = 3;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      long minSeqId = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        region.put(put);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        region.flush(true);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>      // this will create a region with 3 files from flush<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        storeFiles.add(sf.getPath().getName());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      }<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // now verify that the flush markers are written<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      wal.shutdown();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        TEST_UTIL.getConfiguration());<a name="line.993"></a>
-<span class="sourceLineNo">994</span>      try {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        long lastFlushSeqId = -1;<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        while (true) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          WAL.Entry entry = reader.next();<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          if (entry == null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            break;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>          }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            assertNotNull(flushDesc);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>            }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            } else {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>            flushDescriptors.add(entry);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        // now write those markers to the recovered edits again.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span><a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span><a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        fs.create(recoveredEdits);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          writer.append(entry);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        writer.close();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      } finally {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (null != reader) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          try {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            reader.close();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          } catch (IOException exception) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>            LOG.debug("exception details", exception);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
+<span class="sourceLineNo">247</span>    CONF.set(CompactingMemStore.IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY, String.valueOf(0.02));<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>  @After<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public void tearDown() throws Exception {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    TEST_UTIL.cleanupTestDir();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @throws IOException<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Test<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public void testSequenceId() throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    region.close();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // Open region again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    byte [] value = Bytes.toBytes(method);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // Make a random put against our cf.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    Put put = new Put(value);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    region.put(put);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // No flush yet so init numbers should still be in place.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    region.flush(true);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    long max = region.getMaxFlushedSeqId();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    region.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(max, region.getMaxFlushedSeqId());<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>  /**<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * Test for Bug 2 of HBASE-10466.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * case previous flush fails and leaves some data in snapshot. The bug co

<TRUNCATED>

[04/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
index 827d1f3..1b32e2b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
@@ -252,6332 +252,6333 @@
 <span class="sourceLineNo">244</span>    dir = TEST_UTIL.getDataTestDir("TestHRegion").toString();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    method = name.getMethodName();<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    tableName = TableName.valueOf(method);<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>  @After<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public void tearDown() throws Exception {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    TEST_UTIL.cleanupTestDir();<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @throws IOException<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Test<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void testSequenceId() throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // Open region again.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    byte [] value = Bytes.toBytes(method);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Make a random put against our cf.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Put put = new Put(value);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    region.put(put);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // No flush yet so init numbers should still be in place.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    region.flush(true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    long max = region.getMaxFlushedSeqId();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    region.close();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<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>   * Test for Bug 2 of HBASE-10466.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flushes for region close."<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * @throws IOException<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Test<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // Get some random bytes.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    byte [] value = Bytes.toBytes(method);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    // Make a random put against our cf.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    Put put = new Put(value);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    region.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    storeFlushCtx.prepare();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // Second put something in current memstore<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    region.put(put);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    region.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  /*<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * See HBASE-10845<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Test<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      StoreFlushContext storeFlushCtx;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.325"></a>
-<span class="sourceLineNo">326</span>          throws IOException {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        super(fs, rootDir, logName, conf);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>      @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      public void sync(long txid) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        storeFlushCtx.prepare();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        super.sync(txid);<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><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        COLUMN_FAMILY_BYTES);<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // Get some random bytes.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    byte [] value = Bytes.toBytes(method);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    Put put = new Put(value);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    boolean threwIOE = false;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      region.put(put);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    } catch (IOException ioe) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      threwIOE = true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    } finally {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        mss.getDataSize() == 0);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<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>   * Create a WAL outside of the usual helper in<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@code fs.file.impl}.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final Configuration walConf = new Configuration(conf);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return new WALFactory(walConf, callingMethod)<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Test<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootDir = new Path(dir + testName);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        COLUMN_FAMILY_BYTES);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // Put one value<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    byte [] value = Bytes.toBytes(method);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    Put put = new Put(value);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    region.put(put);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(onePutSize &gt; 0);<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    doThrow(new IOException())<a name="line.406"></a>
-<span class="sourceLineNo">407</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    put = new Put(value);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    try {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      region.put(put);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      fail("Should have failed with IOException");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (IOException expected) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    long expectedSize = onePutSize * 2;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    assertEquals("memstoreSize should be incremented",<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        expectedSize, region.getMemStoreDataSize());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    assertEquals("flushable size should be incremented",<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    region.setCoprocessorHost(null);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * if memstoreSize is not larger than 0."<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws Exception<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Test<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // Only retry once.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final User user =<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // Inject our faulty LocalFileSystem<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      public Object run() throws Exception {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        FileSystem fs = FileSystem.get(conf);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HRegion region = null;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        try {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          // Initialize region<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>              COLUMN_FAMILY_BYTES);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          long size = region.getMemStoreDataSize();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          Assert.assertEquals(0, size);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          Put p1 = new Put(row);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          region.put(p1);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          try {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            LOG.info("Flushing");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            region.flush(true);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          } catch (DroppedSnapshotException dse) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>            // What we are expecting<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // Make it so all writes succeed from here on out<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          ffs.fault.set(false);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // Check sizes.  Should still be the one entry.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          // subtract the right amount, the snapshot size only.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          Put p2 = new Put(row);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.488"></a>
-<span class="sourceLineNo">489</span>          region.put(p2);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          // it<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          region.flush(true);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          // Make sure our memory accounting is right.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } finally {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        return null;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    });<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Test<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    // Only retry once.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    final User user =<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Inject our faulty LocalFileSystem<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      @Override<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      public Object run() throws Exception {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        FileSystem fs = FileSystem.get(conf);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        HRegion region = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        try {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // Initialize region<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region = initHRegion(tableName, null, null, false,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          long size = region.getMemStoreDataSize();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          Assert.assertEquals(0, size);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          Put p1 = new Put(row);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          region.put(p1);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          StoreFlushContext storeFlushCtx =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          storeFlushCtx.prepare();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          // Now add two entries to the foreground memstore.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          Put p2 = new Put(row);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          region.put(p2);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          // Now try close on top of a failing flush.<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          region.close();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          fail();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } catch (DroppedSnapshotException dse) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          // Expected<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        } finally {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          ffs.fault.set(false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    });<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  @Test<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    byte[] family = Bytes.toBytes("family");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    region.put(put);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    region.flush(true);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    Scan scan = new Scan();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    scan.setMaxVersions(3);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    // open the first scanner<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    region.delete(delete);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    region.flush(true);<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    // open the second scanner<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    // make a major compaction<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    region.compact(true);<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>    // open the third scanner<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    scanner1.next(results);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    System.out.println(results);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assertEquals(1, results.size());<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    results.clear();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    scanner2.next(results);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    System.out.println(results);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    assertEquals(0, results.size());<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    results.clear();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scanner3.next(results);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    System.out.println(results);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    assertEquals(0, results.size());<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  @Test<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    byte[] family = Bytes.toBytes("family");<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    region.put(put);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    region.put(put);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.flush(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    Scan scan = new Scan();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    scan.setMaxVersions(3);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the first scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    region.compact(true);<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    scanner1.next(results);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Cell keyValue = results.get(0);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner1.close();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  @Test<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    byte[] family = Bytes.toBytes("family");<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    try {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>      long maxSeqId = 1050;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      long minSeqId = 1000;<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        fs.create(recoveredEdits);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>        long time = System.nanoTime();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        WALEdit edit = new WALEdit();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.662"></a>
-<span class="sourceLineNo">663</span>            .toBytes(i)));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>        writer.close();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      for (HStore store : region.getStores()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assertEquals(maxSeqId, seqId);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      region.getMVCC().advanceTo(seqId);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      Get get = new Get(row);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Result result = region.get(get);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        assertEquals(1, kvs.size());<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    } finally {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.region = null;<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      wals.close();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @Test<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    byte[] family = Bytes.toBytes("family");<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    try {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>      long maxSeqId = 1050;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      long minSeqId = 1000;<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        fs.create(recoveredEdits);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long time = System.nanoTime();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        WALEdit edit = new WALEdit();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.713"></a>
-<span class="sourceLineNo">714</span>            .toBytes(i)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>        writer.close();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      long recoverSeqId = 1030;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (HStore store : region.getStores()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertEquals(maxSeqId, seqId);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      region.getMVCC().advanceTo(seqId);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Get get = new Get(row);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      Result result = region.get(get);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        if (i &lt; recoverSeqId) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>          assertEquals(0, kvs.size());<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        } else {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          assertEquals(1, kvs.size());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    } finally {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      this.region = null;<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      wals.close();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  @Test<a name="line.747"></a>
-<span class="sourceLineNo">748</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    byte[] family = Bytes.toBytes("family");<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    try {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        dos.writeInt(i);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        dos.close();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      long minSeqId = 2000;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      dos.close();<a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, null);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      assertEquals(minSeqId, seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    } finally {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      this.region = null;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    byte[] family = Bytes.toBytes("family");<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    try {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>      long maxSeqId = 1050;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      long minSeqId = 1000;<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        fs.create(recoveredEdits);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>        long time = System.nanoTime();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        WALEdit edit = null;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        if (i == maxSeqId) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          CompactionDescriptor.newBuilder()<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          .build());<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        } else {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          edit = new WALEdit();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.815"></a>
-<span class="sourceLineNo">816</span>            .toBytes(i)));<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        }<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        writer.close();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>      long recoverSeqId = 1030;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      for (HStore store : region.getStores()) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      assertEquals(maxSeqId, seqId);<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>      // assert that the files are flushed<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.833"></a>
-<span class="sourceLineNo">834</span><a name="line.834"></a>
-<span class="sourceLineNo">835</span>    } finally {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      this.region = null;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      wals.close();<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    }<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Test<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    testRecoveredEditsReplayCompaction(false);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    testRecoveredEditsReplayCompaction(true);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    byte[] family = Bytes.toBytes("family");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    try {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>      long maxSeqId = 3;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      long minSeqId = 0;<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.862"></a>
-<span class="sourceLineNo">863</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        region.put(put);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        region.flush(true);<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>      // this will create a region with 3 files<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        storeFiles.add(sf.getPath());<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // disable compaction completion<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      region.compactStores();<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // ensure that nothing changed<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          + "from the compaction, could not find any";<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      assertNotNull(errorMsg, files);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      assertEquals(errorMsg, 1, files.length);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      // move the file inside region dir<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          files[0].getPath());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        // Mix the byte array to have a new encodedName<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.902"></a>
-<span class="sourceLineNo">903</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      fs.create(recoveredEdits);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      long time = System.nanoTime();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.916"></a>
-<span class="sourceLineNo">917</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          compactionDescriptor)));<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      writer.close();<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // close the region now, and reopen again<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      region.getTableDescriptor();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      region.getRegionInfo();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      region.close();<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      try {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        region = HRegion.openHRegion(region, null);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      } catch (WrongRegionException wre) {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // now check whether we have only one store file, the compacted one<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      for (HStoreFile sf : sfs) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      if (!mismatchedRegionName) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        Result result = region.get(get);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      }<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      this.region = null;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      wals.close();<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  @Test<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  public void testFlushMarkers() throws Exception {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    byte[] family = Bytes.toBytes("family");<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    try {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>      long maxSeqId = 3;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      long minSeqId = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        region.put(put);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        region.flush(true);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>      // this will create a region with 3 files from flush<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        storeFiles.add(sf.getPath().getName());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      }<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // now verify that the flush markers are written<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      wal.shutdown();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        TEST_UTIL.getConfiguration());<a name="line.993"></a>
-<span class="sourceLineNo">994</span>      try {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        long lastFlushSeqId = -1;<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        while (true) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          WAL.Entry entry = reader.next();<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          if (entry == null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            break;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>          }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            assertNotNull(flushDesc);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>            }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            } else {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>            flushDescriptors.add(entry);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        // now write those markers to the recovered edits again.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span><a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span><a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        fs.create(recoveredEdits);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          writer.append(entry);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        writer.close();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      } finally {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (null != reader) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          try {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            reader.close();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          } catch (IOException exception) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>            LOG.debug("exception details", exception);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
+<span class="sourceLineNo">247</span>    CONF.set(CompactingMemStore.IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY, String.valueOf(0.02));<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>  @After<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public void tearDown() throws Exception {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    TEST_UTIL.cleanupTestDir();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @throws IOException<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Test<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public void testSequenceId() throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    region.close();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // Open region again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    byte [] value = Bytes.toBytes(method);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // Make a random put against our cf.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    Put put = new Put(value);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    region.put(put);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // No flush yet so init numbers should still be in place.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    region.flush(true);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    long max = region.getMaxFlushedSeqId();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    region.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(max, region.getMaxFlushedSeqId());<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>  /**<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * Test for Bug 2 of HBASE-10466.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * case previous flush fails and leaves some dat

<TRUNCATED>

[07/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
index 827d1f3..1b32e2b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
@@ -252,6332 +252,6333 @@
 <span class="sourceLineNo">244</span>    dir = TEST_UTIL.getDataTestDir("TestHRegion").toString();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    method = name.getMethodName();<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    tableName = TableName.valueOf(method);<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>  @After<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public void tearDown() throws Exception {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    TEST_UTIL.cleanupTestDir();<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @throws IOException<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Test<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void testSequenceId() throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // Open region again.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    byte [] value = Bytes.toBytes(method);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Make a random put against our cf.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Put put = new Put(value);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    region.put(put);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // No flush yet so init numbers should still be in place.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    region.flush(true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    long max = region.getMaxFlushedSeqId();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    region.close();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<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>   * Test for Bug 2 of HBASE-10466.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flushes for region close."<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * @throws IOException<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Test<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // Get some random bytes.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    byte [] value = Bytes.toBytes(method);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    // Make a random put against our cf.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    Put put = new Put(value);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    region.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    storeFlushCtx.prepare();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // Second put something in current memstore<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    region.put(put);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    region.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  /*<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * See HBASE-10845<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Test<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      StoreFlushContext storeFlushCtx;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.325"></a>
-<span class="sourceLineNo">326</span>          throws IOException {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        super(fs, rootDir, logName, conf);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>      @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      public void sync(long txid) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        storeFlushCtx.prepare();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        super.sync(txid);<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><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        COLUMN_FAMILY_BYTES);<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // Get some random bytes.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    byte [] value = Bytes.toBytes(method);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    Put put = new Put(value);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    boolean threwIOE = false;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      region.put(put);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    } catch (IOException ioe) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      threwIOE = true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    } finally {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        mss.getDataSize() == 0);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<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>   * Create a WAL outside of the usual helper in<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@code fs.file.impl}.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final Configuration walConf = new Configuration(conf);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return new WALFactory(walConf, callingMethod)<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Test<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootDir = new Path(dir + testName);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        COLUMN_FAMILY_BYTES);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // Put one value<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    byte [] value = Bytes.toBytes(method);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    Put put = new Put(value);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    region.put(put);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(onePutSize &gt; 0);<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    doThrow(new IOException())<a name="line.406"></a>
-<span class="sourceLineNo">407</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    put = new Put(value);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    try {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      region.put(put);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      fail("Should have failed with IOException");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (IOException expected) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    long expectedSize = onePutSize * 2;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    assertEquals("memstoreSize should be incremented",<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        expectedSize, region.getMemStoreDataSize());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    assertEquals("flushable size should be incremented",<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    region.setCoprocessorHost(null);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * if memstoreSize is not larger than 0."<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws Exception<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Test<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // Only retry once.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final User user =<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // Inject our faulty LocalFileSystem<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      public Object run() throws Exception {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        FileSystem fs = FileSystem.get(conf);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HRegion region = null;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        try {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          // Initialize region<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>              COLUMN_FAMILY_BYTES);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          long size = region.getMemStoreDataSize();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          Assert.assertEquals(0, size);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          Put p1 = new Put(row);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          region.put(p1);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          try {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            LOG.info("Flushing");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            region.flush(true);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          } catch (DroppedSnapshotException dse) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>            // What we are expecting<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // Make it so all writes succeed from here on out<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          ffs.fault.set(false);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // Check sizes.  Should still be the one entry.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          // subtract the right amount, the snapshot size only.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          Put p2 = new Put(row);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.488"></a>
-<span class="sourceLineNo">489</span>          region.put(p2);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          // it<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          region.flush(true);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          // Make sure our memory accounting is right.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } finally {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        return null;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    });<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Test<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    // Only retry once.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    final User user =<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Inject our faulty LocalFileSystem<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      @Override<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      public Object run() throws Exception {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        FileSystem fs = FileSystem.get(conf);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        HRegion region = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        try {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // Initialize region<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region = initHRegion(tableName, null, null, false,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          long size = region.getMemStoreDataSize();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          Assert.assertEquals(0, size);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          Put p1 = new Put(row);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          region.put(p1);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          StoreFlushContext storeFlushCtx =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          storeFlushCtx.prepare();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          // Now add two entries to the foreground memstore.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          Put p2 = new Put(row);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          region.put(p2);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          // Now try close on top of a failing flush.<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          region.close();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          fail();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } catch (DroppedSnapshotException dse) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          // Expected<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        } finally {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          ffs.fault.set(false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    });<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  @Test<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    byte[] family = Bytes.toBytes("family");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    region.put(put);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    region.flush(true);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    Scan scan = new Scan();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    scan.setMaxVersions(3);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    // open the first scanner<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    region.delete(delete);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    region.flush(true);<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    // open the second scanner<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    // make a major compaction<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    region.compact(true);<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>    // open the third scanner<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    scanner1.next(results);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    System.out.println(results);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assertEquals(1, results.size());<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    results.clear();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    scanner2.next(results);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    System.out.println(results);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    assertEquals(0, results.size());<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    results.clear();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scanner3.next(results);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    System.out.println(results);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    assertEquals(0, results.size());<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  @Test<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    byte[] family = Bytes.toBytes("family");<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    region.put(put);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    region.put(put);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.flush(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    Scan scan = new Scan();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    scan.setMaxVersions(3);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the first scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    region.compact(true);<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    scanner1.next(results);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Cell keyValue = results.get(0);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner1.close();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  @Test<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    byte[] family = Bytes.toBytes("family");<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    try {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>      long maxSeqId = 1050;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      long minSeqId = 1000;<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        fs.create(recoveredEdits);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>        long time = System.nanoTime();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        WALEdit edit = new WALEdit();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.662"></a>
-<span class="sourceLineNo">663</span>            .toBytes(i)));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>        writer.close();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      for (HStore store : region.getStores()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assertEquals(maxSeqId, seqId);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      region.getMVCC().advanceTo(seqId);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      Get get = new Get(row);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Result result = region.get(get);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        assertEquals(1, kvs.size());<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    } finally {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.region = null;<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      wals.close();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @Test<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    byte[] family = Bytes.toBytes("family");<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    try {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>      long maxSeqId = 1050;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      long minSeqId = 1000;<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        fs.create(recoveredEdits);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long time = System.nanoTime();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        WALEdit edit = new WALEdit();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.713"></a>
-<span class="sourceLineNo">714</span>            .toBytes(i)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>        writer.close();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      long recoverSeqId = 1030;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (HStore store : region.getStores()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertEquals(maxSeqId, seqId);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      region.getMVCC().advanceTo(seqId);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Get get = new Get(row);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      Result result = region.get(get);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        if (i &lt; recoverSeqId) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>          assertEquals(0, kvs.size());<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        } else {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          assertEquals(1, kvs.size());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    } finally {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      this.region = null;<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      wals.close();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  @Test<a name="line.747"></a>
-<span class="sourceLineNo">748</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    byte[] family = Bytes.toBytes("family");<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    try {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        dos.writeInt(i);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        dos.close();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      long minSeqId = 2000;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      dos.close();<a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, null);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      assertEquals(minSeqId, seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    } finally {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      this.region = null;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    byte[] family = Bytes.toBytes("family");<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    try {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>      long maxSeqId = 1050;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      long minSeqId = 1000;<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        fs.create(recoveredEdits);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>        long time = System.nanoTime();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        WALEdit edit = null;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        if (i == maxSeqId) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          CompactionDescriptor.newBuilder()<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          .build());<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        } else {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          edit = new WALEdit();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.815"></a>
-<span class="sourceLineNo">816</span>            .toBytes(i)));<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        }<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        writer.close();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>      long recoverSeqId = 1030;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      for (HStore store : region.getStores()) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      assertEquals(maxSeqId, seqId);<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>      // assert that the files are flushed<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.833"></a>
-<span class="sourceLineNo">834</span><a name="line.834"></a>
-<span class="sourceLineNo">835</span>    } finally {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      this.region = null;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      wals.close();<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    }<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Test<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    testRecoveredEditsReplayCompaction(false);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    testRecoveredEditsReplayCompaction(true);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    byte[] family = Bytes.toBytes("family");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    try {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>      long maxSeqId = 3;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      long minSeqId = 0;<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.862"></a>
-<span class="sourceLineNo">863</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        region.put(put);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        region.flush(true);<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>      // this will create a region with 3 files<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        storeFiles.add(sf.getPath());<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // disable compaction completion<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      region.compactStores();<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // ensure that nothing changed<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          + "from the compaction, could not find any";<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      assertNotNull(errorMsg, files);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      assertEquals(errorMsg, 1, files.length);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      // move the file inside region dir<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          files[0].getPath());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        // Mix the byte array to have a new encodedName<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.902"></a>
-<span class="sourceLineNo">903</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      fs.create(recoveredEdits);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      long time = System.nanoTime();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.916"></a>
-<span class="sourceLineNo">917</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          compactionDescriptor)));<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      writer.close();<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // close the region now, and reopen again<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      region.getTableDescriptor();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      region.getRegionInfo();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      region.close();<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      try {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        region = HRegion.openHRegion(region, null);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      } catch (WrongRegionException wre) {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // now check whether we have only one store file, the compacted one<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      for (HStoreFile sf : sfs) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      if (!mismatchedRegionName) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        Result result = region.get(get);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      }<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      this.region = null;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      wals.close();<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  @Test<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  public void testFlushMarkers() throws Exception {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    byte[] family = Bytes.toBytes("family");<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    try {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>      long maxSeqId = 3;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      long minSeqId = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        region.put(put);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        region.flush(true);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>      // this will create a region with 3 files from flush<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        storeFiles.add(sf.getPath().getName());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      }<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // now verify that the flush markers are written<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      wal.shutdown();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        TEST_UTIL.getConfiguration());<a name="line.993"></a>
-<span class="sourceLineNo">994</span>      try {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        long lastFlushSeqId = -1;<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        while (true) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          WAL.Entry entry = reader.next();<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          if (entry == null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            break;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>          }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            assertNotNull(flushDesc);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>            }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            } else {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>            flushDescriptors.add(entry);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        // now write those markers to the recovered edits again.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span><a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span><a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        fs.create(recoveredEdits);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          writer.append(entry);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        writer.close();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      } finally {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (null != reader) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          try {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            reader.close();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          } catch (IOException exception) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>            LOG.debug("exception details", exception);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
+<span class="sourceLineNo">247</span>    CONF.set(CompactingMemStore.IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY, String.valueOf(0.02));<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>  @After<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public void tearDown() throws Exception {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    TEST_UTIL.cleanupTestDir();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @throws IOException<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Test<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public void testSequenceId() throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    region.close();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // Open region again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    byte [] value = Bytes.toBytes(method);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // Make a random put against our cf.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    Put put = new Put(value);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    region.put(put);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // No flush yet so init numbers should still be in place.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    region.flush(true);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    long max = region.getMaxFlushedSeqId();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    region.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(max, region.getMaxFlushedSeqId());<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>  /**<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * Test for Bug 2 of HBASE-10466.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * case previous flush fails and leaves some dat

<TRUNCATED>

[09/24] hbase-site git commit: Published site at 1cd2b56802a58b833b78ab11093912417c9a226a.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/387c169a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
index 827d1f3..1b32e2b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
@@ -252,6332 +252,6333 @@
 <span class="sourceLineNo">244</span>    dir = TEST_UTIL.getDataTestDir("TestHRegion").toString();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    method = name.getMethodName();<a name="line.245"></a>
 <span class="sourceLineNo">246</span>    tableName = TableName.valueOf(method);<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>  @After<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public void tearDown() throws Exception {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    TEST_UTIL.cleanupTestDir();<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>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @throws IOException<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Test<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void testSequenceId() throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    // Open region again.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    byte [] value = Bytes.toBytes(method);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Make a random put against our cf.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Put put = new Put(value);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    region.put(put);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // No flush yet so init numbers should still be in place.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    region.flush(true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    long max = region.getMaxFlushedSeqId();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    region.close();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    assertEquals(max, region.getMaxFlushedSeqId());<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<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>   * Test for Bug 2 of HBASE-10466.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * case previous flush fails and leaves some data in snapshot. The bug could cause loss of data<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * in current memstore. The fix is removing all conditions except abort check so we ensure 2<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * flushes for region close."<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * @throws IOException<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Test<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  public void testCloseCarryingSnapshot() throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // Get some random bytes.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    byte [] value = Bytes.toBytes(method);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    // Make a random put against our cf.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    Put put = new Put(value);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // First put something in current memstore, which will be in snapshot after flusher.prepare()<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    region.put(put);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StoreFlushContext storeFlushCtx = store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    storeFlushCtx.prepare();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // Second put something in current memstore<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    region.put(put);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // Close with something in memstore and something in the snapshot.  Make sure all is cleared.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    region.close();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  /*<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * This test is for verifying memstore snapshot size is correctly updated in case of rollback<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * See HBASE-10845<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   */<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  @Test<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public void testMemstoreSnapshotSize() throws IOException {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    class MyFaultyFSLog extends FaultyFSLog {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      StoreFlushContext storeFlushCtx;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      public MyFaultyFSLog(FileSystem fs, Path rootDir, String logName, Configuration conf)<a name="line.325"></a>
-<span class="sourceLineNo">326</span>          throws IOException {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        super(fs, rootDir, logName, conf);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>      void setStoreFlushCtx(StoreFlushContext storeFlushCtx) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        this.storeFlushCtx = storeFlushCtx;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>      @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      public void sync(long txid) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        storeFlushCtx.prepare();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        super.sync(txid);<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><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    Path rootDir = new Path(dir + "testMemstoreSnapshotSize");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    MyFaultyFSLog faultyLog = new MyFaultyFSLog(fs, rootDir, "testMemstoreSnapshotSize", CONF);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, faultyLog,<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        COLUMN_FAMILY_BYTES);<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // Get some random bytes.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    byte [] value = Bytes.toBytes(method);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    faultyLog.setStoreFlushCtx(store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    Put put = new Put(value);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    faultyLog.setFailureType(FaultyFSLog.FailureType.SYNC);<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>    boolean threwIOE = false;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    try {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      region.put(put);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    } catch (IOException ioe) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      threwIOE = true;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    } finally {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertTrue("The regionserver should have thrown an exception", threwIOE);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    MemStoreSize mss = store.getFlushableSize();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    assertTrue("flushable size should be zero, but it is " + mss,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        mss.getDataSize() == 0);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<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>   * Create a WAL outside of the usual helper in<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * {@link HBaseTestingUtility#createWal(Configuration, Path, RegionInfo)} because that method<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * doesn't play nicely with FaultyFileSystem. Call this method before overriding<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@code fs.file.impl}.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param callingMethod a unique component for the path, probably the name of the test method.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private static WAL createWALCompatibleWithFaultyFileSystem(String callingMethod,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      Configuration conf, TableName tableName) throws IOException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final Configuration walConf = new Configuration(conf);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return new WALFactory(walConf, callingMethod)<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        .getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Test<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public void testMemstoreSizeAccountingWithFailedPostBatchMutate() throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    Path rootDir = new Path(dir + testName);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    HRegion region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        COLUMN_FAMILY_BYTES);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // Put one value<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    byte [] value = Bytes.toBytes(method);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    Put put = new Put(value);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    region.put(put);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(onePutSize &gt; 0);<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    doThrow(new IOException())<a name="line.406"></a>
-<span class="sourceLineNo">407</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    put = new Put(value);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    try {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      region.put(put);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      fail("Should have failed with IOException");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    } catch (IOException expected) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    long expectedSize = onePutSize * 2;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    assertEquals("memstoreSize should be incremented",<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        expectedSize, region.getMemStoreDataSize());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    assertEquals("flushable size should be incremented",<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    region.setCoprocessorHost(null);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * if memstoreSize is not larger than 0."<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws Exception<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  @Test<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // Only retry once.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final User user =<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // Inject our faulty LocalFileSystem<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      @Override<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      public Object run() throws Exception {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        FileSystem fs = FileSystem.get(conf);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HRegion region = null;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        try {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          // Initialize region<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>              COLUMN_FAMILY_BYTES);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          long size = region.getMemStoreDataSize();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          Assert.assertEquals(0, size);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          Put p1 = new Put(row);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          region.put(p1);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>          try {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            LOG.info("Flushing");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>            region.flush(true);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.475"></a>
-<span class="sourceLineNo">476</span>          } catch (DroppedSnapshotException dse) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>            // What we are expecting<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          // Make it so all writes succeed from here on out<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          ffs.fault.set(false);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // Check sizes.  Should still be the one entry.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.484"></a>
-<span class="sourceLineNo">485</span>          // subtract the right amount, the snapshot size only.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          Put p2 = new Put(row);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.488"></a>
-<span class="sourceLineNo">489</span>          region.put(p2);<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          // it<a name="line.494"></a>
-<span class="sourceLineNo">495</span>          region.flush(true);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          // Make sure our memory accounting is right.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        } finally {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        }<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        return null;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    });<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Test<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    // Only retry once.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    final User user =<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Inject our faulty LocalFileSystem<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      @Override<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      public Object run() throws Exception {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        FileSystem fs = FileSystem.get(conf);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>        HRegion region = null;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        try {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          // Initialize region<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          region = initHRegion(tableName, null, null, false,<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          long size = region.getMemStoreDataSize();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          Assert.assertEquals(0, size);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          Put p1 = new Put(row);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          region.put(p1);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          StoreFlushContext storeFlushCtx =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          storeFlushCtx.prepare();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          // Now add two entries to the foreground memstore.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>          Put p2 = new Put(row);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          region.put(p2);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          // Now try close on top of a failing flush.<a name="line.545"></a>
-<span class="sourceLineNo">546</span>          region.close();<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          fail();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>        } catch (DroppedSnapshotException dse) {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          // Expected<a name="line.549"></a>
-<span class="sourceLineNo">550</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>        } finally {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          ffs.fault.set(false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        return null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    });<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  }<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>  @Test<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    byte[] family = Bytes.toBytes("family");<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    region.put(put);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    region.flush(true);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    Scan scan = new Scan();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    scan.setMaxVersions(3);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    // open the first scanner<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    region.delete(delete);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    region.flush(true);<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    // open the second scanner<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.582"></a>
-<span class="sourceLineNo">583</span><a name="line.583"></a>
-<span class="sourceLineNo">584</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    // make a major compaction<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    region.compact(true);<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>    // open the third scanner<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    scanner1.next(results);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    System.out.println(results);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assertEquals(1, results.size());<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    results.clear();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    scanner2.next(results);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    System.out.println(results);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    assertEquals(0, results.size());<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>    results.clear();<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    scanner3.next(results);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    System.out.println(results);<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    assertEquals(0, results.size());<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>  @Test<a name="line.610"></a>
-<span class="sourceLineNo">611</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    byte[] family = Bytes.toBytes("family");<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    region.put(put);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    region.put(put);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    region.flush(true);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    Scan scan = new Scan();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    scan.setMaxVersions(3);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the first scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    region.compact(true);<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    scanner1.next(results);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Cell keyValue = results.get(0);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    scanner1.close();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
-<span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>  @Test<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    byte[] family = Bytes.toBytes("family");<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    try {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>      long maxSeqId = 1050;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      long minSeqId = 1000;<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.656"></a>
-<span class="sourceLineNo">657</span>        fs.create(recoveredEdits);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>        long time = System.nanoTime();<a name="line.660"></a>
-<span class="sourceLineNo">661</span>        WALEdit edit = new WALEdit();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.662"></a>
-<span class="sourceLineNo">663</span>            .toBytes(i)));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>        writer.close();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      for (HStore store : region.getStores()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      assertEquals(maxSeqId, seqId);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      region.getMVCC().advanceTo(seqId);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      Get get = new Get(row);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      Result result = region.get(get);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        assertEquals(1, kvs.size());<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      }<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    } finally {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      this.region = null;<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      wals.close();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>  }<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>  @Test<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    byte[] family = Bytes.toBytes("family");<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    try {<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>      long maxSeqId = 1050;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>      long minSeqId = 1000;<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        fs.create(recoveredEdits);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        long time = System.nanoTime();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>        WALEdit edit = new WALEdit();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.713"></a>
-<span class="sourceLineNo">714</span>            .toBytes(i)));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>        writer.close();<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      }<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      long recoverSeqId = 1030;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (HStore store : region.getStores()) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertEquals(maxSeqId, seqId);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      region.getMVCC().advanceTo(seqId);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Get get = new Get(row);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      Result result = region.get(get);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        if (i &lt; recoverSeqId) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>          assertEquals(0, kvs.size());<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        } else {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          assertEquals(1, kvs.size());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.737"></a>
-<span class="sourceLineNo">738</span>        }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    } finally {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      this.region = null;<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      wals.close();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>  @Test<a name="line.747"></a>
-<span class="sourceLineNo">748</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    byte[] family = Bytes.toBytes("family");<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    try {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        dos.writeInt(i);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        dos.close();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      long minSeqId = 2000;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      dos.close();<a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, null);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      assertEquals(minSeqId, seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    } finally {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      this.region = null;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    byte[] family = Bytes.toBytes("family");<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    try {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>      long maxSeqId = 1050;<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      long minSeqId = 1000;<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        fs.create(recoveredEdits);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.800"></a>
-<span class="sourceLineNo">801</span><a name="line.801"></a>
-<span class="sourceLineNo">802</span>        long time = System.nanoTime();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>        WALEdit edit = null;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>        if (i == maxSeqId) {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          CompactionDescriptor.newBuilder()<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          .build());<a name="line.812"></a>
-<span class="sourceLineNo">813</span>        } else {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          edit = new WALEdit();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.815"></a>
-<span class="sourceLineNo">816</span>            .toBytes(i)));<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        }<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        writer.close();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>      long recoverSeqId = 1030;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      for (HStore store : region.getStores()) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      long seqId = region.replayRecoveredEditsIfAny(regiondir, maxSeqIdInStores, null, status);<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      assertEquals(maxSeqId, seqId);<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>      // assert that the files are flushed<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.833"></a>
-<span class="sourceLineNo">834</span><a name="line.834"></a>
-<span class="sourceLineNo">835</span>    } finally {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      this.region = null;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      wals.close();<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    }<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  @Test<a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    testRecoveredEditsReplayCompaction(false);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    testRecoveredEditsReplayCompaction(true);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    byte[] family = Bytes.toBytes("family");<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    try {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.854"></a>
-<span class="sourceLineNo">855</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.856"></a>
-<span class="sourceLineNo">857</span><a name="line.857"></a>
-<span class="sourceLineNo">858</span>      long maxSeqId = 3;<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      long minSeqId = 0;<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.862"></a>
-<span class="sourceLineNo">863</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        region.put(put);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        region.flush(true);<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>      // this will create a region with 3 files<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        storeFiles.add(sf.getPath());<a name="line.872"></a>
-<span class="sourceLineNo">873</span>      }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>      // disable compaction completion<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      region.compactStores();<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>      // ensure that nothing changed<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.885"></a>
-<span class="sourceLineNo">886</span>          + "from the compaction, could not find any";<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      assertNotNull(errorMsg, files);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      assertEquals(errorMsg, 1, files.length);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>      // move the file inside region dir<a name="line.889"></a>
-<span class="sourceLineNo">890</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          files[0].getPath());<a name="line.891"></a>
-<span class="sourceLineNo">892</span><a name="line.892"></a>
-<span class="sourceLineNo">893</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        // Mix the byte array to have a new encodedName<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.902"></a>
-<span class="sourceLineNo">903</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.903"></a>
-<span class="sourceLineNo">904</span><a name="line.904"></a>
-<span class="sourceLineNo">905</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.905"></a>
-<span class="sourceLineNo">906</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>      Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      fs.create(recoveredEdits);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      long time = System.nanoTime();<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.916"></a>
-<span class="sourceLineNo">917</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.917"></a>
-<span class="sourceLineNo">918</span>          compactionDescriptor)));<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      writer.close();<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // close the region now, and reopen again<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      region.getTableDescriptor();<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      region.getRegionInfo();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      region.close();<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      try {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        region = HRegion.openHRegion(region, null);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      } catch (WrongRegionException wre) {<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span><a name="line.930"></a>
-<span class="sourceLineNo">931</span>      // now check whether we have only one store file, the compacted one<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      for (HStoreFile sf : sfs) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      if (!mismatchedRegionName) {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
-<span class="sourceLineNo">939</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.942"></a>
-<span class="sourceLineNo">943</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.943"></a>
-<span class="sourceLineNo">944</span>        Result result = region.get(get);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      }<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      this.region = null;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      wals.close();<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>  @Test<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  public void testFlushMarkers() throws Exception {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    byte[] family = Bytes.toBytes("family");<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    try {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>      long maxSeqId = 3;<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      long minSeqId = 0;<a name="line.974"></a>
-<span class="sourceLineNo">975</span><a name="line.975"></a>
-<span class="sourceLineNo">976</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        region.put(put);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        region.flush(true);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span><a name="line.982"></a>
-<span class="sourceLineNo">983</span>      // this will create a region with 3 files from flush<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        storeFiles.add(sf.getPath().getName());<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      }<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>      // now verify that the flush markers are written<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      wal.shutdown();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        TEST_UTIL.getConfiguration());<a name="line.993"></a>
-<span class="sourceLineNo">994</span>      try {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        long lastFlushSeqId = -1;<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        while (true) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          WAL.Entry entry = reader.next();<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          if (entry == null) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>            break;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>          }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>            assertNotNull(flushDesc);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>            }<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>            } else {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>            }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>            flushDescriptors.add(entry);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        // now write those markers to the recovered edits again.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span><a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        Path recoveredEditsDir = WALSplitter.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span><a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        fs.create(recoveredEdits);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          writer.append(entry);<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        }<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        writer.close();<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      } finally {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (null != reader) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          try {<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            reader.close();<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          } catch (IOException exception) {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>            LOG.debug("exception details", exception);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span><a name="line.1053"></a>
+<span class="sourceLineNo">247</span>    CONF.set(CompactingMemStore.IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY, String.valueOf(0.02));<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>  @After<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  public void tearDown() throws Exception {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    LOG.info("Cleaning test directory: " + TEST_UTIL.getDataTestDir());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    TEST_UTIL.cleanupTestDir();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Test that I can use the max flushed sequence id after the close.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @throws IOException<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Test<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public void testSequenceId() throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    HRegion region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // Weird. This returns 0 if no store files or no edits. Afraid to change it.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    region.close();<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // Open region again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    byte [] value = Bytes.toBytes(method);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    // Make a random put against our cf.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    Put put = new Put(value);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    put.addColumn(COLUMN_FAMILY_BYTES, null, value);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    region.put(put);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // No flush yet so init numbers should still be in place.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(HConstants.NO_SEQNUM, region.getMaxFlushedSeqId());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(0, (long)region.getMaxStoreSeqId().get(COLUMN_FAMILY_BYTES));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    region.flush(true);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    long max = region.getMaxFlushedSeqId();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    region.close();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertEquals(max, region.getMaxFlushedSeqId());<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>  /**<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * Test for Bug 2 of HBASE-10466.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * "Bug 2: Conditions for the first flush of region close (so-called pre-flush) If memstoreSize<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * is smaller than a certain value, or when region close starts a flush is ongoing, the first<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * flush is skipped and only the second flush takes place. However, two flushes are required in<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * case previous f

<TRUNCATED>