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/04/03 14:47:46 UTC

[01/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site e8a9b2eef -> 21347dff7


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html
index 4234db1..d760e64 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html
@@ -81,43 +81,49 @@
 <span class="sourceLineNo">073</span>    }<a name="line.73"></a>
 <span class="sourceLineNo">074</span>  }<a name="line.74"></a>
 <span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  // get next compaction action to apply on compaction pipeline<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  public abstract Action getAction(VersionedSegmentsList versionedList);<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  // update policy stats based on the segment that replaced previous versioned list (in<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  // compaction pipeline)<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  public void updateStats(Segment replacement) {}<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  // resets policy stats<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public void resetStats() {}<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  protected Action simpleMergeOrFlatten(VersionedSegmentsList versionedList, String strategy) {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    int numOfSegments = versionedList.getNumOfSegments();<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    if (numOfSegments &gt; pipelineThreshold) {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      // to avoid too many segments, merge now<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      LOG.trace("Strategy={}, store={}; merging {} segments", strategy, cfName, numOfSegments);<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      return getMergingAction();<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>    // just flatten a segment<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    LOG.trace("Strategy={}, store={}; flattening a segment", strategy, cfName);<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    return getFlattenAction();<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  protected Action getMergingAction() {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    return Action.MERGE;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  }<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  protected Action getFlattenAction() {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    return Action.FLATTEN;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  protected Action compact(VersionedSegmentsList versionedList, String strategyInfo) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    int numOfSegments = versionedList.getNumOfSegments();<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    LOG.trace("{} in-memory compaction for store={} compacting {} segments", strategyInfo,<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        cfName, numOfSegments);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    return Action.COMPACT;<a name="line.109"></a>
+<span class="sourceLineNo">076</span>  @Override<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  public String toString() {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    return getName() + ", pipelineThreshold=" + this.pipelineThreshold;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  }<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>  protected abstract String getName();<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  // get next compaction action to apply on compaction pipeline<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  public abstract Action getAction(VersionedSegmentsList versionedList);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  // update policy stats based on the segment that replaced previous versioned list (in<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  // compaction pipeline)<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  public void updateStats(Segment replacement) {}<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  // resets policy stats<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  public void resetStats() {}<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>  protected Action simpleMergeOrFlatten(VersionedSegmentsList versionedList, String strategy) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    int numOfSegments = versionedList.getNumOfSegments();<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    if (numOfSegments &gt; pipelineThreshold) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      // to avoid too many segments, merge now<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      LOG.trace("Strategy={}, store={}; merging {} segments", strategy, cfName, numOfSegments);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      return getMergingAction();<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>    // just flatten a segment<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    LOG.trace("Strategy={}, store={}; flattening a segment", strategy, cfName);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    return getFlattenAction();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  protected Action getMergingAction() {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    return Action.MERGE;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  protected Action getFlattenAction() {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    return Action.FLATTEN;<a name="line.109"></a>
 <span class="sourceLineNo">110</span>  }<a name="line.110"></a>
 <span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>}<a name="line.112"></a>
+<span class="sourceLineNo">112</span>  protected Action compact(VersionedSegmentsList versionedList, String strategyInfo) {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    int numOfSegments = versionedList.getNumOfSegments();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    LOG.trace("{} in-memory compaction for store={} compacting {} segments", strategyInfo,<a name="line.114"></a>
+<span class="sourceLineNo">115</span>        cfName, numOfSegments);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    return Action.COMPACT;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
+<span class="sourceLineNo">118</span>}<a name="line.118"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html
index 4234db1..d760e64 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html
@@ -81,43 +81,49 @@
 <span class="sourceLineNo">073</span>    }<a name="line.73"></a>
 <span class="sourceLineNo">074</span>  }<a name="line.74"></a>
 <span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  // get next compaction action to apply on compaction pipeline<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  public abstract Action getAction(VersionedSegmentsList versionedList);<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  // update policy stats based on the segment that replaced previous versioned list (in<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  // compaction pipeline)<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  public void updateStats(Segment replacement) {}<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  // resets policy stats<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public void resetStats() {}<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  protected Action simpleMergeOrFlatten(VersionedSegmentsList versionedList, String strategy) {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    int numOfSegments = versionedList.getNumOfSegments();<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    if (numOfSegments &gt; pipelineThreshold) {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      // to avoid too many segments, merge now<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      LOG.trace("Strategy={}, store={}; merging {} segments", strategy, cfName, numOfSegments);<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      return getMergingAction();<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>    // just flatten a segment<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    LOG.trace("Strategy={}, store={}; flattening a segment", strategy, cfName);<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    return getFlattenAction();<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  protected Action getMergingAction() {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    return Action.MERGE;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  }<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  protected Action getFlattenAction() {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    return Action.FLATTEN;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  protected Action compact(VersionedSegmentsList versionedList, String strategyInfo) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    int numOfSegments = versionedList.getNumOfSegments();<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    LOG.trace("{} in-memory compaction for store={} compacting {} segments", strategyInfo,<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        cfName, numOfSegments);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    return Action.COMPACT;<a name="line.109"></a>
+<span class="sourceLineNo">076</span>  @Override<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  public String toString() {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    return getName() + ", pipelineThreshold=" + this.pipelineThreshold;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  }<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>  protected abstract String getName();<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  // get next compaction action to apply on compaction pipeline<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  public abstract Action getAction(VersionedSegmentsList versionedList);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  // update policy stats based on the segment that replaced previous versioned list (in<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  // compaction pipeline)<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  public void updateStats(Segment replacement) {}<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  // resets policy stats<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  public void resetStats() {}<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>  protected Action simpleMergeOrFlatten(VersionedSegmentsList versionedList, String strategy) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    int numOfSegments = versionedList.getNumOfSegments();<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    if (numOfSegments &gt; pipelineThreshold) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      // to avoid too many segments, merge now<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      LOG.trace("Strategy={}, store={}; merging {} segments", strategy, cfName, numOfSegments);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      return getMergingAction();<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>    // just flatten a segment<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    LOG.trace("Strategy={}, store={}; flattening a segment", strategy, cfName);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    return getFlattenAction();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  protected Action getMergingAction() {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    return Action.MERGE;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  protected Action getFlattenAction() {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    return Action.FLATTEN;<a name="line.109"></a>
 <span class="sourceLineNo">110</span>  }<a name="line.110"></a>
 <span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>}<a name="line.112"></a>
+<span class="sourceLineNo">112</span>  protected Action compact(VersionedSegmentsList versionedList, String strategyInfo) {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    int numOfSegments = versionedList.getNumOfSegments();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    LOG.trace("{} in-memory compaction for store={} compacting {} segments", strategyInfo,<a name="line.114"></a>
+<span class="sourceLineNo">115</span>        cfName, numOfSegments);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    return Action.COMPACT;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
+<span class="sourceLineNo">118</span>}<a name="line.118"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html
index e029191..d4e7e70 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html
@@ -87,179 +87,184 @@
 <span class="sourceLineNo">079</span>        compactingMemStore.getFamilyName());<a name="line.79"></a>
 <span class="sourceLineNo">080</span>  }<a name="line.80"></a>
 <span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  /**----------------------------------------------------------------------<a name="line.82"></a>
-<span class="sourceLineNo">083</span>   * The request to dispatch the compaction asynchronous task.<a name="line.83"></a>
-<span class="sourceLineNo">084</span>   * The method returns true if compaction was successfully dispatched, or false if there<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   * is already an ongoing compaction or no segments to compact.<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   */<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public boolean start() throws IOException {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    if (!compactingMemStore.hasImmutableSegments()) { // no compaction on empty pipeline<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      return false;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    }<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>    // get a snapshot of the list of the segments from the pipeline,<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    // this local copy of the list is marked with specific version<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    versionedList = compactingMemStore.getImmutableSegments();<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    LOG.trace("Speculative compaction starting on {}/{}",<a name="line.95"></a>
-<span class="sourceLineNo">096</span>        compactingMemStore.getStore().getHRegion().getRegionInfo().getEncodedName(),<a name="line.96"></a>
-<span class="sourceLineNo">097</span>        compactingMemStore.getStore().getColumnFamilyName());<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    HStore store = compactingMemStore.getStore();<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    RegionCoprocessorHost cpHost = store.getCoprocessorHost();<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    if (cpHost != null) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      cpHost.preMemStoreCompaction(store);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    try {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      doCompaction();<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    } finally {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      if (cpHost != null) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>        cpHost.postMemStoreCompaction(store);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      }<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    return true;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>  /**----------------------------------------------------------------------<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  * The request to cancel the compaction asynchronous task<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  * The compaction may still happen if the request was sent too late<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  * Non-blocking request<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  */<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  public void stop() {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      isInterrupted.compareAndSet(false, true);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  }<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public void resetStats() {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    strategy.resetStats();<a name="line.124"></a>
+<span class="sourceLineNo">082</span>  @Override<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public String toString() {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    return this.strategy + ", compactionCellMax=" + this.compactionKVMax;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  }<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  /**----------------------------------------------------------------------<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * The request to dispatch the compaction asynchronous task.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * The method returns true if compaction was successfully dispatched, or false if there<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * is already an ongoing compaction or no segments to compact.<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   */<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  public boolean start() throws IOException {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    if (!compactingMemStore.hasImmutableSegments()) { // no compaction on empty pipeline<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      return false;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    }<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>    // get a snapshot of the list of the segments from the pipeline,<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    // this local copy of the list is marked with specific version<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    versionedList = compactingMemStore.getImmutableSegments();<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    LOG.trace("Speculative compaction starting on {}/{}",<a name="line.100"></a>
+<span class="sourceLineNo">101</span>        compactingMemStore.getStore().getHRegion().getRegionInfo().getEncodedName(),<a name="line.101"></a>
+<span class="sourceLineNo">102</span>        compactingMemStore.getStore().getColumnFamilyName());<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    HStore store = compactingMemStore.getStore();<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    RegionCoprocessorHost cpHost = store.getCoprocessorHost();<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    if (cpHost != null) {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      cpHost.preMemStoreCompaction(store);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    }<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    try {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      doCompaction();<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    } finally {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      if (cpHost != null) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        cpHost.postMemStoreCompaction(store);<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      }<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    return true;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  /**----------------------------------------------------------------------<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  * The request to cancel the compaction asynchronous task<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  * The compaction may still happen if the request was sent too late<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  * Non-blocking request<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  */<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  public void stop() {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      isInterrupted.compareAndSet(false, true);<a name="line.124"></a>
 <span class="sourceLineNo">125</span>  }<a name="line.125"></a>
 <span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  /**----------------------------------------------------------------------<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  * Reset the interruption indicator and clear the pointers in order to allow good<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  * garbage collection<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  */<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  private void releaseResources() {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    isInterrupted.set(false);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    versionedList = null;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  /**----------------------------------------------------------------------<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  * The worker thread performs the compaction asynchronously.<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  * The solo (per compactor) thread only reads the compaction pipeline.<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  * There is at most one thread per memstore instance.<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  */<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private void doCompaction() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    ImmutableSegment result = null;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    boolean resultSwapped = false;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    if (isInterrupted.get()) {      // if the entire process is interrupted cancel flattening<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      return;           // the compaction also doesn't start when interrupted<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>    MemStoreCompactionStrategy.Action nextStep = strategy.getAction(versionedList);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    boolean merge =<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        (nextStep == MemStoreCompactionStrategy.Action.MERGE ||<a name="line.150"></a>
-<span class="sourceLineNo">151</span>            nextStep == MemStoreCompactionStrategy.Action.MERGE_COUNT_UNIQUE_KEYS);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    try {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      if (nextStep == MemStoreCompactionStrategy.Action.NOOP) {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        return;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      if (nextStep == MemStoreCompactionStrategy.Action.FLATTEN ||<a name="line.156"></a>
-<span class="sourceLineNo">157</span>          nextStep == MemStoreCompactionStrategy.Action.FLATTEN_COUNT_UNIQUE_KEYS) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        // some Segment in the pipeline is with SkipList index, make it flat<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        compactingMemStore.flattenOneSegment(versionedList.getVersion(), nextStep);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        return;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>      // Create one segment representing all segments in the compaction pipeline,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      // either by compaction or by merge<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      if (!isInterrupted.get()) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        result = createSubstitution(nextStep);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      }<a name="line.167"></a>
-<span class="sourceLineNo">168</span><a name="line.168"></a>
-<span class="sourceLineNo">169</span>      // Substitute the pipeline with one segment<a name="line.169"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public void resetStats() {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    strategy.resetStats();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  /**----------------------------------------------------------------------<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  * Reset the interruption indicator and clear the pointers in order to allow good<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  * garbage collection<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  */<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private void releaseResources() {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    isInterrupted.set(false);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    versionedList = null;<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>  /**----------------------------------------------------------------------<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  * The worker thread performs the compaction asynchronously.<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  * The solo (per compactor) thread only reads the compaction pipeline.<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  * There is at most one thread per memstore instance.<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  */<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  private void doCompaction() {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    ImmutableSegment result = null;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    boolean resultSwapped = false;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    if (isInterrupted.get()) {      // if the entire process is interrupted cancel flattening<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      return;           // the compaction also doesn't start when interrupted<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>    MemStoreCompactionStrategy.Action nextStep = strategy.getAction(versionedList);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    boolean merge =<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        (nextStep == MemStoreCompactionStrategy.Action.MERGE ||<a name="line.155"></a>
+<span class="sourceLineNo">156</span>            nextStep == MemStoreCompactionStrategy.Action.MERGE_COUNT_UNIQUE_KEYS);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    try {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      if (nextStep == MemStoreCompactionStrategy.Action.NOOP) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        return;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      }<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      if (nextStep == MemStoreCompactionStrategy.Action.FLATTEN ||<a name="line.161"></a>
+<span class="sourceLineNo">162</span>          nextStep == MemStoreCompactionStrategy.Action.FLATTEN_COUNT_UNIQUE_KEYS) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        // some Segment in the pipeline is with SkipList index, make it flat<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        compactingMemStore.flattenOneSegment(versionedList.getVersion(), nextStep);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        return;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      }<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span>      // Create one segment representing all segments in the compaction pipeline,<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      // either by compaction or by merge<a name="line.169"></a>
 <span class="sourceLineNo">170</span>      if (!isInterrupted.get()) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>        resultSwapped = compactingMemStore.swapCompactedSegments(versionedList, result, merge);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        if (resultSwapped) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>          // update compaction strategy<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          strategy.updateStats(result);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>          // update the wal so it can be truncated and not get too long<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          compactingMemStore.updateLowestUnflushedSequenceIdInWAL(true); // only if greater<a name="line.176"></a>
-<span class="sourceLineNo">177</span>        }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      }<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    } catch (IOException e) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      LOG.trace("Interrupting in-memory compaction for store={}",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          compactingMemStore.getFamilyName());<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      Thread.currentThread().interrupt();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    } finally {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      // For the MERGE case, if the result was created, but swap didn't happen,<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      // we DON'T need to close the result segment (meaning its MSLAB)!<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      // Because closing the result segment means closing the chunks of all segments<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      // in the compaction pipeline, which still have ongoing scans.<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      if (!merge &amp;&amp; (result != null) &amp;&amp; !resultSwapped) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        result.close();<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      releaseResources();<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>  }<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>  /**----------------------------------------------------------------------<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * Creation of the ImmutableSegment either by merge or copy-compact of the segments of the<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * pipeline, based on the Compactor Iterator. The new ImmutableSegment is returned.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   */<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  private ImmutableSegment createSubstitution(MemStoreCompactionStrategy.Action action) throws<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      IOException {<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>    ImmutableSegment result = null;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    MemStoreSegmentsIterator iterator = null;<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    switch (action) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      case COMPACT:<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        iterator = new MemStoreCompactorSegmentsIterator(versionedList.getStoreSegments(),<a name="line.208"></a>
-<span class="sourceLineNo">209</span>            compactingMemStore.getComparator(),<a name="line.209"></a>
-<span class="sourceLineNo">210</span>            compactionKVMax, compactingMemStore.getStore());<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>        result = SegmentFactory.instance().createImmutableSegmentByCompaction(<a name="line.212"></a>
-<span class="sourceLineNo">213</span>          compactingMemStore.getConfiguration(), compactingMemStore.getComparator(), iterator,<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          versionedList.getNumOfCells(), compactingMemStore.getIndexType(), action);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        iterator.close();<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        break;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      case MERGE:<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      case MERGE_COUNT_UNIQUE_KEYS:<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        iterator =<a name="line.219"></a>
-<span class="sourceLineNo">220</span>            new MemStoreMergerSegmentsIterator(versionedList.getStoreSegments(),<a name="line.220"></a>
-<span class="sourceLineNo">221</span>            compactingMemStore.getComparator(), compactionKVMax);<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>        result = SegmentFactory.instance().createImmutableSegmentByMerge(<a name="line.223"></a>
-<span class="sourceLineNo">224</span>          compactingMemStore.getConfiguration(), compactingMemStore.getComparator(), iterator,<a name="line.224"></a>
-<span class="sourceLineNo">225</span>          versionedList.getNumOfCells(), versionedList.getStoreSegments(),<a name="line.225"></a>
-<span class="sourceLineNo">226</span>          compactingMemStore.getIndexType(), action);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        iterator.close();<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        break;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      default:<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        throw new RuntimeException("Unknown action " + action); // sanity check<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>    return result;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  @VisibleForTesting<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  void initiateCompactionStrategy(MemoryCompactionPolicy compType,<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      Configuration configuration, String cfName) throws IllegalArgumentIOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>    assert (compType !=MemoryCompactionPolicy.NONE);<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>    switch (compType){<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      case BASIC: strategy = new BasicMemStoreCompactionStrategy(configuration, cfName);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        break;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      case EAGER: strategy = new EagerMemStoreCompactionStrategy(configuration, cfName);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        break;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      case ADAPTIVE: strategy = new AdaptiveMemStoreCompactionStrategy(configuration, cfName);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        break;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      default:<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        // sanity check<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        throw new IllegalArgumentIOException("Unknown memory compaction type " + compType);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<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">171</span>        result = createSubstitution(nextStep);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      }<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>      // Substitute the pipeline with one segment<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      if (!isInterrupted.get()) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        resultSwapped = compactingMemStore.swapCompactedSegments(versionedList, result, merge);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        if (resultSwapped) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>          // update compaction strategy<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          strategy.updateStats(result);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>          // update the wal so it can be truncated and not get too long<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          compactingMemStore.updateLowestUnflushedSequenceIdInWAL(true); // only if greater<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        }<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    } catch (IOException e) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      LOG.trace("Interrupting in-memory compaction for store={}",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>          compactingMemStore.getFamilyName());<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      Thread.currentThread().interrupt();<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      // For the MERGE case, if the result was created, but swap didn't happen,<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      // we DON'T need to close the result segment (meaning its MSLAB)!<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      // Because closing the result segment means closing the chunks of all segments<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      // in the compaction pipeline, which still have ongoing scans.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      if (!merge &amp;&amp; (result != null) &amp;&amp; !resultSwapped) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        result.close();<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      releaseResources();<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<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>   * Creation of the ImmutableSegment either by merge or copy-compact of the segments of the<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * pipeline, based on the Compactor Iterator. The new ImmutableSegment is returned.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private ImmutableSegment createSubstitution(MemStoreCompactionStrategy.Action action) throws<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      IOException {<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>    ImmutableSegment result = null;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    MemStoreSegmentsIterator iterator = null;<a name="line.209"></a>
+<span class="sourceLineNo">210</span><a name="line.210"></a>
+<span class="sourceLineNo">211</span>    switch (action) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      case COMPACT:<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        iterator = new MemStoreCompactorSegmentsIterator(versionedList.getStoreSegments(),<a name="line.213"></a>
+<span class="sourceLineNo">214</span>            compactingMemStore.getComparator(),<a name="line.214"></a>
+<span class="sourceLineNo">215</span>            compactionKVMax, compactingMemStore.getStore());<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>        result = SegmentFactory.instance().createImmutableSegmentByCompaction(<a name="line.217"></a>
+<span class="sourceLineNo">218</span>          compactingMemStore.getConfiguration(), compactingMemStore.getComparator(), iterator,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          versionedList.getNumOfCells(), compactingMemStore.getIndexType(), action);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        iterator.close();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        break;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      case MERGE:<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      case MERGE_COUNT_UNIQUE_KEYS:<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        iterator =<a name="line.224"></a>
+<span class="sourceLineNo">225</span>            new MemStoreMergerSegmentsIterator(versionedList.getStoreSegments(),<a name="line.225"></a>
+<span class="sourceLineNo">226</span>            compactingMemStore.getComparator(), compactionKVMax);<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>        result = SegmentFactory.instance().createImmutableSegmentByMerge(<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          compactingMemStore.getConfiguration(), compactingMemStore.getComparator(), iterator,<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          versionedList.getNumOfCells(), versionedList.getStoreSegments(),<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          compactingMemStore.getIndexType(), action);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        iterator.close();<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        break;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      default:<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        throw new RuntimeException("Unknown action " + action); // sanity check<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>    return result;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  @VisibleForTesting<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  void initiateCompactionStrategy(MemoryCompactionPolicy compType,<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      Configuration configuration, String cfName) throws IllegalArgumentIOException {<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    assert (compType !=MemoryCompactionPolicy.NONE);<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>    switch (compType){<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      case BASIC: strategy = new BasicMemStoreCompactionStrategy(configuration, cfName);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        break;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      case EAGER: strategy = new EagerMemStoreCompactionStrategy(configuration, cfName);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        break;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      case ADAPTIVE: strategy = new AdaptiveMemStoreCompactionStrategy(configuration, cfName);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        break;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      default:<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        // sanity check<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        throw new IllegalArgumentIOException("Unknown memory compaction type " + compType);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>}<a name="line.259"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index f33e181..24c0446 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -321,7 +321,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 03243eb..2d5468c 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -425,7 +425,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index a0d2bfa..abadd64 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -281,7 +281,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 0258e78..d3c0079 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -278,7 +278,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 380db0e..73bfa25 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -481,7 +481,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 01512e2..6820fd5 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index c55012a..62f2c84 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -449,7 +449,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 57a7c0a..40317a6 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -404,7 +404,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 2e3f00e..b2a03cc 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -430,7 +430,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 4fb64a5..75c7a96 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -365,7 +365,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 5db500d..e131856 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -759,7 +759,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index f47dffe..ff851fc 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -325,7 +325,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 48fc8dd..627fe32 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -295,7 +295,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index fc3f4ba..15148bf 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -321,7 +321,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index d684241..6aae482 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -298,7 +298,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index e056031..c76d9bc 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -293,7 +293,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 967247f..a033e44 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -321,7 +321,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 0c90cf4..54d9382 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -289,7 +289,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index bc1a075..e46ced4 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -323,7 +323,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index bcf313c..83c9545 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -510,7 +510,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 4c45f3a..692fad5 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -720,7 +720,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHStore.MyMemStoreCompactor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHStore.MyMemStoreCompactor.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHStore.MyMemStoreCompactor.html
index 8ce6485..fb98924 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHStore.MyMemStoreCompactor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHStore.MyMemStoreCompactor.html
@@ -196,14 +196,14 @@ extends org.apache.hadoop.hbase.regionserver.MemStoreCompactor</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.MemStoreCompactor</h3>
-<code>initiateCompactionStrategy, resetStats, stop</code></li>
+<code>initiateCompactionStrategy, resetStats, stop, toString</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;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">Object</a></h3>
-<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
 </ul>
 </li>
 </ul>


[12/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.PrefetchedHeader.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.PrefetchedHeader.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.PrefetchedHeader.html
index 12d10e1..97ceefd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.PrefetchedHeader.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.PrefetchedHeader.html
@@ -1740,384 +1740,380 @@
 <span class="sourceLineNo">1732</span>      // and will save us having to seek the stream backwards to reread the header we<a name="line.1732"></a>
 <span class="sourceLineNo">1733</span>      // read the last time through here.<a name="line.1733"></a>
 <span class="sourceLineNo">1734</span>      ByteBuffer headerBuf = getCachedHeader(offset);<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      if (LOG.isTraceEnabled()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        LOG.trace("Reading " + this.fileContext.getHFileName() + " at offset=" + offset +<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>          ", pread=" + pread + ", verifyChecksum=" + verifyChecksum + ", cachedHeader=" +<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>          headerBuf + ", onDiskSizeWithHeader=" + onDiskSizeWithHeader);<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      }<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>      // file has support for checksums (version 2+).<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      long startTime = System.currentTimeMillis();<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>        if (headerBuf == null) {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>          if (LOG.isTraceEnabled()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>          }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>              offset, pread);<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      // the header we read last time through here.<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>      if (headerBuf != null) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        // read. Copy to this block's header.<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>      } else {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>      }<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (verifyChecksum &amp;&amp;<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        return null;<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      if (updateMetrics) {<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        HFile.updateReadLatency(duration, pread);<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>      }<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>      HFileBlock hFileBlock =<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      // Run check on uncompressed sizings.<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>      }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      if (LOG.isTraceEnabled()) {<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>        LOG.trace("Read " + hFileBlock + " in " + duration + " ns");<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      }<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>      // Cache next block header if we read it for the next time through here.<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      }<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      return hFileBlock;<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span><a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    @Override<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span><a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    @Override<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    }<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span><a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    @Override<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      return this.encodedBlockDecodingCtx;<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span><a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    @Override<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return this.defaultDecodingCtx;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span><a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    /**<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>     * If the block doesn't uses checksum, returns false.<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>     * @return True if checksum matches, else false.<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>     */<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>        throws IOException {<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      // checksum validation failure.<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>        return false;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    @Override<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    public void closeStreams() throws IOException {<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      streamWrapper.close();<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    @Override<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    public void unbufferStream() {<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      // unbuffer it.<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>      if (streamLock.tryLock()) {<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>        try {<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>          this.streamWrapper.unbuffer();<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>        } finally {<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>          streamLock.unlock();<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>        }<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>      }<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span><a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    @Override<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    public String toString() {<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    }<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>  }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span><a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  @VisibleForTesting<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>        totalChecksumBytes()) {<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>      throw new IOException("Using no compression but "<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    }<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  }<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span><a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>  // Cacheable implementation<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  @Override<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>  public int getSerializedLength() {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    if (buf != null) {<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      // Include extra bytes for block metadata.<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    return 0;<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  }<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span><a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  // Cacheable implementation<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  @Override<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  public void serialize(ByteBuffer destination) {<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    // Make sure any changes in here are reflected over there.<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    destination = addMetaData(destination);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>    // metadata.<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    destination.flip();<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>  }<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>  /**<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>   * For use by bucketcache. This exposes internals.<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   */<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>  public ByteBuffer getMetaData() {<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    bb = addMetaData(bb);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    bb.flip();<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    return bb;<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span><a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  /**<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>   */<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    destination.putLong(this.offset);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return destination;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  // Cacheable implementation<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>  @Override<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>  }<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span><a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>  @Override<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>  public int hashCode() {<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    int result = 1;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    result = result * 31 + blockType.hashCode();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    result = result * 31 + buf.hashCode();<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    return result;<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>  }<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span><a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  @Override<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>  public boolean equals(Object comparison) {<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    if (this == comparison) {<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>      return true;<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    }<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    if (comparison == null) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>      return false;<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    }<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      return false;<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    }<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span><a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span><a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>      return false;<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    }<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1969"></a>
+<span class="sourceLineNo">1735</span>      LOG.trace("Reading {} at offset={}, pread={}, verifyChecksum={}, cachedHeader={}, " +<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>          "onDiskSizeWithHeader={}", this.fileContext.getHFileName(), offset, pread,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>          verifyChecksum, headerBuf, onDiskSizeWithHeader);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      // file has support for checksums (version 2+).<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      long startTime = System.currentTimeMillis();<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>        if (headerBuf == null) {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>          if (LOG.isTraceEnabled()) {<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          }<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>              offset, pread);<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        }<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      }<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // the header we read last time through here.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      if (headerBuf != null) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>        // read. Copy to this block's header.<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      } else {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      }<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      if (verifyChecksum &amp;&amp;<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        return null;<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      }<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      if (updateMetrics) {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>        HFile.updateReadLatency(duration, pread);<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>      }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      HFileBlock hFileBlock =<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      // Run check on uncompressed sizings.<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>      }<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>      LOG.trace("Read {} in {} ns", hFileBlock, duration);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>      // Cache next block header if we read it for the next time through here.<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      }<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>      return hFileBlock;<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span><a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    @Override<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    }<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span><a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    @Override<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span><a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    @Override<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      return this.encodedBlockDecodingCtx;<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span><a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    @Override<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>      return this.defaultDecodingCtx;<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    }<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span><a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    /**<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>     * If the block doesn't uses checksum, returns false.<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>     * @return True if checksum matches, else false.<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>     */<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        throws IOException {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>      // checksum validation failure.<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        return false;<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>      }<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span><a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    @Override<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    public void closeStreams() throws IOException {<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>      streamWrapper.close();<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    }<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    @Override<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    public void unbufferStream() {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      // unbuffer it.<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>      if (streamLock.tryLock()) {<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        try {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>          this.streamWrapper.unbuffer();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>        } finally {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>          streamLock.unlock();<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      }<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    }<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span><a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    @Override<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    public String toString() {<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>  }<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span><a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>  @VisibleForTesting<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        totalChecksumBytes()) {<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      throw new IOException("Using no compression but "<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span><a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>  // Cacheable implementation<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Override<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public int getSerializedLength() {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    if (buf != null) {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>      // Include extra bytes for block metadata.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    return 0;<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>  }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span><a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>  // Cacheable implementation<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  @Override<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>  public void serialize(ByteBuffer destination) {<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    // Make sure any changes in here are reflected over there.<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    destination = addMetaData(destination);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>    // metadata.<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    destination.flip();<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span><a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>  /**<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * For use by bucketcache. This exposes internals.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  public ByteBuffer getMetaData() {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    bb = addMetaData(bb);<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    bb.flip();<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    return bb;<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>  }<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span><a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  /**<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>   */<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    destination.putLong(this.offset);<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    return destination;<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  }<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span><a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>  // Cacheable implementation<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  @Override<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>  }<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span><a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>  @Override<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>  public int hashCode() {<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    int result = 1;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>    result = result * 31 + blockType.hashCode();<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    result = result * 31 + buf.hashCode();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    return result;<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>  }<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span><a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>  @Override<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>  public boolean equals(Object comparison) {<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    if (this == comparison) {<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>      return true;<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    }<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    if (comparison == null) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>      return false;<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    }<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>      return false;<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    }<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span><a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>      return false;<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    }<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>      return false;<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>    }<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    if (castedComparison.offset != this.offset) {<a name="line.1969"></a>
 <span class="sourceLineNo">1970</span>      return false;<a name="line.1970"></a>
 <span class="sourceLineNo">1971</span>    }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    if (castedComparison.offset != this.offset) {<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      return false;<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    }<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>      return false;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      return false;<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>    }<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1982"></a>
+<span class="sourceLineNo">1972</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>      return false;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>    }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      return false;<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    }<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>      return false;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>        castedComparison.buf.limit()) != 0) {<a name="line.1982"></a>
 <span class="sourceLineNo">1983</span>      return false;<a name="line.1983"></a>
 <span class="sourceLineNo">1984</span>    }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        castedComparison.buf.limit()) != 0) {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      return false;<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    }<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    return true;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>  }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    }<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    return DataBlockEncoding.NONE;<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>  }<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span><a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>  @VisibleForTesting<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>  byte getChecksumType() {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>    return this.fileContext.getChecksumType().getCode();<a name="line.2001"></a>
+<span class="sourceLineNo">1985</span>    return true;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>    }<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    return DataBlockEncoding.NONE;<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>  }<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span><a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>  @VisibleForTesting<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>  byte getChecksumType() {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>  int getBytesPerChecksum() {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2001"></a>
 <span class="sourceLineNo">2002</span>  }<a name="line.2002"></a>
 <span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>  int getBytesPerChecksum() {<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>  }<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>  @VisibleForTesting<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    return this.onDiskDataSizeWithHeader;<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  /**<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>   */<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>  int totalChecksumBytes() {<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    // indicates that cached blocks do not have checksum data because<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>    // checksums were already validated when the block was read from disk.<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      return 0;<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        this.fileContext.getBytesPerChecksum());<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  }<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span><a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>  /**<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>   * Returns the size of this block header.<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>   */<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>  public int headerSize() {<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>  }<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span><a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>  /**<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>   * Maps a minor version to the size of the header.<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>   */<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    return usesHBaseChecksum?<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>  }<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span><a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>  /**<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>   */<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>  @VisibleForTesting<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>  // TODO: Why is this in here?<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>  byte[] getDummyHeaderForVersion() {<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>  }<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span><a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>  /**<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>  }<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span><a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>  /**<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>   */<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>  HFileContext getHFileContext() {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    return this.fileContext;<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>  }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span><a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>  @Override<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>  public MemoryType getMemoryType() {<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    return this.memType;<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span><a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>   */<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  boolean usesSharedMemory() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return this.memType == MemoryType.SHARED;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * Convert the contents of the block header into a human readable string.<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>   * has minor version &gt; 0.<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>   */<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>  @VisibleForTesting<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    buf.get(magicBuf);<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    long prevBlockOffset = buf.getLong();<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    byte cksumtype = buf.get();<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    long bytesPerChecksum = buf.getInt();<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>                   " blockType " + bt +<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>                   " compressedBlockSizeNoHeader " +<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>                   compressedBlockSizeNoHeader +<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>                   uncompressedBlockSizeNoHeader +<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2106"></a>
+<span class="sourceLineNo">2004</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>  @VisibleForTesting<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    return this.onDiskDataSizeWithHeader;<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>  }<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span><a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>  /**<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>   */<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>  int totalChecksumBytes() {<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    // indicates that cached blocks do not have checksum data because<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    // checksums were already validated when the block was read from disk.<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      return 0;<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>        this.fileContext.getBytesPerChecksum());<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  }<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span><a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>  /**<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>   * Returns the size of this block header.<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>   */<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  public int headerSize() {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>  }<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>  /**<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>   * Maps a minor version to the size of the header.<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>   */<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    return usesHBaseChecksum?<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span><a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>  /**<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>   */<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>  @VisibleForTesting<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>  // TODO: Why is this in here?<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>  byte[] getDummyHeaderForVersion() {<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>  }<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span><a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>  /**<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>   */<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>  }<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span><a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>  /**<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>   */<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>  HFileContext getHFileContext() {<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    return this.fileContext;<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>  }<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span><a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>  @Override<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>  public MemoryType getMemoryType() {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    return this.memType;<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>  }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span><a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>  /**<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>   */<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>  boolean usesSharedMemory() {<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    return this.memType == MemoryType.SHARED;<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>  }<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span><a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>  /**<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>   * Convert the contents of the block header into a human readable string.<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>   * has minor version &gt; 0.<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>   */<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>  @VisibleForTesting<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    buf.get(magicBuf);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>    long prevBlockOffset = buf.getLong();<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    byte cksumtype = buf.get();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    long bytesPerChecksum = buf.getInt();<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>                   " blockType " + bt +<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>                   " compressedBlockSizeNoHeader " +<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>                   compressedBlockSizeNoHeader +<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>                   uncompressedBlockSizeNoHeader +<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  }<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span><a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public HFileBlock deepClone() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    return new HFileBlock(this, true);<a name="line.2106"></a>
 <span class="sourceLineNo">2107</span>  }<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>  public HFileBlock deepClone() {<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    return new HFileBlock(this, true);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>}<a name="line.2112"></a>
+<span class="sourceLineNo">2108</span>}<a name="line.2108"></a>
 
 
 


[09/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
index 12d10e1..97ceefd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
@@ -1740,384 +1740,380 @@
 <span class="sourceLineNo">1732</span>      // and will save us having to seek the stream backwards to reread the header we<a name="line.1732"></a>
 <span class="sourceLineNo">1733</span>      // read the last time through here.<a name="line.1733"></a>
 <span class="sourceLineNo">1734</span>      ByteBuffer headerBuf = getCachedHeader(offset);<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      if (LOG.isTraceEnabled()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        LOG.trace("Reading " + this.fileContext.getHFileName() + " at offset=" + offset +<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>          ", pread=" + pread + ", verifyChecksum=" + verifyChecksum + ", cachedHeader=" +<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>          headerBuf + ", onDiskSizeWithHeader=" + onDiskSizeWithHeader);<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      }<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>      // file has support for checksums (version 2+).<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      long startTime = System.currentTimeMillis();<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>        if (headerBuf == null) {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>          if (LOG.isTraceEnabled()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>          }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>              offset, pread);<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      // the header we read last time through here.<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>      if (headerBuf != null) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        // read. Copy to this block's header.<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>      } else {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>      }<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (verifyChecksum &amp;&amp;<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        return null;<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      if (updateMetrics) {<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        HFile.updateReadLatency(duration, pread);<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>      }<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>      HFileBlock hFileBlock =<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      // Run check on uncompressed sizings.<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>      }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      if (LOG.isTraceEnabled()) {<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>        LOG.trace("Read " + hFileBlock + " in " + duration + " ns");<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      }<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>      // Cache next block header if we read it for the next time through here.<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      }<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      return hFileBlock;<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span><a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    @Override<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span><a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    @Override<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    }<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span><a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    @Override<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      return this.encodedBlockDecodingCtx;<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span><a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    @Override<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return this.defaultDecodingCtx;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span><a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    /**<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>     * If the block doesn't uses checksum, returns false.<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>     * @return True if checksum matches, else false.<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>     */<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>        throws IOException {<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      // checksum validation failure.<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>        return false;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    @Override<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    public void closeStreams() throws IOException {<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      streamWrapper.close();<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    @Override<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    public void unbufferStream() {<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      // unbuffer it.<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>      if (streamLock.tryLock()) {<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>        try {<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>          this.streamWrapper.unbuffer();<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>        } finally {<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>          streamLock.unlock();<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>        }<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>      }<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span><a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    @Override<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    public String toString() {<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    }<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>  }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span><a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  @VisibleForTesting<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>        totalChecksumBytes()) {<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>      throw new IOException("Using no compression but "<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    }<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  }<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span><a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>  // Cacheable implementation<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  @Override<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>  public int getSerializedLength() {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    if (buf != null) {<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      // Include extra bytes for block metadata.<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    return 0;<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  }<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span><a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  // Cacheable implementation<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  @Override<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  public void serialize(ByteBuffer destination) {<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    // Make sure any changes in here are reflected over there.<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    destination = addMetaData(destination);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>    // metadata.<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    destination.flip();<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>  }<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>  /**<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>   * For use by bucketcache. This exposes internals.<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   */<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>  public ByteBuffer getMetaData() {<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    bb = addMetaData(bb);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    bb.flip();<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    return bb;<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span><a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  /**<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>   */<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    destination.putLong(this.offset);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return destination;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  // Cacheable implementation<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>  @Override<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>  }<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span><a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>  @Override<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>  public int hashCode() {<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    int result = 1;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    result = result * 31 + blockType.hashCode();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    result = result * 31 + buf.hashCode();<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    return result;<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>  }<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span><a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  @Override<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>  public boolean equals(Object comparison) {<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    if (this == comparison) {<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>      return true;<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    }<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    if (comparison == null) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>      return false;<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    }<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      return false;<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    }<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span><a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span><a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>      return false;<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    }<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1969"></a>
+<span class="sourceLineNo">1735</span>      LOG.trace("Reading {} at offset={}, pread={}, verifyChecksum={}, cachedHeader={}, " +<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>          "onDiskSizeWithHeader={}", this.fileContext.getHFileName(), offset, pread,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>          verifyChecksum, headerBuf, onDiskSizeWithHeader);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      // file has support for checksums (version 2+).<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      long startTime = System.currentTimeMillis();<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>        if (headerBuf == null) {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>          if (LOG.isTraceEnabled()) {<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          }<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>              offset, pread);<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        }<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      }<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // the header we read last time through here.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      if (headerBuf != null) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>        // read. Copy to this block's header.<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      } else {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      }<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      if (verifyChecksum &amp;&amp;<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        return null;<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      }<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      if (updateMetrics) {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>        HFile.updateReadLatency(duration, pread);<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>      }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      HFileBlock hFileBlock =<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      // Run check on uncompressed sizings.<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>      }<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>      LOG.trace("Read {} in {} ns", hFileBlock, duration);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>      // Cache next block header if we read it for the next time through here.<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      }<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>      return hFileBlock;<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span><a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    @Override<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    }<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span><a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    @Override<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span><a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    @Override<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      return this.encodedBlockDecodingCtx;<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span><a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    @Override<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>      return this.defaultDecodingCtx;<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    }<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span><a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    /**<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>     * If the block doesn't uses checksum, returns false.<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>     * @return True if checksum matches, else false.<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>     */<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        throws IOException {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>      // checksum validation failure.<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        return false;<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>      }<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span><a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    @Override<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    public void closeStreams() throws IOException {<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>      streamWrapper.close();<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    }<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    @Override<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    public void unbufferStream() {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      // unbuffer it.<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>      if (streamLock.tryLock()) {<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        try {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>          this.streamWrapper.unbuffer();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>        } finally {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>          streamLock.unlock();<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      }<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    }<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span><a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    @Override<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    public String toString() {<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>  }<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span><a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>  @VisibleForTesting<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        totalChecksumBytes()) {<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      throw new IOException("Using no compression but "<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span><a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>  // Cacheable implementation<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Override<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public int getSerializedLength() {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    if (buf != null) {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>      // Include extra bytes for block metadata.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    return 0;<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>  }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span><a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>  // Cacheable implementation<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  @Override<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>  public void serialize(ByteBuffer destination) {<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    // Make sure any changes in here are reflected over there.<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    destination = addMetaData(destination);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>    // metadata.<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    destination.flip();<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span><a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>  /**<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * For use by bucketcache. This exposes internals.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  public ByteBuffer getMetaData() {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    bb = addMetaData(bb);<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    bb.flip();<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    return bb;<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>  }<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span><a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  /**<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>   */<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    destination.putLong(this.offset);<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    return destination;<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  }<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span><a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>  // Cacheable implementation<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  @Override<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>  }<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span><a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>  @Override<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>  public int hashCode() {<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    int result = 1;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>    result = result * 31 + blockType.hashCode();<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    result = result * 31 + buf.hashCode();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    return result;<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>  }<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span><a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>  @Override<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>  public boolean equals(Object comparison) {<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    if (this == comparison) {<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>      return true;<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    }<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    if (comparison == null) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>      return false;<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    }<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>      return false;<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    }<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span><a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>      return false;<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    }<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>      return false;<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>    }<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    if (castedComparison.offset != this.offset) {<a name="line.1969"></a>
 <span class="sourceLineNo">1970</span>      return false;<a name="line.1970"></a>
 <span class="sourceLineNo">1971</span>    }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    if (castedComparison.offset != this.offset) {<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      return false;<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    }<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>      return false;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      return false;<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>    }<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1982"></a>
+<span class="sourceLineNo">1972</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>      return false;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>    }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      return false;<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    }<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>      return false;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>        castedComparison.buf.limit()) != 0) {<a name="line.1982"></a>
 <span class="sourceLineNo">1983</span>      return false;<a name="line.1983"></a>
 <span class="sourceLineNo">1984</span>    }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        castedComparison.buf.limit()) != 0) {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      return false;<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    }<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    return true;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>  }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    }<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    return DataBlockEncoding.NONE;<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>  }<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span><a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>  @VisibleForTesting<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>  byte getChecksumType() {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>    return this.fileContext.getChecksumType().getCode();<a name="line.2001"></a>
+<span class="sourceLineNo">1985</span>    return true;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>    }<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    return DataBlockEncoding.NONE;<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>  }<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span><a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>  @VisibleForTesting<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>  byte getChecksumType() {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>  int getBytesPerChecksum() {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2001"></a>
 <span class="sourceLineNo">2002</span>  }<a name="line.2002"></a>
 <span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>  int getBytesPerChecksum() {<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>  }<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>  @VisibleForTesting<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    return this.onDiskDataSizeWithHeader;<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  /**<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>   */<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>  int totalChecksumBytes() {<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    // indicates that cached blocks do not have checksum data because<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>    // checksums were already validated when the block was read from disk.<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      return 0;<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        this.fileContext.getBytesPerChecksum());<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  }<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span><a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>  /**<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>   * Returns the size of this block header.<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>   */<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>  public int headerSize() {<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>  }<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span><a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>  /**<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>   * Maps a minor version to the size of the header.<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>   */<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    return usesHBaseChecksum?<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>  }<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span><a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>  /**<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>   */<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>  @VisibleForTesting<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>  // TODO: Why is this in here?<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>  byte[] getDummyHeaderForVersion() {<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>  }<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span><a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>  /**<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>  }<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span><a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>  /**<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>   */<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>  HFileContext getHFileContext() {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    return this.fileContext;<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>  }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span><a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>  @Override<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>  public MemoryType getMemoryType() {<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    return this.memType;<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span><a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>   */<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  boolean usesSharedMemory() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return this.memType == MemoryType.SHARED;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * Convert the contents of the block header into a human readable string.<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>   * has minor version &gt; 0.<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>   */<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>  @VisibleForTesting<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    buf.get(magicBuf);<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    long prevBlockOffset = buf.getLong();<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    byte cksumtype = buf.get();<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    long bytesPerChecksum = buf.getInt();<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>                   " blockType " + bt +<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>                   " compressedBlockSizeNoHeader " +<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>                   compressedBlockSizeNoHeader +<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>                   uncompressedBlockSizeNoHeader +<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2106"></a>
+<span class="sourceLineNo">2004</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>  @VisibleForTesting<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    return this.onDiskDataSizeWithHeader;<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>  }<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span><a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>  /**<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>   */<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>  int totalChecksumBytes() {<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    // indicates that cached blocks do not have checksum data because<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    // checksums were already validated when the block was read from disk.<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      return 0;<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>        this.fileContext.getBytesPerChecksum());<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  }<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span><a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>  /**<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>   * Returns the size of this block header.<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>   */<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  public int headerSize() {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>  }<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>  /**<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>   * Maps a minor version to the size of the header.<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>   */<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    return usesHBaseChecksum?<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span><a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>  /**<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>   */<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>  @VisibleForTesting<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>  // TODO: Why is this in here?<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>  byte[] getDummyHeaderForVersion() {<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>  }<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span><a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>  /**<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>   */<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>  }<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span><a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>  /**<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>   */<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>  HFileContext getHFileContext() {<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    return this.fileContext;<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>  }<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span><a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>  @Override<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>  public MemoryType getMemoryType() {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    return this.memType;<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>  }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span><a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>  /**<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>   */<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>  boolean usesSharedMemory() {<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    return this.memType == MemoryType.SHARED;<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>  }<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span><a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>  /**<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>   * Convert the contents of the block header into a human readable string.<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>   * has minor version &gt; 0.<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>   */<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>  @VisibleForTesting<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    buf.get(magicBuf);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>    long prevBlockOffset = buf.getLong();<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    byte cksumtype = buf.get();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    long bytesPerChecksum = buf.getInt();<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>                   " blockType " + bt +<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>                   " compressedBlockSizeNoHeader " +<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>                   compressedBlockSizeNoHeader +<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>                   uncompressedBlockSizeNoHeader +<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  }<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span><a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public HFileBlock deepClone() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    return new HFileBlock(this, true);<a name="line.2106"></a>
 <span class="sourceLineNo">2107</span>  }<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>  public HFileBlock deepClone() {<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    return new HFileBlock(this, true);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>}<a name="line.2112"></a>
+<span class="sourceLineNo">2108</span>}<a name="line.2108"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html
index 995bd6c..18be7ca 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html
@@ -49,44 +49,44 @@
 <span class="sourceLineNo">041</span> */<a name="line.41"></a>
 <span class="sourceLineNo">042</span>@InterfaceAudience.Private<a name="line.42"></a>
 <span class="sourceLineNo">043</span>public class AdaptiveMemStoreCompactionStrategy extends MemStoreCompactionStrategy{<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>  private static final String name = "ADAPTIVE";<a name="line.45"></a>
-<span class="sourceLineNo">046</span>  public static final String ADAPTIVE_COMPACTION_THRESHOLD_KEY =<a name="line.46"></a>
-<span class="sourceLineNo">047</span>      "hbase.hregion.compacting.memstore.adaptive.compaction.threshold";<a name="line.47"></a>
-<span class="sourceLineNo">048</span>  private static final double ADAPTIVE_COMPACTION_THRESHOLD_DEFAULT = 0.5;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>  public static final String ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_KEY =<a name="line.49"></a>
-<span class="sourceLineNo">050</span>      "hbase.hregion.compacting.memstore.adaptive.compaction.probability";<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  private static final double ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_DEFAULT = 0.5;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  private static final double ADAPTIVE_PROBABILITY_FACTOR = 1.02;<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private double compactionThreshold;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  private double initialCompactionProbability;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private double compactionProbability;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  private Random rand = new Random();<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private double numCellsInVersionedList = 0;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  private boolean compacted = false;<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  public AdaptiveMemStoreCompactionStrategy(Configuration conf, String cfName) {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    super(conf, cfName);<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    compactionThreshold = conf.getDouble(ADAPTIVE_COMPACTION_THRESHOLD_KEY,<a name="line.63"></a>
-<span class="sourceLineNo">064</span>        ADAPTIVE_COMPACTION_THRESHOLD_DEFAULT);<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    initialCompactionProbability = conf.getDouble(ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_KEY,<a name="line.65"></a>
-<span class="sourceLineNo">066</span>        ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_DEFAULT);<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    resetStats();<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  }<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  @Override public Action getAction(VersionedSegmentsList versionedList) {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    if (versionedList.getEstimatedUniquesFrac() &lt; 1.0 - compactionThreshold) {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>      double r = rand.nextDouble();<a name="line.72"></a>
-<span class="sourceLineNo">073</span>      if(r &lt; compactionProbability) {<a name="line.73"></a>
-<span class="sourceLineNo">074</span>        numCellsInVersionedList = versionedList.getNumOfCells();<a name="line.74"></a>
-<span class="sourceLineNo">075</span>        compacted = true;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>        return compact(versionedList, name+" (compaction probability="+compactionProbability+")");<a name="line.76"></a>
+<span class="sourceLineNo">044</span>  private static final String NAME = "ADAPTIVE";<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  public static final String ADAPTIVE_COMPACTION_THRESHOLD_KEY =<a name="line.45"></a>
+<span class="sourceLineNo">046</span>      "hbase.hregion.compacting.memstore.adaptive.compaction.threshold";<a name="line.46"></a>
+<span class="sourceLineNo">047</span>  private static final double ADAPTIVE_COMPACTION_THRESHOLD_DEFAULT = 0.5;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>  public static final String ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_KEY =<a name="line.48"></a>
+<span class="sourceLineNo">049</span>      "hbase.hregion.compacting.memstore.adaptive.compaction.probability";<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private static final double ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_DEFAULT = 0.5;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  private static final double ADAPTIVE_PROBABILITY_FACTOR = 1.02;<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>  private double compactionThreshold;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private double initialCompactionProbability;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private double compactionProbability;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>  private Random rand = new Random();<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private double numCellsInVersionedList = 0;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  private boolean compacted = false;<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  public AdaptiveMemStoreCompactionStrategy(Configuration conf, String cfName) {<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    super(conf, cfName);<a name="line.61"></a>
+<span class="sourceLineNo">062</span>    compactionThreshold = conf.getDouble(ADAPTIVE_COMPACTION_THRESHOLD_KEY,<a name="line.62"></a>
+<span class="sourceLineNo">063</span>        ADAPTIVE_COMPACTION_THRESHOLD_DEFAULT);<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    initialCompactionProbability = conf.getDouble(ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_KEY,<a name="line.64"></a>
+<span class="sourceLineNo">065</span>        ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_DEFAULT);<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    resetStats();<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  }<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  @Override public Action getAction(VersionedSegmentsList versionedList) {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    if (versionedList.getEstimatedUniquesFrac() &lt; 1.0 - compactionThreshold) {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>      double r = rand.nextDouble();<a name="line.71"></a>
+<span class="sourceLineNo">072</span>      if(r &lt; compactionProbability) {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>        numCellsInVersionedList = versionedList.getNumOfCells();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>        compacted = true;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>        return compact(versionedList,<a name="line.75"></a>
+<span class="sourceLineNo">076</span>            getName() + " (compaction probability=" + compactionProbability + ")");<a name="line.76"></a>
 <span class="sourceLineNo">077</span>      }<a name="line.77"></a>
 <span class="sourceLineNo">078</span>    }<a name="line.78"></a>
 <span class="sourceLineNo">079</span>    compacted = false;<a name="line.79"></a>
 <span class="sourceLineNo">080</span>    return simpleMergeOrFlatten(versionedList,<a name="line.80"></a>
-<span class="sourceLineNo">081</span>        name+" (compaction probability="+compactionProbability+")");<a name="line.81"></a>
+<span class="sourceLineNo">081</span>        getName() + " (compaction probability=" + compactionProbability + ")");<a name="line.81"></a>
 <span class="sourceLineNo">082</span>  }<a name="line.82"></a>
 <span class="sourceLineNo">083</span><a name="line.83"></a>
 <span class="sourceLineNo">084</span>  @Override<a name="line.84"></a>
@@ -120,7 +120,11 @@
 <span class="sourceLineNo">112</span>    return Action.FLATTEN;<a name="line.112"></a>
 <span class="sourceLineNo">113</span>  }<a name="line.113"></a>
 <span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>}<a name="line.115"></a>
+<span class="sourceLineNo">115</span>  @Override<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  protected  String getName() {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    return NAME;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  }<a name="line.118"></a>
+<span class="sourceLineNo">119</span>}<a name="line.119"></a>
 
 
 


[10/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.html
index 12d10e1..97ceefd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.html
@@ -1740,384 +1740,380 @@
 <span class="sourceLineNo">1732</span>      // and will save us having to seek the stream backwards to reread the header we<a name="line.1732"></a>
 <span class="sourceLineNo">1733</span>      // read the last time through here.<a name="line.1733"></a>
 <span class="sourceLineNo">1734</span>      ByteBuffer headerBuf = getCachedHeader(offset);<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      if (LOG.isTraceEnabled()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        LOG.trace("Reading " + this.fileContext.getHFileName() + " at offset=" + offset +<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>          ", pread=" + pread + ", verifyChecksum=" + verifyChecksum + ", cachedHeader=" +<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>          headerBuf + ", onDiskSizeWithHeader=" + onDiskSizeWithHeader);<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      }<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>      // file has support for checksums (version 2+).<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      long startTime = System.currentTimeMillis();<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>        if (headerBuf == null) {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>          if (LOG.isTraceEnabled()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>          }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>              offset, pread);<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      // the header we read last time through here.<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>      if (headerBuf != null) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        // read. Copy to this block's header.<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>      } else {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>      }<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (verifyChecksum &amp;&amp;<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        return null;<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      if (updateMetrics) {<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        HFile.updateReadLatency(duration, pread);<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>      }<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>      HFileBlock hFileBlock =<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      // Run check on uncompressed sizings.<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>      }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      if (LOG.isTraceEnabled()) {<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>        LOG.trace("Read " + hFileBlock + " in " + duration + " ns");<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      }<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>      // Cache next block header if we read it for the next time through here.<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      }<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      return hFileBlock;<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span><a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    @Override<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span><a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    @Override<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    }<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span><a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    @Override<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      return this.encodedBlockDecodingCtx;<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span><a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    @Override<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return this.defaultDecodingCtx;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span><a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    /**<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>     * If the block doesn't uses checksum, returns false.<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>     * @return True if checksum matches, else false.<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>     */<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>        throws IOException {<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      // checksum validation failure.<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>        return false;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    @Override<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    public void closeStreams() throws IOException {<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      streamWrapper.close();<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    @Override<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    public void unbufferStream() {<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      // unbuffer it.<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>      if (streamLock.tryLock()) {<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>        try {<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>          this.streamWrapper.unbuffer();<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>        } finally {<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>          streamLock.unlock();<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>        }<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>      }<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span><a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    @Override<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    public String toString() {<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    }<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>  }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span><a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  @VisibleForTesting<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>        totalChecksumBytes()) {<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>      throw new IOException("Using no compression but "<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    }<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  }<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span><a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>  // Cacheable implementation<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  @Override<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>  public int getSerializedLength() {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    if (buf != null) {<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      // Include extra bytes for block metadata.<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    return 0;<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  }<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span><a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  // Cacheable implementation<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  @Override<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  public void serialize(ByteBuffer destination) {<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    // Make sure any changes in here are reflected over there.<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    destination = addMetaData(destination);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>    // metadata.<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    destination.flip();<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>  }<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>  /**<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>   * For use by bucketcache. This exposes internals.<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   */<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>  public ByteBuffer getMetaData() {<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    bb = addMetaData(bb);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    bb.flip();<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    return bb;<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span><a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  /**<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>   */<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    destination.putLong(this.offset);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return destination;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  // Cacheable implementation<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>  @Override<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>  }<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span><a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>  @Override<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>  public int hashCode() {<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    int result = 1;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    result = result * 31 + blockType.hashCode();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    result = result * 31 + buf.hashCode();<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    return result;<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>  }<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span><a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  @Override<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>  public boolean equals(Object comparison) {<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    if (this == comparison) {<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>      return true;<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    }<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    if (comparison == null) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>      return false;<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    }<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      return false;<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    }<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span><a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span><a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>      return false;<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    }<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1969"></a>
+<span class="sourceLineNo">1735</span>      LOG.trace("Reading {} at offset={}, pread={}, verifyChecksum={}, cachedHeader={}, " +<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>          "onDiskSizeWithHeader={}", this.fileContext.getHFileName(), offset, pread,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>          verifyChecksum, headerBuf, onDiskSizeWithHeader);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      // file has support for checksums (version 2+).<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      long startTime = System.currentTimeMillis();<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>        if (headerBuf == null) {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>          if (LOG.isTraceEnabled()) {<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          }<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>              offset, pread);<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        }<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      }<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // the header we read last time through here.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      if (headerBuf != null) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>        // read. Copy to this block's header.<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      } else {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      }<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      if (verifyChecksum &amp;&amp;<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        return null;<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      }<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      if (updateMetrics) {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>        HFile.updateReadLatency(duration, pread);<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>      }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      HFileBlock hFileBlock =<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      // Run check on uncompressed sizings.<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>      }<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>      LOG.trace("Read {} in {} ns", hFileBlock, duration);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>      // Cache next block header if we read it for the next time through here.<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      }<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>      return hFileBlock;<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span><a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    @Override<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    }<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span><a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    @Override<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span><a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    @Override<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      return this.encodedBlockDecodingCtx;<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span><a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    @Override<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>      return this.defaultDecodingCtx;<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    }<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span><a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    /**<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>     * If the block doesn't uses checksum, returns false.<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>     * @return True if checksum matches, else false.<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>     */<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        throws IOException {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>      // checksum validation failure.<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        return false;<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>      }<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span><a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    @Override<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    public void closeStreams() throws IOException {<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>      streamWrapper.close();<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    }<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    @Override<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    public void unbufferStream() {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      // unbuffer it.<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>      if (streamLock.tryLock()) {<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        try {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>          this.streamWrapper.unbuffer();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>        } finally {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>          streamLock.unlock();<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      }<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    }<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span><a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    @Override<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    public String toString() {<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>  }<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span><a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>  @VisibleForTesting<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        totalChecksumBytes()) {<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      throw new IOException("Using no compression but "<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span><a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>  // Cacheable implementation<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Override<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public int getSerializedLength() {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    if (buf != null) {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>      // Include extra bytes for block metadata.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    return 0;<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>  }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span><a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>  // Cacheable implementation<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  @Override<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>  public void serialize(ByteBuffer destination) {<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    // Make sure any changes in here are reflected over there.<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    destination = addMetaData(destination);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>    // metadata.<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    destination.flip();<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span><a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>  /**<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * For use by bucketcache. This exposes internals.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  public ByteBuffer getMetaData() {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    bb = addMetaData(bb);<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    bb.flip();<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    return bb;<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>  }<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span><a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  /**<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>   */<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    destination.putLong(this.offset);<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    return destination;<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  }<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span><a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>  // Cacheable implementation<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  @Override<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>  }<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span><a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>  @Override<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>  public int hashCode() {<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    int result = 1;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>    result = result * 31 + blockType.hashCode();<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    result = result * 31 + buf.hashCode();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    return result;<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>  }<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span><a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>  @Override<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>  public boolean equals(Object comparison) {<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    if (this == comparison) {<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>      return true;<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    }<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    if (comparison == null) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>      return false;<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    }<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>      return false;<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    }<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span><a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>      return false;<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    }<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>      return false;<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>    }<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    if (castedComparison.offset != this.offset) {<a name="line.1969"></a>
 <span class="sourceLineNo">1970</span>      return false;<a name="line.1970"></a>
 <span class="sourceLineNo">1971</span>    }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    if (castedComparison.offset != this.offset) {<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      return false;<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    }<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>      return false;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      return false;<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>    }<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1982"></a>
+<span class="sourceLineNo">1972</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>      return false;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>    }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      return false;<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    }<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>      return false;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>        castedComparison.buf.limit()) != 0) {<a name="line.1982"></a>
 <span class="sourceLineNo">1983</span>      return false;<a name="line.1983"></a>
 <span class="sourceLineNo">1984</span>    }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        castedComparison.buf.limit()) != 0) {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      return false;<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    }<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    return true;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>  }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    }<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    return DataBlockEncoding.NONE;<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>  }<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span><a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>  @VisibleForTesting<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>  byte getChecksumType() {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>    return this.fileContext.getChecksumType().getCode();<a name="line.2001"></a>
+<span class="sourceLineNo">1985</span>    return true;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>    }<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    return DataBlockEncoding.NONE;<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>  }<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span><a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>  @VisibleForTesting<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>  byte getChecksumType() {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>  int getBytesPerChecksum() {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2001"></a>
 <span class="sourceLineNo">2002</span>  }<a name="line.2002"></a>
 <span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>  int getBytesPerChecksum() {<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>  }<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>  @VisibleForTesting<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    return this.onDiskDataSizeWithHeader;<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  /**<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>   */<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>  int totalChecksumBytes() {<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    // indicates that cached blocks do not have checksum data because<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>    // checksums were already validated when the block was read from disk.<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      return 0;<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        this.fileContext.getBytesPerChecksum());<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  }<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span><a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>  /**<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>   * Returns the size of this block header.<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>   */<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>  public int headerSize() {<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>  }<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span><a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>  /**<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>   * Maps a minor version to the size of the header.<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>   */<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    return usesHBaseChecksum?<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>  }<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span><a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>  /**<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>   */<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>  @VisibleForTesting<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>  // TODO: Why is this in here?<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>  byte[] getDummyHeaderForVersion() {<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>  }<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span><a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>  /**<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>  }<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span><a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>  /**<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>   */<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>  HFileContext getHFileContext() {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    return this.fileContext;<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>  }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span><a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>  @Override<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>  public MemoryType getMemoryType() {<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    return this.memType;<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span><a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>   */<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  boolean usesSharedMemory() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return this.memType == MemoryType.SHARED;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * Convert the contents of the block header into a human readable string.<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>   * has minor version &gt; 0.<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>   */<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>  @VisibleForTesting<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    buf.get(magicBuf);<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    long prevBlockOffset = buf.getLong();<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    byte cksumtype = buf.get();<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    long bytesPerChecksum = buf.getInt();<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>                   " blockType " + bt +<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>                   " compressedBlockSizeNoHeader " +<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>                   compressedBlockSizeNoHeader +<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>                   uncompressedBlockSizeNoHeader +<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2106"></a>
+<span class="sourceLineNo">2004</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>  @VisibleForTesting<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    return this.onDiskDataSizeWithHeader;<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>  }<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span><a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>  /**<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>   */<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>  int totalChecksumBytes() {<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    // indicates that cached blocks do not have checksum data because<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    // checksums were already validated when the block was read from disk.<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      return 0;<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>        this.fileContext.getBytesPerChecksum());<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  }<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span><a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>  /**<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>   * Returns the size of this block header.<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>   */<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  public int headerSize() {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>  }<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>  /**<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>   * Maps a minor version to the size of the header.<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>   */<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    return usesHBaseChecksum?<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span><a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>  /**<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>   */<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>  @VisibleForTesting<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>  // TODO: Why is this in here?<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>  byte[] getDummyHeaderForVersion() {<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>  }<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span><a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>  /**<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>   */<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>  }<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span><a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>  /**<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>   */<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>  HFileContext getHFileContext() {<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    return this.fileContext;<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>  }<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span><a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>  @Override<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>  public MemoryType getMemoryType() {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    return this.memType;<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>  }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span><a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>  /**<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>   */<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>  boolean usesSharedMemory() {<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    return this.memType == MemoryType.SHARED;<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>  }<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span><a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>  /**<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>   * Convert the contents of the block header into a human readable string.<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>   * has minor version &gt; 0.<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>   */<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>  @VisibleForTesting<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    buf.get(magicBuf);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>    long prevBlockOffset = buf.getLong();<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    byte cksumtype = buf.get();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    long bytesPerChecksum = buf.getInt();<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>                   " blockType " + bt +<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>                   " compressedBlockSizeNoHeader " +<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>                   compressedBlockSizeNoHeader +<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>                   uncompressedBlockSizeNoHeader +<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  }<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span><a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public HFileBlock deepClone() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    return new HFileBlock(this, true);<a name="line.2106"></a>
 <span class="sourceLineNo">2107</span>  }<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>  public HFileBlock deepClone() {<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    return new HFileBlock(this, true);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>}<a name="line.2112"></a>
+<span class="sourceLineNo">2108</span>}<a name="line.2108"></a>
 
 
 


[02/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
index cc35a46..cca21a9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
@@ -190,1967 +190,1967 @@
 <span class="sourceLineNo">182</span><a name="line.182"></a>
 <span class="sourceLineNo">183</span>  private final boolean verifyBulkLoads;<a name="line.183"></a>
 <span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  private final AtomicInteger currentParallelPutCount = new AtomicInteger(0);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private final int parallelPutCountPrintThreshold;<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private ScanInfo scanInfo;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  // All access must be synchronized.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  // TODO: ideally, this should be part of storeFileManager, as we keep passing this to it.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private final List&lt;HStoreFile&gt; filesCompacting = Lists.newArrayList();<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>  // All access must be synchronized.<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  private final Set&lt;ChangedReadersObserver&gt; changedReaderObservers =<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    Collections.newSetFromMap(new ConcurrentHashMap&lt;ChangedReadersObserver, Boolean&gt;());<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>  protected final int blocksize;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  private HFileDataBlockEncoder dataBlockEncoder;<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>  /** Checksum configuration */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  protected ChecksumType checksumType;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  protected int bytesPerChecksum;<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  // Comparing KeyValues<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  protected final CellComparator comparator;<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>  final StoreEngine&lt;?, ?, ?, ?&gt; storeEngine;<a name="line.208"></a>
+<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * Use this counter to track concurrent puts. If TRACE-log is enabled, if we are over the<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * threshold set by hbase.region.store.parallel.put.print.threshold (Default is 50) we will<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   * log a message that identifies the Store experience this high-level of concurrency.<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   */<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  private final AtomicInteger currentParallelPutCount = new AtomicInteger(0);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private final int parallelPutCountPrintThreshold;<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private ScanInfo scanInfo;<a name="line.193"></a>
+<span class="sourceLineNo">194</span><a name="line.194"></a>
+<span class="sourceLineNo">195</span>  // All access must be synchronized.<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  // TODO: ideally, this should be part of storeFileManager, as we keep passing this to it.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  private final List&lt;HStoreFile&gt; filesCompacting = Lists.newArrayList();<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  // All access must be synchronized.<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  private final Set&lt;ChangedReadersObserver&gt; changedReaderObservers =<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    Collections.newSetFromMap(new ConcurrentHashMap&lt;ChangedReadersObserver, Boolean&gt;());<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected final int blocksize;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  private HFileDataBlockEncoder dataBlockEncoder;<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span>  /** Checksum configuration */<a name="line.206"></a>
+<span class="sourceLineNo">207</span>  protected ChecksumType checksumType;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  protected int bytesPerChecksum;<a name="line.208"></a>
 <span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  private static final AtomicBoolean offPeakCompactionTracker = new AtomicBoolean();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  private volatile OffPeakHours offPeakHours;<a name="line.211"></a>
+<span class="sourceLineNo">210</span>  // Comparing KeyValues<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected final CellComparator comparator;<a name="line.211"></a>
 <span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  private static final int DEFAULT_FLUSH_RETRIES_NUMBER = 10;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  private int flushRetriesNumber;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private int pauseTime;<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  private long blockingFileCount;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  private int compactionCheckMultiplier;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  protected Encryption.Context cryptoContext = Encryption.Context.NONE;<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  private AtomicLong flushedCellsCount = new AtomicLong();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  private AtomicLong compactedCellsCount = new AtomicLong();<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  private AtomicLong majorCompactedCellsCount = new AtomicLong();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private AtomicLong flushedCellsSize = new AtomicLong();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private AtomicLong flushedOutputFileSize = new AtomicLong();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private AtomicLong compactedCellsSize = new AtomicLong();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  private AtomicLong majorCompactedCellsSize = new AtomicLong();<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * Constructor<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * @param region<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @param family HColumnDescriptor for this column<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @param confParam configuration object<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * failed.  Can be null.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @throws IOException<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  protected HStore(final HRegion region, final ColumnFamilyDescriptor family,<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      final Configuration confParam) throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>    this.fs = region.getRegionFileSystem();<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>    // Assemble the store's home directory and Ensure it exists.<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    fs.createStoreDir(family.getNameAsString());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    this.region = region;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    this.family = family;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    // 'conf' renamed to 'confParam' b/c we use this.conf in the constructor<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    // CompoundConfiguration will look for keys in reverse order of addition, so we'd<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    // add global config first, then table and cf overrides, then cf metadata.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    this.conf = new CompoundConfiguration()<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      .add(confParam)<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      .addBytesMap(region.getTableDescriptor().getValues())<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      .addStringMap(family.getConfiguration())<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      .addBytesMap(family.getValues());<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    this.blocksize = family.getBlocksize();<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>    // set block storage policy for store directory<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    String policyName = family.getStoragePolicy();<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    if (null == policyName) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      policyName = this.conf.get(BLOCK_STORAGE_POLICY_KEY, DEFAULT_BLOCK_STORAGE_POLICY);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    this.fs.setStoragePolicy(family.getNameAsString(), policyName.trim());<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>    this.dataBlockEncoder =<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        new HFileDataBlockEncoderImpl(family.getDataBlockEncoding());<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>    this.comparator = region.getCellComparator();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    // used by ScanQueryMatcher<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    long timeToPurgeDeletes =<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        Math.max(conf.getLong("hbase.hstore.time.to.purge.deletes", 0), 0);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    LOG.trace("Time to purge deletes set to {}ms in store {}", timeToPurgeDeletes, this);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    // Get TTL<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    long ttl = determineTTLFromFamily(family);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // Why not just pass a HColumnDescriptor in here altogether?  Even if have<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    // to clone it?<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    scanInfo = new ScanInfo(conf, family, ttl, timeToPurgeDeletes, this.comparator);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    if (this.getTableName().isSystemTable()) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      inMemoryCompaction = MemoryCompactionPolicy<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          .valueOf(conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    } else {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    if (inMemoryCompaction == null) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      inMemoryCompaction =<a name="line.284"></a>
-<span class="sourceLineNo">285</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.285"></a>
-<span class="sourceLineNo">286</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    String className;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    switch (inMemoryCompaction) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      case NONE:<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        className = DefaultMemStore.class.getName();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        this.memstore = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            new Object[] { conf, this.comparator });<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        break;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      default:<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          CompactingMemStore.class, CompactingMemStore.class);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        className = clz.getName();<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        this.memstore = ReflectionUtils.newInstance(clz, new Object[] { conf, this.comparator, this,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction });<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    this.offPeakHours = OffPeakHours.getInstance(conf);<a name="line.302"></a>
+<span class="sourceLineNo">213</span>  final StoreEngine&lt;?, ?, ?, ?&gt; storeEngine;<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>  private static final AtomicBoolean offPeakCompactionTracker = new AtomicBoolean();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  private volatile OffPeakHours offPeakHours;<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  private static final int DEFAULT_FLUSH_RETRIES_NUMBER = 10;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  private int flushRetriesNumber;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  private int pauseTime;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>  private long blockingFileCount;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private int compactionCheckMultiplier;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  protected Encryption.Context cryptoContext = Encryption.Context.NONE;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  private AtomicLong flushedCellsCount = new AtomicLong();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  private AtomicLong compactedCellsCount = new AtomicLong();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>  private AtomicLong majorCompactedCellsCount = new AtomicLong();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  private AtomicLong flushedCellsSize = new AtomicLong();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  private AtomicLong flushedOutputFileSize = new AtomicLong();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  private AtomicLong compactedCellsSize = new AtomicLong();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  private AtomicLong majorCompactedCellsSize = new AtomicLong();<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>   * Constructor<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * @param region<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * @param family HColumnDescriptor for this column<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param confParam configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * failed.  Can be null.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * @throws IOException<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  protected HStore(final HRegion region, final ColumnFamilyDescriptor family,<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      final Configuration confParam) throws IOException {<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    this.fs = region.getRegionFileSystem();<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // Assemble the store's home directory and Ensure it exists.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    fs.createStoreDir(family.getNameAsString());<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    this.region = region;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    this.family = family;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // 'conf' renamed to 'confParam' b/c we use this.conf in the constructor<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    // CompoundConfiguration will look for keys in reverse order of addition, so we'd<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    // add global config first, then table and cf overrides, then cf metadata.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    this.conf = new CompoundConfiguration()<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      .add(confParam)<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      .addBytesMap(region.getTableDescriptor().getValues())<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      .addStringMap(family.getConfiguration())<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      .addBytesMap(family.getValues());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    this.blocksize = family.getBlocksize();<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // set block storage policy for store directory<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    String policyName = family.getStoragePolicy();<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    if (null == policyName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      policyName = this.conf.get(BLOCK_STORAGE_POLICY_KEY, DEFAULT_BLOCK_STORAGE_POLICY);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    this.fs.setStoragePolicy(family.getNameAsString(), policyName.trim());<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    this.dataBlockEncoder = new HFileDataBlockEncoderImpl(family.getDataBlockEncoding());<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>    this.comparator = region.getCellComparator();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    // used by ScanQueryMatcher<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    long timeToPurgeDeletes =<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        Math.max(conf.getLong("hbase.hstore.time.to.purge.deletes", 0), 0);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    LOG.trace("Time to purge deletes set to {}ms in store {}", timeToPurgeDeletes, this);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    // Get TTL<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    long ttl = determineTTLFromFamily(family);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // Why not just pass a HColumnDescriptor in here altogether?  Even if have<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    // to clone it?<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    scanInfo = new ScanInfo(conf, family, ttl, timeToPurgeDeletes, this.comparator);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    this.memstore = getMemstore();<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>    this.offPeakHours = OffPeakHours.getInstance(conf);<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // Setting up cache configuration for this family<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    createCacheConf(family);<a name="line.285"></a>
+<span class="sourceLineNo">286</span><a name="line.286"></a>
+<span class="sourceLineNo">287</span>    this.verifyBulkLoads = conf.getBoolean("hbase.hstore.bulkload.verify", false);<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    this.blockingFileCount =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        conf.getInt(BLOCKING_STOREFILES_KEY, DEFAULT_BLOCKING_STOREFILE_COUNT);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    this.compactionCheckMultiplier = conf.getInt(<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        COMPACTCHECKER_INTERVAL_MULTIPLIER_KEY, DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    if (this.compactionCheckMultiplier &lt;= 0) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      LOG.error("Compaction check period multiplier must be positive, setting default: {}",<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      this.compactionCheckMultiplier = DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    if (HStore.closeCheckInterval == 0) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      HStore.closeCheckInterval = conf.getInt(<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          "hbase.hstore.close.check.interval", 10*1000*1000 /* 10 MB */);<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>    // Setting up cache configuration for this family<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    createCacheConf(family);<a name="line.305"></a>
+<span class="sourceLineNo">304</span>    this.storeEngine = createStoreEngine(this, this.conf, this.comparator);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    this.storeEngine.getStoreFileManager().loadFiles(loadStoreFiles());<a name="line.305"></a>
 <span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    this.verifyBulkLoads = conf.getBoolean("hbase.hstore.bulkload.verify", false);<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>    this.blockingFileCount =<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        conf.getInt(BLOCKING_STOREFILES_KEY, DEFAULT_BLOCKING_STOREFILE_COUNT);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    this.compactionCheckMultiplier = conf.getInt(<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        COMPACTCHECKER_INTERVAL_MULTIPLIER_KEY, DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    if (this.compactionCheckMultiplier &lt;= 0) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      LOG.error("Compaction check period multiplier must be positive, setting default: {}",<a name="line.314"></a>
-<span class="sourceLineNo">315</span>          DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      this.compactionCheckMultiplier = DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>    if (HStore.closeCheckInterval == 0) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      HStore.closeCheckInterval = conf.getInt(<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          "hbase.hstore.close.check.interval", 10*1000*1000 /* 10 MB */);<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>    this.storeEngine = createStoreEngine(this, this.conf, this.comparator);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    this.storeEngine.getStoreFileManager().loadFiles(loadStoreFiles());<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // Initialize checksum type from name. The names are CRC32, CRC32C, etc.<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    this.checksumType = getChecksumType(conf);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    // Initialize bytes per checksum<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    this.bytesPerChecksum = getBytesPerChecksum(conf);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    flushRetriesNumber = conf.getInt(<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        "hbase.hstore.flush.retries.number", DEFAULT_FLUSH_RETRIES_NUMBER);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    pauseTime = conf.getInt(HConstants.HBASE_SERVER_PAUSE, HConstants.DEFAULT_HBASE_SERVER_PAUSE);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    if (flushRetriesNumber &lt;= 0) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      throw new IllegalArgumentException(<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          "hbase.hstore.flush.retries.number must be &gt; 0, not "<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              + flushRetriesNumber);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    cryptoContext = EncryptionUtil.createEncryptionContext(conf, family);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    int confPrintThreshold = conf.getInt("hbase.region.store.parallel.put.print.threshold", 50);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    if (confPrintThreshold &lt; 10) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      confPrintThreshold = 10;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    this.parallelPutCountPrintThreshold = confPrintThreshold;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    LOG.info("Memstore class name is " + className + " ; parallelPutCountPrintThreshold="<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        + parallelPutCountPrintThreshold);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /**<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * Creates the cache config.<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @param family The current column family.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   */<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    this.cacheConf = new CacheConfig(conf, family);<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>  /**<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   * Creates the store engine configured for the given Store.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   *              being passed to coprocessors via the compactor.<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   * @param conf Store configuration.<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   * @return StoreEngine to use.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   */<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      CellComparator kvComparator) throws IOException {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    return StoreEngine.create(store, conf, comparator);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>  /**<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * @param family<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * @return TTL in seconds of the specified family<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    long ttl = family.getTimeToLive();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    if (ttl == HConstants.FOREVER) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      // Default is unlimited ttl.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      ttl = Long.MAX_VALUE;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    } else if (ttl == -1) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      ttl = Long.MAX_VALUE;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    } else {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      // Second -&gt; ms adjust for user data<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      ttl *= 1000;<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    return ttl;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>  @Override<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  public String getColumnFamilyName() {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    return this.family.getNameAsString();<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>  @Override<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  public TableName getTableName() {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    return this.getRegionInfo().getTable();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>  @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public FileSystem getFileSystem() {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return this.fs.getFileSystem();<a name="line.402"></a>
+<span class="sourceLineNo">307</span>    // Initialize checksum type from name. The names are CRC32, CRC32C, etc.<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    this.checksumType = getChecksumType(conf);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // Initialize bytes per checksum<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    this.bytesPerChecksum = getBytesPerChecksum(conf);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    flushRetriesNumber = conf.getInt(<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        "hbase.hstore.flush.retries.number", DEFAULT_FLUSH_RETRIES_NUMBER);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    pauseTime = conf.getInt(HConstants.HBASE_SERVER_PAUSE, HConstants.DEFAULT_HBASE_SERVER_PAUSE);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (flushRetriesNumber &lt;= 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      throw new IllegalArgumentException(<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          "hbase.hstore.flush.retries.number must be &gt; 0, not "<a name="line.316"></a>
+<span class="sourceLineNo">317</span>              + flushRetriesNumber);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    cryptoContext = EncryptionUtil.createEncryptionContext(conf, family);<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>    int confPrintThreshold =<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        this.conf.getInt("hbase.region.store.parallel.put.print.threshold", 50);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    if (confPrintThreshold &lt; 10) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      confPrintThreshold = 10;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    this.parallelPutCountPrintThreshold = confPrintThreshold;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    LOG.info("Store={},  memstore type={}, storagePolicy={}, verifyBulkLoads={}, " +<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            "parallelPutCountPrintThreshold={}", getColumnFamilyName(),<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        this.memstore.getClass().getSimpleName(), policyName,<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        this.verifyBulkLoads, this.parallelPutCountPrintThreshold);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
+<span class="sourceLineNo">332</span><a name="line.332"></a>
+<span class="sourceLineNo">333</span>  /**<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * @return MemStore Instance to use in this store.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private MemStore getMemstore() {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    MemStore ms = null;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    // Check if in-memory-compaction configured. Note MemoryCompactionPolicy is an enum!<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    if (this.getTableName().isSystemTable()) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      inMemoryCompaction = MemoryCompactionPolicy.valueOf(<a name="line.341"></a>
+<span class="sourceLineNo">342</span>          conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    } else {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    if (inMemoryCompaction == null) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      inMemoryCompaction =<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.348"></a>
+<span class="sourceLineNo">349</span>              CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT));<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    switch (inMemoryCompaction) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      case NONE:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        ms = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.353"></a>
+<span class="sourceLineNo">354</span>            new Object[]{conf, this.comparator});<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        break;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      default:<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            CompactingMemStore.class, CompactingMemStore.class);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        ms = ReflectionUtils.newInstance(clz, new Object[]{conf, this.comparator, this,<a name="line.359"></a>
+<span class="sourceLineNo">360</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction});<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    return ms;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  /**<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * Creates the cache config.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   * @param family The current column family.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    this.cacheConf = new CacheConfig(conf, family);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<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>   * Creates the store engine configured for the given Store.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   *              being passed to coprocessors via the compactor.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @param conf Store configuration.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * @return StoreEngine to use.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      CellComparator kvComparator) throws IOException {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    return StoreEngine.create(store, conf, comparator);<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>  /**<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * @param family<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   * @return TTL in seconds of the specified family<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   */<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    long ttl = family.getTimeToLive();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    if (ttl == HConstants.FOREVER) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      // Default is unlimited ttl.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      ttl = Long.MAX_VALUE;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    } else if (ttl == -1) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      ttl = Long.MAX_VALUE;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    } else {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      // Second -&gt; ms adjust for user data<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      ttl *= 1000;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return ttl;<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>  public HRegionFileSystem getRegionFileSystem() {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    return this.fs;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  /* Implementation of StoreConfigInformation */<a name="line.409"></a>
+<span class="sourceLineNo">405</span>  @Override<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  public String getColumnFamilyName() {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    return this.family.getNameAsString();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
 <span class="sourceLineNo">410</span>  @Override<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  public long getStoreFileTtl() {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // TTL only applies if there's no MIN_VERSIONs setting on the column.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return (this.scanInfo.getMinVersions() == 0) ? this.scanInfo.getTtl() : Long.MAX_VALUE;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public long getMemStoreFlushSize() {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    // TODO: Why is this in here?  The flushsize of the region rather than the store?  St.Ack<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    return this.region.memstoreFlushSize;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  @Override<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  public MemStoreSize getFlushableSize() {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    return this.memstore.getFlushableSize();<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>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public MemStoreSize getSnapshotSize() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return this.memstore.getSnapshotSize();<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public long getCompactionCheckMultiplier() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return this.compactionCheckMultiplier;<a name="line.434"></a>
+<span class="sourceLineNo">411</span>  public TableName getTableName() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return this.getRegionInfo().getTable();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  @Override<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  public FileSystem getFileSystem() {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    return this.fs.getFileSystem();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>  public HRegionFileSystem getRegionFileSystem() {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    return this.fs;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
+<span class="sourceLineNo">423</span><a name="line.423"></a>
+<span class="sourceLineNo">424</span>  /* Implementation of StoreConfigInformation */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  public long getStoreFileTtl() {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    // TTL only applies if there's no MIN_VERSIONs setting on the column.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    return (this.scanInfo.getMinVersions() == 0) ? this.scanInfo.getTtl() : Long.MAX_VALUE;<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>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  public long getMemStoreFlushSize() {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    // TODO: Why is this in here?  The flushsize of the region rather than the store?  St.Ack<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    return this.region.memstoreFlushSize;<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>  @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public long getBlockingFileCount() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return blockingFileCount;<a name="line.439"></a>
+<span class="sourceLineNo">438</span>  public MemStoreSize getFlushableSize() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return this.memstore.getFlushableSize();<a name="line.439"></a>
 <span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  /* End implementation of StoreConfigInformation */<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>   * Returns the configured bytesPerChecksum value.<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * @param conf The configuration<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   * @return The bytesPerChecksum that is set in the configuration<a name="line.446"></a>
-<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public static int getBytesPerChecksum(Configuration conf) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    return conf.getInt(HConstants.BYTES_PER_CHECKSUM,<a name="line.449"></a>
-<span class="sourceLineNo">450</span>                       HFile.DEFAULT_BYTES_PER_CHECKSUM);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  /**<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * Returns the configured checksum algorithm.<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * @param conf The configuration<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return The checksum algorithm that is set in the configuration<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public static ChecksumType getChecksumType(Configuration conf) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    String checksumName = conf.get(HConstants.CHECKSUM_TYPE_NAME);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    if (checksumName == null) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      return ChecksumType.getDefaultChecksumType();<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    } else {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      return ChecksumType.nameToType(checksumName);<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><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * @return how many bytes to write between status checks<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   */<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  public static int getCloseCheckInterval() {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    return closeCheckInterval;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public ColumnFamilyDescriptor getColumnFamilyDescriptor() {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    return this.family;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>  }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>  @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  public OptionalLong getMaxSequenceId() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    return StoreUtils.getMaxSequenceIdInList(this.getStorefiles());<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  public OptionalLong getMaxMemStoreTS() {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    return StoreUtils.getMaxMemStoreTSInList(this.getStorefiles());<a name="line.486"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public MemStoreSize getSnapshotSize() {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    return this.memstore.getSnapshotSize();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public long getCompactionCheckMultiplier() {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    return this.compactionCheckMultiplier;<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>  @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  public long getBlockingFileCount() {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    return blockingFileCount;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  /* End implementation of StoreConfigInformation */<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>   * Returns the configured bytesPerChecksum value.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * @param conf The configuration<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * @return The bytesPerChecksum that is set in the configuration<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   */<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public static int getBytesPerChecksum(Configuration conf) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return conf.getInt(HConstants.BYTES_PER_CHECKSUM,<a name="line.464"></a>
+<span class="sourceLineNo">465</span>                       HFile.DEFAULT_BYTES_PER_CHECKSUM);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  }<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>  /**<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * Returns the configured checksum algorithm.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * @param conf The configuration<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * @return The checksum algorithm that is set in the configuration<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   */<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public static ChecksumType getChecksumType(Configuration conf) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    String checksumName = conf.get(HConstants.CHECKSUM_TYPE_NAME);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    if (checksumName == null) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      return ChecksumType.getDefaultChecksumType();<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    } else {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      return ChecksumType.nameToType(checksumName);<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>  /**<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * @return how many bytes to write between status checks<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  public static int getCloseCheckInterval() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    return closeCheckInterval;<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>  /**<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * @param hri {@link RegionInfo} for the region.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @return Path to family/Store home directory.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   */<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  @Deprecated<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      final RegionInfo hri, final byte[] family) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return getStoreHomedir(tabledir, hri.getEncodedName(), family);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>  /**<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * @param encodedName Encoded region name.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.504"></a>
-<span class="sourceLineNo">505</span>   * @return Path to family/Store home directory.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>   */<a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Deprecated<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      final String encodedName, final byte[] family) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return new Path(tabledir, new Path(encodedName, Bytes.toString(family)));<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  }<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>   * @return the data block encoder<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   */<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  public HFileDataBlockEncoder getDataBlockEncoder() {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    return dataBlockEncoder;<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  }<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>   * Should be used only in tests.<a name="line.521"></a>
-<span class="sourceLineNo">522</span>   * @param blockEncoder the block delta encoder to use<a name="line.522"></a>
-<span class="sourceLineNo">523</span>   */<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  void setDataBlockEncoderInTest(HFileDataBlockEncoder blockEncoder) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    this.dataBlockEncoder = blockEncoder;<a name="line.525"></a>
+<span class="sourceLineNo">489</span>  @Override<a name="line.489"></a>
+<span class="sourceLineNo">490</span>  public ColumnFamilyDescriptor getColumnFamilyDescriptor() {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    return this.family;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
+<span class="sourceLineNo">493</span><a name="line.493"></a>
+<span class="sourceLineNo">494</span>  @Override<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  public OptionalLong getMaxSequenceId() {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    return StoreUtils.getMaxSequenceIdInList(this.getStorefiles());<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>  @Override<a name="line.499"></a>
+<span class="sourceLineNo">500</span>  public OptionalLong getMaxMemStoreTS() {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    return StoreUtils.getMaxMemStoreTSInList(this.getStorefiles());<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>  /**<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @param hri {@link RegionInfo} for the region.<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.507"></a>
+<span class="sourceLineNo">508</span>   * @return Path to family/Store home directory.<a name="line.508"></a>
+<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  @Deprecated<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      final RegionInfo hri, final byte[] family) {<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    return getStoreHomedir(tabledir, hri.getEncodedName(), family);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  /**<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   * @param encodedName Encoded region name.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * @return Path to family/Store home directory.<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  @Deprecated<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      final String encodedName, final byte[] family) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return new Path(tabledir, new Path(encodedName, Bytes.toString(family)));<a name="line.525"></a>
 <span class="sourceLineNo">526</span>  }<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>   * Creates an unsorted list of StoreFile loaded in parallel<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * from the given directory.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @throws IOException<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  private List&lt;HStoreFile&gt; loadStoreFiles() throws IOException {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    Collection&lt;StoreFileInfo&gt; files = fs.getStoreFiles(getColumnFamilyName());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    return openStoreFiles(files);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  private List&lt;HStoreFile&gt; openStoreFiles(Collection&lt;StoreFileInfo&gt; files) throws IOException {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    if (CollectionUtils.isEmpty(files)) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      return Collections.emptyList();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    }<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    // initialize the thread pool for opening store files in parallel..<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    ThreadPoolExecutor storeFileOpenerThreadPool =<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      this.region.getStoreFileOpenAndCloseThreadPool("StoreFileOpenerThread-" +<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          this.getColumnFamilyName());<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    CompletionService&lt;HStoreFile&gt; completionService = new ExecutorCompletionService&lt;&gt;(storeFileOpenerThreadPool);<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>    int totalValidStoreFile = 0;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    for (StoreFileInfo storeFileInfo : files) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      // open each store file in parallel<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      completionService.submit(() -&gt; this.createStoreFileAndReader(storeFileInfo));<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      totalValidStoreFile++;<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    ArrayList&lt;HStoreFile&gt; results = new ArrayList&lt;&gt;(files.size());<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    IOException ioe = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      for (int i = 0; i &lt; totalValidStoreFile; i++) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>        try {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>          HStoreFile storeFile = completionService.take().get();<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          if (storeFile != null) {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>            long length = storeFile.getReader().length();<a name="line.562"></a>
-<span class="sourceLineNo">563</span>            this.storeSize.addAndGet(length);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>            this.totalUncompressedBytes<a name="line.564"></a>
-<span class="sourceLineNo">565</span>                .addAndGet(storeFile.getReader().getTotalUncompressedBytes());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>            LOG.debug("loaded {}", storeFile);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>            results.add(storeFile);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        } catch (InterruptedException e) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          if (ioe == null) ioe = new InterruptedIOException(e.getMessage());<a name="line.570"></a>
-<span class="sourceLineNo">571</span>        } catch (ExecutionException e) {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          if (ioe == null) ioe = new IOException(e.getCause());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        }<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      }<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    } finally {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      storeFileOpenerThreadPool.shutdownNow();<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    }<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    if (ioe != null) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      // close StoreFile readers<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      boolean evictOnClose =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (HStoreFile file : results) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        try {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          if (file != null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            file.closeStoreFile(evictOnClose);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        } catch (IOException e) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          LOG.warn("Could not close store file", e);<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>      throw ioe;<a name="line.591"></a>
+<span class="sourceLineNo">529</span>   * @return the data block encoder<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   */<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  public HFileDataBlockEncoder getDataBlockEncoder() {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    return dataBlockEncoder;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>  }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>  /**<a name="line.535"></a>
+<span class="sourceLineNo">536</span>   * Should be used only in tests.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>   * @param blockEncoder the block delta encoder to use<a name="line.537"></a>
+<span class="sourceLineNo">538</span>   */<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  void setDataBlockEncoderInTest(HFileDataBlockEncoder blockEncoder) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    this.dataBlockEncoder = blockEncoder;<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  }<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>  /**<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   * Creates an unsorted list of StoreFile loaded in parallel<a name="line.544"></a>
+<span class="sourceLineNo">545</span>   * from the given directory.<a name="line.545"></a>
+<span class="sourceLineNo">546</span>   * @throws IOException<a name="line.546"></a>
+<span class="sourceLineNo">547</span>   */<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  private List&lt;HStoreFile&gt; loadStoreFiles() throws IOException {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    Collection&lt;StoreFileInfo&gt; files = fs.getStoreFiles(getColumnFamilyName());<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    return openStoreFiles(files);<a name="line.550"></a>
+<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>  private List&lt;HStoreFile&gt; openStoreFiles(Collection&lt;StoreFileInfo&gt; files) throws IOException {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    if (CollectionUtils.isEmpty(files)) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      return Collections.emptyList();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    // initialize the thread pool for opening store files in parallel..<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    ThreadPoolExecutor storeFileOpenerThreadPool =<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      this.region.getStoreFileOpenAndCloseThreadPool("StoreFileOpenerThread-" +<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          this.getColumnFamilyName());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    CompletionService&lt;HStoreFile&gt; completionService = new ExecutorCompletionService&lt;&gt;(storeFileOpenerThreadPool);<a name="line.561"></a>
+<span class="sourceLineNo">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>    int totalValidStoreFile = 0;<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    for (StoreFileInfo storeFileInfo : files) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      // open each store file in parallel<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      completionService.submit(() -&gt; this.createStoreFileAndReader(storeFileInfo));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      totalValidStoreFile++;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>    ArrayList&lt;HStoreFile&gt; results = new ArrayList&lt;&gt;(files.size());<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    IOException ioe = null;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      for (int i = 0; i &lt; totalValidStoreFile; i++) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        try {<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          HStoreFile storeFile = completionService.take().get();<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          if (storeFile != null) {<a name="line.576"></a>
+<span class="sourceLineNo">577</span>            long length = storeFile.getReader().length();<a name="line.577"></a>
+<span class="sourceLineNo">578</span>            this.storeSize.addAndGet(length);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>            this.totalUncompressedBytes<a name="line.579"></a>
+<span class="sourceLineNo">580</span>                .addAndGet(storeFile.getReader().getTotalUncompressedBytes());<a name="line.580"></a>
+<span class="sourceLineNo">581</span>            LOG.debug("loaded {}", storeFile);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>            results.add(storeFile);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          }<a name="line.583"></a>
+<span class="sourceLineNo">584</span>        } catch (InterruptedException e) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          if (ioe == null) ioe = new InterruptedIOException(e.getMessage());<a name="line.585"></a>
+<span class="sourceLineNo">586</span>        } catch (ExecutionException e) {<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          if (ioe == null) ioe = new IOException(e.getCause());<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        }<a name="line.588"></a>
+<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    } finally {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      storeFileOpenerThreadPool.shutdownNow();<a name="line.591"></a>
 <span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    return results;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  }<a name="line.595"></a>
-<span class="sourceLineNo">596</span><a name="line.596"></a>
-<span class="sourceLineNo">597</span>  @Override<a name="line.597"></a>
-<span class="sourceLineNo">598</span>  public void refreshStoreFiles() throws IOException {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Collection&lt;StoreFileInfo&gt; newFiles = fs.getStoreFiles(getColumnFamilyName());<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    refreshStoreFilesInternal(newFiles);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>  }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>  /**<a name="line.603"></a>
-<span class="sourceLineNo">604</span>   * Replaces the store files that the store has with the given files. Mainly used by secondary<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   * region replicas to keep up to date with the primary region files.<a name="line.605"></a>
-<span class="sourceLineNo">606</span>   * @throws IOException<a name="line.606"></a>
-<span class="sourceLineNo">607</span>   */<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  public void refreshStoreFiles(Collection&lt;String&gt; newFiles) throws IOException {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    List&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(newFiles.size());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    for (String file : newFiles) {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      storeFiles.add(fs.getStoreFileInfo(getColumnFamilyName(), file));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    refreshStoreFilesInternal(storeFiles);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  /**<a name="line.616"></a>
-<span class="sourceLineNo">617</span>   * Checks the underlying store files, and opens the files that  have not<a name="line.617"></a>
-<span class="sourceLineNo">618</span>   * been opened, and removes the store file readers for store files no longer<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * available. Mainly used by secondary region replicas to keep up to date with<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * the primary region files.<a name="line.620"></a>
+<span class="sourceLineNo">593</span>    if (ioe != null) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      // close StoreFile readers<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      boolean evictOnClose =<a name="line.595"></a>
+<span class="sourceLineNo">596</span>          cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      for (HStoreFile file : results) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        try {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          if (file != null) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>            file.closeStoreFile(evictOnClose);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          }<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        } catch (IOException e) {<a name="line.602"></a>
+<span class="sourceLineNo">603</span>          LOG.warn("Could not close store file", e);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      }<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      throw ioe;<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    }<a name="line.607"></a>
+<span class="sourceLineNo">608</span><a name="line.608"></a>
+<span class="sourceLineNo">609</span>    return results;<a name="line.609"></a>
+<span class="sourceLineNo">610</span>  }<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>  @Override<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  public void refreshStoreFiles() throws IOException {<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    Collection&lt;StoreFileInfo&gt; newFiles = fs.getStoreFiles(getColumnFamilyName());<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    refreshStoreFilesInternal(newFiles);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>   * Replaces the store files that the store has with the given files. Mainly used by secondary<a name="line.619"></a>
+<span class="sourceLineNo">620</span>   * region replicas to keep up to date with the primary region files.<a name="line.620"></a>
 <span class="sourceLineNo">621</span>   * @throws IOException<a name="line.621"></a>
 <span class="sourceLineNo">622</span>   */<a name="line.622"></a>
-<span class="sourceLineNo">623</span>  private void refreshStoreFilesInternal(Collection&lt;StoreFileInfo&gt; newFiles) throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    StoreFileManager sfm = storeEngine.getStoreFileManager();<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    Collection&lt;HStoreFile&gt; currentFiles = sfm.getStorefiles();<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    Collection&lt;HStoreFile&gt; compactedFiles = sfm.getCompactedfiles();<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    if (currentFiles == null) currentFiles = Collections.emptySet();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    if (newFiles == null) newFiles = Collections.emptySet();<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    if (compactedFiles == null) compactedFiles = Collections.emptySet();<a name="line.629"></a>
+<span class="sourceLineNo">623</span>  public void refreshStoreFiles(Collection&lt;String&gt; newFiles) throws IOException {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    List&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(newFiles.size());<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    for (String file : newFiles) {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      storeFiles.add(fs.getStoreFileInfo(getColumnFamilyName(), file));<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    refreshStoreFilesInternal(storeFiles);<a name="line.628"></a>
+<span class="sourceLineNo">629</span>  }<a name="line.629"></a>
 <span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; currentFilesSet = new HashMap&lt;&gt;(currentFiles.size());<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    for (HStoreFile sf : currentFiles) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      currentFilesSet.put(sf.getFileInfo(), sf);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; compactedFilesSet = new HashMap&lt;&gt;(compactedFiles.size());<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    for (HStoreFile sf : compactedFiles) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      compactedFilesSet.put(sf.getFileInfo(), sf);<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>    Set&lt;StoreFileInfo&gt; newFilesSet = new HashSet&lt;StoreFileInfo&gt;(newFiles);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Exclude the files that have already been compacted<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    newFilesSet = Sets.difference(newFilesSet, compactedFilesSet.keySet());<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    Set&lt;StoreFileInfo&gt; toBeAddedFiles = Sets.difference(newFilesSet, currentFilesSet.keySet());<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    Set&lt;StoreFileInfo&gt; toBeRemovedFiles = Sets.difference(currentFilesSet.keySet(), newFilesSet);<a name="line.644"></a>
+<span class="sourceLineNo">631</span>  /**<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * Checks the underlying store files, and opens the files that  have not<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * been opened, and removes the store file readers for store files no longer<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * available. Mainly used by secondary region replicas to keep up to date with<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * the primary region files.<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * @throws IOException<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   */<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  private void refreshStoreFilesInternal(Collection&lt;StoreFileInfo&gt; newFiles) throws IOException {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    StoreFileManager sfm = storeEngine.getStoreFileManager();<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    Collection&lt;HStoreFile&gt; currentFiles = sfm.getStorefiles();<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    Collection&lt;HStoreFile&gt; compactedFiles = sfm.getCompactedfiles();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    if (currentFiles == null) currentFiles = Collections.emptySet();<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    if (newFiles == null) newFiles = Collections.emptySet();<a name="line.643"></a>
+<span cla

<TRUNCATED>

[08/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html
index c24fb8f..d1de577 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html
@@ -37,18 +37,22 @@
 <span class="sourceLineNo">029</span> */<a name="line.29"></a>
 <span class="sourceLineNo">030</span>@InterfaceAudience.Private<a name="line.30"></a>
 <span class="sourceLineNo">031</span>public class BasicMemStoreCompactionStrategy extends MemStoreCompactionStrategy{<a name="line.31"></a>
-<span class="sourceLineNo">032</span><a name="line.32"></a>
-<span class="sourceLineNo">033</span>  private static final String name = "BASIC";<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>  public BasicMemStoreCompactionStrategy(Configuration conf, String cfName) {<a name="line.35"></a>
-<span class="sourceLineNo">036</span>    super(conf, cfName);<a name="line.36"></a>
-<span class="sourceLineNo">037</span>  }<a name="line.37"></a>
-<span class="sourceLineNo">038</span><a name="line.38"></a>
-<span class="sourceLineNo">039</span>  @Override<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  public Action getAction(VersionedSegmentsList versionedList) {<a name="line.40"></a>
-<span class="sourceLineNo">041</span>    return simpleMergeOrFlatten(versionedList, name);<a name="line.41"></a>
-<span class="sourceLineNo">042</span>  }<a name="line.42"></a>
-<span class="sourceLineNo">043</span>}<a name="line.43"></a>
+<span class="sourceLineNo">032</span>  private static final String NAME = "BASIC";<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>  public BasicMemStoreCompactionStrategy(Configuration conf, String cfName) {<a name="line.34"></a>
+<span class="sourceLineNo">035</span>    super(conf, cfName);<a name="line.35"></a>
+<span class="sourceLineNo">036</span>  }<a name="line.36"></a>
+<span class="sourceLineNo">037</span><a name="line.37"></a>
+<span class="sourceLineNo">038</span>  @Override<a name="line.38"></a>
+<span class="sourceLineNo">039</span>  public Action getAction(VersionedSegmentsList versionedList) {<a name="line.39"></a>
+<span class="sourceLineNo">040</span>    return simpleMergeOrFlatten(versionedList, getName());<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  }<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>  @Override<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  protected String getName() {<a name="line.44"></a>
+<span class="sourceLineNo">045</span>    return NAME;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  }<a name="line.46"></a>
+<span class="sourceLineNo">047</span>}<a name="line.47"></a>
 
 
 


[20/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html b/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
index 2a7cd58..ef42115 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
@@ -697,7 +697,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>createMemStoreCompactor</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.125">createMemStoreCompactor</a>(<a href="../../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase">MemoryCompactionPolicy</a>&nbsp;compactionPolicy)
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.129">createMemStoreCompactor</a>(<a href="../../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase">MemoryCompactionPolicy</a>&nbsp;compactionPolicy)
                                              throws <a href="../../../../../org/apache/hadoop/hbase/exceptions/IllegalArgumentIOException.html" title="class in org.apache.hadoop.hbase.exceptions">IllegalArgumentIOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -711,7 +711,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>initInmemoryFlushSize</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.130">initInmemoryFlushSize</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.134">initInmemoryFlushSize</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="size--">
@@ -720,7 +720,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>size</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.155">size</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.157">size</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Total memory occupied by this MemStore. This won't include any size occupied by the
@@ -736,7 +736,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>preFlushSeqIDEstimation</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.170">preFlushSeqIDEstimation</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.172">preFlushSeqIDEstimation</a>()</pre>
 <div class="block">This method is called before the flush is executed.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -751,7 +751,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>isSloppy</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.182">isSloppy</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.184">isSloppy</a>()</pre>
 </li>
 </ul>
 <a name="snapshot--">
@@ -760,7 +760,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshot</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.194">snapshot</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.196">snapshot</a>()</pre>
 <div class="block">Push the current active memstore segment into the pipeline
  and create a snapshot of the tail of current compaction pipeline
  Snapshot must be cleared by call to <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#clearSnapshot-long-"><code>AbstractMemStore.clearSnapshot(long)</code></a>.
@@ -777,7 +777,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushableSize</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.222">getFlushableSize</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.224">getFlushableSize</a>()</pre>
 <div class="block">On flush, how much memory we will clear.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -791,7 +791,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>keySize</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.238">keySize</a>()</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.240">keySize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#keySize--">keySize</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html" title="class in org.apache.hadoop.hbase.regionserver">AbstractMemStore</a></code></dd>
@@ -806,7 +806,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>heapSize</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.248">heapSize</a>()</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.250">heapSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#heapSize--">heapSize</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html" title="class in org.apache.hadoop.hbase.regionserver">AbstractMemStore</a></code></dd>
@@ -822,7 +822,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>updateLowestUnflushedSequenceIdInWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.258">updateLowestUnflushedSequenceIdInWAL</a>(boolean&nbsp;onlyIfGreater)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.260">updateLowestUnflushedSequenceIdInWAL</a>(boolean&nbsp;onlyIfGreater)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#updateLowestUnflushedSequenceIdInWAL-boolean-">AbstractMemStore</a></code></span></div>
 <div class="block">Updates the wal with the lowest sequence id (oldest entry) that is still in memory</div>
 <dl>
@@ -840,7 +840,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>startReplayingFromWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.275">startReplayingFromWAL</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.277">startReplayingFromWAL</a>()</pre>
 <div class="block">This message intends to inform the MemStore that next coming updates
  are going to be part of the replaying edits from WAL</div>
 </li>
@@ -851,7 +851,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>stopReplayingFromWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.284">stopReplayingFromWAL</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.286">stopReplayingFromWAL</a>()</pre>
 <div class="block">This message intends to inform the MemStore that the replaying edits from WAL
  are done</div>
 </li>
@@ -862,7 +862,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getSegments</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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.291">getSegments</a>()</pre>
+<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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.293">getSegments</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#getSegments--">getSegments</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html" title="class in org.apache.hadoop.hbase.regionserver">AbstractMemStore</a></code></dd>
@@ -877,7 +877,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>setCompositeSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.302">setCompositeSnapshot</a>(boolean&nbsp;useCompositeSnapshot)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.304">setCompositeSnapshot</a>(boolean&nbsp;useCompositeSnapshot)</pre>
 </li>
 </ul>
 <a name="swapCompactedSegments-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-org.apache.hadoop.hbase.regionserver.ImmutableSegment-boolean-">
@@ -886,7 +886,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>swapCompactedSegments</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.306">swapCompactedSegments</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.308">swapCompactedSegments</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList,
                                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/ImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">ImmutableSegment</a>&nbsp;result,
                                      boolean&nbsp;merge)</pre>
 </li>
@@ -897,7 +897,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>flattenOneSegment</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.317">flattenOneSegment</a>(long&nbsp;requesterVersion,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.319">flattenOneSegment</a>(long&nbsp;requesterVersion,
                               <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;action)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -913,7 +913,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>setIndexType</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.323">setIndexType</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver">CompactingMemStore.IndexType</a>&nbsp;type)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.325">setIndexType</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver">CompactingMemStore.IndexType</a>&nbsp;type)</pre>
 </li>
 </ul>
 <a name="getIndexType--">
@@ -922,7 +922,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getIndexType</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver">CompactingMemStore.IndexType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.330">getIndexType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver">CompactingMemStore.IndexType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.332">getIndexType</a>()</pre>
 </li>
 </ul>
 <a name="hasImmutableSegments--">
@@ -931,7 +931,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>hasImmutableSegments</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.334">hasImmutableSegments</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.336">hasImmutableSegments</a>()</pre>
 </li>
 </ul>
 <a name="getImmutableSegments--">
@@ -940,7 +940,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getImmutableSegments</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.338">getImmutableSegments</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.340">getImmutableSegments</a>()</pre>
 </li>
 </ul>
 <a name="getSmallestReadPoint--">
@@ -949,7 +949,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getSmallestReadPoint</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.342">getSmallestReadPoint</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.344">getSmallestReadPoint</a>()</pre>
 </li>
 </ul>
 <a name="getStore--">
@@ -958,7 +958,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getStore</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.346">getStore</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.348">getStore</a>()</pre>
 </li>
 </ul>
 <a name="getFamilyName--">
@@ -967,7 +967,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getFamilyName</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/regionserver/CompactingMemStore.html#line.350">getFamilyName</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/regionserver/CompactingMemStore.html#line.352">getFamilyName</a>()</pre>
 </li>
 </ul>
 <a name="getScanners-long-">
@@ -976,7 +976,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanners</h4>
-<pre>public&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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.358">getScanners</a>(long&nbsp;readPt)
+<pre>public&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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.360">getScanners</a>(long&nbsp;readPt)
                                   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="returnLabel">Returns:</span></dt>
@@ -993,7 +993,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>createList</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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.373">createList</a>(int&nbsp;capacity)</pre>
+<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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.375">createList</a>(int&nbsp;capacity)</pre>
 </li>
 </ul>
 <a name="checkActiveSize--">
@@ -1002,7 +1002,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>checkActiveSize</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.384">checkActiveSize</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.386">checkActiveSize</a>()</pre>
 <div class="block">Check whether anything need to be done based on the current active set size.
  The method is invoked upon every addition to the active set.
  For CompactingMemStore, flush the active set to the read-only memory if it's
@@ -1019,7 +1019,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>flushInMemory</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.403">flushInMemory</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.405">flushInMemory</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>
@@ -1033,7 +1033,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastSegment</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.436">getLastSegment</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.438">getLastSegment</a>()</pre>
 </li>
 </ul>
 <a name="getFamilyNameInBytes--">
@@ -1042,7 +1042,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getFamilyNameInBytes</h4>
-<pre>private&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.442">getFamilyNameInBytes</a>()</pre>
+<pre>private&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.444">getFamilyNameInBytes</a>()</pre>
 </li>
 </ul>
 <a name="getPool--">
@@ -1051,7 +1051,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getPool</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.446">getPool</a>()</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.448">getPool</a>()</pre>
 </li>
 </ul>
 <a name="shouldFlushInMemory--">
@@ -1060,7 +1060,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldFlushInMemory</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.451">shouldFlushInMemory</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.453">shouldFlushInMemory</a>()</pre>
 </li>
 </ul>
 <a name="stopCompaction--">
@@ -1069,7 +1069,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>stopCompaction</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.468">stopCompaction</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.470">stopCompaction</a>()</pre>
 <div class="block">The request to cancel the compaction asynchronous task (caused by in-memory flush)
  The compaction may still happen if the request was sent too late
  Non-blocking request</div>
@@ -1081,7 +1081,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>pushActiveToPipeline</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.474">pushActiveToPipeline</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">MutableSegment</a>&nbsp;active)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.476">pushActiveToPipeline</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">MutableSegment</a>&nbsp;active)</pre>
 </li>
 </ul>
 <a name="pushTailToSnapshot--">
@@ -1090,7 +1090,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>pushTailToSnapshot</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.481">pushTailToSnapshot</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.483">pushTailToSnapshot</a>()</pre>
 </li>
 </ul>
 <a name="pushPipelineToSnapshot--">
@@ -1099,7 +1099,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>pushPipelineToSnapshot</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.488">pushPipelineToSnapshot</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.490">pushPipelineToSnapshot</a>()</pre>
 </li>
 </ul>
 <a name="pushToSnapshot-java.util.List-">
@@ -1108,7 +1108,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>pushToSnapshot</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.511">pushToSnapshot</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">ImmutableSegment</a>&gt;&nbsp;segments)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.513">pushToSnapshot</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">ImmutableSegment</a>&gt;&nbsp;segments)</pre>
 </li>
 </ul>
 <a name="getRegionServices--">
@@ -1117,7 +1117,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionServices</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServicesForStores.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServicesForStores</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.522">getRegionServices</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServicesForStores.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServicesForStores</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.524">getRegionServices</a>()</pre>
 </li>
 </ul>
 <a name="isMemStoreFlushingInMemory--">
@@ -1126,7 +1126,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>isMemStoreFlushingInMemory</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.547">isMemStoreFlushingInMemory</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.549">isMemStoreFlushingInMemory</a>()</pre>
 </li>
 </ul>
 <a name="getNextRow-org.apache.hadoop.hbase.Cell-">
@@ -1135,7 +1135,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getNextRow</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.556">getNextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.558">getNextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>cell</code> - Find the row that comes after this one.  If null, we return the
@@ -1151,7 +1151,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getInmemoryFlushSize</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.570">getInmemoryFlushSize</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.572">getInmemoryFlushSize</a>()</pre>
 </li>
 </ul>
 <a name="debug--">
@@ -1160,7 +1160,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockListLast">
 <li class="blockList">
 <h4>debug</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.575">debug</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.577">debug</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html b/devapidocs/org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html
index c38a6b0..116f653 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10};
+var methods = {"i0":10,"i1":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -152,7 +152,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 </tr>
 <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/regionserver/EagerMemStoreCompactionStrategy.html#name">name</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html#NAME">NAME</a></span></code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
@@ -198,20 +198,24 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html#getAction-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-">getAction</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList)</code>&nbsp;</td>
 </tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>protected <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/regionserver/EagerMemStoreCompactionStrategy.html#getName--">getName</a></span>()</code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.regionserver.MemStoreCompactionStrategy">
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#compact-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">compact</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getFlattenAction--">getFlattenAction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getMergingAction--">getMergingAction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#resetStats--">resetStats</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#simpleMergeOrFlatten-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">simpleMergeOrFlatten</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#updateStats-org.apache.hadoop.hbase.regionserver.Segment-">updateStats</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#compact-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">compact</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getFlattenAction--">getFlattenAction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getMergingAction--">getMergingAction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#resetStats--">resetStats</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#simpleMergeOrFlatten-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">simpleMergeOrFlatten</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#toString--">toString</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 CompactionStrategy.html#updateStats-org.apache.hadoop.hbase.regionserver.Segment-">updateStats</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;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">Object</a></h3>
-<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
 </ul>
 </li>
 </ul>
@@ -227,16 +231,16 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <!--   -->
 </a>
 <h3>Field Detail</h3>
-<a name="name">
+<a name="NAME">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>name</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/regionserver/EagerMemStoreCompactionStrategy.html#line.27">name</a></pre>
+<h4>NAME</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/regionserver/EagerMemStoreCompactionStrategy.html#line.26">NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.EagerMemStoreCompactionStrategy.name">Constant Field Values</a></dd>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.EagerMemStoreCompactionStrategy.NAME">Constant Field Values</a></dd>
 </dl>
 </li>
 </ul>
@@ -269,7 +273,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <a name="getAction-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>getAction</h4>
 <pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html#line.33">getAction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList)</pre>
@@ -279,6 +283,19 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 </dl>
 </li>
 </ul>
+<a name="getName--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>getName</h4>
+<pre>protected&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/regionserver/EagerMemStoreCompactionStrategy.html#line.38">getName</a>()</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getName--">getName</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy</a></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
index 4c4a4d7..4a035fc 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2237">HStore.StoreFlusherImpl</a>
+<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2248">HStore.StoreFlusherImpl</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/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a></pre>
 </li>
@@ -279,7 +279,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>tracker</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2239">tracker</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2250">tracker</a></pre>
 </li>
 </ul>
 <a name="cacheFlushSeqNum">
@@ -288,7 +288,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushSeqNum</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2240">cacheFlushSeqNum</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2251">cacheFlushSeqNum</a></pre>
 </li>
 </ul>
 <a name="snapshot">
@@ -297,7 +297,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshot</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2241">snapshot</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2252">snapshot</a></pre>
 </li>
 </ul>
 <a name="tempFiles">
@@ -306,7 +306,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>tempFiles</h4>
-<pre>private&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.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2242">tempFiles</a></pre>
+<pre>private&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.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2253">tempFiles</a></pre>
 </li>
 </ul>
 <a name="committedFiles">
@@ -315,7 +315,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>committedFiles</h4>
-<pre>private&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.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2243">committedFiles</a></pre>
+<pre>private&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.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2254">committedFiles</a></pre>
 </li>
 </ul>
 <a name="cacheFlushCount">
@@ -324,7 +324,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushCount</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2244">cacheFlushCount</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2255">cacheFlushCount</a></pre>
 </li>
 </ul>
 <a name="cacheFlushSize">
@@ -333,7 +333,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushSize</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2245">cacheFlushSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2256">cacheFlushSize</a></pre>
 </li>
 </ul>
 <a name="outputFileSize">
@@ -342,7 +342,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>outputFileSize</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2246">outputFileSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2257">outputFileSize</a></pre>
 </li>
 </ul>
 </li>
@@ -359,7 +359,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StoreFlusherImpl</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2248">StoreFlusherImpl</a>(long&nbsp;cacheFlushSeqNum,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2259">StoreFlusherImpl</a>(long&nbsp;cacheFlushSeqNum,
                          <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
 </li>
 </ul>
@@ -377,7 +377,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>prepare</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2258">prepare</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2269">prepare</a>()</pre>
 <div class="block">This is not thread safe. The caller should have a lock on the region or the store.
  If necessary, the lock can be added with the patch provided in HBASE-10087</div>
 <dl>
@@ -394,7 +394,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>flushCache</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2268">flushCache</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2279">flushCache</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
                 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/regionserver/StoreFlushContext.html#flushCache-org.apache.hadoop.hbase.monitoring.MonitoredTask-">StoreFlushContext</a></code></span></div>
 <div class="block">Flush the cache (create the new store file)
@@ -415,7 +415,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>commit</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2277">commit</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2288">commit</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
                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/regionserver/StoreFlushContext.html#commit-org.apache.hadoop.hbase.monitoring.MonitoredTask-">StoreFlushContext</a></code></span></div>
 <div class="block">Commit the flush - add the store file to the store and clear the
@@ -439,7 +439,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>getOutputFileSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2320">getOutputFileSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2331">getOutputFileSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#getOutputFileSize--">getOutputFileSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a></code></dd>
@@ -454,7 +454,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>getCommittedFiles</h4>
-<pre>public&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.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2325">getCommittedFiles</a>()</pre>
+<pre>public&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.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2336">getCommittedFiles</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#getCommittedFiles--">StoreFlushContext</a></code></span></div>
 <div class="block">Returns the newly committed files from the flush. Called only if commit returns true</div>
 <dl>
@@ -471,7 +471,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>replayFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2338">replayFlush</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<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;&nbsp;fileNames,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2349">replayFlush</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<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;&nbsp;fileNames,
                         boolean&nbsp;dropMemstoreSnapshot)
                  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">Similar to commit, but called in secondary region replicas for replaying the
@@ -494,7 +494,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>abort</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2370">abort</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2381">abort</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">Abort the snapshot preparation. Drops the snapshot if any.</div>
 <dl>


[15/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html
index 12d10e1..97ceefd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html
@@ -1740,384 +1740,380 @@
 <span class="sourceLineNo">1732</span>      // and will save us having to seek the stream backwards to reread the header we<a name="line.1732"></a>
 <span class="sourceLineNo">1733</span>      // read the last time through here.<a name="line.1733"></a>
 <span class="sourceLineNo">1734</span>      ByteBuffer headerBuf = getCachedHeader(offset);<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      if (LOG.isTraceEnabled()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        LOG.trace("Reading " + this.fileContext.getHFileName() + " at offset=" + offset +<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>          ", pread=" + pread + ", verifyChecksum=" + verifyChecksum + ", cachedHeader=" +<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>          headerBuf + ", onDiskSizeWithHeader=" + onDiskSizeWithHeader);<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      }<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>      // file has support for checksums (version 2+).<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      long startTime = System.currentTimeMillis();<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>        if (headerBuf == null) {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>          if (LOG.isTraceEnabled()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>          }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>              offset, pread);<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      // the header we read last time through here.<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>      if (headerBuf != null) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        // read. Copy to this block's header.<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>      } else {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>      }<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (verifyChecksum &amp;&amp;<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        return null;<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      if (updateMetrics) {<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        HFile.updateReadLatency(duration, pread);<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>      }<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>      HFileBlock hFileBlock =<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      // Run check on uncompressed sizings.<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>      }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      if (LOG.isTraceEnabled()) {<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>        LOG.trace("Read " + hFileBlock + " in " + duration + " ns");<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      }<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>      // Cache next block header if we read it for the next time through here.<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      }<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      return hFileBlock;<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span><a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    @Override<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span><a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    @Override<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    }<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span><a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    @Override<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      return this.encodedBlockDecodingCtx;<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span><a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    @Override<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return this.defaultDecodingCtx;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span><a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    /**<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>     * If the block doesn't uses checksum, returns false.<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>     * @return True if checksum matches, else false.<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>     */<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>        throws IOException {<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      // checksum validation failure.<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>        return false;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    @Override<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    public void closeStreams() throws IOException {<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      streamWrapper.close();<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    @Override<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    public void unbufferStream() {<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      // unbuffer it.<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>      if (streamLock.tryLock()) {<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>        try {<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>          this.streamWrapper.unbuffer();<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>        } finally {<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>          streamLock.unlock();<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>        }<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>      }<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span><a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    @Override<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    public String toString() {<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    }<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>  }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span><a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  @VisibleForTesting<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>        totalChecksumBytes()) {<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>      throw new IOException("Using no compression but "<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    }<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  }<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span><a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>  // Cacheable implementation<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  @Override<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>  public int getSerializedLength() {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    if (buf != null) {<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      // Include extra bytes for block metadata.<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    return 0;<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  }<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span><a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  // Cacheable implementation<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  @Override<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  public void serialize(ByteBuffer destination) {<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    // Make sure any changes in here are reflected over there.<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    destination = addMetaData(destination);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>    // metadata.<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    destination.flip();<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>  }<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>  /**<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>   * For use by bucketcache. This exposes internals.<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   */<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>  public ByteBuffer getMetaData() {<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    bb = addMetaData(bb);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    bb.flip();<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    return bb;<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span><a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  /**<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>   */<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    destination.putLong(this.offset);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return destination;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  // Cacheable implementation<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>  @Override<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>  }<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span><a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>  @Override<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>  public int hashCode() {<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    int result = 1;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    result = result * 31 + blockType.hashCode();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    result = result * 31 + buf.hashCode();<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    return result;<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>  }<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span><a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  @Override<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>  public boolean equals(Object comparison) {<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    if (this == comparison) {<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>      return true;<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    }<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    if (comparison == null) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>      return false;<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    }<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      return false;<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    }<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span><a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span><a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>      return false;<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    }<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1969"></a>
+<span class="sourceLineNo">1735</span>      LOG.trace("Reading {} at offset={}, pread={}, verifyChecksum={}, cachedHeader={}, " +<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>          "onDiskSizeWithHeader={}", this.fileContext.getHFileName(), offset, pread,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>          verifyChecksum, headerBuf, onDiskSizeWithHeader);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      // file has support for checksums (version 2+).<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      long startTime = System.currentTimeMillis();<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>        if (headerBuf == null) {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>          if (LOG.isTraceEnabled()) {<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          }<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>              offset, pread);<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        }<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      }<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // the header we read last time through here.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      if (headerBuf != null) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>        // read. Copy to this block's header.<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      } else {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      }<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      if (verifyChecksum &amp;&amp;<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        return null;<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      }<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      if (updateMetrics) {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>        HFile.updateReadLatency(duration, pread);<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>      }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      HFileBlock hFileBlock =<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      // Run check on uncompressed sizings.<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>      }<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>      LOG.trace("Read {} in {} ns", hFileBlock, duration);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>      // Cache next block header if we read it for the next time through here.<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      }<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>      return hFileBlock;<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span><a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    @Override<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    }<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span><a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    @Override<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span><a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    @Override<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      return this.encodedBlockDecodingCtx;<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span><a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    @Override<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>      return this.defaultDecodingCtx;<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    }<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span><a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    /**<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>     * If the block doesn't uses checksum, returns false.<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>     * @return True if checksum matches, else false.<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>     */<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        throws IOException {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>      // checksum validation failure.<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        return false;<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>      }<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span><a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    @Override<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    public void closeStreams() throws IOException {<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>      streamWrapper.close();<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    }<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    @Override<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    public void unbufferStream() {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      // unbuffer it.<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>      if (streamLock.tryLock()) {<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        try {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>          this.streamWrapper.unbuffer();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>        } finally {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>          streamLock.unlock();<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      }<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    }<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span><a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    @Override<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    public String toString() {<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>  }<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span><a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>  @VisibleForTesting<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        totalChecksumBytes()) {<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      throw new IOException("Using no compression but "<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span><a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>  // Cacheable implementation<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Override<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public int getSerializedLength() {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    if (buf != null) {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>      // Include extra bytes for block metadata.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    return 0;<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>  }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span><a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>  // Cacheable implementation<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  @Override<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>  public void serialize(ByteBuffer destination) {<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    // Make sure any changes in here are reflected over there.<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    destination = addMetaData(destination);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>    // metadata.<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    destination.flip();<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span><a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>  /**<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * For use by bucketcache. This exposes internals.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  public ByteBuffer getMetaData() {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    bb = addMetaData(bb);<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    bb.flip();<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    return bb;<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>  }<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span><a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  /**<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>   */<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    destination.putLong(this.offset);<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    return destination;<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  }<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span><a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>  // Cacheable implementation<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  @Override<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>  }<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span><a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>  @Override<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>  public int hashCode() {<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    int result = 1;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>    result = result * 31 + blockType.hashCode();<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    result = result * 31 + buf.hashCode();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    return result;<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>  }<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span><a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>  @Override<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>  public boolean equals(Object comparison) {<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    if (this == comparison) {<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>      return true;<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    }<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    if (comparison == null) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>      return false;<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    }<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>      return false;<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    }<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span><a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>      return false;<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    }<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>      return false;<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>    }<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    if (castedComparison.offset != this.offset) {<a name="line.1969"></a>
 <span class="sourceLineNo">1970</span>      return false;<a name="line.1970"></a>
 <span class="sourceLineNo">1971</span>    }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    if (castedComparison.offset != this.offset) {<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      return false;<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    }<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>      return false;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      return false;<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>    }<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1982"></a>
+<span class="sourceLineNo">1972</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>      return false;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>    }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      return false;<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    }<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>      return false;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>        castedComparison.buf.limit()) != 0) {<a name="line.1982"></a>
 <span class="sourceLineNo">1983</span>      return false;<a name="line.1983"></a>
 <span class="sourceLineNo">1984</span>    }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        castedComparison.buf.limit()) != 0) {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      return false;<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    }<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    return true;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>  }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    }<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    return DataBlockEncoding.NONE;<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>  }<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span><a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>  @VisibleForTesting<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>  byte getChecksumType() {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>    return this.fileContext.getChecksumType().getCode();<a name="line.2001"></a>
+<span class="sourceLineNo">1985</span>    return true;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>    }<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    return DataBlockEncoding.NONE;<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>  }<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span><a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>  @VisibleForTesting<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>  byte getChecksumType() {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>  int getBytesPerChecksum() {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2001"></a>
 <span class="sourceLineNo">2002</span>  }<a name="line.2002"></a>
 <span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>  int getBytesPerChecksum() {<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>  }<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>  @VisibleForTesting<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    return this.onDiskDataSizeWithHeader;<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  /**<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>   */<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>  int totalChecksumBytes() {<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    // indicates that cached blocks do not have checksum data because<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>    // checksums were already validated when the block was read from disk.<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      return 0;<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        this.fileContext.getBytesPerChecksum());<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  }<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span><a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>  /**<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>   * Returns the size of this block header.<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>   */<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>  public int headerSize() {<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>  }<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span><a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>  /**<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>   * Maps a minor version to the size of the header.<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>   */<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    return usesHBaseChecksum?<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>  }<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span><a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>  /**<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>   */<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>  @VisibleForTesting<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>  // TODO: Why is this in here?<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>  byte[] getDummyHeaderForVersion() {<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>  }<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span><a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>  /**<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>  }<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span><a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>  /**<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>   */<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>  HFileContext getHFileContext() {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    return this.fileContext;<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>  }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span><a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>  @Override<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>  public MemoryType getMemoryType() {<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    return this.memType;<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span><a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>   */<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  boolean usesSharedMemory() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return this.memType == MemoryType.SHARED;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * Convert the contents of the block header into a human readable string.<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>   * has minor version &gt; 0.<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>   */<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>  @VisibleForTesting<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    buf.get(magicBuf);<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    long prevBlockOffset = buf.getLong();<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    byte cksumtype = buf.get();<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    long bytesPerChecksum = buf.getInt();<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>                   " blockType " + bt +<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>                   " compressedBlockSizeNoHeader " +<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>                   compressedBlockSizeNoHeader +<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>                   uncompressedBlockSizeNoHeader +<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2106"></a>
+<span class="sourceLineNo">2004</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>  @VisibleForTesting<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    return this.onDiskDataSizeWithHeader;<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>  }<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span><a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>  /**<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>   */<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>  int totalChecksumBytes() {<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    // indicates that cached blocks do not have checksum data because<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    // checksums were already validated when the block was read from disk.<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      return 0;<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>        this.fileContext.getBytesPerChecksum());<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  }<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span><a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>  /**<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>   * Returns the size of this block header.<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>   */<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  public int headerSize() {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>  }<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>  /**<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>   * Maps a minor version to the size of the header.<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>   */<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    return usesHBaseChecksum?<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span><a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>  /**<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>   */<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>  @VisibleForTesting<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>  // TODO: Why is this in here?<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>  byte[] getDummyHeaderForVersion() {<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>  }<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span><a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>  /**<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>   */<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>  }<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span><a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>  /**<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>   */<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>  HFileContext getHFileContext() {<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    return this.fileContext;<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>  }<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span><a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>  @Override<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>  public MemoryType getMemoryType() {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    return this.memType;<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>  }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span><a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>  /**<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>   */<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>  boolean usesSharedMemory() {<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    return this.memType == MemoryType.SHARED;<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>  }<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span><a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>  /**<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>   * Convert the contents of the block header into a human readable string.<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>   * has minor version &gt; 0.<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>   */<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>  @VisibleForTesting<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    buf.get(magicBuf);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>    long prevBlockOffset = buf.getLong();<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    byte cksumtype = buf.get();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    long bytesPerChecksum = buf.getInt();<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>                   " blockType " + bt +<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>                   " compressedBlockSizeNoHeader " +<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>                   compressedBlockSizeNoHeader +<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>                   uncompressedBlockSizeNoHeader +<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  }<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span><a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public HFileBlock deepClone() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    return new HFileBlock(this, true);<a name="line.2106"></a>
 <span class="sourceLineNo">2107</span>  }<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>  public HFileBlock deepClone() {<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    return new HFileBlock(this, true);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>}<a name="line.2112"></a>
+<span class="sourceLineNo">2108</span>}<a name="line.2108"></a>
 
 
 


[16/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockWritable.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockWritable.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockWritable.html
index 12d10e1..97ceefd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockWritable.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockWritable.html
@@ -1740,384 +1740,380 @@
 <span class="sourceLineNo">1732</span>      // and will save us having to seek the stream backwards to reread the header we<a name="line.1732"></a>
 <span class="sourceLineNo">1733</span>      // read the last time through here.<a name="line.1733"></a>
 <span class="sourceLineNo">1734</span>      ByteBuffer headerBuf = getCachedHeader(offset);<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      if (LOG.isTraceEnabled()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        LOG.trace("Reading " + this.fileContext.getHFileName() + " at offset=" + offset +<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>          ", pread=" + pread + ", verifyChecksum=" + verifyChecksum + ", cachedHeader=" +<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>          headerBuf + ", onDiskSizeWithHeader=" + onDiskSizeWithHeader);<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      }<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>      // file has support for checksums (version 2+).<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      long startTime = System.currentTimeMillis();<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>        if (headerBuf == null) {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>          if (LOG.isTraceEnabled()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>          }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>              offset, pread);<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      // the header we read last time through here.<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>      if (headerBuf != null) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        // read. Copy to this block's header.<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>      } else {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>      }<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (verifyChecksum &amp;&amp;<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        return null;<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      if (updateMetrics) {<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        HFile.updateReadLatency(duration, pread);<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>      }<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>      HFileBlock hFileBlock =<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      // Run check on uncompressed sizings.<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>      }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      if (LOG.isTraceEnabled()) {<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>        LOG.trace("Read " + hFileBlock + " in " + duration + " ns");<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      }<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>      // Cache next block header if we read it for the next time through here.<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      }<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      return hFileBlock;<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span><a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    @Override<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span><a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    @Override<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    }<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span><a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    @Override<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      return this.encodedBlockDecodingCtx;<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span><a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    @Override<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return this.defaultDecodingCtx;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span><a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    /**<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>     * If the block doesn't uses checksum, returns false.<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>     * @return True if checksum matches, else false.<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>     */<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>        throws IOException {<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      // checksum validation failure.<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>        return false;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    @Override<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    public void closeStreams() throws IOException {<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      streamWrapper.close();<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    @Override<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    public void unbufferStream() {<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      // unbuffer it.<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>      if (streamLock.tryLock()) {<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>        try {<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>          this.streamWrapper.unbuffer();<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>        } finally {<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>          streamLock.unlock();<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>        }<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>      }<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span><a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    @Override<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    public String toString() {<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    }<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>  }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span><a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  @VisibleForTesting<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>        totalChecksumBytes()) {<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>      throw new IOException("Using no compression but "<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    }<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  }<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span><a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>  // Cacheable implementation<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  @Override<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>  public int getSerializedLength() {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    if (buf != null) {<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      // Include extra bytes for block metadata.<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    return 0;<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  }<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span><a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  // Cacheable implementation<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  @Override<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  public void serialize(ByteBuffer destination) {<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    // Make sure any changes in here are reflected over there.<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    destination = addMetaData(destination);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>    // metadata.<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    destination.flip();<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>  }<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>  /**<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>   * For use by bucketcache. This exposes internals.<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   */<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>  public ByteBuffer getMetaData() {<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    bb = addMetaData(bb);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    bb.flip();<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    return bb;<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span><a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  /**<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>   */<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    destination.putLong(this.offset);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return destination;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  // Cacheable implementation<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>  @Override<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>  }<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span><a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>  @Override<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>  public int hashCode() {<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    int result = 1;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    result = result * 31 + blockType.hashCode();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    result = result * 31 + buf.hashCode();<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    return result;<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>  }<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span><a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  @Override<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>  public boolean equals(Object comparison) {<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    if (this == comparison) {<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>      return true;<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    }<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    if (comparison == null) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>      return false;<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    }<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      return false;<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    }<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span><a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span><a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>      return false;<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    }<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1969"></a>
+<span class="sourceLineNo">1735</span>      LOG.trace("Reading {} at offset={}, pread={}, verifyChecksum={}, cachedHeader={}, " +<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>          "onDiskSizeWithHeader={}", this.fileContext.getHFileName(), offset, pread,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>          verifyChecksum, headerBuf, onDiskSizeWithHeader);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      // file has support for checksums (version 2+).<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      long startTime = System.currentTimeMillis();<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>        if (headerBuf == null) {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>          if (LOG.isTraceEnabled()) {<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          }<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>              offset, pread);<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        }<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      }<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // the header we read last time through here.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      if (headerBuf != null) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>        // read. Copy to this block's header.<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      } else {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      }<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      if (verifyChecksum &amp;&amp;<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        return null;<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      }<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      if (updateMetrics) {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>        HFile.updateReadLatency(duration, pread);<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>      }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      HFileBlock hFileBlock =<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      // Run check on uncompressed sizings.<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>      }<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>      LOG.trace("Read {} in {} ns", hFileBlock, duration);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>      // Cache next block header if we read it for the next time through here.<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      }<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>      return hFileBlock;<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span><a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    @Override<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    }<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span><a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    @Override<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span><a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    @Override<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      return this.encodedBlockDecodingCtx;<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span><a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    @Override<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>      return this.defaultDecodingCtx;<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    }<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span><a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    /**<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>     * If the block doesn't uses checksum, returns false.<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>     * @return True if checksum matches, else false.<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>     */<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        throws IOException {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>      // checksum validation failure.<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        return false;<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>      }<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span><a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    @Override<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    public void closeStreams() throws IOException {<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>      streamWrapper.close();<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    }<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    @Override<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    public void unbufferStream() {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      // unbuffer it.<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>      if (streamLock.tryLock()) {<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        try {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>          this.streamWrapper.unbuffer();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>        } finally {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>          streamLock.unlock();<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      }<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    }<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span><a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    @Override<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    public String toString() {<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>  }<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span><a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>  @VisibleForTesting<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        totalChecksumBytes()) {<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      throw new IOException("Using no compression but "<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span><a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>  // Cacheable implementation<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Override<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public int getSerializedLength() {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    if (buf != null) {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>      // Include extra bytes for block metadata.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    return 0;<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>  }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span><a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>  // Cacheable implementation<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  @Override<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>  public void serialize(ByteBuffer destination) {<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    // Make sure any changes in here are reflected over there.<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    destination = addMetaData(destination);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>    // metadata.<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    destination.flip();<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span><a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>  /**<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * For use by bucketcache. This exposes internals.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  public ByteBuffer getMetaData() {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    bb = addMetaData(bb);<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    bb.flip();<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    return bb;<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>  }<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span><a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  /**<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>   */<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    destination.putLong(this.offset);<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    return destination;<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  }<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span><a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>  // Cacheable implementation<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  @Override<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>  }<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span><a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>  @Override<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>  public int hashCode() {<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    int result = 1;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>    result = result * 31 + blockType.hashCode();<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    result = result * 31 + buf.hashCode();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    return result;<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>  }<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span><a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>  @Override<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>  public boolean equals(Object comparison) {<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    if (this == comparison) {<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>      return true;<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    }<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    if (comparison == null) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>      return false;<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    }<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>      return false;<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    }<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span><a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>      return false;<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    }<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>      return false;<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>    }<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    if (castedComparison.offset != this.offset) {<a name="line.1969"></a>
 <span class="sourceLineNo">1970</span>      return false;<a name="line.1970"></a>
 <span class="sourceLineNo">1971</span>    }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    if (castedComparison.offset != this.offset) {<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      return false;<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    }<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>      return false;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      return false;<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>    }<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1982"></a>
+<span class="sourceLineNo">1972</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>      return false;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>    }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      return false;<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    }<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>      return false;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>        castedComparison.buf.limit()) != 0) {<a name="line.1982"></a>
 <span class="sourceLineNo">1983</span>      return false;<a name="line.1983"></a>
 <span class="sourceLineNo">1984</span>    }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        castedComparison.buf.limit()) != 0) {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      return false;<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    }<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    return true;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>  }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    }<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    return DataBlockEncoding.NONE;<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>  }<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span><a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>  @VisibleForTesting<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>  byte getChecksumType() {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>    return this.fileContext.getChecksumType().getCode();<a name="line.2001"></a>
+<span class="sourceLineNo">1985</span>    return true;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>    }<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    return DataBlockEncoding.NONE;<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>  }<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span><a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>  @VisibleForTesting<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>  byte getChecksumType() {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>  int getBytesPerChecksum() {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2001"></a>
 <span class="sourceLineNo">2002</span>  }<a name="line.2002"></a>
 <span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>  int getBytesPerChecksum() {<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>  }<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>  @VisibleForTesting<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    return this.onDiskDataSizeWithHeader;<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  /**<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>   */<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>  int totalChecksumBytes() {<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    // indicates that cached blocks do not have checksum data because<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>    // checksums were already validated when the block was read from disk.<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      return 0;<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        this.fileContext.getBytesPerChecksum());<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  }<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span><a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>  /**<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>   * Returns the size of this block header.<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>   */<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>  public int headerSize() {<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>  }<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span><a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>  /**<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>   * Maps a minor version to the size of the header.<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>   */<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    return usesHBaseChecksum?<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>  }<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span><a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>  /**<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>   */<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>  @VisibleForTesting<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>  // TODO: Why is this in here?<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>  byte[] getDummyHeaderForVersion() {<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>  }<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span><a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>  /**<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>  }<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span><a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>  /**<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>   */<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>  HFileContext getHFileContext() {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    return this.fileContext;<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>  }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span><a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>  @Override<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>  public MemoryType getMemoryType() {<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    return this.memType;<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span><a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>   */<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  boolean usesSharedMemory() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return this.memType == MemoryType.SHARED;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * Convert the contents of the block header into a human readable string.<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>   * has minor version &gt; 0.<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>   */<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>  @VisibleForTesting<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    buf.get(magicBuf);<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    long prevBlockOffset = buf.getLong();<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    byte cksumtype = buf.get();<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    long bytesPerChecksum = buf.getInt();<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>                   " blockType " + bt +<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>                   " compressedBlockSizeNoHeader " +<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>                   compressedBlockSizeNoHeader +<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>                   uncompressedBlockSizeNoHeader +<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2106"></a>
+<span class="sourceLineNo">2004</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>  @VisibleForTesting<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    return this.onDiskDataSizeWithHeader;<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>  }<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span><a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>  /**<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>   */<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>  int totalChecksumBytes() {<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    // indicates that cached blocks do not have checksum data because<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    // checksums were already validated when the block was read from disk.<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      return 0;<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>        this.fileContext.getBytesPerChecksum());<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  }<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span><a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>  /**<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>   * Returns the size of this block header.<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>   */<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  public int headerSize() {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>  }<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>  /**<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>   * Maps a minor version to the size of the header.<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>   */<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    return usesHBaseChecksum?<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span><a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>  /**<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>   */<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>  @VisibleForTesting<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>  // TODO: Why is this in here?<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>  byte[] getDummyHeaderForVersion() {<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>  }<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span><a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>  /**<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>   */<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>  }<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span><a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>  /**<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>   */<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>  HFileContext getHFileContext() {<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    return this.fileContext;<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>  }<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span><a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>  @Override<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>  public MemoryType getMemoryType() {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    return this.memType;<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>  }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span><a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>  /**<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>   */<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>  boolean usesSharedMemory() {<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    return this.memType == MemoryType.SHARED;<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>  }<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span><a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>  /**<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>   * Convert the contents of the block header into a human readable string.<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>   * has minor version &gt; 0.<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>   */<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>  @VisibleForTesting<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    buf.get(magicBuf);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>    long prevBlockOffset = buf.getLong();<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    byte cksumtype = buf.get();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    long bytesPerChecksum = buf.getInt();<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>                   " blockType " + bt +<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>                   " compressedBlockSizeNoHeader " +<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>                   compressedBlockSizeNoHeader +<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>                   uncompressedBlockSizeNoHeader +<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  }<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span><a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public HFileBlock deepClone() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    return new HFileBlock(this, true);<a name="line.2106"></a>
 <span class="sourceLineNo">2107</span>  }<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>  public HFileBlock deepClone() {<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    return new HFileBlock(this, true);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>}<a name="line.2112"></a>
+<span class="sourceLineNo">2108</span>}<a name="line.2108"></a>
 
 
 


[26/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.


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

Branch: refs/heads/asf-site
Commit: 21347dff7da261edf5b5c805f2d14c24bfd883ee
Parents: e8a9b2e
Author: jenkins <bu...@apache.org>
Authored: Tue Apr 3 14:47:32 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Tue Apr 3 14:47:32 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                | 30756 ++++++++++-------
 apidocs/index-all.html                          |     4 +-
 .../hbase/client/TableDescriptorBuilder.html    |     8 +-
 .../hbase/client/TableDescriptorBuilder.html    |     4 +-
 book.html                                       |  1405 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       |   134 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |    18 +-
 devapidocs/index-all.html                       |    28 +-
 .../hadoop/hbase/backup/package-tree.html       |     4 +-
 .../hbase/client/TableDescriptorBuilder.html    |     8 +-
 .../hadoop/hbase/client/package-tree.html       |    24 +-
 .../hadoop/hbase/executor/package-tree.html     |     2 +-
 .../hadoop/hbase/filter/package-tree.html       |     6 +-
 .../hbase/io/hfile/HFileBlock.FSReaderImpl.html |    16 +-
 .../hadoop/hbase/io/hfile/HFileBlock.html       |    44 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     4 +-
 .../hadoop/hbase/master/package-tree.html       |     6 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    16 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../hadoop/hbase/quotas/package-tree.html       |     8 +-
 .../AdaptiveMemStoreCompactionStrategy.html     |    63 +-
 .../BasicMemStoreCompactionStrategy.html        |    39 +-
 ...ompactingMemStore.InMemoryFlushRunnable.html |     6 +-
 .../hbase/regionserver/CompactingMemStore.html  |    82 +-
 .../EagerMemStoreCompactionStrategy.html        |    35 +-
 .../regionserver/HStore.StoreFlusherImpl.html   |    34 +-
 .../hadoop/hbase/regionserver/HStore.html       |   532 +-
 .../MemStoreCompactionStrategy.Action.html      |     4 +-
 .../MemStoreCompactionStrategy.html             |    52 +-
 .../hbase/regionserver/MemStoreCompactor.html   |    35 +-
 .../hbase/regionserver/class-use/MemStore.html  |    13 +
 .../hadoop/hbase/regionserver/package-tree.html |    20 +-
 .../regionserver/querymatcher/package-tree.html |     2 +-
 .../hbase/regionserver/wal/package-tree.html    |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     8 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 ...riptorBuilder.ModifyableTableDescriptor.html |     4 +-
 .../hbase/client/TableDescriptorBuilder.html    |     4 +-
 .../io/hfile/HFileBlock.BlockIterator.html      |   738 +-
 .../io/hfile/HFileBlock.BlockWritable.html      |   738 +-
 .../hbase/io/hfile/HFileBlock.FSReader.html     |   738 +-
 .../hbase/io/hfile/HFileBlock.FSReaderImpl.html |   738 +-
 .../hbase/io/hfile/HFileBlock.Header.html       |   738 +-
 .../io/hfile/HFileBlock.PrefetchedHeader.html   |   738 +-
 .../hbase/io/hfile/HFileBlock.Writer.State.html |   738 +-
 .../hbase/io/hfile/HFileBlock.Writer.html       |   738 +-
 .../hadoop/hbase/io/hfile/HFileBlock.html       |   738 +-
 .../AdaptiveMemStoreCompactionStrategy.html     |    74 +-
 .../BasicMemStoreCompactionStrategy.html        |    28 +-
 ...ompactingMemStore.InMemoryFlushRunnable.html |   926 +-
 .../CompactingMemStore.IndexType.html           |   926 +-
 .../hbase/regionserver/CompactingMemStore.html  |   926 +-
 .../EagerMemStoreCompactionStrategy.html        |    13 +-
 .../regionserver/HStore.StoreFlusherImpl.html   |  4961 +--
 .../hadoop/hbase/regionserver/HStore.html       |  4961 +--
 .../MemStoreCompactionStrategy.Action.html      |    76 +-
 .../MemStoreCompactionStrategy.html             |    76 +-
 .../hbase/regionserver/MemStoreCompactor.html   |   345 +-
 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 +-
 .../TestHStore.MyMemStoreCompactor.html         |     4 +-
 92 files changed, 29929 insertions(+), 23593 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index efc8e87..5a37a7b 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -591,7 +591,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 


[22/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index ec1a372..0edf3af 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -296,7 +296,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index d012532..5628338 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -10312,12 +10312,12 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>798</td>
+<td>784</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3833</td>
+<td>3847</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -14526,7 +14526,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 26 has parse error. Missed HTML close tag 'arg'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td>44</td></tr></table></div>
 <div class="section">
@@ -15162,7 +15162,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 4 has parse error. Missed HTML close tag 'pre'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td>59</td></tr></table></div>
 <div class="section">
@@ -16917,7 +16917,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 19 has parse error. Details: no viable alternative at input '&lt;code&gt;\n   *   List&lt;Future&lt;' while parsing HTML_TAG</td>
 <td>167</td></tr></table></div>
 <div class="section">
@@ -19839,7 +19839,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 2 has parse error. Unrecognized error from ANTLR parser: null</td>
 <td>83</td></tr>
 <tr class="a">
@@ -33846,7 +33846,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 37 has parse error. Details: no viable alternative at input '&lt;ColumnFamily,' while parsing HTML_ELEMENT</td>
 <td>29</td></tr></table></div>
 <div class="section">
@@ -49010,7 +49010,7 @@
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>2063</td></tr></table></div>
+<td>2059</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.hfile.HFileBlockIndex.java">org/apache/hadoop/hbase/io/hfile/HFileBlockIndex.java</h3>
 <table border="0" class="table table-striped">
@@ -50142,7 +50142,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 24 has parse error. Details: no viable alternative at input '&lt;key,' while parsing HTML_ELEMENT</td>
 <td>25</td></tr>
 <tr class="b">
@@ -53730,7 +53730,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 2 has parse error. Unrecognized error from ANTLR parser: null</td>
 <td>587</td></tr>
 <tr class="a">
@@ -73488,7 +73488,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 60 has parse error. Missed HTML close tag 'Comparable'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td>29</td></tr>
 <tr class="a">
@@ -77676,7 +77676,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 0 has parse error. Unrecognized error from ANTLR parser: null</td>
 <td>74</td></tr>
 <tr class="b">
@@ -79217,31 +79217,31 @@
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>167</td></tr>
+<td>169</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 3, expected level should be 2.</td>
-<td>372</td></tr>
+<td>374</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 5, expected level should be 4.</td>
-<td>374</td></tr>
+<td>376</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 3, expected level should be 2.</td>
-<td>375</td></tr>
+<td>377</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>512</td></tr></table></div>
+<td>514</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.CompactionPipeline.java">org/apache/hadoop/hbase/regionserver/CompactionPipeline.java</h3>
 <table border="0" class="table table-striped">
@@ -82043,253 +82043,253 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>231</td></tr>
+<td>236</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>234</td></tr>
+<td>239</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>235</td></tr>
+<td>240</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>372</td></tr>
+<td>387</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>495</td></tr>
+<td>510</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>507</td></tr>
+<td>522</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>531</td></tr>
+<td>546</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 113).</td>
-<td>546</td></tr>
+<td>561</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>570</td></tr>
+<td>585</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>572</td></tr>
+<td>587</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>606</td></tr>
+<td>621</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>621</td></tr>
+<td>636</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>627</td></tr>
+<td>642</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>628</td></tr>
+<td>643</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>629</td></tr>
+<td>644</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>828</td></tr>
+<td>839</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child have incorrect indentation level 9, expected level should be 10.</td>
-<td>829</td></tr>
+<td>840</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child have incorrect indentation level 9, expected level should be 10.</td>
-<td>830</td></tr>
+<td>841</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>833</td></tr>
+<td>844</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>841</td></tr>
+<td>852</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>953</td></tr>
+<td>964</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>959</td></tr>
+<td>970</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>987</td></tr>
+<td>998</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>988</td></tr>
+<td>999</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>989</td></tr>
+<td>1000</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>1041</td></tr>
+<td>1052</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>1042</td></tr>
+<td>1053</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>1044</td></tr>
+<td>1055</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>1067</td></tr>
+<td>1078</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>1136</td></tr>
+<td>1147</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>1137</td></tr>
+<td>1148</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>1169</td></tr>
+<td>1180</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>1364</td></tr>
+<td>1375</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>1430</td></tr>
+<td>1441</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 114).</td>
-<td>1469</td></tr>
+<td>1480</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>1573</td></tr>
+<td>1584</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>1816</td></tr>
+<td>1827</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>2028</td></tr>
+<td>2039</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>2221</td></tr>
+<td>2232</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>2335</td></tr>
+<td>2346</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>2367</td></tr>
+<td>2378</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 102).</td>
-<td>2612</td></tr></table></div>
+<td>2623</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HStoreFile.java">org/apache/hadoop/hbase/regionserver/HStoreFile.java</h3>
 <table border="0" class="table table-striped">
@@ -82832,7 +82832,7 @@
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 6, expected level should be 4.</td>
-<td>119</td></tr></table></div>
+<td>124</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.MemStoreFlusher.java">org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java</h3>
 <table border="0" class="table table-striped">
@@ -87672,7 +87672,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 33 has parse error. Missed HTML close tag 'number'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td>127</td></tr>
 <tr class="b">
@@ -116229,7 +116229,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 23 has parse error. Details: no viable alternative at input '&lt;expected,' while parsing HTML_ELEMENT</td>
 <td>143</td></tr>
 <tr class="b">
@@ -116433,7 +116433,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 78 has parse error. Details: no viable alternative at input '&lt;Object&gt;, Map&lt;String,' while parsing HTML_TAG</td>
 <td>33</td></tr>
 <tr class="b">
@@ -117033,7 +117033,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 35 has parse error. Missed HTML close tag 'index'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td>823</td></tr>
 <tr class="a">
@@ -120840,7 +120840,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</td>
 <td>Javadoc comment at column 58 has parse error. Details: no viable alternative at input '&lt;byte[' while parsing HTML_ELEMENT</td>
 <td>426</td></tr>
 <tr class="b">
@@ -123693,7 +123693,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 4735d3a..62dd9f8 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -365,7 +365,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-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 0276948..936adbb 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -430,7 +430,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index c3f4b1d..faedc46 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -1095,7 +1095,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index ae3854b..81994f9 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -303,7 +303,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index fc4a164..9e26e21 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="20180401" />
+    <meta name="Date-Revision-yyyymmdd" content="20180403" />
     <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" />
@@ -959,7 +959,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-04-01</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-04-03</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index a2a1b92..dc53779 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 Apr  1 14:41:16 UTC 2018"</code></td>
+<td class="colLast"><code>"Tue Apr  3 14:41:01 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>"1e56938757d2958631ac1ea07387eaa61997d84a"</code></td>
+<td class="colLast"><code>"219625233c1e8ad9daf2c35bc2e3a0844e1b97ba"</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>"2e76f99b04d039004b3db1b121ecb142"</code></td>
+<td class="colLast"><code>"f835792dd6c4970ab511e58632d939d6"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
@@ -17439,10 +17439,10 @@
 <td class="colLast"><code>1.02</code></td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.AdaptiveMemStoreCompactionStrategy.name">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.AdaptiveMemStoreCompactionStrategy.NAME">
 <!--   -->
 </a><code>private&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/regionserver/AdaptiveMemStoreCompactionStrategy.html#name">name</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#NAME">NAME</a></code></td>
 <td class="colLast"><code>"ADAPTIVE"</code></td>
 </tr>
 </tbody>
@@ -17477,10 +17477,10 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.BasicMemStoreCompactionStrategy.name">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.BasicMemStoreCompactionStrategy.NAME">
 <!--   -->
 </a><code>private&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/regionserver/BasicMemStoreCompactionStrategy.html#name">name</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html#NAME">NAME</a></code></td>
 <td class="colLast"><code>"BASIC"</code></td>
 </tr>
 </tbody>
@@ -17913,10 +17913,10 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.EagerMemStoreCompactionStrategy.name">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.EagerMemStoreCompactionStrategy.NAME">
 <!--   -->
 </a><code>private&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/regionserver/EagerMemStoreCompactionStrategy.html#name">name</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html#NAME">NAME</a></code></td>
 <td class="colLast"><code>"EAGER"</code></td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index b7904f0..700ff07 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -21155,7 +21155,9 @@
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALSplitter.EntryBuffers.html#currentlyWriting">currentlyWriting</a></span> - Variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALSplitter.EntryBuffers.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.EntryBuffers</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HStore.html#currentParallelPutCount">currentParallelPutCount</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">Use this counter to track concurrent puts.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/FileLink.FileLinkInputStream.html#currentPath">currentPath</a></span> - Variable in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/FileLink.FileLinkInputStream.html" title="class in org.apache.hadoop.hbase.io">FileLink.FileLinkInputStream</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html#currentPath">currentPath</a></span> - Variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.html" title="class in org.apache.hadoop.hbase.replication.regionserver">ReplicationSourceShipper</a></dt>
@@ -22995,8 +22997,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TableDescriptorBuilder.html#DEFAULT_MEMSTORE_FLUSH_SIZE">DEFAULT_MEMSTORE_FLUSH_SIZE</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a></dt>
 <dd>
-<div class="block">Constant that denotes the maximum default size of the memstore after which
- the contents are flushed to the store files</div>
+<div class="block">Constant that denotes the maximum default size of the memstore in bytes after which
+ the contents are flushed to the store files.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HTableDescriptor.html#DEFAULT_MEMSTORE_FLUSH_SIZE">DEFAULT_MEMSTORE_FLUSH_SIZE</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a></dt>
 <dd>
@@ -41703,6 +41705,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/HFileBlock.html#getMemoryType--">getMemoryType()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HStore.html#getMemstore--">getMemstore()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#getMemStoreDataSize--">getMemStoreDataSize()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#getMemStoreDataSize-org.apache.hadoop.hbase.regionserver.HRegion-">getMemStoreDataSize(HRegion)</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher</a></dt>
@@ -42754,10 +42758,18 @@
              Use <a href="org/apache/hadoop/hbase/RegionLoad.html#getRegionName--"><code>RegionLoad.getRegionName()</code></a> instead.</span></div>
 </div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#getName--">getName()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">AdaptiveMemStoreCompactionStrategy</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/BaseRowProcessor.html#getName--">getName()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/BaseRowProcessor.html" title="class in org.apache.hadoop.hbase.regionserver">BaseRowProcessor</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html#getName--">getName()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">BasicMemStoreCompactionStrategy</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html#getName--">getName()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">EagerMemStoreCompactionStrategy</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/Leases.LeaseStillHeldException.html#getName--">getName()</a></span> - Method in exception org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/Leases.LeaseStillHeldException.html" title="class in org.apache.hadoop.hbase.regionserver">Leases.LeaseStillHeldException</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getName--">getName()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/RowProcessor.html#getName--">getName()</a></span> - Method in interface org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/RowProcessor.html" title="interface in org.apache.hadoop.hbase.regionserver">RowProcessor</a></dt>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
@@ -74854,11 +74866,11 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/RegionMetricsBuilder.RegionMetricsImpl.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/RegionMetricsBuilder.RegionMetricsImpl.html" title="class in org.apache.hadoop.hbase">RegionMetricsBuilder.RegionMetricsImpl</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#name">name</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">AdaptiveMemStoreCompactionStrategy</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#NAME">NAME</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">AdaptiveMemStoreCompactionStrategy</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html#name">name</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">BasicMemStoreCompactionStrategy</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html#NAME">NAME</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">BasicMemStoreCompactionStrategy</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html#name">name</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">EagerMemStoreCompactionStrategy</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html#NAME">NAME</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">EagerMemStoreCompactionStrategy</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/snapshot/RegionServerSnapshotManager.SnapshotSubprocedurePool.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.snapshot.<a href="org/apache/hadoop/hbase/regionserver/snapshot/RegionServerSnapshotManager.SnapshotSubprocedurePool.html" title="class in org.apache.hadoop.hbase.regionserver.snapshot">RegionServerSnapshotManager.SnapshotSubprocedurePool</a></dt>
 <dd>&nbsp;</dd>
@@ -112789,6 +112801,10 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/ImmutableSegment.html#toString--">toString()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/ImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">ImmutableSegment</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#toString--">toString()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#toString--">toString()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactor</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#toString--">toString()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#toString--">toString()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 5890b1a..f2790ae 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,10 +167,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&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/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/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>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html b/devapidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
index e8e2ae2..657153c 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
@@ -205,8 +205,8 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <tr class="rowColor">
 <td class="colFirst"><code>static long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptorBuilder.html#DEFAULT_MEMSTORE_FLUSH_SIZE">DEFAULT_MEMSTORE_FLUSH_SIZE</a></span></code>
-<div class="block">Constant that denotes the maximum default size of the memstore after which
- the contents are flushed to the store files</div>
+<div class="block">Constant that denotes the maximum default size of the memstore in bytes after which
+ the contents are flushed to the store files.</div>
 </td>
 </tr>
 <tr class="altColor">
@@ -1019,8 +1019,8 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <li class="blockList">
 <h4>DEFAULT_MEMSTORE_FLUSH_SIZE</h4>
 <pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html#line.188">DEFAULT_MEMSTORE_FLUSH_SIZE</a></pre>
-<div class="block">Constant that denotes the maximum default size of the memstore after which
- the contents are flushed to the store files</div>
+<div class="block">Constant that denotes the maximum default size of the memstore in bytes after which
+ the contents are flushed to the store files.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.client.TableDescriptorBuilder.DEFAULT_MEMSTORE_FLUSH_SIZE">Constant Field Values</a></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 fdc71f6..ed7e4a4 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/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/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/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/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/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/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.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/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/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index ce950b0..ae0124e 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -104,8 +104,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&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.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 3fc1f19..7eaa108 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/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/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/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/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/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/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/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
index 6406465..eca9c0e 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
@@ -723,7 +723,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 <ul class="blockList">
 <li class="blockList">
 <h4>setIncludesMemStoreTS</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1815">setIncludesMemStoreTS</a>(boolean&nbsp;includesMemstoreTS)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1811">setIncludesMemStoreTS</a>(boolean&nbsp;includesMemstoreTS)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html#setIncludesMemStoreTS-boolean-">setIncludesMemStoreTS</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileBlock.FSReader</a></code></dd>
@@ -736,7 +736,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 <ul class="blockList">
 <li class="blockList">
 <h4>setDataBlockEncoder</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1820">setDataBlockEncoder</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;encoder)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1816">setDataBlockEncoder</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;encoder)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html#setDataBlockEncoder-org.apache.hadoop.hbase.io.hfile.HFileDataBlockEncoder-">setDataBlockEncoder</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileBlock.FSReader</a></code></dd>
@@ -749,7 +749,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 <ul class="blockList">
 <li class="blockList">
 <h4>getBlockDecodingContext</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockDecodingContext.html" title="interface in org.apache.hadoop.hbase.io.encoding">HFileBlockDecodingContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1825">getBlockDecodingContext</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockDecodingContext.html" title="interface in org.apache.hadoop.hbase.io.encoding">HFileBlockDecodingContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1821">getBlockDecodingContext</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html#getBlockDecodingContext--">HFileBlock.FSReader</a></code></span></div>
 <div class="block">Get a decoder for <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html#ENCODED_DATA"><code>BlockType.ENCODED_DATA</code></a> blocks from this file.</div>
 <dl>
@@ -764,7 +764,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 <ul class="blockList">
 <li class="blockList">
 <h4>getDefaultBlockDecodingContext</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockDecodingContext.html" title="interface in org.apache.hadoop.hbase.io.encoding">HFileBlockDecodingContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1830">getDefaultBlockDecodingContext</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/encoding/HFileBlockDecodingContext.html" title="interface in org.apache.hadoop.hbase.io.encoding">HFileBlockDecodingContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1826">getDefaultBlockDecodingContext</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html#getDefaultBlockDecodingContext--">HFileBlock.FSReader</a></code></span></div>
 <div class="block">Get the default decoder for blocks from this file.</div>
 <dl>
@@ -779,7 +779,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 <ul class="blockList">
 <li class="blockList">
 <h4>validateChecksum</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1839">validateChecksum</a>(long&nbsp;offset,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1835">validateChecksum</a>(long&nbsp;offset,
                                  <a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;data,
                                  int&nbsp;hdrSize)
                           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>
@@ -799,7 +799,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 <ul class="blockList">
 <li class="blockList">
 <h4>closeStreams</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1853">closeStreams</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1849">closeStreams</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"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html#closeStreams--">HFileBlock.FSReader</a></code></span></div>
 <div class="block">Closes the backing streams</div>
@@ -817,7 +817,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 <ul class="blockList">
 <li class="blockList">
 <h4>unbufferStream</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1858">unbufferStream</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html#line.1854">unbufferStream</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReader.html#unbufferStream--">HFileBlock.FSReader</a></code></span></div>
 <div class="block">To close the stream's socket. Note: This can be concurrently called from multiple threads and
  implementation should take care of thread safety.</div>
@@ -833,7 +833,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBloc
 <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/io/hfile/HFileBlock.FSReaderImpl.html#line.1871">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/io/hfile/HFileBlock.FSReaderImpl.html#line.1867">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>


[13/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Header.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Header.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Header.html
index 12d10e1..97ceefd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Header.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Header.html
@@ -1740,384 +1740,380 @@
 <span class="sourceLineNo">1732</span>      // and will save us having to seek the stream backwards to reread the header we<a name="line.1732"></a>
 <span class="sourceLineNo">1733</span>      // read the last time through here.<a name="line.1733"></a>
 <span class="sourceLineNo">1734</span>      ByteBuffer headerBuf = getCachedHeader(offset);<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      if (LOG.isTraceEnabled()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        LOG.trace("Reading " + this.fileContext.getHFileName() + " at offset=" + offset +<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>          ", pread=" + pread + ", verifyChecksum=" + verifyChecksum + ", cachedHeader=" +<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>          headerBuf + ", onDiskSizeWithHeader=" + onDiskSizeWithHeader);<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      }<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>      // file has support for checksums (version 2+).<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      long startTime = System.currentTimeMillis();<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>        if (headerBuf == null) {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>          if (LOG.isTraceEnabled()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>          }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>              offset, pread);<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      // the header we read last time through here.<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>      if (headerBuf != null) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        // read. Copy to this block's header.<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>      } else {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>      }<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (verifyChecksum &amp;&amp;<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        return null;<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      if (updateMetrics) {<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        HFile.updateReadLatency(duration, pread);<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>      }<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>      HFileBlock hFileBlock =<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      // Run check on uncompressed sizings.<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>      }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      if (LOG.isTraceEnabled()) {<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>        LOG.trace("Read " + hFileBlock + " in " + duration + " ns");<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      }<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>      // Cache next block header if we read it for the next time through here.<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      }<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      return hFileBlock;<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span><a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    @Override<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span><a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    @Override<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    }<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span><a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    @Override<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      return this.encodedBlockDecodingCtx;<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span><a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    @Override<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return this.defaultDecodingCtx;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span><a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    /**<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>     * If the block doesn't uses checksum, returns false.<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>     * @return True if checksum matches, else false.<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>     */<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>        throws IOException {<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      // checksum validation failure.<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>        return false;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    @Override<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    public void closeStreams() throws IOException {<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      streamWrapper.close();<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    @Override<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    public void unbufferStream() {<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      // unbuffer it.<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>      if (streamLock.tryLock()) {<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>        try {<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>          this.streamWrapper.unbuffer();<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>        } finally {<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>          streamLock.unlock();<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>        }<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>      }<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span><a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    @Override<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    public String toString() {<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    }<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>  }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span><a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  @VisibleForTesting<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>        totalChecksumBytes()) {<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>      throw new IOException("Using no compression but "<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    }<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  }<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span><a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>  // Cacheable implementation<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  @Override<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>  public int getSerializedLength() {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    if (buf != null) {<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      // Include extra bytes for block metadata.<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    return 0;<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  }<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span><a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  // Cacheable implementation<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  @Override<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  public void serialize(ByteBuffer destination) {<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    // Make sure any changes in here are reflected over there.<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    destination = addMetaData(destination);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>    // metadata.<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    destination.flip();<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>  }<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>  /**<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>   * For use by bucketcache. This exposes internals.<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   */<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>  public ByteBuffer getMetaData() {<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    bb = addMetaData(bb);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    bb.flip();<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    return bb;<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span><a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  /**<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>   */<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    destination.putLong(this.offset);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return destination;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  // Cacheable implementation<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>  @Override<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>  }<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span><a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>  @Override<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>  public int hashCode() {<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    int result = 1;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    result = result * 31 + blockType.hashCode();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    result = result * 31 + buf.hashCode();<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    return result;<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>  }<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span><a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  @Override<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>  public boolean equals(Object comparison) {<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    if (this == comparison) {<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>      return true;<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    }<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    if (comparison == null) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>      return false;<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    }<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      return false;<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    }<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span><a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span><a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>      return false;<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    }<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1969"></a>
+<span class="sourceLineNo">1735</span>      LOG.trace("Reading {} at offset={}, pread={}, verifyChecksum={}, cachedHeader={}, " +<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>          "onDiskSizeWithHeader={}", this.fileContext.getHFileName(), offset, pread,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>          verifyChecksum, headerBuf, onDiskSizeWithHeader);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      // file has support for checksums (version 2+).<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      long startTime = System.currentTimeMillis();<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>        if (headerBuf == null) {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>          if (LOG.isTraceEnabled()) {<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          }<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>              offset, pread);<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        }<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      }<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // the header we read last time through here.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      if (headerBuf != null) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>        // read. Copy to this block's header.<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      } else {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      }<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      if (verifyChecksum &amp;&amp;<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        return null;<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      }<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      if (updateMetrics) {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>        HFile.updateReadLatency(duration, pread);<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>      }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      HFileBlock hFileBlock =<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      // Run check on uncompressed sizings.<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>      }<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>      LOG.trace("Read {} in {} ns", hFileBlock, duration);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>      // Cache next block header if we read it for the next time through here.<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      }<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>      return hFileBlock;<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span><a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    @Override<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    }<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span><a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    @Override<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span><a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    @Override<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      return this.encodedBlockDecodingCtx;<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span><a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    @Override<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>      return this.defaultDecodingCtx;<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    }<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span><a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    /**<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>     * If the block doesn't uses checksum, returns false.<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>     * @return True if checksum matches, else false.<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>     */<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        throws IOException {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>      // checksum validation failure.<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        return false;<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>      }<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span><a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    @Override<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    public void closeStreams() throws IOException {<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>      streamWrapper.close();<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    }<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    @Override<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    public void unbufferStream() {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      // unbuffer it.<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>      if (streamLock.tryLock()) {<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        try {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>          this.streamWrapper.unbuffer();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>        } finally {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>          streamLock.unlock();<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      }<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    }<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span><a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    @Override<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    public String toString() {<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>  }<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span><a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>  @VisibleForTesting<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        totalChecksumBytes()) {<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      throw new IOException("Using no compression but "<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span><a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>  // Cacheable implementation<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Override<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public int getSerializedLength() {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    if (buf != null) {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>      // Include extra bytes for block metadata.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    return 0;<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>  }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span><a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>  // Cacheable implementation<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  @Override<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>  public void serialize(ByteBuffer destination) {<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    // Make sure any changes in here are reflected over there.<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    destination = addMetaData(destination);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>    // metadata.<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    destination.flip();<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span><a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>  /**<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * For use by bucketcache. This exposes internals.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  public ByteBuffer getMetaData() {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    bb = addMetaData(bb);<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    bb.flip();<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    return bb;<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>  }<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span><a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  /**<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>   */<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    destination.putLong(this.offset);<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    return destination;<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  }<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span><a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>  // Cacheable implementation<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  @Override<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>  }<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span><a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>  @Override<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>  public int hashCode() {<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    int result = 1;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>    result = result * 31 + blockType.hashCode();<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    result = result * 31 + buf.hashCode();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    return result;<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>  }<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span><a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>  @Override<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>  public boolean equals(Object comparison) {<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    if (this == comparison) {<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>      return true;<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    }<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    if (comparison == null) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>      return false;<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    }<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>      return false;<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    }<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span><a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>      return false;<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    }<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>      return false;<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>    }<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    if (castedComparison.offset != this.offset) {<a name="line.1969"></a>
 <span class="sourceLineNo">1970</span>      return false;<a name="line.1970"></a>
 <span class="sourceLineNo">1971</span>    }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    if (castedComparison.offset != this.offset) {<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      return false;<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    }<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>      return false;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      return false;<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>    }<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1982"></a>
+<span class="sourceLineNo">1972</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>      return false;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>    }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      return false;<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    }<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>      return false;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>        castedComparison.buf.limit()) != 0) {<a name="line.1982"></a>
 <span class="sourceLineNo">1983</span>      return false;<a name="line.1983"></a>
 <span class="sourceLineNo">1984</span>    }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        castedComparison.buf.limit()) != 0) {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      return false;<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    }<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    return true;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>  }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    }<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    return DataBlockEncoding.NONE;<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>  }<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span><a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>  @VisibleForTesting<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>  byte getChecksumType() {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>    return this.fileContext.getChecksumType().getCode();<a name="line.2001"></a>
+<span class="sourceLineNo">1985</span>    return true;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>    }<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    return DataBlockEncoding.NONE;<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>  }<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span><a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>  @VisibleForTesting<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>  byte getChecksumType() {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>  int getBytesPerChecksum() {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2001"></a>
 <span class="sourceLineNo">2002</span>  }<a name="line.2002"></a>
 <span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>  int getBytesPerChecksum() {<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>  }<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>  @VisibleForTesting<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    return this.onDiskDataSizeWithHeader;<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  /**<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>   */<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>  int totalChecksumBytes() {<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    // indicates that cached blocks do not have checksum data because<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>    // checksums were already validated when the block was read from disk.<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      return 0;<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        this.fileContext.getBytesPerChecksum());<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  }<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span><a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>  /**<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>   * Returns the size of this block header.<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>   */<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>  public int headerSize() {<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>  }<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span><a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>  /**<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>   * Maps a minor version to the size of the header.<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>   */<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    return usesHBaseChecksum?<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>  }<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span><a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>  /**<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>   */<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>  @VisibleForTesting<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>  // TODO: Why is this in here?<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>  byte[] getDummyHeaderForVersion() {<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>  }<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span><a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>  /**<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>  }<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span><a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>  /**<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>   */<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>  HFileContext getHFileContext() {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    return this.fileContext;<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>  }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span><a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>  @Override<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>  public MemoryType getMemoryType() {<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    return this.memType;<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span><a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>   */<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  boolean usesSharedMemory() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return this.memType == MemoryType.SHARED;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * Convert the contents of the block header into a human readable string.<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>   * has minor version &gt; 0.<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>   */<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>  @VisibleForTesting<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    buf.get(magicBuf);<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    long prevBlockOffset = buf.getLong();<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    byte cksumtype = buf.get();<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    long bytesPerChecksum = buf.getInt();<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>                   " blockType " + bt +<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>                   " compressedBlockSizeNoHeader " +<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>                   compressedBlockSizeNoHeader +<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>                   uncompressedBlockSizeNoHeader +<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2106"></a>
+<span class="sourceLineNo">2004</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>  @VisibleForTesting<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    return this.onDiskDataSizeWithHeader;<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>  }<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span><a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>  /**<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>   */<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>  int totalChecksumBytes() {<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    // indicates that cached blocks do not have checksum data because<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    // checksums were already validated when the block was read from disk.<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      return 0;<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>        this.fileContext.getBytesPerChecksum());<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  }<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span><a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>  /**<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>   * Returns the size of this block header.<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>   */<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  public int headerSize() {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>  }<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>  /**<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>   * Maps a minor version to the size of the header.<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>   */<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    return usesHBaseChecksum?<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span><a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>  /**<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>   */<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>  @VisibleForTesting<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>  // TODO: Why is this in here?<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>  byte[] getDummyHeaderForVersion() {<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>  }<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span><a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>  /**<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>   */<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>  }<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span><a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>  /**<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>   */<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>  HFileContext getHFileContext() {<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    return this.fileContext;<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>  }<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span><a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>  @Override<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>  public MemoryType getMemoryType() {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    return this.memType;<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>  }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span><a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>  /**<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>   */<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>  boolean usesSharedMemory() {<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    return this.memType == MemoryType.SHARED;<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>  }<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span><a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>  /**<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>   * Convert the contents of the block header into a human readable string.<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>   * has minor version &gt; 0.<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>   */<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>  @VisibleForTesting<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    buf.get(magicBuf);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>    long prevBlockOffset = buf.getLong();<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    byte cksumtype = buf.get();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    long bytesPerChecksum = buf.getInt();<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>                   " blockType " + bt +<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>                   " compressedBlockSizeNoHeader " +<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>                   compressedBlockSizeNoHeader +<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>                   uncompressedBlockSizeNoHeader +<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  }<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span><a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public HFileBlock deepClone() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    return new HFileBlock(this, true);<a name="line.2106"></a>
 <span class="sourceLineNo">2107</span>  }<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>  public HFileBlock deepClone() {<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    return new HFileBlock(this, true);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>}<a name="line.2112"></a>
+<span class="sourceLineNo">2108</span>}<a name="line.2108"></a>
 
 
 


[03/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
index cc35a46..cca21a9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
@@ -190,1967 +190,1967 @@
 <span class="sourceLineNo">182</span><a name="line.182"></a>
 <span class="sourceLineNo">183</span>  private final boolean verifyBulkLoads;<a name="line.183"></a>
 <span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  private final AtomicInteger currentParallelPutCount = new AtomicInteger(0);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private final int parallelPutCountPrintThreshold;<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private ScanInfo scanInfo;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  // All access must be synchronized.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  // TODO: ideally, this should be part of storeFileManager, as we keep passing this to it.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private final List&lt;HStoreFile&gt; filesCompacting = Lists.newArrayList();<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>  // All access must be synchronized.<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  private final Set&lt;ChangedReadersObserver&gt; changedReaderObservers =<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    Collections.newSetFromMap(new ConcurrentHashMap&lt;ChangedReadersObserver, Boolean&gt;());<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>  protected final int blocksize;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  private HFileDataBlockEncoder dataBlockEncoder;<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>  /** Checksum configuration */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  protected ChecksumType checksumType;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  protected int bytesPerChecksum;<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  // Comparing KeyValues<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  protected final CellComparator comparator;<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>  final StoreEngine&lt;?, ?, ?, ?&gt; storeEngine;<a name="line.208"></a>
+<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * Use this counter to track concurrent puts. If TRACE-log is enabled, if we are over the<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * threshold set by hbase.region.store.parallel.put.print.threshold (Default is 50) we will<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   * log a message that identifies the Store experience this high-level of concurrency.<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   */<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  private final AtomicInteger currentParallelPutCount = new AtomicInteger(0);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private final int parallelPutCountPrintThreshold;<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  private ScanInfo scanInfo;<a name="line.193"></a>
+<span class="sourceLineNo">194</span><a name="line.194"></a>
+<span class="sourceLineNo">195</span>  // All access must be synchronized.<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  // TODO: ideally, this should be part of storeFileManager, as we keep passing this to it.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  private final List&lt;HStoreFile&gt; filesCompacting = Lists.newArrayList();<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  // All access must be synchronized.<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  private final Set&lt;ChangedReadersObserver&gt; changedReaderObservers =<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    Collections.newSetFromMap(new ConcurrentHashMap&lt;ChangedReadersObserver, Boolean&gt;());<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>  protected final int blocksize;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  private HFileDataBlockEncoder dataBlockEncoder;<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span>  /** Checksum configuration */<a name="line.206"></a>
+<span class="sourceLineNo">207</span>  protected ChecksumType checksumType;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  protected int bytesPerChecksum;<a name="line.208"></a>
 <span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  private static final AtomicBoolean offPeakCompactionTracker = new AtomicBoolean();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  private volatile OffPeakHours offPeakHours;<a name="line.211"></a>
+<span class="sourceLineNo">210</span>  // Comparing KeyValues<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected final CellComparator comparator;<a name="line.211"></a>
 <span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  private static final int DEFAULT_FLUSH_RETRIES_NUMBER = 10;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  private int flushRetriesNumber;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private int pauseTime;<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  private long blockingFileCount;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  private int compactionCheckMultiplier;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  protected Encryption.Context cryptoContext = Encryption.Context.NONE;<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  private AtomicLong flushedCellsCount = new AtomicLong();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  private AtomicLong compactedCellsCount = new AtomicLong();<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  private AtomicLong majorCompactedCellsCount = new AtomicLong();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  private AtomicLong flushedCellsSize = new AtomicLong();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  private AtomicLong flushedOutputFileSize = new AtomicLong();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  private AtomicLong compactedCellsSize = new AtomicLong();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  private AtomicLong majorCompactedCellsSize = new AtomicLong();<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * Constructor<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * @param region<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @param family HColumnDescriptor for this column<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @param confParam configuration object<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * failed.  Can be null.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @throws IOException<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  protected HStore(final HRegion region, final ColumnFamilyDescriptor family,<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      final Configuration confParam) throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>    this.fs = region.getRegionFileSystem();<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>    // Assemble the store's home directory and Ensure it exists.<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    fs.createStoreDir(family.getNameAsString());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    this.region = region;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    this.family = family;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    // 'conf' renamed to 'confParam' b/c we use this.conf in the constructor<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    // CompoundConfiguration will look for keys in reverse order of addition, so we'd<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    // add global config first, then table and cf overrides, then cf metadata.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    this.conf = new CompoundConfiguration()<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      .add(confParam)<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      .addBytesMap(region.getTableDescriptor().getValues())<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      .addStringMap(family.getConfiguration())<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      .addBytesMap(family.getValues());<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    this.blocksize = family.getBlocksize();<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>    // set block storage policy for store directory<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    String policyName = family.getStoragePolicy();<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    if (null == policyName) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      policyName = this.conf.get(BLOCK_STORAGE_POLICY_KEY, DEFAULT_BLOCK_STORAGE_POLICY);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    this.fs.setStoragePolicy(family.getNameAsString(), policyName.trim());<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>    this.dataBlockEncoder =<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        new HFileDataBlockEncoderImpl(family.getDataBlockEncoding());<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>    this.comparator = region.getCellComparator();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    // used by ScanQueryMatcher<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    long timeToPurgeDeletes =<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        Math.max(conf.getLong("hbase.hstore.time.to.purge.deletes", 0), 0);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    LOG.trace("Time to purge deletes set to {}ms in store {}", timeToPurgeDeletes, this);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    // Get TTL<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    long ttl = determineTTLFromFamily(family);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // Why not just pass a HColumnDescriptor in here altogether?  Even if have<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    // to clone it?<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    scanInfo = new ScanInfo(conf, family, ttl, timeToPurgeDeletes, this.comparator);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    if (this.getTableName().isSystemTable()) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      inMemoryCompaction = MemoryCompactionPolicy<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          .valueOf(conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    } else {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    if (inMemoryCompaction == null) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      inMemoryCompaction =<a name="line.284"></a>
-<span class="sourceLineNo">285</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.285"></a>
-<span class="sourceLineNo">286</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    String className;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    switch (inMemoryCompaction) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      case NONE:<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        className = DefaultMemStore.class.getName();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        this.memstore = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            new Object[] { conf, this.comparator });<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        break;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      default:<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          CompactingMemStore.class, CompactingMemStore.class);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        className = clz.getName();<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        this.memstore = ReflectionUtils.newInstance(clz, new Object[] { conf, this.comparator, this,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction });<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    this.offPeakHours = OffPeakHours.getInstance(conf);<a name="line.302"></a>
+<span class="sourceLineNo">213</span>  final StoreEngine&lt;?, ?, ?, ?&gt; storeEngine;<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>  private static final AtomicBoolean offPeakCompactionTracker = new AtomicBoolean();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  private volatile OffPeakHours offPeakHours;<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  private static final int DEFAULT_FLUSH_RETRIES_NUMBER = 10;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  private int flushRetriesNumber;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  private int pauseTime;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>  private long blockingFileCount;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  private int compactionCheckMultiplier;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  protected Encryption.Context cryptoContext = Encryption.Context.NONE;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>  private AtomicLong flushedCellsCount = new AtomicLong();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  private AtomicLong compactedCellsCount = new AtomicLong();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>  private AtomicLong majorCompactedCellsCount = new AtomicLong();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  private AtomicLong flushedCellsSize = new AtomicLong();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  private AtomicLong flushedOutputFileSize = new AtomicLong();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  private AtomicLong compactedCellsSize = new AtomicLong();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  private AtomicLong majorCompactedCellsSize = new AtomicLong();<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>   * Constructor<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * @param region<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * @param family HColumnDescriptor for this column<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param confParam configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * failed.  Can be null.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * @throws IOException<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  protected HStore(final HRegion region, final ColumnFamilyDescriptor family,<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      final Configuration confParam) throws IOException {<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>    this.fs = region.getRegionFileSystem();<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // Assemble the store's home directory and Ensure it exists.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    fs.createStoreDir(family.getNameAsString());<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    this.region = region;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    this.family = family;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // 'conf' renamed to 'confParam' b/c we use this.conf in the constructor<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    // CompoundConfiguration will look for keys in reverse order of addition, so we'd<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    // add global config first, then table and cf overrides, then cf metadata.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    this.conf = new CompoundConfiguration()<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      .add(confParam)<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      .addBytesMap(region.getTableDescriptor().getValues())<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      .addStringMap(family.getConfiguration())<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      .addBytesMap(family.getValues());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    this.blocksize = family.getBlocksize();<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    // set block storage policy for store directory<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    String policyName = family.getStoragePolicy();<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    if (null == policyName) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      policyName = this.conf.get(BLOCK_STORAGE_POLICY_KEY, DEFAULT_BLOCK_STORAGE_POLICY);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    this.fs.setStoragePolicy(family.getNameAsString(), policyName.trim());<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    this.dataBlockEncoder = new HFileDataBlockEncoderImpl(family.getDataBlockEncoding());<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>    this.comparator = region.getCellComparator();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    // used by ScanQueryMatcher<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    long timeToPurgeDeletes =<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        Math.max(conf.getLong("hbase.hstore.time.to.purge.deletes", 0), 0);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    LOG.trace("Time to purge deletes set to {}ms in store {}", timeToPurgeDeletes, this);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    // Get TTL<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    long ttl = determineTTLFromFamily(family);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // Why not just pass a HColumnDescriptor in here altogether?  Even if have<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    // to clone it?<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    scanInfo = new ScanInfo(conf, family, ttl, timeToPurgeDeletes, this.comparator);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    this.memstore = getMemstore();<a name="line.280"></a>
+<span class="sourceLineNo">281</span><a name="line.281"></a>
+<span class="sourceLineNo">282</span>    this.offPeakHours = OffPeakHours.getInstance(conf);<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // Setting up cache configuration for this family<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    createCacheConf(family);<a name="line.285"></a>
+<span class="sourceLineNo">286</span><a name="line.286"></a>
+<span class="sourceLineNo">287</span>    this.verifyBulkLoads = conf.getBoolean("hbase.hstore.bulkload.verify", false);<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    this.blockingFileCount =<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        conf.getInt(BLOCKING_STOREFILES_KEY, DEFAULT_BLOCKING_STOREFILE_COUNT);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    this.compactionCheckMultiplier = conf.getInt(<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        COMPACTCHECKER_INTERVAL_MULTIPLIER_KEY, DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    if (this.compactionCheckMultiplier &lt;= 0) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      LOG.error("Compaction check period multiplier must be positive, setting default: {}",<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      this.compactionCheckMultiplier = DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    if (HStore.closeCheckInterval == 0) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      HStore.closeCheckInterval = conf.getInt(<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          "hbase.hstore.close.check.interval", 10*1000*1000 /* 10 MB */);<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>    // Setting up cache configuration for this family<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    createCacheConf(family);<a name="line.305"></a>
+<span class="sourceLineNo">304</span>    this.storeEngine = createStoreEngine(this, this.conf, this.comparator);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    this.storeEngine.getStoreFileManager().loadFiles(loadStoreFiles());<a name="line.305"></a>
 <span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    this.verifyBulkLoads = conf.getBoolean("hbase.hstore.bulkload.verify", false);<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>    this.blockingFileCount =<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        conf.getInt(BLOCKING_STOREFILES_KEY, DEFAULT_BLOCKING_STOREFILE_COUNT);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    this.compactionCheckMultiplier = conf.getInt(<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        COMPACTCHECKER_INTERVAL_MULTIPLIER_KEY, DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    if (this.compactionCheckMultiplier &lt;= 0) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      LOG.error("Compaction check period multiplier must be positive, setting default: {}",<a name="line.314"></a>
-<span class="sourceLineNo">315</span>          DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      this.compactionCheckMultiplier = DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>    if (HStore.closeCheckInterval == 0) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      HStore.closeCheckInterval = conf.getInt(<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          "hbase.hstore.close.check.interval", 10*1000*1000 /* 10 MB */);<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>    this.storeEngine = createStoreEngine(this, this.conf, this.comparator);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    this.storeEngine.getStoreFileManager().loadFiles(loadStoreFiles());<a name="line.325"></a>
-<span class="sourceLineNo">326</span><a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // Initialize checksum type from name. The names are CRC32, CRC32C, etc.<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    this.checksumType = getChecksumType(conf);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    // Initialize bytes per checksum<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    this.bytesPerChecksum = getBytesPerChecksum(conf);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    flushRetriesNumber = conf.getInt(<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        "hbase.hstore.flush.retries.number", DEFAULT_FLUSH_RETRIES_NUMBER);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    pauseTime = conf.getInt(HConstants.HBASE_SERVER_PAUSE, HConstants.DEFAULT_HBASE_SERVER_PAUSE);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    if (flushRetriesNumber &lt;= 0) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      throw new IllegalArgumentException(<a name="line.335"></a>
-<span class="sourceLineNo">336</span>          "hbase.hstore.flush.retries.number must be &gt; 0, not "<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              + flushRetriesNumber);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    cryptoContext = EncryptionUtil.createEncryptionContext(conf, family);<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    int confPrintThreshold = conf.getInt("hbase.region.store.parallel.put.print.threshold", 50);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    if (confPrintThreshold &lt; 10) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      confPrintThreshold = 10;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    this.parallelPutCountPrintThreshold = confPrintThreshold;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    LOG.info("Memstore class name is " + className + " ; parallelPutCountPrintThreshold="<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        + parallelPutCountPrintThreshold);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /**<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * Creates the cache config.<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @param family The current column family.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   */<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    this.cacheConf = new CacheConfig(conf, family);<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>  /**<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   * Creates the store engine configured for the given Store.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   *              being passed to coprocessors via the compactor.<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   * @param conf Store configuration.<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   * @return StoreEngine to use.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   */<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      CellComparator kvComparator) throws IOException {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    return StoreEngine.create(store, conf, comparator);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>  /**<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * @param family<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * @return TTL in seconds of the specified family<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    long ttl = family.getTimeToLive();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    if (ttl == HConstants.FOREVER) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      // Default is unlimited ttl.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      ttl = Long.MAX_VALUE;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    } else if (ttl == -1) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      ttl = Long.MAX_VALUE;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    } else {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      // Second -&gt; ms adjust for user data<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      ttl *= 1000;<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    return ttl;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>  @Override<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  public String getColumnFamilyName() {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    return this.family.getNameAsString();<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>  @Override<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  public TableName getTableName() {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    return this.getRegionInfo().getTable();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  }<a name="line.398"></a>
-<span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>  @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public FileSystem getFileSystem() {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return this.fs.getFileSystem();<a name="line.402"></a>
+<span class="sourceLineNo">307</span>    // Initialize checksum type from name. The names are CRC32, CRC32C, etc.<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    this.checksumType = getChecksumType(conf);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // Initialize bytes per checksum<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    this.bytesPerChecksum = getBytesPerChecksum(conf);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    flushRetriesNumber = conf.getInt(<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        "hbase.hstore.flush.retries.number", DEFAULT_FLUSH_RETRIES_NUMBER);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    pauseTime = conf.getInt(HConstants.HBASE_SERVER_PAUSE, HConstants.DEFAULT_HBASE_SERVER_PAUSE);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (flushRetriesNumber &lt;= 0) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      throw new IllegalArgumentException(<a name="line.315"></a>
+<span class="sourceLineNo">316</span>          "hbase.hstore.flush.retries.number must be &gt; 0, not "<a name="line.316"></a>
+<span class="sourceLineNo">317</span>              + flushRetriesNumber);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    cryptoContext = EncryptionUtil.createEncryptionContext(conf, family);<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>    int confPrintThreshold =<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        this.conf.getInt("hbase.region.store.parallel.put.print.threshold", 50);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    if (confPrintThreshold &lt; 10) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      confPrintThreshold = 10;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    this.parallelPutCountPrintThreshold = confPrintThreshold;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    LOG.info("Store={},  memstore type={}, storagePolicy={}, verifyBulkLoads={}, " +<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            "parallelPutCountPrintThreshold={}", getColumnFamilyName(),<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        this.memstore.getClass().getSimpleName(), policyName,<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        this.verifyBulkLoads, this.parallelPutCountPrintThreshold);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
+<span class="sourceLineNo">332</span><a name="line.332"></a>
+<span class="sourceLineNo">333</span>  /**<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * @return MemStore Instance to use in this store.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  private MemStore getMemstore() {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    MemStore ms = null;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    // Check if in-memory-compaction configured. Note MemoryCompactionPolicy is an enum!<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    if (this.getTableName().isSystemTable()) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      inMemoryCompaction = MemoryCompactionPolicy.valueOf(<a name="line.341"></a>
+<span class="sourceLineNo">342</span>          conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    } else {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    if (inMemoryCompaction == null) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      inMemoryCompaction =<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.348"></a>
+<span class="sourceLineNo">349</span>              CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT));<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    switch (inMemoryCompaction) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      case NONE:<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        ms = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.353"></a>
+<span class="sourceLineNo">354</span>            new Object[]{conf, this.comparator});<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        break;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      default:<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            CompactingMemStore.class, CompactingMemStore.class);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>        ms = ReflectionUtils.newInstance(clz, new Object[]{conf, this.comparator, this,<a name="line.359"></a>
+<span class="sourceLineNo">360</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction});<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    return ms;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  /**<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * Creates the cache config.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   * @param family The current column family.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    this.cacheConf = new CacheConfig(conf, family);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  }<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>   * Creates the store engine configured for the given Store.<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   *              being passed to coprocessors via the compactor.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @param conf Store configuration.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * @return StoreEngine to use.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      CellComparator kvComparator) throws IOException {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    return StoreEngine.create(store, conf, comparator);<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>  /**<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * @param family<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   * @return TTL in seconds of the specified family<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   */<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    long ttl = family.getTimeToLive();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    if (ttl == HConstants.FOREVER) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      // Default is unlimited ttl.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      ttl = Long.MAX_VALUE;<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    } else if (ttl == -1) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      ttl = Long.MAX_VALUE;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    } else {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      // Second -&gt; ms adjust for user data<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      ttl *= 1000;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return ttl;<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>  public HRegionFileSystem getRegionFileSystem() {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    return this.fs;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  /* Implementation of StoreConfigInformation */<a name="line.409"></a>
+<span class="sourceLineNo">405</span>  @Override<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  public String getColumnFamilyName() {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    return this.family.getNameAsString();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
 <span class="sourceLineNo">410</span>  @Override<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  public long getStoreFileTtl() {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // TTL only applies if there's no MIN_VERSIONs setting on the column.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return (this.scanInfo.getMinVersions() == 0) ? this.scanInfo.getTtl() : Long.MAX_VALUE;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Override<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public long getMemStoreFlushSize() {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    // TODO: Why is this in here?  The flushsize of the region rather than the store?  St.Ack<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    return this.region.memstoreFlushSize;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  @Override<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  public MemStoreSize getFlushableSize() {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    return this.memstore.getFlushableSize();<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>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public MemStoreSize getSnapshotSize() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return this.memstore.getSnapshotSize();<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public long getCompactionCheckMultiplier() {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return this.compactionCheckMultiplier;<a name="line.434"></a>
+<span class="sourceLineNo">411</span>  public TableName getTableName() {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    return this.getRegionInfo().getTable();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  @Override<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  public FileSystem getFileSystem() {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    return this.fs.getFileSystem();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>  public HRegionFileSystem getRegionFileSystem() {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    return this.fs;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
+<span class="sourceLineNo">423</span><a name="line.423"></a>
+<span class="sourceLineNo">424</span>  /* Implementation of StoreConfigInformation */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  public long getStoreFileTtl() {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    // TTL only applies if there's no MIN_VERSIONs setting on the column.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    return (this.scanInfo.getMinVersions() == 0) ? this.scanInfo.getTtl() : Long.MAX_VALUE;<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>  @Override<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  public long getMemStoreFlushSize() {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    // TODO: Why is this in here?  The flushsize of the region rather than the store?  St.Ack<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    return this.region.memstoreFlushSize;<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>  @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public long getBlockingFileCount() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return blockingFileCount;<a name="line.439"></a>
+<span class="sourceLineNo">438</span>  public MemStoreSize getFlushableSize() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return this.memstore.getFlushableSize();<a name="line.439"></a>
 <span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  /* End implementation of StoreConfigInformation */<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>   * Returns the configured bytesPerChecksum value.<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * @param conf The configuration<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   * @return The bytesPerChecksum that is set in the configuration<a name="line.446"></a>
-<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public static int getBytesPerChecksum(Configuration conf) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    return conf.getInt(HConstants.BYTES_PER_CHECKSUM,<a name="line.449"></a>
-<span class="sourceLineNo">450</span>                       HFile.DEFAULT_BYTES_PER_CHECKSUM);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  /**<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * Returns the configured checksum algorithm.<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * @param conf The configuration<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return The checksum algorithm that is set in the configuration<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public static ChecksumType getChecksumType(Configuration conf) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    String checksumName = conf.get(HConstants.CHECKSUM_TYPE_NAME);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    if (checksumName == null) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      return ChecksumType.getDefaultChecksumType();<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    } else {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      return ChecksumType.nameToType(checksumName);<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><a name="line.466"></a>
-<span class="sourceLineNo">467</span>  /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * @return how many bytes to write between status checks<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   */<a name="line.469"></a>
-<span class="sourceLineNo">470</span>  public static int getCloseCheckInterval() {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    return closeCheckInterval;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public ColumnFamilyDescriptor getColumnFamilyDescriptor() {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    return this.family;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>  }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>  @Override<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  public OptionalLong getMaxSequenceId() {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    return StoreUtils.getMaxSequenceIdInList(this.getStorefiles());<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  @Override<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  public OptionalLong getMaxMemStoreTS() {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    return StoreUtils.getMaxMemStoreTSInList(this.getStorefiles());<a name="line.486"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  public MemStoreSize getSnapshotSize() {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    return this.memstore.getSnapshotSize();<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public long getCompactionCheckMultiplier() {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    return this.compactionCheckMultiplier;<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>  @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  public long getBlockingFileCount() {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    return blockingFileCount;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  /* End implementation of StoreConfigInformation */<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>   * Returns the configured bytesPerChecksum value.<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * @param conf The configuration<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * @return The bytesPerChecksum that is set in the configuration<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   */<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public static int getBytesPerChecksum(Configuration conf) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return conf.getInt(HConstants.BYTES_PER_CHECKSUM,<a name="line.464"></a>
+<span class="sourceLineNo">465</span>                       HFile.DEFAULT_BYTES_PER_CHECKSUM);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  }<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>  /**<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * Returns the configured checksum algorithm.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * @param conf The configuration<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * @return The checksum algorithm that is set in the configuration<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   */<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public static ChecksumType getChecksumType(Configuration conf) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    String checksumName = conf.get(HConstants.CHECKSUM_TYPE_NAME);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    if (checksumName == null) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      return ChecksumType.getDefaultChecksumType();<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    } else {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      return ChecksumType.nameToType(checksumName);<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>  /**<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * @return how many bytes to write between status checks<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  public static int getCloseCheckInterval() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    return closeCheckInterval;<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>  /**<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * @param hri {@link RegionInfo} for the region.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @return Path to family/Store home directory.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   */<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  @Deprecated<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      final RegionInfo hri, final byte[] family) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return getStoreHomedir(tabledir, hri.getEncodedName(), family);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>  /**<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * @param encodedName Encoded region name.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.504"></a>
-<span class="sourceLineNo">505</span>   * @return Path to family/Store home directory.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>   */<a name="line.506"></a>
-<span class="sourceLineNo">507</span>  @Deprecated<a name="line.507"></a>
-<span class="sourceLineNo">508</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      final String encodedName, final byte[] family) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    return new Path(tabledir, new Path(encodedName, Bytes.toString(family)));<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  }<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>   * @return the data block encoder<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   */<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  public HFileDataBlockEncoder getDataBlockEncoder() {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    return dataBlockEncoder;<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  }<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>   * Should be used only in tests.<a name="line.521"></a>
-<span class="sourceLineNo">522</span>   * @param blockEncoder the block delta encoder to use<a name="line.522"></a>
-<span class="sourceLineNo">523</span>   */<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  void setDataBlockEncoderInTest(HFileDataBlockEncoder blockEncoder) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    this.dataBlockEncoder = blockEncoder;<a name="line.525"></a>
+<span class="sourceLineNo">489</span>  @Override<a name="line.489"></a>
+<span class="sourceLineNo">490</span>  public ColumnFamilyDescriptor getColumnFamilyDescriptor() {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    return this.family;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
+<span class="sourceLineNo">493</span><a name="line.493"></a>
+<span class="sourceLineNo">494</span>  @Override<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  public OptionalLong getMaxSequenceId() {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    return StoreUtils.getMaxSequenceIdInList(this.getStorefiles());<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>  @Override<a name="line.499"></a>
+<span class="sourceLineNo">500</span>  public OptionalLong getMaxMemStoreTS() {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    return StoreUtils.getMaxMemStoreTSInList(this.getStorefiles());<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>  /**<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @param hri {@link RegionInfo} for the region.<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.507"></a>
+<span class="sourceLineNo">508</span>   * @return Path to family/Store home directory.<a name="line.508"></a>
+<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  @Deprecated<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      final RegionInfo hri, final byte[] family) {<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    return getStoreHomedir(tabledir, hri.getEncodedName(), family);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  /**<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   * @param encodedName Encoded region name.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * @return Path to family/Store home directory.<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>  @Deprecated<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      final String encodedName, final byte[] family) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return new Path(tabledir, new Path(encodedName, Bytes.toString(family)));<a name="line.525"></a>
 <span class="sourceLineNo">526</span>  }<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>   * Creates an unsorted list of StoreFile loaded in parallel<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * from the given directory.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @throws IOException<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  private List&lt;HStoreFile&gt; loadStoreFiles() throws IOException {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    Collection&lt;StoreFileInfo&gt; files = fs.getStoreFiles(getColumnFamilyName());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    return openStoreFiles(files);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  private List&lt;HStoreFile&gt; openStoreFiles(Collection&lt;StoreFileInfo&gt; files) throws IOException {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    if (CollectionUtils.isEmpty(files)) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      return Collections.emptyList();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    }<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    // initialize the thread pool for opening store files in parallel..<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    ThreadPoolExecutor storeFileOpenerThreadPool =<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      this.region.getStoreFileOpenAndCloseThreadPool("StoreFileOpenerThread-" +<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          this.getColumnFamilyName());<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    CompletionService&lt;HStoreFile&gt; completionService = new ExecutorCompletionService&lt;&gt;(storeFileOpenerThreadPool);<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>    int totalValidStoreFile = 0;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    for (StoreFileInfo storeFileInfo : files) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      // open each store file in parallel<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      completionService.submit(() -&gt; this.createStoreFileAndReader(storeFileInfo));<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      totalValidStoreFile++;<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    ArrayList&lt;HStoreFile&gt; results = new ArrayList&lt;&gt;(files.size());<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    IOException ioe = null;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      for (int i = 0; i &lt; totalValidStoreFile; i++) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>        try {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>          HStoreFile storeFile = completionService.take().get();<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          if (storeFile != null) {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>            long length = storeFile.getReader().length();<a name="line.562"></a>
-<span class="sourceLineNo">563</span>            this.storeSize.addAndGet(length);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>            this.totalUncompressedBytes<a name="line.564"></a>
-<span class="sourceLineNo">565</span>                .addAndGet(storeFile.getReader().getTotalUncompressedBytes());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>            LOG.debug("loaded {}", storeFile);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>            results.add(storeFile);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>          }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>        } catch (InterruptedException e) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          if (ioe == null) ioe = new InterruptedIOException(e.getMessage());<a name="line.570"></a>
-<span class="sourceLineNo">571</span>        } catch (ExecutionException e) {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          if (ioe == null) ioe = new IOException(e.getCause());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        }<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      }<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    } finally {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      storeFileOpenerThreadPool.shutdownNow();<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    }<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    if (ioe != null) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      // close StoreFile readers<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      boolean evictOnClose =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (HStoreFile file : results) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        try {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          if (file != null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            file.closeStoreFile(evictOnClose);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        } catch (IOException e) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          LOG.warn("Could not close store file", e);<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>      throw ioe;<a name="line.591"></a>
+<span class="sourceLineNo">529</span>   * @return the data block encoder<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   */<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  public HFileDataBlockEncoder getDataBlockEncoder() {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    return dataBlockEncoder;<a name="line.532"></a>
+<span class="sourceLineNo">533</span>  }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>  /**<a name="line.535"></a>
+<span class="sourceLineNo">536</span>   * Should be used only in tests.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>   * @param blockEncoder the block delta encoder to use<a name="line.537"></a>
+<span class="sourceLineNo">538</span>   */<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  void setDataBlockEncoderInTest(HFileDataBlockEncoder blockEncoder) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    this.dataBlockEncoder = blockEncoder;<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  }<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>  /**<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   * Creates an unsorted list of StoreFile loaded in parallel<a name="line.544"></a>
+<span class="sourceLineNo">545</span>   * from the given directory.<a name="line.545"></a>
+<span class="sourceLineNo">546</span>   * @throws IOException<a name="line.546"></a>
+<span class="sourceLineNo">547</span>   */<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  private List&lt;HStoreFile&gt; loadStoreFiles() throws IOException {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    Collection&lt;StoreFileInfo&gt; files = fs.getStoreFiles(getColumnFamilyName());<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    return openStoreFiles(files);<a name="line.550"></a>
+<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>  private List&lt;HStoreFile&gt; openStoreFiles(Collection&lt;StoreFileInfo&gt; files) throws IOException {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    if (CollectionUtils.isEmpty(files)) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      return Collections.emptyList();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    // initialize the thread pool for opening store files in parallel..<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    ThreadPoolExecutor storeFileOpenerThreadPool =<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      this.region.getStoreFileOpenAndCloseThreadPool("StoreFileOpenerThread-" +<a name="line.559"></a>
+<span class="sourceLineNo">560</span>          this.getColumnFamilyName());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    CompletionService&lt;HStoreFile&gt; completionService = new ExecutorCompletionService&lt;&gt;(storeFileOpenerThreadPool);<a name="line.561"></a>
+<span class="sourceLineNo">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>    int totalValidStoreFile = 0;<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    for (StoreFileInfo storeFileInfo : files) {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      // open each store file in parallel<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      completionService.submit(() -&gt; this.createStoreFileAndReader(storeFileInfo));<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      totalValidStoreFile++;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>    ArrayList&lt;HStoreFile&gt; results = new ArrayList&lt;&gt;(files.size());<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    IOException ioe = null;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      for (int i = 0; i &lt; totalValidStoreFile; i++) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        try {<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          HStoreFile storeFile = completionService.take().get();<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          if (storeFile != null) {<a name="line.576"></a>
+<span class="sourceLineNo">577</span>            long length = storeFile.getReader().length();<a name="line.577"></a>
+<span class="sourceLineNo">578</span>            this.storeSize.addAndGet(length);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>            this.totalUncompressedBytes<a name="line.579"></a>
+<span class="sourceLineNo">580</span>                .addAndGet(storeFile.getReader().getTotalUncompressedBytes());<a name="line.580"></a>
+<span class="sourceLineNo">581</span>            LOG.debug("loaded {}", storeFile);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>            results.add(storeFile);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          }<a name="line.583"></a>
+<span class="sourceLineNo">584</span>        } catch (InterruptedException e) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          if (ioe == null) ioe = new InterruptedIOException(e.getMessage());<a name="line.585"></a>
+<span class="sourceLineNo">586</span>        } catch (ExecutionException e) {<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          if (ioe == null) ioe = new IOException(e.getCause());<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        }<a name="line.588"></a>
+<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    } finally {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      storeFileOpenerThreadPool.shutdownNow();<a name="line.591"></a>
 <span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    return results;<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  }<a name="line.595"></a>
-<span class="sourceLineNo">596</span><a name="line.596"></a>
-<span class="sourceLineNo">597</span>  @Override<a name="line.597"></a>
-<span class="sourceLineNo">598</span>  public void refreshStoreFiles() throws IOException {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    Collection&lt;StoreFileInfo&gt; newFiles = fs.getStoreFiles(getColumnFamilyName());<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    refreshStoreFilesInternal(newFiles);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>  }<a name="line.601"></a>
-<span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>  /**<a name="line.603"></a>
-<span class="sourceLineNo">604</span>   * Replaces the store files that the store has with the given files. Mainly used by secondary<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   * region replicas to keep up to date with the primary region files.<a name="line.605"></a>
-<span class="sourceLineNo">606</span>   * @throws IOException<a name="line.606"></a>
-<span class="sourceLineNo">607</span>   */<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  public void refreshStoreFiles(Collection&lt;String&gt; newFiles) throws IOException {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    List&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(newFiles.size());<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    for (String file : newFiles) {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      storeFiles.add(fs.getStoreFileInfo(getColumnFamilyName(), file));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    refreshStoreFilesInternal(storeFiles);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  /**<a name="line.616"></a>
-<span class="sourceLineNo">617</span>   * Checks the underlying store files, and opens the files that  have not<a name="line.617"></a>
-<span class="sourceLineNo">618</span>   * been opened, and removes the store file readers for store files no longer<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * available. Mainly used by secondary region replicas to keep up to date with<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * the primary region files.<a name="line.620"></a>
+<span class="sourceLineNo">593</span>    if (ioe != null) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      // close StoreFile readers<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      boolean evictOnClose =<a name="line.595"></a>
+<span class="sourceLineNo">596</span>          cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      for (HStoreFile file : results) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        try {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          if (file != null) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>            file.closeStoreFile(evictOnClose);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          }<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        } catch (IOException e) {<a name="line.602"></a>
+<span class="sourceLineNo">603</span>          LOG.warn("Could not close store file", e);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      }<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      throw ioe;<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    }<a name="line.607"></a>
+<span class="sourceLineNo">608</span><a name="line.608"></a>
+<span class="sourceLineNo">609</span>    return results;<a name="line.609"></a>
+<span class="sourceLineNo">610</span>  }<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>  @Override<a name="line.612"></a>
+<span class="sourceLineNo">613</span>  public void refreshStoreFiles() throws IOException {<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    Collection&lt;StoreFileInfo&gt; newFiles = fs.getStoreFiles(getColumnFamilyName());<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    refreshStoreFilesInternal(newFiles);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>   * Replaces the store files that the store has with the given files. Mainly used by secondary<a name="line.619"></a>
+<span class="sourceLineNo">620</span>   * region replicas to keep up to date with the primary region files.<a name="line.620"></a>
 <span class="sourceLineNo">621</span>   * @throws IOException<a name="line.621"></a>
 <span class="sourceLineNo">622</span>   */<a name="line.622"></a>
-<span class="sourceLineNo">623</span>  private void refreshStoreFilesInternal(Collection&lt;StoreFileInfo&gt; newFiles) throws IOException {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    StoreFileManager sfm = storeEngine.getStoreFileManager();<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    Collection&lt;HStoreFile&gt; currentFiles = sfm.getStorefiles();<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    Collection&lt;HStoreFile&gt; compactedFiles = sfm.getCompactedfiles();<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    if (currentFiles == null) currentFiles = Collections.emptySet();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    if (newFiles == null) newFiles = Collections.emptySet();<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    if (compactedFiles == null) compactedFiles = Collections.emptySet();<a name="line.629"></a>
+<span class="sourceLineNo">623</span>  public void refreshStoreFiles(Collection&lt;String&gt; newFiles) throws IOException {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    List&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(newFiles.size());<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    for (String file : newFiles) {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      storeFiles.add(fs.getStoreFileInfo(getColumnFamilyName(), file));<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    refreshStoreFilesInternal(storeFiles);<a name="line.628"></a>
+<span class="sourceLineNo">629</span>  }<a name="line.629"></a>
 <span class="sourceLineNo">630</span><a name="line.630"></a>
-<span class="sourceLineNo">631</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; currentFilesSet = new HashMap&lt;&gt;(currentFiles.size());<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    for (HStoreFile sf : currentFiles) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      currentFilesSet.put(sf.getFileInfo(), sf);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; compactedFilesSet = new HashMap&lt;&gt;(compactedFiles.size());<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    for (HStoreFile sf : compactedFiles) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      compactedFilesSet.put(sf.getFileInfo(), sf);<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>    Set&lt;StoreFileInfo&gt; newFilesSet = new HashSet&lt;StoreFileInfo&gt;(newFiles);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Exclude the files that have already been compacted<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    newFilesSet = Sets.difference(newFilesSet, compactedFilesSet.keySet());<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    Set&lt;StoreFileInfo&gt; toBeAddedFiles = Sets.difference(newFilesSet, currentFilesSet.keySet());<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    Set&lt;StoreFileInfo&gt; toBeRemovedFiles = Sets.difference(currentFilesSet.keySet(), newFilesSet);<a name="line.644"></a>
+<span class="sourceLineNo">631</span>  /**<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * Checks the underlying store files, and opens the files that  have not<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * been opened, and removes the store file readers for store files no longer<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * available. Mainly used by secondary region replicas to keep up to date with<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * the primary region files.<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * @throws IOException<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   */<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  private void refreshStoreFilesInternal(Collection&lt;StoreFileInfo&gt; newFiles) throws IOException {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    StoreFileManager sfm = storeEngine.getStoreFileManager();<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    Collection&lt;HStoreFile&gt; currentFiles = sfm.getStorefiles();<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    Collection&lt;HStoreFile&gt; compactedFiles = sfm.getCompactedfiles();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    if (currentFiles == null) currentFiles = Collections.emptySet();<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    if (n

<TRUNCATED>

[23/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index cbbdddd..233b28d 100644
--- a/book.html
+++ b/book.html
@@ -138,166 +138,172 @@
 <li><a href="#hbase_mob">75. Storing Medium-sized Objects (MOB)</a></li>
 </ul>
 </li>
+<li><a href="#inmemory_compaction">In-memory Compaction</a>
+<ul class="sectlevel1">
+<li><a href="#imc.overview">76. Overview</a></li>
+<li><a href="#_enabling">77. Enabling</a></li>
+</ul>
+</li>
 <li><a href="#backuprestore">Backup and Restore</a>
 <ul class="sectlevel1">
-<li><a href="#br.overview">76. Overview</a></li>
-<li><a href="#br.terminology">77. Terminology</a></li>
-<li><a href="#br.planning">78. Planning</a></li>
-<li><a href="#br.initial.setup">79. First-time configuration steps</a></li>
-<li><a href="#_backup_and_restore_commands">80. Backup and Restore commands</a></li>
-<li><a href="#br.administration">81. Administration of Backup Images</a></li>
-<li><a href="#br.backup.configuration">82. Configuration keys</a></li>
-<li><a href="#br.best.practices">83. Best Practices</a></li>
-<li><a href="#br.s3.backup.scenario">84. Scenario: Safeguarding Application Datasets on Amazon S3</a></li>
-<li><a href="#br.data.security">85. Security of Backup Data</a></li>
-<li><a href="#br.technical.details">86. Technical Details of Incremental Backup and Restore</a></li>
-<li><a href="#br.filesystem.growth.warning">87. A Warning on File System Growth</a></li>
-<li><a href="#br.backup.capacity.planning">88. Capacity Planning</a></li>
-<li><a href="#br.limitations">89. Limitations of the Backup and Restore Utility</a></li>
+<li><a href="#br.overview">78. Overview</a></li>
+<li><a href="#br.terminology">79. Terminology</a></li>
+<li><a href="#br.planning">80. Planning</a></li>
+<li><a href="#br.initial.setup">81. First-time configuration steps</a></li>
+<li><a href="#_backup_and_restore_commands">82. Backup and Restore commands</a></li>
+<li><a href="#br.administration">83. Administration of Backup Images</a></li>
+<li><a href="#br.backup.configuration">84. Configuration keys</a></li>
+<li><a href="#br.best.practices">85. Best Practices</a></li>
+<li><a href="#br.s3.backup.scenario">86. Scenario: Safeguarding Application Datasets on Amazon S3</a></li>
+<li><a href="#br.data.security">87. Security of Backup Data</a></li>
+<li><a href="#br.technical.details">88. Technical Details of Incremental Backup and Restore</a></li>
+<li><a href="#br.filesystem.growth.warning">89. A Warning on File System Growth</a></li>
+<li><a href="#br.backup.capacity.planning">90. Capacity Planning</a></li>
+<li><a href="#br.limitations">91. Limitations of the Backup and Restore Utility</a></li>
 </ul>
 </li>
 <li><a href="#hbase_apis">Apache HBase APIs</a>
 <ul class="sectlevel1">
-<li><a href="#_examples">90. Examples</a></li>
+<li><a href="#_examples">92. Examples</a></li>
 </ul>
 </li>
 <li><a href="#external_apis">Apache HBase External APIs</a>
 <ul class="sectlevel1">
-<li><a href="#_rest">91. REST</a></li>
-<li><a href="#_thrift">92. Thrift</a></li>
-<li><a href="#c">93. C/C++ Apache HBase Client</a></li>
-<li><a href="#jdo">94. Using Java Data Objects (JDO) with HBase</a></li>
-<li><a href="#scala">95. Scala</a></li>
-<li><a href="#jython">96. Jython</a></li>
+<li><a href="#_rest">93. REST</a></li>
+<li><a href="#_thrift">94. Thrift</a></li>
+<li><a href="#c">95. C/C++ Apache HBase Client</a></li>
+<li><a href="#jdo">96. Using Java Data Objects (JDO) with HBase</a></li>
+<li><a href="#scala">97. Scala</a></li>
+<li><a href="#jython">98. Jython</a></li>
 </ul>
 </li>
 <li><a href="#thrift">Thrift API and Filter Language</a>
 <ul class="sectlevel1">
-<li><a href="#thrift.filter_language">97. Filter Language</a></li>
+<li><a href="#thrift.filter_language">99. Filter Language</a></li>
 </ul>
 </li>
 <li><a href="#spark">HBase and Spark</a>
 <ul class="sectlevel1">
-<li><a href="#_basic_spark">98. Basic Spark</a></li>
-<li><a href="#_spark_streaming">99. Spark Streaming</a></li>
-<li><a href="#_bulk_load">100. Bulk Load</a></li>
-<li><a href="#_sparksql_dataframes">101. SparkSQL/DataFrames</a></li>
+<li><a href="#_basic_spark">100. Basic Spark</a></li>
+<li><a href="#_spark_streaming">101. Spark Streaming</a></li>
+<li><a href="#_bulk_load">102. Bulk Load</a></li>
+<li><a href="#_sparksql_dataframes">103. SparkSQL/DataFrames</a></li>
 </ul>
 </li>
 <li><a href="#cp">Apache HBase Coprocessors</a>
 <ul class="sectlevel1">
-<li><a href="#_coprocessor_overview">102. Coprocessor Overview</a></li>
-<li><a href="#_types_of_coprocessors">103. Types of Coprocessors</a></li>
-<li><a href="#cp_loading">104. Loading Coprocessors</a></li>
-<li><a href="#cp_example">105. Examples</a></li>
-<li><a href="#_guidelines_for_deploying_a_coprocessor">106. Guidelines For Deploying A Coprocessor</a></li>
-<li><a href="#_restricting_coprocessor_usage">107. Restricting Coprocessor Usage</a></li>
+<li><a href="#_coprocessor_overview">104. Coprocessor Overview</a></li>
+<li><a href="#_types_of_coprocessors">105. Types of Coprocessors</a></li>
+<li><a href="#cp_loading">106. Loading Coprocessors</a></li>
+<li><a href="#cp_example">107. Examples</a></li>
+<li><a href="#_guidelines_for_deploying_a_coprocessor">108. Guidelines For Deploying A Coprocessor</a></li>
+<li><a href="#_restricting_coprocessor_usage">109. Restricting Coprocessor Usage</a></li>
 </ul>
 </li>
 <li><a href="#performance">Apache HBase Performance Tuning</a>
 <ul class="sectlevel1">
-<li><a href="#perf.os">108. Operating System</a></li>
-<li><a href="#perf.network">109. Network</a></li>
-<li><a href="#jvm">110. Java</a></li>
-<li><a href="#perf.configurations">111. HBase Configurations</a></li>
-<li><a href="#perf.zookeeper">112. ZooKeeper</a></li>
-<li><a href="#perf.schema">113. Schema Design</a></li>
-<li><a href="#perf.general">114. HBase General Patterns</a></li>
-<li><a href="#perf.writing">115. Writing to HBase</a></li>
-<li><a href="#perf.reading">116. Reading from HBase</a></li>
-<li><a href="#perf.deleting">117. Deleting from HBase</a></li>
-<li><a href="#perf.hdfs">118. HDFS</a></li>
-<li><a href="#perf.ec2">119. Amazon EC2</a></li>
-<li><a href="#perf.hbase.mr.cluster">120. Collocating HBase and MapReduce</a></li>
-<li><a href="#perf.casestudy">121. Case Studies</a></li>
+<li><a href="#perf.os">110. Operating System</a></li>
+<li><a href="#perf.network">111. Network</a></li>
+<li><a href="#jvm">112. Java</a></li>
+<li><a href="#perf.configurations">113. HBase Configurations</a></li>
+<li><a href="#perf.zookeeper">114. ZooKeeper</a></li>
+<li><a href="#perf.schema">115. Schema Design</a></li>
+<li><a href="#perf.general">116. HBase General Patterns</a></li>
+<li><a href="#perf.writing">117. Writing to HBase</a></li>
+<li><a href="#perf.reading">118. Reading from HBase</a></li>
+<li><a href="#perf.deleting">119. Deleting from HBase</a></li>
+<li><a href="#perf.hdfs">120. HDFS</a></li>
+<li><a href="#perf.ec2">121. Amazon EC2</a></li>
+<li><a href="#perf.hbase.mr.cluster">122. Collocating HBase and MapReduce</a></li>
+<li><a href="#perf.casestudy">123. Case Studies</a></li>
 </ul>
 </li>
 <li><a href="#trouble">Troubleshooting and Debugging Apache HBase</a>
 <ul class="sectlevel1">
-<li><a href="#trouble.general">122. General Guidelines</a></li>
-<li><a href="#trouble.log">123. Logs</a></li>
-<li><a href="#trouble.resources">124. Resources</a></li>
-<li><a href="#trouble.tools">125. Tools</a></li>
-<li><a href="#trouble.client">126. Client</a></li>
-<li><a href="#trouble.mapreduce">127. MapReduce</a></li>
-<li><a href="#trouble.namenode">128. NameNode</a></li>
-<li><a href="#trouble.network">129. Network</a></li>
-<li><a href="#trouble.rs">130. RegionServer</a></li>
-<li><a href="#trouble.master">131. Master</a></li>
-<li><a href="#trouble.zookeeper">132. ZooKeeper</a></li>
-<li><a href="#trouble.ec2">133. Amazon EC2</a></li>
-<li><a href="#trouble.versions">134. HBase and Hadoop version issues</a></li>
-<li><a href="#_hbase_and_hdfs">135. HBase and HDFS</a></li>
-<li><a href="#trouble.tests">136. Running unit or integration tests</a></li>
-<li><a href="#trouble.casestudy">137. Case Studies</a></li>
-<li><a href="#trouble.crypto">138. Cryptographic Features</a></li>
-<li><a href="#_operating_system_specific_issues">139. Operating System Specific Issues</a></li>
-<li><a href="#_jdk_issues">140. JDK Issues</a></li>
+<li><a href="#trouble.general">124. General Guidelines</a></li>
+<li><a href="#trouble.log">125. Logs</a></li>
+<li><a href="#trouble.resources">126. Resources</a></li>
+<li><a href="#trouble.tools">127. Tools</a></li>
+<li><a href="#trouble.client">128. Client</a></li>
+<li><a href="#trouble.mapreduce">129. MapReduce</a></li>
+<li><a href="#trouble.namenode">130. NameNode</a></li>
+<li><a href="#trouble.network">131. Network</a></li>
+<li><a href="#trouble.rs">132. RegionServer</a></li>
+<li><a href="#trouble.master">133. Master</a></li>
+<li><a href="#trouble.zookeeper">134. ZooKeeper</a></li>
+<li><a href="#trouble.ec2">135. Amazon EC2</a></li>
+<li><a href="#trouble.versions">136. HBase and Hadoop version issues</a></li>
+<li><a href="#_hbase_and_hdfs">137. HBase and HDFS</a></li>
+<li><a href="#trouble.tests">138. Running unit or integration tests</a></li>
+<li><a href="#trouble.casestudy">139. Case Studies</a></li>
+<li><a href="#trouble.crypto">140. Cryptographic Features</a></li>
+<li><a href="#_operating_system_specific_issues">141. Operating System Specific Issues</a></li>
+<li><a href="#_jdk_issues">142. JDK Issues</a></li>
 </ul>
 </li>
 <li><a href="#casestudies">Apache HBase Case Studies</a>
 <ul class="sectlevel1">
-<li><a href="#casestudies.overview">141. Overview</a></li>
-<li><a href="#casestudies.schema">142. Schema Design</a></li>
-<li><a href="#casestudies.perftroub">143. Performance/Troubleshooting</a></li>
+<li><a href="#casestudies.overview">143. Overview</a></li>
+<li><a href="#casestudies.schema">144. Schema Design</a></li>
+<li><a href="#casestudies.perftroub">145. Performance/Troubleshooting</a></li>
 </ul>
 </li>
 <li><a href="#ops_mgt">Apache HBase Operational Management</a>
 <ul class="sectlevel1">
-<li><a href="#tools">144. HBase Tools and Utilities</a></li>
-<li><a href="#ops.regionmgt">145. Region Management</a></li>
-<li><a href="#node.management">146. Node Management</a></li>
-<li><a href="#hbase_metrics">147. HBase Metrics</a></li>
-<li><a href="#ops.monitoring">148. HBase Monitoring</a></li>
-<li><a href="#_cluster_replication">149. Cluster Replication</a></li>
-<li><a href="#_running_multiple_workloads_on_a_single_cluster">150. Running Multiple Workloads On a Single Cluster</a></li>
-<li><a href="#ops.backup">151. HBase Backup</a></li>
-<li><a href="#ops.snapshots">152. HBase Snapshots</a></li>
-<li><a href="#snapshots_azure">153. Storing Snapshots in Microsoft Azure Blob Storage</a></li>
-<li><a href="#ops.capacity">154. Capacity Planning and Region Sizing</a></li>
-<li><a href="#table.rename">155. Table Rename</a></li>
-<li><a href="#rsgroup">156. RegionServer Grouping</a></li>
-<li><a href="#normalizer">157. Region Normalizer</a></li>
+<li><a href="#tools">146. HBase Tools and Utilities</a></li>
+<li><a href="#ops.regionmgt">147. Region Management</a></li>
+<li><a href="#node.management">148. Node Management</a></li>
+<li><a href="#hbase_metrics">149. HBase Metrics</a></li>
+<li><a href="#ops.monitoring">150. HBase Monitoring</a></li>
+<li><a href="#_cluster_replication">151. Cluster Replication</a></li>
+<li><a href="#_running_multiple_workloads_on_a_single_cluster">152. Running Multiple Workloads On a Single Cluster</a></li>
+<li><a href="#ops.backup">153. HBase Backup</a></li>
+<li><a href="#ops.snapshots">154. HBase Snapshots</a></li>
+<li><a href="#snapshots_azure">155. Storing Snapshots in Microsoft Azure Blob Storage</a></li>
+<li><a href="#ops.capacity">156. Capacity Planning and Region Sizing</a></li>
+<li><a href="#table.rename">157. Table Rename</a></li>
+<li><a href="#rsgroup">158. RegionServer Grouping</a></li>
+<li><a href="#normalizer">159. Region Normalizer</a></li>
 </ul>
 </li>
 <li><a href="#developer">Building and Developing Apache HBase</a>
 <ul class="sectlevel1">
-<li><a href="#getting.involved">158. Getting Involved</a></li>
-<li><a href="#repos">159. Apache HBase Repositories</a></li>
-<li><a href="#_ides">160. IDEs</a></li>
-<li><a href="#build">161. Building Apache HBase</a></li>
-<li><a href="#releasing">162. Releasing Apache HBase</a></li>
-<li><a href="#hbase.rc.voting">163. Voting on Release Candidates</a></li>
-<li><a href="#documentation">164. Generating the HBase Reference Guide</a></li>
-<li><a href="#hbase.org">165. Updating <a href="https://hbase.apache.org">hbase.apache.org</a></a></li>
-<li><a href="#hbase.tests">166. Tests</a></li>
-<li><a href="#developing">167. Developer Guidelines</a></li>
+<li><a href="#getting.involved">160. Getting Involved</a></li>
+<li><a href="#repos">161. Apache HBase Repositories</a></li>
+<li><a href="#_ides">162. IDEs</a></li>
+<li><a href="#build">163. Building Apache HBase</a></li>
+<li><a href="#releasing">164. Releasing Apache HBase</a></li>
+<li><a href="#hbase.rc.voting">165. Voting on Release Candidates</a></li>
+<li><a href="#documentation">166. Generating the HBase Reference Guide</a></li>
+<li><a href="#hbase.org">167. Updating <a href="https://hbase.apache.org">hbase.apache.org</a></a></li>
+<li><a href="#hbase.tests">168. Tests</a></li>
+<li><a href="#developing">169. Developer Guidelines</a></li>
 </ul>
 </li>
 <li><a href="#unit.tests">Unit Testing HBase Applications</a>
 <ul class="sectlevel1">
-<li><a href="#_junit">168. JUnit</a></li>
-<li><a href="#mockito">169. Mockito</a></li>
-<li><a href="#_mrunit">170. MRUnit</a></li>
-<li><a href="#_integration_testing_with_an_hbase_mini_cluster">171. Integration Testing with an HBase Mini-Cluster</a></li>
+<li><a href="#_junit">170. JUnit</a></li>
+<li><a href="#mockito">171. Mockito</a></li>
+<li><a href="#_mrunit">172. MRUnit</a></li>
+<li><a href="#_integration_testing_with_an_hbase_mini_cluster">173. Integration Testing with an HBase Mini-Cluster</a></li>
 </ul>
 </li>
 <li><a href="#protobuf">Protobuf in HBase</a>
 <ul class="sectlevel1">
-<li><a href="#_protobuf">172. Protobuf</a></li>
+<li><a href="#_protobuf">174. Protobuf</a></li>
 </ul>
 </li>
 <li><a href="#zookeeper">ZooKeeper</a>
 <ul class="sectlevel1">
-<li><a href="#_using_existing_zookeeper_ensemble">173. Using existing ZooKeeper ensemble</a></li>
-<li><a href="#zk.sasl.auth">174. SASL Authentication with ZooKeeper</a></li>
+<li><a href="#_using_existing_zookeeper_ensemble">175. Using existing ZooKeeper ensemble</a></li>
+<li><a href="#zk.sasl.auth">176. SASL Authentication with ZooKeeper</a></li>
 </ul>
 </li>
 <li><a href="#community">Community</a>
 <ul class="sectlevel1">
-<li><a href="#_decisions">175. Decisions</a></li>
-<li><a href="#community.roles">176. Community Roles</a></li>
-<li><a href="#hbase.commit.msg.format">177. Commit Message format</a></li>
+<li><a href="#_decisions">177. Decisions</a></li>
+<li><a href="#community.roles">178. Community Roles</a></li>
+<li><a href="#hbase.commit.msg.format">179. Commit Message format</a></li>
 </ul>
 </li>
 <li><a href="#_appendix">Appendix</a>
@@ -315,8 +321,8 @@
 <li><a href="#asf">Appendix K: HBase and the Apache Software Foundation</a></li>
 <li><a href="#orca">Appendix L: Apache HBase Orca</a></li>
 <li><a href="#tracing">Appendix M: Enabling Dapper-like Tracing in HBase</a></li>
-<li><a href="#tracing.client.modifications">178. Client Modifications</a></li>
-<li><a href="#tracing.client.shell">179. Tracing from HBase Shell</a></li>
+<li><a href="#tracing.client.modifications">180. Client Modifications</a></li>
+<li><a href="#tracing.client.shell">181. Tracing from HBase Shell</a></li>
 <li><a href="#hbase.rpc">Appendix N: 0.95 RPC Specification</a></li>
 </ul>
 </li>
@@ -17723,9 +17729,132 @@ hbase&gt; major_compact 't1', 'c1’, ‘MOB’</pre>
 </div>
 </div>
 </div>
+<h1 id="inmemory_compaction" class="sect0"><a class="anchor" href="#inmemory_compaction"></a>In-memory Compaction</h1>
+<div class="sect1">
+<h2 id="imc.overview"><a class="anchor" href="#imc.overview"></a>76. Overview</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>In-memory Compaction (A.K.A Accordion) is a new feature in hbase-2.0.0.
+It was first introduced on the Apache HBase Blog at
+<a href="https://blogs.apache.org/hbase/entry/accordion-hbase-breathes-with-in">Accordion: HBase Breathes with In-Memory Compaction</a>.
+Quoting the blog:</p>
+</div>
+<div class="quoteblock">
+<blockquote>
+<div class="paragraph">
+<p>Accordion reapplies the LSM principal [<em>Log-Structured-Merge Tree</em>, the design pattern upon which HBase is based] to MemStore, in order to eliminate redundancies and other overhead while the data is still in RAM.  Doing so decreases the frequency of flushes to HDFS, thereby reducing the write amplification and the overall disk footprint. With less flushes, the write operations are stalled less frequently as the MemStore overflows, therefore the write performance is improved. Less data on disk also implies less pressure on the block cache, higher hit rates, and eventually better read response times. Finally, having less disk writes also means having less compaction happening in the background, i.e., less cycles are stolen from productive (read and write) work. All in all, the effect of in-memory compaction can be envisioned as a catalyst that enables the system move faster as a whole.</p>
+</div>
+</blockquote>
+</div>
+<div class="paragraph">
+<p>A developer view is available at
+<a href="https://blogs.apache.org/hbase/entry/accordion-developer-view-of-in">Accordion: Developer View of In-Memory Compaction</a>.</p>
+</div>
+<div class="paragraph">
+<p>In-memory compaction works best when high data churn; overwrites or over-versions
+can be eliminated while the data is still in memory. If the writes are all uniques,
+it may drag write throughput (In-memory compaction costs CPU). We suggest you test
+and compare before deploying to production.</p>
+</div>
+<div class="paragraph">
+<p>In this section we describe how to enable Accordion and the available configurations.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_enabling"><a class="anchor" href="#_enabling"></a>77. Enabling</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>To enable in-memory compactions, set the <em>IN_MEMORY_COMPACTION</em> attribute
+on per column family where you want the behavior. The <em>IN_MEMORY_COMPACTION</em>
+attribute can have one of three values.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>NONE</em>: No in-memory compaction.</p>
+</li>
+<li>
+<p><em>BASIC</em>: Basic policy enables flushing and keeps a pipeline of flushes until we trip the pipeline maximum threshold and then we flush to disk. No in-memory compaction but can help throughput as data is moved from the profligate, native ConcurrentSkipListMap data-type to more compact (and efficient) data types.</p>
+</li>
+<li>
+<p><em>EAGER</em>: This is <em>BASIC</em> policy plus in-memory compaction of flushes (much like the on-disk compactions done to hfiles); on compaction we apply on-disk rules eliminating versions, duplicates, ttl&#8217;d cells, etc.</p>
+</li>
+<li>
+<p><em>ADAPTIVE</em>: Adaptive compaction adapts to the workload. It applies either index compaction or data compaction based on the ratio of duplicate cells in the data.  Experimental.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>To enable <em>BASIC</em> on the <em>info</em> column family in the table <em>radish</em>, disable the table and add the attribute to the <em>info</em> column family, and then reenable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="ruby">hbase(main):<span class="integer">002</span>:<span class="integer">0</span>&gt; disable <span class="string"><span class="delimiter">'</span><span class="content">radish</span><span class="delimiter">'</span></span>
+<span class="constant">Took</span> <span class="float">0.5570</span> seconds
+hbase(main):<span class="integer">003</span>:<span class="integer">0</span>&gt; alter <span class="string"><span class="delimiter">'</span><span class="content">radish</span><span class="delimiter">'</span></span>, {<span class="constant">NAME</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">info</span><span class="delimiter">'</span></span>, <span class="constant">IN_MEMORY_COMPACTION</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">BASIC</span><span class="delimiter">'</span></span>}
+<span class="constant">Updating</span> all regions with the new schema...
+<span class="constant">All</span> regions updated.
+Done.
+Took <span class="float">1.2413</span> seconds
+hbase(main):<span class="integer">004</span>:<span class="integer">0</span>&gt; describe <span class="string"><span class="delimiter">'</span><span class="content">radish</span><span class="delimiter">'</span></span>
+<span class="constant">Table</span> radish is <span class="constant">DISABLED</span>
+radish
+<span class="constant">COLUMN</span> <span class="constant">FAMILIES</span> <span class="constant">DESCRIPTION</span>
+{<span class="constant">NAME</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">info</span><span class="delimiter">'</span></span>, <span class="constant">VERSIONS</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">1</span><span class="delimiter">'</span></span>, <span class="constant">EVICT_BLOCKS_ON_CLOSE</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">false</span><span class="delimiter">'</span></span>, <span class="constant">NEW_VERSION_BEHAVIOR</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">false</span><span class="delimiter">'</span></span>, <span class="constant">KEEP_DELETED_CELLS</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">FALSE</span><span class="delimiter">'</span></span>, <span class="constant">CACHE_DATA_ON_WRITE</span> =&gt; <span class="string"><span class="delimiter">'</s
 pan><span class="content">false</span><span class="delimiter">'</span></span>, <span class="constant">DATA_BLOCK_ENCODING</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">NONE</span><span class="delimiter">'</span></span>, <span class="constant">TTL</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">FOREVER</span><span class="delimiter">'</span></span>, <span class="constant">MIN_VERSIONS</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">0</span><span class="delimiter">'</span></span>, <span class="constant">REPLICATION_SCOPE</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">0</span><span class="delimiter">'</span></span>, <span class="constant">BLOOMFILTER</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">ROW</span><span class="delimiter">'</span></span>, <span class="constant">CACHE_INDEX_ON_WR
 ITE</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">false</span><span class="delimiter">'</span></span>, <span class="constant">IN_MEMORY</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">false</span><span class="delimiter">'</span></span>, <span class="constant">CACHE_BLOOMS_ON_WRITE</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">false</span><span class="delimiter">'</span></span>, <span class="constant">PREFETCH_BLOCKS_ON_OPEN</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">false</span><span class="delimiter">'</span></span>, <span class="constant">COMPRESSION</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">NONE</span><span class="delimiter">'</span></span>, <span class="constant">BLOCKCACHE</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">true</s
 pan><span class="delimiter">'</span></span>, <span class="constant">BLOCKSIZE</span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">65536</span><span class="delimiter">'</span></span>, <span class="constant">METADATA</span> =&gt; {
+<span class="string"><span class="delimiter">'</span><span class="content">IN_MEMORY_COMPACTION</span><span class="delimiter">'</span></span> =&gt; <span class="string"><span class="delimiter">'</span><span class="content">BASIC</span><span class="delimiter">'</span></span>}}
+<span class="integer">1</span> row(s)
+<span class="constant">Took</span> <span class="float">0.0239</span> seconds
+hbase(main):<span class="integer">005</span>:<span class="integer">0</span>&gt; enable <span class="string"><span class="delimiter">'</span><span class="content">radish</span><span class="delimiter">'</span></span>
+<span class="constant">Took</span> <span class="float">0.7537</span> seconds</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note how the IN_MEMORY_COMPACTION attribute shows as part of the <em>METADATA</em> map.</p>
+</div>
+<div class="paragraph">
+<p>There is also a global configuration, <em>hbase.hregion.compacting.memstore.type</em> which you can set in your <em>hbase-site.xml</em> file. Use it to set the
+default on creation of a new table (On creation of a column family Store, we look first to the column family configuration looking for the
+<em>IN_MEMORY_COMPACTION</em> setting, and if none, we then consult the <em>hbase.hregion.compacting.memstore.type</em> value using its content; default is
+<em>BASIC</em>).</p>
+</div>
+<div class="paragraph">
+<p>By default, new hbase system tables will have <em>BASIC</em> in-memory compaction set.  To specify otherwise,
+on new table-creation, set <em>hbase.hregion.compacting.memstore.type</em> to <em>NONE</em> (Note, setting this value
+post-creation of system tables will not have a retroactive effect; you will have to alter your tables
+to set the in-memory attribute to <em>NONE</em>).</p>
+</div>
+<div class="paragraph">
+<p>When an in-memory flush happens is calculated by dividing the configured region flush size (Set in the table descriptor
+or read from <em>hbase.hregion.memstore.flush.size</em>) by the number of column families and then multiplying by
+<em>hbase.memstore.inmemoryflush.threshold.factor</em> (default is 0.1).</p>
+</div>
+<div class="paragraph">
+<p>The number of flushes carried by the pipeline is monitored so as to fit within the bounds of memstore sizing
+but you can also set a maximum on the number of flushes total by setting
+<em>hbase.hregion.compacting.pipeline.segments.limit</em>. Default is 4.</p>
+</div>
+<div class="paragraph">
+<p>When a column family Store is created, it says what memstore type is in effect. As of this writing
+there is the old-school <em>DefaultMemStore</em> which fills a <em>ConcurrentSkipListMap</em> and then flushes
+to disk or the new <em>CompactingMemStore</em> that is the implementation that provides this new
+in-memory compactions facility. Here is a log-line from a RegionServer that shows a column
+family Store named <em>family</em> configured to use a <em>CompactingMemStore</em>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>Note how the IN_MEMORY_COMPACTION attribute shows as part of the _METADATA_ map.
+2018-03-30 11:02:24,466 INFO  [Time-limited test] regionserver.HStore(325): Store=family,  memstore type=CompactingMemStore, storagePolicy=HOT, verifyBulkLoads=false, parallelPutCountPrintThreshold=10</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Enable TRACE-level logging on the CompactingMemStore class (<em>org.apache.hadoop.hbase.regionserver.CompactingMemStore</em>) to see detail on its operation.</p>
+</div>
+</div>
+</div>
 <h1 id="backuprestore" class="sect0"><a class="anchor" href="#backuprestore"></a>Backup and Restore</h1>
 <div class="sect1">
-<h2 id="br.overview"><a class="anchor" href="#br.overview"></a>76. Overview</h2>
+<h2 id="br.overview"><a class="anchor" href="#br.overview"></a>78. Overview</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>Backup and restore is a standard operation provided by many databases. An effective backup and restore
@@ -17753,7 +17882,7 @@ backup implementation is the novel improvement over the previous "art" provided
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.terminology"><a class="anchor" href="#br.terminology"></a>77. Terminology</h2>
+<h2 id="br.terminology"><a class="anchor" href="#br.terminology"></a>79. Terminology</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>The backup and restore feature introduces new terminology which can be used to understand how control flows through the
@@ -17781,7 +17910,7 @@ system.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.planning"><a class="anchor" href="#br.planning"></a>78. Planning</h2>
+<h2 id="br.planning"><a class="anchor" href="#br.planning"></a>80. Planning</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>There are some common strategies which can be used to implement backup and restore in your environment. The following section
@@ -17801,7 +17930,7 @@ This is related to the open issue <a href="https://issues.apache.org/jira/browse
 </table>
 </div>
 <div class="sect2">
-<h3 id="br.intracluster.backup"><a class="anchor" href="#br.intracluster.backup"></a>78.1. Backup within a cluster</h3>
+<h3 id="br.intracluster.backup"><a class="anchor" href="#br.intracluster.backup"></a>80.1. Backup within a cluster</h3>
 <div class="paragraph">
 <p>This strategy stores the backups on the same cluster as where the backup was taken. This approach is only appropriate for testing
 as it does not provide any additional safety on top of what the software itself already provides.</p>
@@ -17814,7 +17943,7 @@ as it does not provide any additional safety on top of what the software itself
 </div>
 </div>
 <div class="sect2">
-<h3 id="br.dedicated.cluster.backup"><a class="anchor" href="#br.dedicated.cluster.backup"></a>78.2. Backup using a dedicated cluster</h3>
+<h3 id="br.dedicated.cluster.backup"><a class="anchor" href="#br.dedicated.cluster.backup"></a>80.2. Backup using a dedicated cluster</h3>
 <div class="paragraph">
 <p>This strategy provides greater fault tolerance and provides a path towards disaster recovery. In this setting, you will
 store the backup on a separate HDFS cluster by supplying the backup destination cluster’s HDFS URL to the backup utility.
@@ -17831,7 +17960,7 @@ You should consider backing up to a different physical location, such as a diffe
 </div>
 </div>
 <div class="sect2">
-<h3 id="br.cloud.or.vendor.backup"><a class="anchor" href="#br.cloud.or.vendor.backup"></a>78.3. Backup to the Cloud or a storage vendor appliance</h3>
+<h3 id="br.cloud.or.vendor.backup"><a class="anchor" href="#br.cloud.or.vendor.backup"></a>80.3. Backup to the Cloud or a storage vendor appliance</h3>
 <div class="paragraph">
 <p>Another approach to safeguarding HBase incremental backups is to store the data on provisioned, secure servers that belong
 to third-party vendors and that are located off-site. The vendor can be a public cloud provider or a storage vendor who uses
@@ -17860,7 +17989,7 @@ of the backup files from HDFS or S3.
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.initial.setup"><a class="anchor" href="#br.initial.setup"></a>79. First-time configuration steps</h2>
+<h2 id="br.initial.setup"><a class="anchor" href="#br.initial.setup"></a>81. First-time configuration steps</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>This section contains the necessary configuration changes that must be made in order to use the backup and restore feature.
@@ -17868,7 +17997,7 @@ As this feature makes significant use of YARN&#8217;s MapReduce framework to par
 changes extend outside of just <code>hbase-site.xml</code>.</p>
 </div>
 <div class="sect2">
-<h3 id="_allow_the_hbase_system_user_in_yarn"><a class="anchor" href="#_allow_the_hbase_system_user_in_yarn"></a>79.1. Allow the "hbase" system user in YARN</h3>
+<h3 id="_allow_the_hbase_system_user_in_yarn"><a class="anchor" href="#_allow_the_hbase_system_user_in_yarn"></a>81.1. Allow the "hbase" system user in YARN</h3>
 <div class="paragraph">
 <p>The YARN <strong>container-executor.cfg</strong> configuration file must have the following property setting: <em>allowed.system.users=hbase</em>. No spaces
 are allowed in entries of this configuration file.</p>
@@ -17899,7 +18028,7 @@ min.user.id=<span class="integer">500</span></code></pre>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_hbase_specific_changes"><a class="anchor" href="#_hbase_specific_changes"></a>79.2. HBase specific changes</h3>
+<h3 id="_hbase_specific_changes"><a class="anchor" href="#_hbase_specific_changes"></a>81.2. HBase specific changes</h3>
 <div class="paragraph">
 <p>Add the following properties to hbase-site.xml and restart HBase if it is already running.</p>
 </div>
@@ -17947,7 +18076,7 @@ The ",&#8230;&#8203;" is an ellipsis meant to imply that this is a comma-separat
 </div>
 </div>
 <div class="sect1">
-<h2 id="_backup_and_restore_commands"><a class="anchor" href="#_backup_and_restore_commands"></a>80. Backup and Restore commands</h2>
+<h2 id="_backup_and_restore_commands"><a class="anchor" href="#_backup_and_restore_commands"></a>82. Backup and Restore commands</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>This covers the command-line utilities that administrators would run to create, restore, and merge backups. Tools to
@@ -17958,7 +18087,7 @@ inspect details on specific backup sessions is covered in the next section, <a h
 and its options. The below information is captured in this help message for each command.</p>
 </div>
 <div class="sect2">
-<h3 id="br.creating.complete.backup"><a class="anchor" href="#br.creating.complete.backup"></a>80.1. Creating a Backup Image</h3>
+<h3 id="br.creating.complete.backup"><a class="anchor" href="#br.creating.complete.backup"></a>82.1. Creating a Backup Image</h3>
 <div class="admonitionblock note">
 <table>
 <tr>
@@ -18007,7 +18136,7 @@ dataset with a restore operation, having the backup ID readily available can sav
 </table>
 </div>
 <div class="sect3">
-<h4 id="br.create.positional.cli.arguments"><a class="anchor" href="#br.create.positional.cli.arguments"></a>80.1.1. Positional Command-Line Arguments</h4>
+<h4 id="br.create.positional.cli.arguments"><a class="anchor" href="#br.create.positional.cli.arguments"></a>82.1.1. Positional Command-Line Arguments</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1"><em>type</em></dt>
@@ -18024,7 +18153,7 @@ are <em>hdfs:</em>, <em>webhdfs:</em>, <em>gpfs:</em>, and <em>s3fs:</em>.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.create.named.cli.arguments"><a class="anchor" href="#br.create.named.cli.arguments"></a>80.1.2. Named Command-Line Arguments</h4>
+<h4 id="br.create.named.cli.arguments"><a class="anchor" href="#br.create.named.cli.arguments"></a>82.1.2. Named Command-Line Arguments</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1"><em>-t &lt;table_name[,table_name]&gt;</em></dt>
@@ -18061,7 +18190,7 @@ is useful to prevent backup tasks from stealing resources away from other MapRed
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.usage.examples"><a class="anchor" href="#br.usage.examples"></a>80.1.3. Example usage</h4>
+<h4 id="br.usage.examples"><a class="anchor" href="#br.usage.examples"></a>82.1.3. Example usage</h4>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="java"><span class="error">$</span> hbase backup create full hdfs:<span class="comment">//host5:8020/data/backup -t SALES2,SALES3 -w 3</span></code></pre>
@@ -18074,7 +18203,7 @@ in the path <em>/data/backup</em>. The <em>-w</em> option specifies that no more
 </div>
 </div>
 <div class="sect2">
-<h3 id="br.restoring.backup"><a class="anchor" href="#br.restoring.backup"></a>80.2. Restoring a Backup Image</h3>
+<h3 id="br.restoring.backup"><a class="anchor" href="#br.restoring.backup"></a>82.2. Restoring a Backup Image</h3>
 <div class="paragraph">
 <p>Run the following command as an HBase superuser. You can only restore a backup on a running HBase cluster because the data must be
 redistributed the RegionServers for the operation to complete successfully.</p>
@@ -18085,7 +18214,7 @@ redistributed the RegionServers for the operation to complete successfully.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.restore.positional.args"><a class="anchor" href="#br.restore.positional.args"></a>80.2.1. Positional Command-Line Arguments</h4>
+<h4 id="br.restore.positional.args"><a class="anchor" href="#br.restore.positional.args"></a>82.2.1. Positional Command-Line Arguments</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1"><em>backup_path</em></dt>
@@ -18101,7 +18230,7 @@ are <em>hdfs:</em>, <em>webhdfs:</em>, <em>gpfs:</em>, and <em>s3fs:</em>.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.restore.named.args"><a class="anchor" href="#br.restore.named.args"></a>80.2.2. Named Command-Line Arguments</h4>
+<h4 id="br.restore.named.args"><a class="anchor" href="#br.restore.named.args"></a>82.2.2. Named Command-Line Arguments</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1"><em>-t &lt;table_name[,table_name]&gt;</em></dt>
@@ -18137,7 +18266,7 @@ this option is provided, there must be an equal number of entries provided in th
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.restore.usage"><a class="anchor" href="#br.restore.usage"></a>80.2.3. Example of Usage</h4>
+<h4 id="br.restore.usage"><a class="anchor" href="#br.restore.usage"></a>82.2.3. Example of Usage</h4>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="java">hbase backup restore /tmp/backup_incremental backupId_1467823988425 -t mytable1,mytable2</code></pre>
@@ -18152,7 +18281,7 @@ this option is provided, there must be an equal number of entries provided in th
 </div>
 </div>
 <div class="sect2">
-<h3 id="br.merge.backup"><a class="anchor" href="#br.merge.backup"></a>80.3. Merging Incremental Backup Images</h3>
+<h3 id="br.merge.backup"><a class="anchor" href="#br.merge.backup"></a>82.3. Merging Incremental Backup Images</h3>
 <div class="paragraph">
 <p>This command can be used to merge two or more incremental backup images into a single incremental
 backup image. This can be used to consolidate multiple, small incremental backup images into a single
@@ -18165,7 +18294,7 @@ into a daily incremental backup image, or daily incremental backups into a weekl
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.merge.backup.positional.cli.arguments"><a class="anchor" href="#br.merge.backup.positional.cli.arguments"></a>80.3.1. Positional Command-Line Arguments</h4>
+<h4 id="br.merge.backup.positional.cli.arguments"><a class="anchor" href="#br.merge.backup.positional.cli.arguments"></a>82.3.1. Positional Command-Line Arguments</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1"><em>backup_ids</em></dt>
@@ -18176,13 +18305,13 @@ into a daily incremental backup image, or daily incremental backups into a weekl
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.merge.backup.named.cli.arguments"><a class="anchor" href="#br.merge.backup.named.cli.arguments"></a>80.3.2. Named Command-Line Arguments</h4>
+<h4 id="br.merge.backup.named.cli.arguments"><a class="anchor" href="#br.merge.backup.named.cli.arguments"></a>82.3.2. Named Command-Line Arguments</h4>
 <div class="paragraph">
 <p>None.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.merge.backup.example"><a class="anchor" href="#br.merge.backup.example"></a>80.3.3. Example usage</h4>
+<h4 id="br.merge.backup.example"><a class="anchor" href="#br.merge.backup.example"></a>82.3.3. Example usage</h4>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="java"><span class="error">$</span> hbase backup merge backupId_1467823988425,backupId_1467827588425</code></pre>
@@ -18191,7 +18320,7 @@ into a daily incremental backup image, or daily incremental backups into a weekl
 </div>
 </div>
 <div class="sect2">
-<h3 id="br.using.backup.sets"><a class="anchor" href="#br.using.backup.sets"></a>80.4. Using Backup Sets</h3>
+<h3 id="br.using.backup.sets"><a class="anchor" href="#br.using.backup.sets"></a>82.4. Using Backup Sets</h3>
 <div class="paragraph">
 <p>Backup sets can ease the administration of HBase data backups and restores by reducing the amount of repetitive input
 of table names. You can group tables into a named backup set with the <code>hbase backup set add</code> command. You can then use
@@ -18242,7 +18371,7 @@ backup set metadata, then you must specify individual table names to restore the
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.set.subcommands"><a class="anchor" href="#br.set.subcommands"></a>80.4.1. Backup Set Subcommands</h4>
+<h4 id="br.set.subcommands"><a class="anchor" href="#br.set.subcommands"></a>82.4.1. Backup Set Subcommands</h4>
 <div class="paragraph">
 <p>The following list details subcommands of the hbase backup set command.</p>
 </div>
@@ -18287,7 +18416,7 @@ a valid value for the <em>backup_set_name</em> value.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.set.positional.cli.arguments"><a class="anchor" href="#br.set.positional.cli.arguments"></a>80.4.2. Positional Command-Line Arguments</h4>
+<h4 id="br.set.positional.cli.arguments"><a class="anchor" href="#br.set.positional.cli.arguments"></a>82.4.2. Positional Command-Line Arguments</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1"><em>backup_set_name</em></dt>
@@ -18316,7 +18445,7 @@ or remote cluster, backup strategy. This information can help you in case of fai
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.set.usage"><a class="anchor" href="#br.set.usage"></a>80.4.3. Example of Usage</h4>
+<h4 id="br.set.usage"><a class="anchor" href="#br.set.usage"></a>82.4.3. Example of Usage</h4>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="java"><span class="error">$</span> hbase backup set add Q1Data TEAM3,TEAM_4</code></pre>
@@ -18340,7 +18469,7 @@ or remote cluster, backup strategy. This information can help you in case of fai
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.administration"><a class="anchor" href="#br.administration"></a>81. Administration of Backup Images</h2>
+<h2 id="br.administration"><a class="anchor" href="#br.administration"></a>83. Administration of Backup Images</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>The <code>hbase backup</code> command has several subcommands that help with administering backup images as they accumulate. Most production
@@ -18353,7 +18482,7 @@ You can also delete backup images.</p>
 the HBase superuser.</p>
 </div>
 <div class="sect2">
-<h3 id="br.managing.backup.progress"><a class="anchor" href="#br.managing.backup.progress"></a>81.1. Managing Backup Progress</h3>
+<h3 id="br.managing.backup.progress"><a class="anchor" href="#br.managing.backup.progress"></a>83.1. Managing Backup Progress</h3>
 <div class="paragraph">
 <p>You can monitor a running backup in another terminal session by running the <em>hbase backup progress</em> command and specifying the backup ID as an argument.</p>
 </div>
@@ -18366,7 +18495,7 @@ the HBase superuser.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.progress.positional.cli.arguments"><a class="anchor" href="#br.progress.positional.cli.arguments"></a>81.1.1. Positional Command-Line Arguments</h4>
+<h4 id="br.progress.positional.cli.arguments"><a class="anchor" href="#br.progress.positional.cli.arguments"></a>83.1.1. Positional Command-Line Arguments</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1"><em>backup_id</em></dt>
@@ -18377,13 +18506,13 @@ the HBase superuser.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.progress.named.cli.arguments"><a class="anchor" href="#br.progress.named.cli.arguments"></a>81.1.2. Named Command-Line Arguments</h4>
+<h4 id="br.progress.named.cli.arguments"><a class="anchor" href="#br.progress.named.cli.arguments"></a>83.1.2. Named Command-Line Arguments</h4>
 <div class="paragraph">
 <p>None.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.progress.example"><a class="anchor" href="#br.progress.example"></a>81.1.3. Example usage</h4>
+<h4 id="br.progress.example"><a class="anchor" href="#br.progress.example"></a>83.1.3. Example usage</h4>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="java">hbase backup progress backupId_1467823988425</code></pre>
@@ -18392,7 +18521,7 @@ the HBase superuser.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="br.managing.backup.history"><a class="anchor" href="#br.managing.backup.history"></a>81.2. Managing Backup History</h3>
+<h3 id="br.managing.backup.history"><a class="anchor" href="#br.managing.backup.history"></a>83.2. Managing Backup History</h3>
 <div class="paragraph">
 <p>This command displays a log of backup sessions. The information for each session includes backup ID, type (full or incremental), the tables
 in the backup, status, and start and end time. Specify the number of backup sessions to display with the optional -n argument.</p>
@@ -18403,7 +18532,7 @@ in the backup, status, and start and end time. Specify the number of backup sess
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.history.positional.cli.arguments"><a class="anchor" href="#br.history.positional.cli.arguments"></a>81.2.1. Positional Command-Line Arguments</h4>
+<h4 id="br.history.positional.cli.arguments"><a class="anchor" href="#br.history.positional.cli.arguments"></a>83.2.1. Positional Command-Line Arguments</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1"><em>backup_id</em></dt>
@@ -18414,7 +18543,7 @@ in the backup, status, and start and end time. Specify the number of backup sess
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.history.named.cli.arguments"><a class="anchor" href="#br.history.named.cli.arguments"></a>81.2.2. Named Command-Line Arguments</h4>
+<h4 id="br.history.named.cli.arguments"><a class="anchor" href="#br.history.named.cli.arguments"></a>83.2.2. Named Command-Line Arguments</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1"><em>-n &lt;num_records&gt;</em></dt>
@@ -18437,7 +18566,7 @@ in the backup, status, and start and end time. Specify the number of backup sess
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.history.backup.example"><a class="anchor" href="#br.history.backup.example"></a>81.2.3. Example usage</h4>
+<h4 id="br.history.backup.example"><a class="anchor" href="#br.history.backup.example"></a>83.2.3. Example usage</h4>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="java"><span class="error">$</span> hbase backup history
@@ -18448,7 +18577,7 @@ in the backup, status, and start and end time. Specify the number of backup sess
 </div>
 </div>
 <div class="sect2">
-<h3 id="br.describe.backup"><a class="anchor" href="#br.describe.backup"></a>81.3. Describing a Backup Image</h3>
+<h3 id="br.describe.backup"><a class="anchor" href="#br.describe.backup"></a>83.3. Describing a Backup Image</h3>
 <div class="paragraph">
 <p>This command can be used to obtain information about a specific backup image.</p>
 </div>
@@ -18458,7 +18587,7 @@ in the backup, status, and start and end time. Specify the number of backup sess
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.describe.backup.positional.cli.arguments"><a class="anchor" href="#br.describe.backup.positional.cli.arguments"></a>81.3.1. Positional Command-Line Arguments</h4>
+<h4 id="br.describe.backup.positional.cli.arguments"><a class="anchor" href="#br.describe.backup.positional.cli.arguments"></a>83.3.1. Positional Command-Line Arguments</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1"><em>backup_id</em></dt>
@@ -18469,13 +18598,13 @@ in the backup, status, and start and end time. Specify the number of backup sess
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.describe.backup.named.cli.arguments"><a class="anchor" href="#br.describe.backup.named.cli.arguments"></a>81.3.2. Named Command-Line Arguments</h4>
+<h4 id="br.describe.backup.named.cli.arguments"><a class="anchor" href="#br.describe.backup.named.cli.arguments"></a>83.3.2. Named Command-Line Arguments</h4>
 <div class="paragraph">
 <p>None.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.describe.backup.example"><a class="anchor" href="#br.describe.backup.example"></a>81.3.3. Example usage</h4>
+<h4 id="br.describe.backup.example"><a class="anchor" href="#br.describe.backup.example"></a>83.3.3. Example usage</h4>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="java"><span class="error">$</span> hbase backup describe backupId_1467823988425</code></pre>
@@ -18484,7 +18613,7 @@ in the backup, status, and start and end time. Specify the number of backup sess
 </div>
 </div>
 <div class="sect2">
-<h3 id="br.delete.backup"><a class="anchor" href="#br.delete.backup"></a>81.4. Deleting a Backup Image</h3>
+<h3 id="br.delete.backup"><a class="anchor" href="#br.delete.backup"></a>83.4. Deleting a Backup Image</h3>
 <div class="paragraph">
 <p>This command can be used to delete a backup image which is no longer needed.</p>
 </div>
@@ -18494,7 +18623,7 @@ in the backup, status, and start and end time. Specify the number of backup sess
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.delete.backup.positional.cli.arguments"><a class="anchor" href="#br.delete.backup.positional.cli.arguments"></a>81.4.1. Positional Command-Line Arguments</h4>
+<h4 id="br.delete.backup.positional.cli.arguments"><a class="anchor" href="#br.delete.backup.positional.cli.arguments"></a>83.4.1. Positional Command-Line Arguments</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1"><em>backup_id</em></dt>
@@ -18505,13 +18634,13 @@ in the backup, status, and start and end time. Specify the number of backup sess
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.delete.backup.named.cli.arguments"><a class="anchor" href="#br.delete.backup.named.cli.arguments"></a>81.4.2. Named Command-Line Arguments</h4>
+<h4 id="br.delete.backup.named.cli.arguments"><a class="anchor" href="#br.delete.backup.named.cli.arguments"></a>83.4.2. Named Command-Line Arguments</h4>
 <div class="paragraph">
 <p>None.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.delete.backup.example"><a class="anchor" href="#br.delete.backup.example"></a>81.4.3. Example usage</h4>
+<h4 id="br.delete.backup.example"><a class="anchor" href="#br.delete.backup.example"></a>83.4.3. Example usage</h4>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="java"><span class="error">$</span> hbase backup delete backupId_1467823988425</code></pre>
@@ -18520,7 +18649,7 @@ in the backup, status, and start and end time. Specify the number of backup sess
 </div>
 </div>
 <div class="sect2">
-<h3 id="br.repair.backup"><a class="anchor" href="#br.repair.backup"></a>81.5. Backup Repair Command</h3>
+<h3 id="br.repair.backup"><a class="anchor" href="#br.repair.backup"></a>83.5. Backup Repair Command</h3>
 <div class="paragraph">
 <p>This command attempts to correct any inconsistencies in persisted backup metadata which exists as
 the result of software errors or unhandled failure scenarios. While the backup implementation tries
@@ -18533,19 +18662,19 @@ automatically recover on its own.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="br.repair.backup.positional.cli.arguments"><a class="anchor" href="#br.repair.backup.positional.cli.arguments"></a>81.5.1. Positional Command-Line Arguments</h4>
+<h4 id="br.repair.backup.positional.cli.arguments"><a class="anchor" href="#br.repair.backup.positional.cli.arguments"></a>83.5.1. Positional Command-Line Arguments</h4>
 <div class="paragraph">
 <p>None.</p>
 </div>
 </div>
 </div>
 <div class="sect2">
-<h3 id="br.repair.backup.named.cli.arguments"><a class="anchor" href="#br.repair.backup.named.cli.arguments"></a>81.6. Named Command-Line Arguments</h3>
+<h3 id="br.repair.backup.named.cli.arguments"><a class="anchor" href="#br.repair.backup.named.cli.arguments"></a>83.6. Named Command-Line Arguments</h3>
 <div class="paragraph">
 <p>None.</p>
 </div>
 <div class="sect3">
-<h4 id="br.repair.backup.example"><a class="anchor" href="#br.repair.backup.example"></a>81.6.1. Example usage</h4>
+<h4 id="br.repair.backup.example"><a class="anchor" href="#br.repair.backup.example"></a>83.6.1. Example usage</h4>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="java"><span class="error">$</span> hbase backup repair</code></pre>
@@ -18556,13 +18685,13 @@ automatically recover on its own.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.backup.configuration"><a class="anchor" href="#br.backup.configuration"></a>82. Configuration keys</h2>
+<h2 id="br.backup.configuration"><a class="anchor" href="#br.backup.configuration"></a>84. Configuration keys</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>The backup and restore feature includes both required and optional configuration keys.</p>
 </div>
 <div class="sect2">
-<h3 id="_required_properties"><a class="anchor" href="#_required_properties"></a>82.1. Required properties</h3>
+<h3 id="_required_properties"><a class="anchor" href="#_required_properties"></a>84.1. Required properties</h3>
 <div class="paragraph">
 <p><em>hbase.backup.enable</em>: Controls whether or not the feature is enabled (Default: <code>false</code>). Set this value to <code>true</code>.</p>
 </div>
@@ -18588,7 +18717,7 @@ to <code>org.apache.hadoop.hbase.backup.BackupHFileCleaner</code> or append it t
 </div>
 </div>
 <div class="sect2">
-<h3 id="_optional_properties"><a class="anchor" href="#_optional_properties"></a>82.2. Optional properties</h3>
+<h3 id="_optional_properties"><a class="anchor" href="#_optional_properties"></a>84.2. Optional properties</h3>
 <div class="paragraph">
 <p><em>hbase.backup.system.ttl</em>: The time-to-live in seconds of data in the <code>hbase:backup</code> tables (default: forever). This property
 is only relevant prior to the creation of the <code>hbase:backup</code> table. Use the <code>alter</code> command in the HBase shell to modify the TTL
@@ -18609,10 +18738,10 @@ in the Master&#8217;s procedure framework (default: 30000).</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.best.practices"><a class="anchor" href="#br.best.practices"></a>83. Best Practices</h2>
+<h2 id="br.best.practices"><a class="anchor" href="#br.best.practices"></a>85. Best Practices</h2>
 <div class="sectionbody">
 <div class="sect2">
-<h3 id="_formulate_a_restore_strategy_and_test_it"><a class="anchor" href="#_formulate_a_restore_strategy_and_test_it"></a>83.1. Formulate a restore strategy and test it.</h3>
+<h3 id="_formulate_a_restore_strategy_and_test_it"><a class="anchor" href="#_formulate_a_restore_strategy_and_test_it"></a>85.1. Formulate a restore strategy and test it.</h3>
 <div class="paragraph">
 <p>Before you rely on a backup and restore strategy for your production environment, identify how backups must be performed,
 and more importantly, how restores must be performed. Test the plan to ensure that it is workable.
@@ -18628,7 +18757,7 @@ at the whole primary site (fire, earthquake, etc.), the remote backup site can b
 </div>
 </div>
 <div class="sect2">
-<h3 id="_secure_a_full_backup_image_first"><a class="anchor" href="#_secure_a_full_backup_image_first"></a>83.2. Secure a full backup image first.</h3>
+<h3 id="_secure_a_full_backup_image_first"><a class="anchor" href="#_secure_a_full_backup_image_first"></a>85.2. Secure a full backup image first.</h3>
 <div class="paragraph">
 <p>As a baseline, you must complete a full backup of HBase data at least once before you can rely on incremental backups. The full
 backup should be stored outside of the source cluster. To ensure complete dataset recovery, you must run the restore utility
@@ -18637,7 +18766,7 @@ is applied on top of the full backup during the restore operation to return you
 </div>
 </div>
 <div class="sect2">
-<h3 id="_define_and_use_backup_sets_for_groups_of_tables_that_are_logical_subsets_of_the_entire_dataset"><a class="anchor" href="#_define_and_use_backup_sets_for_groups_of_tables_that_are_logical_subsets_of_the_entire_dataset"></a>83.3. Define and use backup sets for groups of tables that are logical subsets of the entire dataset.</h3>
+<h3 id="_define_and_use_backup_sets_for_groups_of_tables_that_are_logical_subsets_of_the_entire_dataset"><a class="anchor" href="#_define_and_use_backup_sets_for_groups_of_tables_that_are_logical_subsets_of_the_entire_dataset"></a>85.3. Define and use backup sets for groups of tables that are logical subsets of the entire dataset.</h3>
 <div class="paragraph">
 <p>You can group tables into an object called a backup set. A backup set can save time when you have a particular group of tables
 that you expect to repeatedly back up or restore.</p>
@@ -18649,7 +18778,7 @@ to the command execution instead of entering all the table names individually.</
 </div>
 </div>
 <div class="sect2">
-<h3 id="_document_the_backup_and_restore_strategy_and_ideally_log_information_about_each_backup"><a class="anchor" href="#_document_the_backup_and_restore_strategy_and_ideally_log_information_about_each_backup"></a>83.4. Document the backup and restore strategy, and ideally log information about each backup.</h3>
+<h3 id="_document_the_backup_and_restore_strategy_and_ideally_log_information_about_each_backup"><a class="anchor" href="#_document_the_backup_and_restore_strategy_and_ideally_log_information_about_each_backup"></a>85.4. Document the backup and restore strategy, and ideally log information about each backup.</h3>
 <div class="paragraph">
 <p>Document the whole process so that the knowledge base can transfer to new administrators after employee turnover. As an extra
 safety precaution, also log the calendar date, time, and other relevant details about the data of each backup. This metadata
@@ -18661,7 +18790,7 @@ accessed by an administrator remotely from the production cluster.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.s3.backup.scenario"><a class="anchor" href="#br.s3.backup.scenario"></a>84. Scenario: Safeguarding Application Datasets on Amazon S3</h2>
+<h2 id="br.s3.backup.scenario"><a class="anchor" href="#br.s3.backup.scenario"></a>86. Scenario: Safeguarding Application Datasets on Amazon S3</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>This scenario describes how a hypothetical retail business uses backups to safeguard application data and then restore the dataset
@@ -18777,7 +18906,7 @@ existing data in the destination. In this case, the admin decides to overwrite t
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.data.security"><a class="anchor" href="#br.data.security"></a>85. Security of Backup Data</h2>
+<h2 id="br.data.security"><a class="anchor" href="#br.data.security"></a>87. Security of Backup Data</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>With this feature which makes copying data to remote locations, it&#8217;s important to take a moment to clearly state the procedural
@@ -18795,7 +18924,7 @@ providing a comparable level of security. This is a manual step which users <str
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.technical.details"><a class="anchor" href="#br.technical.details"></a>86. Technical Details of Incremental Backup and Restore</h2>
+<h2 id="br.technical.details"><a class="anchor" href="#br.technical.details"></a>88. Technical Details of Incremental Backup and Restore</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>HBase incremental backups enable more efficient capture of HBase table images than previous attempts at serial backup and restore
@@ -18816,7 +18945,7 @@ Bulk Load utility automatically imports as restored data in the table.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.filesystem.growth.warning"><a class="anchor" href="#br.filesystem.growth.warning"></a>87. A Warning on File System Growth</h2>
+<h2 id="br.filesystem.growth.warning"><a class="anchor" href="#br.filesystem.growth.warning"></a>89. A Warning on File System Growth</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>As a reminder, incremental backups are implemented via retaining the write-ahead logs which HBase primarily uses for data durability.
@@ -18837,7 +18966,7 @@ in the HBase shell. Modifying the configuration property <code>hbase.backup.syst
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.backup.capacity.planning"><a class="anchor" href="#br.backup.capacity.planning"></a>88. Capacity Planning</h2>
+<h2 id="br.backup.capacity.planning"><a class="anchor" href="#br.backup.capacity.planning"></a>90. Capacity Planning</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>When designing a distributed system deployment, it is critical that some basic mathmatical rigor is executed to ensure sufficient computational
@@ -18846,7 +18975,7 @@ bottleneck when estimating the performance of some implementation of backup and
 data can be read/written.</p>
 </div>
 <div class="sect2">
-<h3 id="_full_backups"><a class="anchor" href="#_full_backups"></a>88.1. Full Backups</h3>
+<h3 id="_full_backups"><a class="anchor" href="#_full_backups"></a>90.1. Full Backups</h3>
 <div class="paragraph">
 <p>To estimate the duration of a full backup, we have to understand the general actions which are invoked:</p>
 </div>
@@ -18886,7 +19015,7 @@ data at the full 80MB/s and <code>-w</code> is used to limit the job from spawni
 </div>
 </div>
 <div class="sect2">
-<h3 id="_incremental_backup"><a class="anchor" href="#_incremental_backup"></a>88.2. Incremental Backup</h3>
+<h3 id="_incremental_backup"><a class="anchor" href="#_incremental_backup"></a>90.2. Incremental Backup</h3>
 <div class="paragraph">
 <p>Like we did for full backups, we have to understand the incremental backup process to approximate its runtime and cost.</p>
 </div>
@@ -18913,7 +19042,7 @@ DistCp MapReduce job would likely dominate the actual time taken to copy the dat
 </div>
 </div>
 <div class="sect1">
-<h2 id="br.limitations"><a class="anchor" href="#br.limitations"></a>89. Limitations of the Backup and Restore Utility</h2>
+<h2 id="br.limitations"><a class="anchor" href="#br.limitations"></a>91. Limitations of the Backup and Restore Utility</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p><strong>Serial backup operations</strong></p>
@@ -18991,7 +19120,7 @@ See <a href="#external_apis">Apache HBase External APIs</a> for more information
 </div>
 </div>
 <div class="sect1">
-<h2 id="_examples"><a class="anchor" href="#_examples"></a>90. Examples</h2>
+<h2 id="_examples"><a class="anchor" href="#_examples"></a>92. Examples</h2>
 <div class="sectionbody">
 <div class="exampleblock">
 <div class="title">Example 40. Create, modify and delete a Table Using Java</div>
@@ -19102,7 +19231,7 @@ through custom protocols. For information on using the native HBase APIs, refer
 </div>
 </div>
 <div class="sect1">
-<h2 id="_rest"><a class="anchor" href="#_rest"></a>91. REST</h2>
+<h2 id="_rest"><a class="anchor" href="#_rest"></a>93. REST</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>Representational State Transfer (REST) was introduced in 2000 in the doctoral
@@ -19118,7 +19247,7 @@ There is also a nice series of blogs on
 by Jesse Anderson.</p>
 </div>
 <div class="sect2">
-<h3 id="_starting_and_stopping_the_rest_server"><a class="anchor" href="#_starting_and_stopping_the_rest_server"></a>91.1. Starting and Stopping the REST Server</h3>
+<h3 id="_starting_and_stopping_the_rest_server"><a class="anchor" href="#_starting_and_stopping_the_rest_server"></a>93.1. Starting and Stopping the REST Server</h3>
 <div class="paragraph">
 <p>The included REST server can run as a daemon which starts an embedded Jetty
 servlet container and deploys the servlet into it. Use one of the following commands
@@ -19145,7 +19274,7 @@ following command if you were running it in the background.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_configuring_the_rest_server_and_client"><a class="anchor" href="#_configuring_the_rest_server_and_client"></a>91.2. Configuring the REST Server and Client</h3>
+<h3 id="_configuring_the_rest_server_and_client"><a class="anchor" href="#_configuring_the_rest_server_and_client"></a>93.2. Configuring the REST Server and Client</h3>
 <div class="paragraph">
 <p>For information about configuring the REST server and client for SSL, as well as <code>doAs</code>
 impersonation for the REST server, see <a href="#security.gateway.thrift">Configure the Thrift Gateway to Authenticate on Behalf of the Client</a> and other portions
@@ -19153,7 +19282,7 @@ of the <a href="#security">Securing Apache HBase</a> chapter.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_using_rest_endpoints"><a class="anchor" href="#_using_rest_endpoints"></a>91.3. Using REST Endpoints</h3>
+<h3 id="_using_rest_endpoints"><a class="anchor" href="#_using_rest_endpoints"></a>93.3. Using REST Endpoints</h3>
 <div class="paragraph">
 <p>The following examples use the placeholder server http://example.com:8000, and
 the following commands can all be run using <code>curl</code> or <code>wget</code> commands. You can request
@@ -19520,7 +19649,7 @@ curl -vi -X PUT \
 </table>
 </div>
 <div class="sect2">
-<h3 id="xml_schema"><a class="anchor" href="#xml_schema"></a>91.4. REST XML Schema</h3>
+<h3 id="xml_schema"><a class="anchor" href="#xml_schema"></a>93.4. REST XML Schema</h3>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;schema</span> <span class="attribute-name">xmlns</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">http://www.w3.org/2001/XMLSchema</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">xmlns:tns</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">RESTSchema</span><span class="delimiter">&quot;</span></span><span class="tag">&gt;</span>
@@ -19678,7 +19807,7 @@ curl -vi -X PUT \
 </div>
 </div>
 <div class="sect2">
-<h3 id="protobufs_schema"><a class="anchor" href="#protobufs_schema"></a>91.5. REST Protobufs Schema</h3>
+<h3 id="protobufs_schema"><a class="anchor" href="#protobufs_schema"></a>93.5. REST Protobufs Schema</h3>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="json"><span class="error">m</span><span class="error">e</span><span class="error">s</span><span class="error">s</span><span class="error">a</span><span class="error">g</span><span class="error">e</span> <span class="error">V</span><span class="error">e</span><span class="error">r</span><span class="error">s</span><span class="error">i</span><span class="error">o</span><span class="error">n</span> {
@@ -19786,7 +19915,7 @@ curl -vi -X PUT \
 </div>
 </div>
 <div class="sect1">
-<h2 id="_thrift"><a class="anchor" href="#_thrift"></a>92. Thrift</h2>
+<h2 id="_thrift"><a class="anchor" href="#_thrift"></a>94. Thrift</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>Documentation about Thrift has moved to <a href="#thrift">Thrift API and Filter Language</a>.</p>
@@ -19794,7 +19923,7 @@ curl -vi -X PUT \
 </div>
 </div>
 <div class="sect1">
-<h2 id="c"><a class="anchor" href="#c"></a>93. C/C++ Apache HBase Client</h2>
+<h2 id="c"><a class="anchor" href="#c"></a>95. C/C++ Apache HBase Client</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>FB&#8217;s Chip Turner wrote a pure C/C++ client.
@@ -19806,7 +19935,7 @@ curl -vi -X PUT \
 </div>
 </div>
 <div class="sect1">
-<h2 id="jdo"><a class="anchor" href="#jdo"></a>94. Using Java Data Objects (JDO) with HBase</h2>
+<h2 id="jdo"><a class="anchor" href="#jdo"></a>96. Using Java Data Objects (JDO) with HBase</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p><a href="https://db.apache.org/jdo/">Java Data Objects (JDO)</a> is a standard way to
@@ -19963,10 +20092,10 @@ a row, get a column value, perform a query, and do some additional HBase operati
 </div>
 </div>
 <div class="sect1">
-<h2 id="scala"><a class="anchor" href="#scala"></a>95. Scala</h2>
+<h2 id="scala"><a class="anchor" href="#scala"></a>97. Scala</h2>
 <div class="sectionbody">
 <div class="sect2">
-<h3 id="_setting_the_classpath"><a class="anchor" href="#_setting_the_classpath"></a>95.1. Setting the Classpath</h3>
+<h3 id="_setting_the_classpath"><a class="anchor" href="#_setting_the_classpath"></a>97.1. Setting the Classpath</h3>
 <div class="paragraph">
 <p>To use Scala with HBase, your CLASSPATH must include HBase&#8217;s classpath as well as
 the Scala JARs required by your code. First, use the following command on a server
@@ -19991,7 +20120,7 @@ your project.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_scala_sbt_file"><a class="anchor" href="#_scala_sbt_file"></a>95.2. Scala SBT File</h3>
+<h3 id="_scala_sbt_file"><a class="anchor" href="#_scala_sbt_file"></a>97.2. Scala SBT File</h3>
 <div class="paragraph">
 <p>Your <code>build.sbt</code> file needs the following <code>resolvers</code> and <code>libraryDependencies</code> to work
 with HBase.</p>
@@ -20010,7 +20139,7 @@ libraryDependencies ++= Seq(
 </div>
 </div>
 <div class="sect2">
-<h3 id="_example_scala_code"><a class="anchor" href="#_example_scala_code"></a>95.3. Example Scala Code</h3>
+<h3 id="_example_scala_code"><a class="anchor" href="#_example_scala_code"></a>97.3. Example Scala Code</h3>
 <div class="paragraph">
 <p>This example lists HBase tables, creates a new table, and adds a row to it.</p>
 </div>
@@ -20048,10 +20177,10 @@ println(Bytes.toString(value))</code></pre>
 </div>
 </div>
 <div class="sect1">
-<h2 id="jython"><a class="anchor" href="#jython"></a>96. Jython</h2>
+<h2 id="jython"><a class="anchor" href="#jython"></a>98. Jython</h2>
 <div class="sectionbody">
 <div class="sect2">
-<h3 id="_setting_the_classpath_2"><a class="anchor" href="#_setting_the_classpath_2"></a>96.1. Setting the Classpath</h3>
+<h3 id="_setting_the_classpath_2"><a class="anchor" href="#_setting_the_classpath_2"></a>98.1. Setting the Classpath</h3>
 <div class="paragraph">
 <p>To use Jython with HBase, your CLASSPATH must include HBase&#8217;s classpath as well as
 the Jython JARs required by your code. First, use the following command on a server
@@ -20080,7 +20209,7 @@ $ bin/hbase org.python.util.jython</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_jython_code_examples"><a class="anchor" href="#_jython_code_examples"></a>96.2. Jython Code Examples</h3>
+<h3 id="_jython_code_examples"><a class="anchor" href="#_jython_code_examples"></a>98.2. Jython Code Examples</h3>
 <div class="exampleblock">
 <div class="title">Example 42. Table Creation, Population, Get, and Delete with Jython</div>
 <div class="content">
@@ -20189,7 +20318,7 @@ The Thrift API relies on client and server processes.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="thrift.filter_language"><a class="anchor" href="#thrift.filter_language"></a>97. Filter Language</h2>
+<h2 id="thrift.filter_language"><a class="anchor" href="#thrift.filter_language"></a>99. Filter Language</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>Thrift Filter Language was introduced in HBase 0.92.
@@ -20200,7 +20329,7 @@ You can find out more about shell integration by using the <code>scan help</code
 <p>You specify a filter as a string, which is parsed on the server to construct the filter.</p>
 </div>
 <div class="sect2">
-<h3 id="general_syntax"><a class="anchor" href="#general_syntax"></a>97.1. General Filter String Syntax</h3>
+<h3 id="general_syntax"><a class="anchor" href="#general_syntax"></a>99.1. General Filter String Syntax</h3>
 <div class="paragraph">
 <p>A simple filter expression is expressed as a string:</p>
 </div>
@@ -20235,7 +20364,7 @@ If single quotes are present in the argument, they must be escaped by an additio
 </div>
 </div>
 <div class="sect2">
-<h3 id="_compound_filters_and_operators"><a class="anchor" href="#_compound_filters_and_operators"></a>97.2. Compound Filters and Operators</h3>
+<h3 id="_compound_filters_and_operators"><a class="anchor" href="#_compound_filters_and_operators"></a>99.2. Compound Filters and Operators</h3>
 <div class="dlist">
 <div class="title">Binary Operators</div>
 <dl>
@@ -20277,7 +20406,7 @@ If single quotes are present in the argument, they must be escaped by an additio
 </div>
 </div>
 <div class="sect2">
-<h3 id="_order_of_evaluation"><a class="anchor" href="#_order_of_evaluation"></a>97.3. Order of Evaluation</h3>
+<h3 id="_order_of_evaluation"><a class="anchor" href="#_order_of_evaluation"></a>99.3. Order of Evaluation</h3>
 <div class="olist arabic">
 <ol class="arabic">
 <li>
@@ -20315,7 +20444,7 @@ is evaluated as
 </div>
 </div>
 <div class="sect2">
-<h3 id="_compare_operator"><a class="anchor" href="#_compare_operator"></a>97.4. Compare Operator</h3>
+<h3 id="_compare_operator"><a class="anchor" href="#_compare_operator"></a>99.4. Compare Operator</h3>
 <div class="paragraph">
 <p>The following compare operators are provided:</p>
 </div>
@@ -20349,7 +20478,7 @@ is evaluated as
 </div>
 </div>
 <div class="sect2">
-<h3 id="_comparator"><a class="anchor" href="#_comparator"></a>97.5. Comparator</h3>
+<h3 id="_comparator"><a class="anchor" href="#_comparator"></a>99.5. Comparator</h3>
 <div class="paragraph">
 <p>A comparator can be any of the following:</p>
 </div>
@@ -20417,7 +20546,7 @@ Only EQUAL and NOT_EQUAL comparisons are valid with this comparator</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="examplephpclientprogram"><a class="anchor" href="#examplephpclientprogram"></a>97.6. Example PHP Client Program that uses the Filter Language</h3>
+<h3 id="examplephpclientprogram"><a class="anchor" href="#examplephpclientprogram"></a>99.6. Example PHP Client Program that uses the Filter Language</h3>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="php"><span class="inline-delimiter">&lt;?</span>
@@ -20440,7 +20569,7 @@ Only EQUAL and NOT_EQUAL comparisons are valid with this comparator</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_example_filter_strings"><a class="anchor" href="#_example_filter_strings"></a>97.7. Example Filter Strings</h3>
+<h3 id="_example_filter_strings"><a class="anchor" href="#_example_filter_strings"></a>99.7. Example Filter Strings</h3>
 <div class="ulist">
 <ul>
 <li>
@@ -20489,7 +20618,7 @@ Only EQUAL and NOT_EQUAL comparisons are valid with this comparator</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="individualfiltersyntax"><a class="anchor" href="#individualfiltersyntax"></a>97.8. Individual Filter Syntax</h3>
+<h3 id="individualfiltersyntax"><a class="anchor" href="#individualfiltersyntax"></a>99.8. Individual Filter Syntax</h3>
 <div class="dlist">
 <dl>
 <dt class="hdlist1">KeyOnlyFilter</dt>
@@ -20632,7 +20761,7 @@ application.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="_basic_spark"><a class="anchor" href="#_basic_spark"></a>98. Basic Spark</h2>
+<h2 id="_basic_spark"><a class="anchor" href="#_basic_spark"></a>100. Basic Spark</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>This section discusses Spark HBase integration at the lowest and simplest levels.
@@ -20763,7 +20892,7 @@ access to HBase</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="_spark_streaming"><a class="anchor" href="#_spark_streaming"></a>99. Spark Streaming</h2>
+<h2 id="_spark_streaming"><a class="anchor" href="#_spark_streaming"></a>101. Spark Streaming</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p><a href="https://spark.apache.org/streaming/">Spark Streaming</a> is a micro batching stream
@@ -20860,7 +20989,7 @@ to the HBase Connections in the executors
 </div>
 </div>
 <div class="sect1">
-<h2 id="_bulk_load"><a class="anchor" href="#_bulk_load"></a>100. Bulk Load</h2>
+<h2 id="_bulk_load"><a class="anchor" href="#_bulk_load"></a>102. Bulk Load</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>There are two options for bulk loading data into HBase with Spark.  There is the
@@ -21068,7 +21197,7 @@ values for this row for all column families.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="_sparksql_dataframes"><a class="anchor" href="#_sparksql_dataframes"></a>101. SparkSQL/DataFrames</h2>
+<h2 id="_sparksql_dataframes"><a class="anchor" href="#_sparksql_dataframes"></a>103. SparkSQL/DataFrames</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>HBase-Spark Connector (in HBase-Spark Module) leverages
@@ -21088,7 +21217,7 @@ then load HBase DataFrame. After that, users can do integrated query and access
 in HBase table with SQL query. Following illustrates the basic procedure.</p>
 </div>
 <div class="sect2">
-<h3 id="_define_catalog"><a class="anchor" href="#_define_catalog"></a>101.1. Define catalog</h3>
+<h3 id="_define_catalog"><a class="anchor" href="#_define_catalog"></a>103.1. Define catalog</h3>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="scala">def catalog = s&quot;&quot;&quot;{
@@ -21117,7 +21246,7 @@ also has to be defined in details as a column (col0), which has a specific cf (r
 </div>
 </div>
 <div class="sect2">
-<h3 id="_save_the_dataframe"><a class="anchor" href="#_save_the_dataframe"></a>101.2. Save the DataFrame</h3>
+<h3 id="_save_the_dataframe"><a class="anchor" href="#_save_the_dataframe"></a>103.2. Save the DataFrame</h3>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="scala">case class HBaseRecord(
@@ -21164,7 +21293,7 @@ will create an HBase table with 5 regions and save the DataFrame inside.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_load_the_dataframe"><a class="anchor" href="#_load_the_dataframe"></a>101.3. Load the DataFrame</h3>
+<h3 id="_load_the_dataframe"><a class="anchor" href="#_load_the_dataframe"></a>103.3. Load the DataFrame</h3>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="scala">def withCatalog(cat: String): DataFrame = {
@@ -21188,7 +21317,7 @@ by <code>withCatalog</code> function could be used to access HBase table, such a
 </div>
 </div>
 <div class="sect2">
-<h3 id="_language_integrated_query"><a class="anchor" href="#_language_integrated_query"></a>101.4. Language Integrated Query</h3>
+<h3 id="_language_integrated_query"><a class="anchor" href="#_language_integrated_query"></a>103.4. Language Integrated Query</h3>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="scala">val s = df.filter(($&quot;col0&quot; &lt;= &quot;row050&quot; &amp;&amp; $&quot;col0&quot; &gt; &quot;row040&quot;) ||
@@ -21205,7 +21334,7 @@ s.show</code></pre>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_sql_query"><a class="anchor" href="#_sql_query"></a>101.5. SQL Query</h3>
+<h3 id="_sql_query"><a class="anchor" href="#_sql_query"></a>103.5. SQL Query</h3>
 <div class="listingblock">
 <div class="content">
 <pre class="CodeRay highlight"><code data-lang="scala">df.registerTempTable(&quot;table1&quot;)
@@ -21219,7 +21348,7 @@ The lifetime of this temporary table is tied to the SQLContext that was used to
 </div>
 </div>
 <div class="sect2">
-<h3 id="_others"><a class="anchor" href="#_others"></a>101.6. Others</h3>
+<h3 id="_others"><a class="anchor" href="#_others"></a>103.6. Others</h3>
 <div class="exampleblock">
 <div class="title">Example 51. Query with different timestamps</div>
 <div class="content">
@@ -21467,7 +21596,7 @@ coprocessor can severely degrade cluster performance and stability.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="_coprocessor_overview"><a class="anchor" href="#_coprocessor_overview"></a>102. Coprocessor Overview</h2>
+<h2 id="_coprocessor_overview"><a class="anchor" href="#_coprocessor_overview"></a>104. Coprocessor Overview</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>In HBase, you fetch data using a <code>Get</code> or <code>Scan</code>, whereas in an RDBMS you use a SQL
@@ -21493,7 +21622,7 @@ data, and returns the result to the client.</p>
 are some analogies which may help to explain some of the benefits of coprocessors.</p>
 </div>
 <div class="sect2">
-<h3 id="cp_analogies"><a class="anchor" href="#cp_analogies"></a>102.1. Coprocessor Analogies</h3>
+<h3 id="cp_analogies"><a class="anchor" href="#cp_analogies"></a>104.1. Coprocessor Analogies</h3>
 <div class="dlist">
 <dl>
 <dt class="hdlist1">Triggers and Stored Procedure</dt>
@@ -21519,7 +21648,7 @@ before passing the request on to its final destination (or even changing the des
 </div>
 </div>
 <div class="sect2">
-<h3 id="_coprocessor_implementation_overview"><a class="anchor" href="#_coprocessor_implementation_overview"></a>102.2. Coprocessor Implementation Overview</h3>
+<h3 id="_coprocessor_implementation_overview"><a class="anchor" href="#_coprocessor_implementation_overview"></a>104.2. Coprocessor Implementation Overview</h3>
 <div class="olist arabic">
 <ol class="arabic">
 <li>
@@ -21547,10 +21676,10 @@ package.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="_types_of_coprocessors"><a class="anchor" href="#_types_of_coprocessors"></a>103. Types of Coprocessors</h2>
+<h2 id="_types_of_coprocessors"><a class="anchor" href="#_types_of_coprocessors"></a>105. Types of Coprocessors</h2>
 <div class="sectionbody">
 <div class="sect2">
-<h3 id="_observer_coprocessors"><a class="anchor" href="#_observer_coprocessors"></a>103.1. Observer Coprocessors</h3>
+<h3 id="_observer_coprocessors"><a class="anchor" href="#_observer_coprocessors"></a>105.1. Observer Coprocessors</h3>
 <div class="paragraph">
 <p>Observer coprocessors are triggered either before or after a specific event occurs.
 Observers that happen before an event use methods that start with a <code>pre</code> prefix,
@@ -21558,7 +21687,7 @@ such as <a href="https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/cop
 with a <code>post</code> prefix, such as <a href="https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-"><code>postPut</code></a>.</p>
 </div>
 <div class="sect3">
-<h4 id="_use_cases_for_observer_coprocessors"><a class="anchor" href="#_use_cases_for_observer_coprocessors"></a>103.1.1. Use Cases for Observer Coprocessors</h4>
+<h4 id="_use_cases_for_observer_coprocessors"><a class="anchor" href="#_use_cases_for_observer_coprocessors"></a>105.1.1. Use Cases for Observer Coprocessors</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1">Security</dt>
@@ -21583,7 +21712,7 @@ a coprocessor to use the <code>prePut</code> method on <code>user</code> to inse
 </div>
 </div>
 <div class="sect3">
-<h4 id="_types_of_observer_coprocessor"><a class="anchor" href="#_types_of_observer_coprocessor"></a>103.1.2. Types of Observer Coprocessor</h4>
+<h4 id="_types_of_observer_coprocessor"><a class="anchor" href="#_types_of_observer_coprocessor"></a>105.1.2. Types of Observer Coprocessor</h4>
 <div class="dlist">
 <dl>
 <dt class="hdlist1">RegionObserver</dt>
@@ -21619,7 +21748,7 @@ Log (WAL). See
 </div>
 </div>
 <div class="sect2">
-<h3 id="cpeps"><a class="anchor" href="#cpeps"></a>103.2. Endpoint Coprocessor</h3>
+<h3 id="cpeps"><a class="anchor" href="#cpeps"></a>105.2. Endpoint Coprocessor</h3>
 <div class="paragraph">
 <p>Endpoint processors allow you to perform computation at the location of the data.
 See <a href="#cp_analogies">Coprocessor Analogy</a>. An example is the need to calculate a running
@@ -21663,14 +21792,14 @@ change.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="cp_loading"><a class="anchor" href="#cp_loading"></a>104. Loading Coprocessors</h2>
+<h2 id="cp_loading"><a class="anchor" href="#cp_loading"></a>106. Loading Coprocessors</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>To make your coprocessor available to HBase, it must be <em>loaded</em>, either statically
 (through the HBase configuration) or dynamically (using HBase Shell or the Java API).</p>
 </div>
 <div class="sect2">
-<h3 id="_static_loading"><a class="anchor" href="#_static_loading"></a>104.1. Static Loading</h3>
+<h3 id="_static_loading"><a class="anchor" href="#_static_loading"></a>106.1. Static Loading</h3>
 <div class="paragraph">
 <p>Follow these steps to statically load your coprocessor. Keep in mind that you must
 restart HBase to unload a coprocessor that has been loaded statically.</p>
@@ -21739,7 +21868,7 @@ HBase installation.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_static_unloading"><a class="anchor" href="#_static_unloading"></a>104.2. Static Unloading</h3>
+<h3 id="_static_unloading"><a class="anchor" href="#_static_unloading"></a>106.2. Static Unloading</h3>
 <div class="olist arabic">
 <ol class="arabic">
 <li>
@@ -21756,7 +21885,7 @@ directory.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_dynamic_loading"><a class="anchor" href="#_dynamic_loading"></a>104.3. Dynamic Loading</h3>
+<h3 id="_dynamic_loading"><a class="anchor" href="#_dynamic_loading"></a>106.3. Dynamic Loading</h3>
 <div class="paragraph">
 <p>You can also load a coprocessor dynamically, without restarting HBase. This may seem
 preferable to static loading, but dynamically loaded coprocessors are loaded on a
@@ -21798,7 +21927,7 @@ dependencies.</p>
 </table>
 </div>
 <div class="sect3">
-<h4 id="load_coprocessor_in_shell"><a class="anchor" href="#load_coprocessor_in_shell"></a>104.3.1. Using HBase Shell</h4>
+<h4 id="load_coprocessor_in_shell"><a class="anchor" href="#load_coprocessor_in_shell"></a>106.3.1. Using HBase Shell</h4>
 <div class="olist arabic">
 <ol class="arabic">
 <li>
@@ -21874,7 +22003,7 @@ case the framework will assign a default priority value.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_using_the_java_api_all_hbase_versions"><a class="anchor" href="#_using_the_java_api_all_hbase_versions"></a>104.3.2. Using the Java API (all HBase versions)</h4>
+<h4 id="_using_the_java_api_all_hbase_versions"><a class="anchor" href="#_using_the_java_api_all_hbase_versions"></a>106.3.2. Using the Java API (all HBase versions)</h4>
 <div class="paragraph">
 <p>The following Java code shows how to use the <code>setValue()</code> method of <code>HTableDescriptor</code>
 to load a coprocessor on the <code>users</code> table.</p>
@@ -21903,7 +22032,7 @@ admin.enableTable(tableName);</code></pre>
 </div>
 </div>
 <div class="sect3">
-<h4 id="_using_the_java_api_hbase_0_96_only"><a class="anchor" href="#_using_the_java_api_hbase_0_96_only"></a>104.3.3. Using the Java API (HBase 0.96+ only)</h4>
+<h4 id="_using_the_java_api_hbase_0_96_only"><a class="anchor" href="#_using_the_java_api_hbase_0_96_only"></a>106.3.3. Using the Java API (HBase 0.96+ only)</h4>
 <div class="paragraph">
 <p>In HBase 0.96 and newer, the <code>addCoprocessor()</code> method of <code>HTableDescriptor</code> provides
 an easier way to load a coprocessor dynamically.</p>
@@ -21946,9 +22075,9 @@ verifies whether the given class is actually contained in the jar file.
 </div>
 </div>
 <div class="sect2">
-<h3 id="_dynamic_unloading"><a class="anchor" href="#_dynamic_unloading"></a>104.4. Dynamic Unloading</h3>
+<h3 id="_dynamic_unloading"><a class="anchor" href="#_dynamic_unloading"></a>106.4. Dynamic Unloading</h3>
 <div class="sect3">
-<h4 id="_using_hbase_shell"><a class="anchor" href="#_using_hbase_shell"></a>104.4.1. Using HBase Shell</h4>
+<h4 id="_using_hbase_shell"><a class="anchor" href="#_using_hbase_shell"></a>106.4.1. Using HBase Shell</h4>
 <div class="olist arabic">
 <ol class="arabic">
 <li>
@@ -21979,7 +22108,7 @@ verifies whether the given class is actually contained in the jar file.
 </div>
 </div>
 <div class="sect3">
-<h4 id="_using_the_java_api"><a class="anchor" href="#_using_the_java_api"></a>104.4.2. Using the Java API</h4>
+<h4 id="_using_the_java_api"><a class="anchor" href="#_using_the_java_api"></a>106.4.2. Using the Java API</h4>
 <div class="paragraph">
 <p>Reload the table definition without setting the value of the coprocessor either by
 using <code>setValue()</code> or <code>addCoprocessor()</code> methods. This will remove any coprocessor
@@ -22013,7 +22142,7 @@ admin.enableTable(tableName);</code></pre>
 </div>
 </div>
 <div class="sect1">
-<h2 id="cp_example"><a class="anchor" href="#cp_example"></a>105. Examples</h2>
+<h2 id="cp_example"><a class="anchor" href="#cp_example"></a>107. Examples</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>HBase ships examples for Observer Coprocessor.</p>
@@ -22084,7 +22213,7 @@ of the <code>use

<TRUNCATED>

[06/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html
index 3dbdec3..22e7059 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html
@@ -127,468 +127,470 @@
 <span class="sourceLineNo">119</span>    // initialization of the flush size should happen after initialization of the index type<a name="line.119"></a>
 <span class="sourceLineNo">120</span>    // so do not transfer the following method<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    initInmemoryFlushSize(conf);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  @VisibleForTesting<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  protected MemStoreCompactor createMemStoreCompactor(MemoryCompactionPolicy compactionPolicy)<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      throws IllegalArgumentIOException {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    return new MemStoreCompactor(this, compactionPolicy);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private void initInmemoryFlushSize(Configuration conf) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    double factor = 0;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    long memstoreFlushSize = getRegionServices().getMemStoreFlushSize();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    int numStores = getRegionServices().getNumStores();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    if (numStores &lt;= 1) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      // Family number might also be zero in some of our unit test case<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      numStores = 1;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    inmemoryFlushSize = memstoreFlushSize / numStores;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    // multiply by a factor (the same factor for all index types)<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    factor = conf.getDouble(IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY,<a name="line.140"></a>
-<span class="sourceLineNo">141</span>          IN_MEMORY_FLUSH_THRESHOLD_FACTOR_DEFAULT);<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>    inmemoryFlushSize = (long) (inmemoryFlushSize * factor);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    LOG.info("Setting in-memory flush size threshold to {} and immutable segments index to type={}",<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        StringUtils.byteDesc(inmemoryFlushSize), indexType);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  /**<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * @return Total memory occupied by this MemStore. This won't include any size occupied by the<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   *         snapshot. We assume the snapshot will get cleared soon. This is not thread safe and<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   *         the memstore may be changed while computing its size. It is the responsibility of the<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   *         caller to make sure this doesn't happen.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  @Override<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  public MemStoreSize size() {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    MemStoreSizing memstoreSizing = new MemStoreSizing();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    memstoreSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    for (Segment item : pipeline.getSegments()) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      memstoreSizing.incMemStoreSize(item.getMemStoreSize());<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    return memstoreSizing;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
-<span class="sourceLineNo">163</span><a name="line.163"></a>
-<span class="sourceLineNo">164</span>  /**<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * This method is called before the flush is executed.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @return an estimation (lower bound) of the unflushed sequence id in memstore after the flush<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * is executed. if memstore will be cleared returns {@code HConstants.NO_SEQNUM}.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  @Override<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public long preFlushSeqIDEstimation() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    if(compositeSnapshot) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return HConstants.NO_SEQNUM;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    Segment segment = getLastSegment();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    if(segment == null) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return HConstants.NO_SEQNUM;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    return segment.getMinSequenceId();<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  @Override<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public boolean isSloppy() {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    return true;<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>  /**<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * Push the current active memstore segment into the pipeline<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * and create a snapshot of the tail of current compaction pipeline<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Snapshot must be cleared by call to {@link #clearSnapshot}.<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * {@link #clearSnapshot(long)}.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @return {@link MemStoreSnapshot}<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public MemStoreSnapshot snapshot() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    // If snapshot currently has entries, then flusher failed or didn't call<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // cleanup.  Log a warning.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    if (!this.snapshot.isEmpty()) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.warn("Snapshot called again without clearing previous. " +<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          "Doing nothing. Another ongoing flush or did we fail last attempt?");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      LOG.debug("FLUSHING TO DISK {}, store={}",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      stopCompaction();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      pushActiveToPipeline(this.active);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      if (compositeSnapshot) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        pushPipelineToSnapshot();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      } else {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        pushTailToSnapshot();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      compactor.resetStats();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  /**<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   * On flush, how much memory we will clear.<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * @return size of data that is going to be flushed<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  @Override<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  public MemStoreSize getFlushableSize() {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      if (compositeSnapshot) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      } else {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        snapshotSizing = pipeline.getTailSizing();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        : new MemStoreSize(active.getMemStoreSize());<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  @Override<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  protected long keySize() {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    long k = this.active.keySize();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      k += segment.keySize();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    return k;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>  @Override<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  protected long heapSize() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    long h = this.active.heapSize();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      h += segment.heapSize();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    return h;<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>  @Override<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      WAL WAL = getRegionServices().getWAL();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      if (WAL != null) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  }<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>   * This message intends to inform the MemStore that next coming updates<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * are going to be part of the replaying edits from WAL<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  public void startReplayingFromWAL() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    inWalReplay = true;<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>  /**<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * are done<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   */<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public void stopReplayingFromWAL() {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    inWalReplay = false;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // the getSegments() method is used for tests only<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  @VisibleForTesting<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  @Override<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    list.add(this.active);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    list.addAll(pipelineList);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    return list;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      boolean merge) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // last true stands for updating the region size<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    return pipeline.swap(versionedList, result, !merge, true);<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>  /**<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   *           The flattening happens only if versions match.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  // setter is used only for testability<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  @VisibleForTesting<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  void setIndexType(IndexType type) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    indexType = type;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // If it is needed, please change in-memory flush size explicitly<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>  public IndexType getIndexType() {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return indexType;<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>  public boolean hasImmutableSegments() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    return !pipeline.isEmpty();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>  public VersionedSegmentsList getImmutableSegments() {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return pipeline.getVersionedList();<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>  public long getSmallestReadPoint() {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    return store.getSmallestReadPoint();<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>  public HStore getStore() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return store;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  public String getFamilyName() {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  @Override<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /*<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    MutableSegment activeTmp = active;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    // The order is the Segment ordinal<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    return list;<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>   @VisibleForTesting<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Check whether anything need to be done based on the current active set size.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * The method is invoked upon every addition to the active set.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * size is above threshold<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  @Override<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  protected void checkActiveSize() {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    if (shouldFlushInMemory()) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      * in the shared mode. */<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      if (LOG.isTraceEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        LOG.trace(<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      getPool().execute(runnable);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  // internally used method, externally visible only for tests<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  // otherwise there is a deadlock<a name="line.401"></a>
-<span class="sourceLineNo">402</span>  @VisibleForTesting<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  void flushInMemory() throws IOException {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    inMemoryFlushInProgress.set(true);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    try {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      // Phase I: Update the pipeline<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      getRegionServices().blockUpdates();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        pushActiveToPipeline(this.active);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      } finally {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        getRegionServices().unblockUpdates();<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      }<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>      // Used by tests<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      if (!allowCompaction.get()) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      // Phase II: Compact the pipeline<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      try {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        // compaction is in progress<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        compactor.start();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      } catch (IOException e) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.427"></a>
-<span class="sourceLineNo">428</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    } finally {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      inMemoryFlushInProgress.set(false);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      LOG.trace("IN-MEMORY FLUSH: end");<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
-<span class="sourceLineNo">435</span><a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private Segment getLastSegment() {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    Segment localActive = getActive();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    Segment tail = pipeline.getTail();<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return tail == null ? localActive : tail;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  private byte[] getFamilyNameInBytes() {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    return store.getColumnFamilyDescriptor().getName();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
-<span class="sourceLineNo">445</span><a name="line.445"></a>
-<span class="sourceLineNo">446</span>  private ThreadPoolExecutor getPool() {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    return getRegionServices().getInMemoryCompactionPool();<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>  @VisibleForTesting<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  protected boolean shouldFlushInMemory() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        return false;     // regardless the size<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      // the insert of the active into the compaction pipeline<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    return false;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
-<span class="sourceLineNo">462</span><a name="line.462"></a>
-<span class="sourceLineNo">463</span>  /**<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * The compaction may still happen if the request was sent too late<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * Non-blocking request<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  private void stopCompaction() {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    if (inMemoryFlushInProgress.get()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      compactor.stop();<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><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    if (!active.isEmpty()) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      pipeline.pushHead(active);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      resetActive();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<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>  private void pushTailToSnapshot() {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    pipeline.swap(segments,null,false, false);<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>  private void pushPipelineToSnapshot() {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    int iterationsCnt = 0;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    boolean done = false;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    while (!done) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      iterationsCnt++;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      // and the version increase, the chance of it happenning is very low<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      done = pipeline.swap(segments, null, false, false);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      if (iterationsCnt&gt;2) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        // practically it is impossible that this loop iterates more than two times<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.503"></a>
-<span class="sourceLineNo">504</span>            " while flushing to disk.");<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        break;<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      }<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><a name="line.510"></a>
-<span class="sourceLineNo">511</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    if(segments.isEmpty()) return;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      this.snapshot = segments.get(0);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      return;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    } else { // create composite snapshot<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      this.snapshot =<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<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><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  private RegionServicesForStores getRegionServices() {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return regionServices;<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>  /**<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  * There is at most one thread per memstore instance.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  * and compacts the pipeline.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  */<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    @Override<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    public void run() {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      try {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        flushInMemory();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      } catch (IOException e) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.539"></a>
-<span class="sourceLineNo">540</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.540"></a>
-<span class="sourceLineNo">541</span>            + "store: "+ getFamilyName(), e);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  @VisibleForTesting<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  boolean isMemStoreFlushingInMemory() {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return inMemoryFlushInProgress.get();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
-<span class="sourceLineNo">550</span><a name="line.550"></a>
-<span class="sourceLineNo">551</span>  /**<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   *             first.<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * @return Next row or null if none found.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  Cell getNextRow(final Cell cell) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    Cell lowest = null;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    for (Segment segment : segments) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      if (lowest == null) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      } else {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return lowest;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  }<a name="line.567"></a>
-<span class="sourceLineNo">568</span><a name="line.568"></a>
-<span class="sourceLineNo">569</span>  @VisibleForTesting<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  long getInmemoryFlushSize() {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    return inmemoryFlushSize;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  }<a name="line.572"></a>
-<span class="sourceLineNo">573</span><a name="line.573"></a>
-<span class="sourceLineNo">574</span>  // debug method<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public void debug() {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    String msg = "active size=" + this.active.keySize();<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    msg += " inMemoryFlushInProgress is "+ (inMemoryFlushInProgress.get() ? "true" : "false");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    LOG.debug(msg);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>}<a name="line.583"></a>
+<span class="sourceLineNo">122</span>    LOG.info("Store={}, in-memory flush size threshold={}, immutable segments index type={}, " +<a name="line.122"></a>
+<span class="sourceLineNo">123</span>            "compactor={}", this.store.getColumnFamilyName(),<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        StringUtils.byteDesc(this.inmemoryFlushSize), this.indexType,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        (this.compactor == null? "NULL": this.compactor.toString()));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  @VisibleForTesting<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  protected MemStoreCompactor createMemStoreCompactor(MemoryCompactionPolicy compactionPolicy)<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      throws IllegalArgumentIOException {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    return new MemStoreCompactor(this, compactionPolicy);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  }<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private void initInmemoryFlushSize(Configuration conf) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    double factor = 0;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    long memstoreFlushSize = getRegionServices().getMemStoreFlushSize();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    int numStores = getRegionServices().getNumStores();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    if (numStores &lt;= 1) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      // Family number might also be zero in some of our unit test case<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      numStores = 1;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    inmemoryFlushSize = memstoreFlushSize / numStores;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    // multiply by a factor (the same factor for all index types)<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    factor = conf.getDouble(IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY,<a name="line.144"></a>
+<span class="sourceLineNo">145</span>          IN_MEMORY_FLUSH_THRESHOLD_FACTOR_DEFAULT);<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    inmemoryFlushSize = (long) (inmemoryFlushSize * factor);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * @return Total memory occupied by this MemStore. This won't include any size occupied by the<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   *         snapshot. We assume the snapshot will get cleared soon. This is not thread safe and<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   *         the memstore may be changed while computing its size. It is the responsibility of the<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   *         caller to make sure this doesn't happen.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  @Override<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  public MemStoreSize size() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    MemStoreSizing memstoreSizing = new MemStoreSizing();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    memstoreSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    for (Segment item : pipeline.getSegments()) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      memstoreSizing.incMemStoreSize(item.getMemStoreSize());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    }<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    return memstoreSizing;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * This method is called before the flush is executed.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @return an estimation (lower bound) of the unflushed sequence id in memstore after the flush<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * is executed. if memstore will be cleared returns {@code HConstants.NO_SEQNUM}.<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  @Override<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public long preFlushSeqIDEstimation() {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    if(compositeSnapshot) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return HConstants.NO_SEQNUM;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    Segment segment = getLastSegment();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    if(segment == null) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      return HConstants.NO_SEQNUM;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    }<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return segment.getMinSequenceId();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @Override<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public boolean isSloppy() {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    return true;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * Push the current active memstore segment into the pipeline<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * and create a snapshot of the tail of current compaction pipeline<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Snapshot must be cleared by call to {@link #clearSnapshot}.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * {@link #clearSnapshot(long)}.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * @return {@link MemStoreSnapshot}<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   */<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  @Override<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  public MemStoreSnapshot snapshot() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    // If snapshot currently has entries, then flusher failed or didn't call<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    // cleanup.  Log a warning.<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (!this.snapshot.isEmpty()) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      LOG.warn("Snapshot called again without clearing previous. " +<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          "Doing nothing. Another ongoing flush or did we fail last attempt?");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    } else {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      LOG.debug("FLUSHING TO DISK {}, store={}",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      stopCompaction();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      pushActiveToPipeline(this.active);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      if (compositeSnapshot) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        pushPipelineToSnapshot();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      } else {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        pushTailToSnapshot();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      compactor.resetStats();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>  /**<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   * On flush, how much memory we will clear.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * @return size of data that is going to be flushed<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   */<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  @Override<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  public MemStoreSize getFlushableSize() {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      if (compositeSnapshot) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      } else {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        snapshotSizing = pipeline.getTailSizing();<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>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        : new MemStoreSize(active.getMemStoreSize());<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>  @Override<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  protected long keySize() {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    long k = this.active.keySize();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      k += segment.keySize();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    return k;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>  @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  protected long heapSize() {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    long h = this.active.heapSize();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      h += segment.heapSize();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    return h;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
+<span class="sourceLineNo">258</span><a name="line.258"></a>
+<span class="sourceLineNo">259</span>  @Override<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      WAL WAL = getRegionServices().getWAL();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (WAL != null) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * This message intends to inform the MemStore that next coming updates<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * are going to be part of the replaying edits from WAL<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  public void startReplayingFromWAL() {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    inWalReplay = true;<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>  /**<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * are done<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 stopReplayingFromWAL() {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    inWalReplay = false;<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>  // the getSegments() method is used for tests only<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  @VisibleForTesting<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Override<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    list.add(this.active);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    list.addAll(pipelineList);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span>    return list;<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>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      boolean merge) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    // last true stands for updating the region size<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    return pipeline.swap(versionedList, result, !merge, true);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<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>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   *           The flattening happens only if versions match.<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>  // setter is used only for testability<a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @VisibleForTesting<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  void setIndexType(IndexType type) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    indexType = type;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    // If it is needed, please change in-memory flush size explicitly<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>  public IndexType getIndexType() {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return indexType;<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>  public boolean hasImmutableSegments() {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return !pipeline.isEmpty();<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>  public VersionedSegmentsList getImmutableSegments() {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    return pipeline.getVersionedList();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  public long getSmallestReadPoint() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return store.getSmallestReadPoint();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>  public HStore getStore() {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return store;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>  public String getFamilyName() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  @Override<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  /*<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   */<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    MutableSegment activeTmp = active;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    // The order is the Segment ordinal<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return list;<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>   @VisibleForTesting<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   }<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>   * Check whether anything need to be done based on the current active set size.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * The method is invoked upon every addition to the active set.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * size is above threshold<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  @Override<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  protected void checkActiveSize() {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    if (shouldFlushInMemory()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      * in the shared mode. */<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      if (LOG.isTraceEnabled()) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        LOG.trace(<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      }<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      getPool().execute(runnable);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>  // internally used method, externally visible only for tests<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  // otherwise there is a deadlock<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @VisibleForTesting<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  void flushInMemory() throws IOException {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    inMemoryFlushInProgress.set(true);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    try {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // Phase I: Update the pipeline<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      getRegionServices().blockUpdates();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      try {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        pushActiveToPipeline(this.active);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        getRegionServices().unblockUpdates();<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>      // Used by tests<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      if (!allowCompaction.get()) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        return;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      // Phase II: Compact the pipeline<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      try {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        // compaction is in progress<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        compactor.start();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      } catch (IOException e) {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.429"></a>
+<span class="sourceLineNo">430</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    } finally {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      inMemoryFlushInProgress.set(false);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      LOG.trace("IN-MEMORY FLUSH: end");<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><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private Segment getLastSegment() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    Segment localActive = getActive();<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    Segment tail = pipeline.getTail();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    return tail == null ? localActive : tail;<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>  private byte[] getFamilyNameInBytes() {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    return store.getColumnFamilyDescriptor().getName();<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>  private ThreadPoolExecutor getPool() {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    return getRegionServices().getInMemoryCompactionPool();<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>  @VisibleForTesting<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  protected boolean shouldFlushInMemory() {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        return false;     // regardless the size<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // the insert of the active into the compaction pipeline<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    return false;<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>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * The compaction may still happen if the request was sent too late<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * Non-blocking request<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   */<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  private void stopCompaction() {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    if (inMemoryFlushInProgress.get()) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      compactor.stop();<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    if (!active.isEmpty()) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      pipeline.pushHead(active);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      resetActive();<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><a name="line.482"></a>
+<span class="sourceLineNo">483</span>  private void pushTailToSnapshot() {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    pipeline.swap(segments,null,false, false);<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>  private void pushPipelineToSnapshot() {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    int iterationsCnt = 0;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    boolean done = false;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    while (!done) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      iterationsCnt++;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      // and the version increase, the chance of it happenning is very low<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      done = pipeline.swap(segments, null, false, false);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      if (iterationsCnt&gt;2) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        // practically it is impossible that this loop iterates more than two times<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            " while flushing to disk.");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        break;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    if(segments.isEmpty()) return;<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      this.snapshot = segments.get(0);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      return;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    } else { // create composite snapshot<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      this.snapshot =<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<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>  private RegionServicesForStores getRegionServices() {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return regionServices;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<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>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  * There is at most one thread per memstore instance.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  * and compacts the pipeline.<a name="line.532"></a>
+<span class="sourceLineNo">533</span>  */<a name="line.533"></a>
+<span class="sourceLineNo">534</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.534"></a>
+<span class="sourceLineNo">535</span><a name="line.535"></a>
+<span class="sourceLineNo">536</span>    @Override<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    public void run() {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      try {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        flushInMemory();<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      } catch (IOException e) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.541"></a>
+<span class="sourceLineNo">542</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.542"></a>
+<span class="sourceLineNo">543</span>            + "store: "+ getFamilyName(), e);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>  }<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>  @VisibleForTesting<a name="line.548"></a>
+<span class="sourceLineNo">549</span>  boolean isMemStoreFlushingInMemory() {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    return inMemoryFlushInProgress.get();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   *             first.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>   * @return Next row or null if none found.<a name="line.556"></a>
+<span class="sourceLineNo">557</span>   */<a name="line.557"></a>
+<span class="sourceLineNo">558</span>  Cell getNextRow(final Cell cell) {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    Cell lowest = null;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    for (Segment segment : segments) {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      if (lowest == null) {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      } else {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      }<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    return lowest;<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>  @VisibleForTesting<a name="line.571"></a>
+<span class="sourceLineNo">572</span>  long getInmemoryFlushSize() {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return inmemoryFlushSize;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  // debug method<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  public void debug() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    String msg = "active size=" + this.active.keySize();<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    msg += " inMemoryFlushInProgress is "+ (inMemoryFlush

<TRUNCATED>

[17/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockIterator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockIterator.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockIterator.html
index 12d10e1..97ceefd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockIterator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockIterator.html
@@ -1740,384 +1740,380 @@
 <span class="sourceLineNo">1732</span>      // and will save us having to seek the stream backwards to reread the header we<a name="line.1732"></a>
 <span class="sourceLineNo">1733</span>      // read the last time through here.<a name="line.1733"></a>
 <span class="sourceLineNo">1734</span>      ByteBuffer headerBuf = getCachedHeader(offset);<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      if (LOG.isTraceEnabled()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        LOG.trace("Reading " + this.fileContext.getHFileName() + " at offset=" + offset +<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>          ", pread=" + pread + ", verifyChecksum=" + verifyChecksum + ", cachedHeader=" +<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>          headerBuf + ", onDiskSizeWithHeader=" + onDiskSizeWithHeader);<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      }<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>      // file has support for checksums (version 2+).<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      long startTime = System.currentTimeMillis();<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>        if (headerBuf == null) {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>          if (LOG.isTraceEnabled()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>          }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>              offset, pread);<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      // the header we read last time through here.<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>      if (headerBuf != null) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        // read. Copy to this block's header.<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>      } else {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>      }<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (verifyChecksum &amp;&amp;<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        return null;<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      if (updateMetrics) {<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        HFile.updateReadLatency(duration, pread);<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>      }<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>      HFileBlock hFileBlock =<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      // Run check on uncompressed sizings.<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>      }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      if (LOG.isTraceEnabled()) {<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>        LOG.trace("Read " + hFileBlock + " in " + duration + " ns");<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      }<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>      // Cache next block header if we read it for the next time through here.<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      }<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      return hFileBlock;<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span><a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    @Override<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span><a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    @Override<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    }<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span><a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    @Override<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      return this.encodedBlockDecodingCtx;<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span><a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    @Override<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return this.defaultDecodingCtx;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span><a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    /**<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>     * If the block doesn't uses checksum, returns false.<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>     * @return True if checksum matches, else false.<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>     */<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>        throws IOException {<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      // checksum validation failure.<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>        return false;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    @Override<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    public void closeStreams() throws IOException {<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      streamWrapper.close();<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    @Override<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    public void unbufferStream() {<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      // unbuffer it.<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>      if (streamLock.tryLock()) {<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>        try {<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>          this.streamWrapper.unbuffer();<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>        } finally {<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>          streamLock.unlock();<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>        }<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>      }<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span><a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    @Override<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    public String toString() {<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    }<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>  }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span><a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  @VisibleForTesting<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>        totalChecksumBytes()) {<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>      throw new IOException("Using no compression but "<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    }<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  }<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span><a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>  // Cacheable implementation<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  @Override<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>  public int getSerializedLength() {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    if (buf != null) {<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      // Include extra bytes for block metadata.<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    return 0;<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  }<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span><a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  // Cacheable implementation<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  @Override<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  public void serialize(ByteBuffer destination) {<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    // Make sure any changes in here are reflected over there.<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    destination = addMetaData(destination);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>    // metadata.<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    destination.flip();<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>  }<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>  /**<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>   * For use by bucketcache. This exposes internals.<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   */<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>  public ByteBuffer getMetaData() {<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    bb = addMetaData(bb);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    bb.flip();<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    return bb;<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span><a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  /**<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>   */<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    destination.putLong(this.offset);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return destination;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  // Cacheable implementation<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>  @Override<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>  }<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span><a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>  @Override<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>  public int hashCode() {<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    int result = 1;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    result = result * 31 + blockType.hashCode();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    result = result * 31 + buf.hashCode();<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    return result;<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>  }<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span><a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  @Override<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>  public boolean equals(Object comparison) {<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    if (this == comparison) {<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>      return true;<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    }<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    if (comparison == null) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>      return false;<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    }<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      return false;<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    }<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span><a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span><a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>      return false;<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    }<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1969"></a>
+<span class="sourceLineNo">1735</span>      LOG.trace("Reading {} at offset={}, pread={}, verifyChecksum={}, cachedHeader={}, " +<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>          "onDiskSizeWithHeader={}", this.fileContext.getHFileName(), offset, pread,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>          verifyChecksum, headerBuf, onDiskSizeWithHeader);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      // file has support for checksums (version 2+).<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      long startTime = System.currentTimeMillis();<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>        if (headerBuf == null) {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>          if (LOG.isTraceEnabled()) {<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          }<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>              offset, pread);<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        }<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      }<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // the header we read last time through here.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      if (headerBuf != null) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>        // read. Copy to this block's header.<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      } else {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      }<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      if (verifyChecksum &amp;&amp;<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        return null;<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      }<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      if (updateMetrics) {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>        HFile.updateReadLatency(duration, pread);<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>      }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      HFileBlock hFileBlock =<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      // Run check on uncompressed sizings.<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>      }<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>      LOG.trace("Read {} in {} ns", hFileBlock, duration);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>      // Cache next block header if we read it for the next time through here.<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      }<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>      return hFileBlock;<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span><a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    @Override<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    }<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span><a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    @Override<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span><a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    @Override<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      return this.encodedBlockDecodingCtx;<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span><a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    @Override<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>      return this.defaultDecodingCtx;<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    }<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span><a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    /**<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>     * If the block doesn't uses checksum, returns false.<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>     * @return True if checksum matches, else false.<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>     */<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        throws IOException {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>      // checksum validation failure.<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        return false;<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>      }<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span><a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    @Override<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    public void closeStreams() throws IOException {<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>      streamWrapper.close();<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    }<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    @Override<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    public void unbufferStream() {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      // unbuffer it.<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>      if (streamLock.tryLock()) {<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        try {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>          this.streamWrapper.unbuffer();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>        } finally {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>          streamLock.unlock();<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      }<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    }<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span><a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    @Override<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    public String toString() {<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>  }<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span><a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>  @VisibleForTesting<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        totalChecksumBytes()) {<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      throw new IOException("Using no compression but "<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span><a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>  // Cacheable implementation<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Override<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public int getSerializedLength() {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    if (buf != null) {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>      // Include extra bytes for block metadata.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    return 0;<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>  }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span><a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>  // Cacheable implementation<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  @Override<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>  public void serialize(ByteBuffer destination) {<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    // Make sure any changes in here are reflected over there.<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    destination = addMetaData(destination);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>    // metadata.<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    destination.flip();<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span><a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>  /**<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * For use by bucketcache. This exposes internals.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  public ByteBuffer getMetaData() {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    bb = addMetaData(bb);<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    bb.flip();<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    return bb;<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>  }<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span><a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  /**<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>   */<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    destination.putLong(this.offset);<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    return destination;<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  }<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span><a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>  // Cacheable implementation<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  @Override<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>  }<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span><a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>  @Override<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>  public int hashCode() {<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    int result = 1;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>    result = result * 31 + blockType.hashCode();<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    result = result * 31 + buf.hashCode();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    return result;<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>  }<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span><a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>  @Override<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>  public boolean equals(Object comparison) {<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    if (this == comparison) {<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>      return true;<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    }<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    if (comparison == null) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>      return false;<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    }<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>      return false;<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    }<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span><a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>      return false;<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    }<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>      return false;<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>    }<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    if (castedComparison.offset != this.offset) {<a name="line.1969"></a>
 <span class="sourceLineNo">1970</span>      return false;<a name="line.1970"></a>
 <span class="sourceLineNo">1971</span>    }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    if (castedComparison.offset != this.offset) {<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      return false;<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    }<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>      return false;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      return false;<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>    }<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1982"></a>
+<span class="sourceLineNo">1972</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>      return false;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>    }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      return false;<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    }<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>      return false;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>        castedComparison.buf.limit()) != 0) {<a name="line.1982"></a>
 <span class="sourceLineNo">1983</span>      return false;<a name="line.1983"></a>
 <span class="sourceLineNo">1984</span>    }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        castedComparison.buf.limit()) != 0) {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      return false;<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    }<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    return true;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>  }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    }<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    return DataBlockEncoding.NONE;<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>  }<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span><a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>  @VisibleForTesting<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>  byte getChecksumType() {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>    return this.fileContext.getChecksumType().getCode();<a name="line.2001"></a>
+<span class="sourceLineNo">1985</span>    return true;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>    }<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    return DataBlockEncoding.NONE;<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>  }<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span><a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>  @VisibleForTesting<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>  byte getChecksumType() {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>  int getBytesPerChecksum() {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2001"></a>
 <span class="sourceLineNo">2002</span>  }<a name="line.2002"></a>
 <span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>  int getBytesPerChecksum() {<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>  }<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>  @VisibleForTesting<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    return this.onDiskDataSizeWithHeader;<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  /**<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>   */<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>  int totalChecksumBytes() {<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    // indicates that cached blocks do not have checksum data because<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>    // checksums were already validated when the block was read from disk.<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      return 0;<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        this.fileContext.getBytesPerChecksum());<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  }<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span><a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>  /**<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>   * Returns the size of this block header.<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>   */<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>  public int headerSize() {<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>  }<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span><a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>  /**<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>   * Maps a minor version to the size of the header.<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>   */<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    return usesHBaseChecksum?<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>  }<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span><a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>  /**<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>   */<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>  @VisibleForTesting<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>  // TODO: Why is this in here?<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>  byte[] getDummyHeaderForVersion() {<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>  }<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span><a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>  /**<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>  }<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span><a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>  /**<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>   */<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>  HFileContext getHFileContext() {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    return this.fileContext;<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>  }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span><a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>  @Override<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>  public MemoryType getMemoryType() {<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    return this.memType;<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span><a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>   */<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  boolean usesSharedMemory() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return this.memType == MemoryType.SHARED;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * Convert the contents of the block header into a human readable string.<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>   * has minor version &gt; 0.<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>   */<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>  @VisibleForTesting<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    buf.get(magicBuf);<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    long prevBlockOffset = buf.getLong();<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    byte cksumtype = buf.get();<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    long bytesPerChecksum = buf.getInt();<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>                   " blockType " + bt +<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>                   " compressedBlockSizeNoHeader " +<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>                   compressedBlockSizeNoHeader +<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>                   uncompressedBlockSizeNoHeader +<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2106"></a>
+<span class="sourceLineNo">2004</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>  @VisibleForTesting<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    return this.onDiskDataSizeWithHeader;<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>  }<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span><a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>  /**<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>   */<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>  int totalChecksumBytes() {<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    // indicates that cached blocks do not have checksum data because<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    // checksums were already validated when the block was read from disk.<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      return 0;<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>        this.fileContext.getBytesPerChecksum());<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  }<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span><a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>  /**<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>   * Returns the size of this block header.<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>   */<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  public int headerSize() {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>  }<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>  /**<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>   * Maps a minor version to the size of the header.<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>   */<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    return usesHBaseChecksum?<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span><a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>  /**<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>   */<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>  @VisibleForTesting<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>  // TODO: Why is this in here?<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>  byte[] getDummyHeaderForVersion() {<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>  }<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span><a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>  /**<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>   */<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>  }<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span><a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>  /**<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>   */<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>  HFileContext getHFileContext() {<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    return this.fileContext;<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>  }<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span><a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>  @Override<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>  public MemoryType getMemoryType() {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    return this.memType;<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>  }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span><a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>  /**<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>   */<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>  boolean usesSharedMemory() {<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    return this.memType == MemoryType.SHARED;<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>  }<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span><a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>  /**<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>   * Convert the contents of the block header into a human readable string.<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>   * has minor version &gt; 0.<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>   */<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>  @VisibleForTesting<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    buf.get(magicBuf);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>    long prevBlockOffset = buf.getLong();<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    byte cksumtype = buf.get();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    long bytesPerChecksum = buf.getInt();<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>                   " blockType " + bt +<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>                   " compressedBlockSizeNoHeader " +<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>                   compressedBlockSizeNoHeader +<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>                   uncompressedBlockSizeNoHeader +<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  }<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span><a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public HFileBlock deepClone() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    return new HFileBlock(this, true);<a name="line.2106"></a>
 <span class="sourceLineNo">2107</span>  }<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>  public HFileBlock deepClone() {<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    return new HFileBlock(this, true);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>}<a name="line.2112"></a>
+<span class="sourceLineNo">2108</span>}<a name="line.2108"></a>
 
 
 


[11/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html
index 12d10e1..97ceefd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html
@@ -1740,384 +1740,380 @@
 <span class="sourceLineNo">1732</span>      // and will save us having to seek the stream backwards to reread the header we<a name="line.1732"></a>
 <span class="sourceLineNo">1733</span>      // read the last time through here.<a name="line.1733"></a>
 <span class="sourceLineNo">1734</span>      ByteBuffer headerBuf = getCachedHeader(offset);<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      if (LOG.isTraceEnabled()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        LOG.trace("Reading " + this.fileContext.getHFileName() + " at offset=" + offset +<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>          ", pread=" + pread + ", verifyChecksum=" + verifyChecksum + ", cachedHeader=" +<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>          headerBuf + ", onDiskSizeWithHeader=" + onDiskSizeWithHeader);<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      }<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>      // file has support for checksums (version 2+).<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      long startTime = System.currentTimeMillis();<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>        if (headerBuf == null) {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>          if (LOG.isTraceEnabled()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>          }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>              offset, pread);<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      // the header we read last time through here.<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>      if (headerBuf != null) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        // read. Copy to this block's header.<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>      } else {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>      }<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (verifyChecksum &amp;&amp;<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        return null;<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      if (updateMetrics) {<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        HFile.updateReadLatency(duration, pread);<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>      }<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>      HFileBlock hFileBlock =<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      // Run check on uncompressed sizings.<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>      }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      if (LOG.isTraceEnabled()) {<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>        LOG.trace("Read " + hFileBlock + " in " + duration + " ns");<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      }<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>      // Cache next block header if we read it for the next time through here.<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      }<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      return hFileBlock;<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span><a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    @Override<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span><a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    @Override<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    }<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span><a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    @Override<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      return this.encodedBlockDecodingCtx;<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span><a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    @Override<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return this.defaultDecodingCtx;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span><a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    /**<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>     * If the block doesn't uses checksum, returns false.<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>     * @return True if checksum matches, else false.<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>     */<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>        throws IOException {<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      // checksum validation failure.<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>        return false;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    @Override<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    public void closeStreams() throws IOException {<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      streamWrapper.close();<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    @Override<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    public void unbufferStream() {<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      // unbuffer it.<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>      if (streamLock.tryLock()) {<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>        try {<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>          this.streamWrapper.unbuffer();<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>        } finally {<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>          streamLock.unlock();<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>        }<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>      }<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span><a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    @Override<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    public String toString() {<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    }<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>  }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span><a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  @VisibleForTesting<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>        totalChecksumBytes()) {<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>      throw new IOException("Using no compression but "<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    }<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  }<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span><a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>  // Cacheable implementation<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  @Override<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>  public int getSerializedLength() {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    if (buf != null) {<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      // Include extra bytes for block metadata.<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    return 0;<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  }<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span><a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  // Cacheable implementation<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  @Override<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  public void serialize(ByteBuffer destination) {<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    // Make sure any changes in here are reflected over there.<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    destination = addMetaData(destination);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>    // metadata.<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    destination.flip();<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>  }<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>  /**<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>   * For use by bucketcache. This exposes internals.<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   */<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>  public ByteBuffer getMetaData() {<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    bb = addMetaData(bb);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    bb.flip();<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    return bb;<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span><a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  /**<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>   */<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    destination.putLong(this.offset);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return destination;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  // Cacheable implementation<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>  @Override<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>  }<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span><a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>  @Override<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>  public int hashCode() {<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    int result = 1;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    result = result * 31 + blockType.hashCode();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    result = result * 31 + buf.hashCode();<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    return result;<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>  }<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span><a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  @Override<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>  public boolean equals(Object comparison) {<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    if (this == comparison) {<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>      return true;<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    }<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    if (comparison == null) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>      return false;<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    }<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      return false;<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    }<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span><a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span><a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>      return false;<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    }<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1969"></a>
+<span class="sourceLineNo">1735</span>      LOG.trace("Reading {} at offset={}, pread={}, verifyChecksum={}, cachedHeader={}, " +<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>          "onDiskSizeWithHeader={}", this.fileContext.getHFileName(), offset, pread,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>          verifyChecksum, headerBuf, onDiskSizeWithHeader);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      // file has support for checksums (version 2+).<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      long startTime = System.currentTimeMillis();<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>        if (headerBuf == null) {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>          if (LOG.isTraceEnabled()) {<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          }<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>              offset, pread);<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        }<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      }<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // the header we read last time through here.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      if (headerBuf != null) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>        // read. Copy to this block's header.<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      } else {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      }<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      if (verifyChecksum &amp;&amp;<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        return null;<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      }<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      if (updateMetrics) {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>        HFile.updateReadLatency(duration, pread);<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>      }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      HFileBlock hFileBlock =<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      // Run check on uncompressed sizings.<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>      }<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>      LOG.trace("Read {} in {} ns", hFileBlock, duration);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>      // Cache next block header if we read it for the next time through here.<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      }<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>      return hFileBlock;<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span><a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    @Override<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    }<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span><a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    @Override<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span><a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    @Override<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      return this.encodedBlockDecodingCtx;<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span><a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    @Override<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>      return this.defaultDecodingCtx;<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    }<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span><a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    /**<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>     * If the block doesn't uses checksum, returns false.<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>     * @return True if checksum matches, else false.<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>     */<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        throws IOException {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>      // checksum validation failure.<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        return false;<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>      }<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span><a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    @Override<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    public void closeStreams() throws IOException {<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>      streamWrapper.close();<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    }<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    @Override<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    public void unbufferStream() {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      // unbuffer it.<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>      if (streamLock.tryLock()) {<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        try {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>          this.streamWrapper.unbuffer();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>        } finally {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>          streamLock.unlock();<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      }<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    }<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span><a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    @Override<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    public String toString() {<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>  }<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span><a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>  @VisibleForTesting<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        totalChecksumBytes()) {<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      throw new IOException("Using no compression but "<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span><a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>  // Cacheable implementation<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Override<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public int getSerializedLength() {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    if (buf != null) {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>      // Include extra bytes for block metadata.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    return 0;<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>  }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span><a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>  // Cacheable implementation<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  @Override<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>  public void serialize(ByteBuffer destination) {<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    // Make sure any changes in here are reflected over there.<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    destination = addMetaData(destination);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>    // metadata.<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    destination.flip();<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span><a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>  /**<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * For use by bucketcache. This exposes internals.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  public ByteBuffer getMetaData() {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    bb = addMetaData(bb);<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    bb.flip();<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    return bb;<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>  }<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span><a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  /**<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>   */<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    destination.putLong(this.offset);<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    return destination;<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  }<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span><a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>  // Cacheable implementation<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  @Override<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>  }<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span><a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>  @Override<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>  public int hashCode() {<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    int result = 1;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>    result = result * 31 + blockType.hashCode();<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    result = result * 31 + buf.hashCode();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    return result;<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>  }<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span><a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>  @Override<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>  public boolean equals(Object comparison) {<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    if (this == comparison) {<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>      return true;<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    }<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    if (comparison == null) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>      return false;<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    }<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>      return false;<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    }<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span><a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>      return false;<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    }<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>      return false;<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>    }<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    if (castedComparison.offset != this.offset) {<a name="line.1969"></a>
 <span class="sourceLineNo">1970</span>      return false;<a name="line.1970"></a>
 <span class="sourceLineNo">1971</span>    }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    if (castedComparison.offset != this.offset) {<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      return false;<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    }<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>      return false;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      return false;<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>    }<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1982"></a>
+<span class="sourceLineNo">1972</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>      return false;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>    }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      return false;<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    }<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>      return false;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>        castedComparison.buf.limit()) != 0) {<a name="line.1982"></a>
 <span class="sourceLineNo">1983</span>      return false;<a name="line.1983"></a>
 <span class="sourceLineNo">1984</span>    }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        castedComparison.buf.limit()) != 0) {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      return false;<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    }<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    return true;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>  }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    }<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    return DataBlockEncoding.NONE;<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>  }<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span><a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>  @VisibleForTesting<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>  byte getChecksumType() {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>    return this.fileContext.getChecksumType().getCode();<a name="line.2001"></a>
+<span class="sourceLineNo">1985</span>    return true;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>    }<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    return DataBlockEncoding.NONE;<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>  }<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span><a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>  @VisibleForTesting<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>  byte getChecksumType() {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>  int getBytesPerChecksum() {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2001"></a>
 <span class="sourceLineNo">2002</span>  }<a name="line.2002"></a>
 <span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>  int getBytesPerChecksum() {<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>  }<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>  @VisibleForTesting<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    return this.onDiskDataSizeWithHeader;<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  /**<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>   */<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>  int totalChecksumBytes() {<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    // indicates that cached blocks do not have checksum data because<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>    // checksums were already validated when the block was read from disk.<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      return 0;<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        this.fileContext.getBytesPerChecksum());<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  }<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span><a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>  /**<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>   * Returns the size of this block header.<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>   */<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>  public int headerSize() {<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>  }<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span><a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>  /**<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>   * Maps a minor version to the size of the header.<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>   */<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    return usesHBaseChecksum?<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>  }<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span><a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>  /**<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>   */<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>  @VisibleForTesting<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>  // TODO: Why is this in here?<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>  byte[] getDummyHeaderForVersion() {<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>  }<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span><a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>  /**<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>  }<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span><a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>  /**<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>   */<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>  HFileContext getHFileContext() {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    return this.fileContext;<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>  }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span><a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>  @Override<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>  public MemoryType getMemoryType() {<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    return this.memType;<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span><a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>   */<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  boolean usesSharedMemory() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return this.memType == MemoryType.SHARED;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * Convert the contents of the block header into a human readable string.<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>   * has minor version &gt; 0.<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>   */<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>  @VisibleForTesting<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    buf.get(magicBuf);<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    long prevBlockOffset = buf.getLong();<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    byte cksumtype = buf.get();<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    long bytesPerChecksum = buf.getInt();<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>                   " blockType " + bt +<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>                   " compressedBlockSizeNoHeader " +<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>                   compressedBlockSizeNoHeader +<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>                   uncompressedBlockSizeNoHeader +<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2106"></a>
+<span class="sourceLineNo">2004</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>  @VisibleForTesting<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    return this.onDiskDataSizeWithHeader;<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>  }<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span><a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>  /**<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>   */<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>  int totalChecksumBytes() {<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    // indicates that cached blocks do not have checksum data because<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    // checksums were already validated when the block was read from disk.<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      return 0;<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>        this.fileContext.getBytesPerChecksum());<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  }<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span><a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>  /**<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>   * Returns the size of this block header.<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>   */<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  public int headerSize() {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>  }<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>  /**<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>   * Maps a minor version to the size of the header.<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>   */<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    return usesHBaseChecksum?<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span><a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>  /**<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>   */<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>  @VisibleForTesting<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>  // TODO: Why is this in here?<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>  byte[] getDummyHeaderForVersion() {<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>  }<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span><a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>  /**<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>   */<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>  }<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span><a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>  /**<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>   */<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>  HFileContext getHFileContext() {<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    return this.fileContext;<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>  }<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span><a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>  @Override<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>  public MemoryType getMemoryType() {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    return this.memType;<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>  }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span><a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>  /**<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>   */<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>  boolean usesSharedMemory() {<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    return this.memType == MemoryType.SHARED;<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>  }<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span><a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>  /**<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>   * Convert the contents of the block header into a human readable string.<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>   * has minor version &gt; 0.<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>   */<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>  @VisibleForTesting<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    buf.get(magicBuf);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>    long prevBlockOffset = buf.getLong();<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    byte cksumtype = buf.get();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    long bytesPerChecksum = buf.getInt();<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>                   " blockType " + bt +<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>                   " compressedBlockSizeNoHeader " +<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>                   compressedBlockSizeNoHeader +<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>                   uncompressedBlockSizeNoHeader +<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  }<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span><a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public HFileBlock deepClone() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    return new HFileBlock(this, true);<a name="line.2106"></a>
 <span class="sourceLineNo">2107</span>  }<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>  public HFileBlock deepClone() {<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    return new HFileBlock(this, true);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>}<a name="line.2112"></a>
+<span class="sourceLineNo">2108</span>}<a name="line.2108"></a>
 
 
 


[07/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
index 3dbdec3..22e7059 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
@@ -127,468 +127,470 @@
 <span class="sourceLineNo">119</span>    // initialization of the flush size should happen after initialization of the index type<a name="line.119"></a>
 <span class="sourceLineNo">120</span>    // so do not transfer the following method<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    initInmemoryFlushSize(conf);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  @VisibleForTesting<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  protected MemStoreCompactor createMemStoreCompactor(MemoryCompactionPolicy compactionPolicy)<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      throws IllegalArgumentIOException {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    return new MemStoreCompactor(this, compactionPolicy);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private void initInmemoryFlushSize(Configuration conf) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    double factor = 0;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    long memstoreFlushSize = getRegionServices().getMemStoreFlushSize();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    int numStores = getRegionServices().getNumStores();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    if (numStores &lt;= 1) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      // Family number might also be zero in some of our unit test case<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      numStores = 1;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    inmemoryFlushSize = memstoreFlushSize / numStores;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    // multiply by a factor (the same factor for all index types)<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    factor = conf.getDouble(IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY,<a name="line.140"></a>
-<span class="sourceLineNo">141</span>          IN_MEMORY_FLUSH_THRESHOLD_FACTOR_DEFAULT);<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>    inmemoryFlushSize = (long) (inmemoryFlushSize * factor);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    LOG.info("Setting in-memory flush size threshold to {} and immutable segments index to type={}",<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        StringUtils.byteDesc(inmemoryFlushSize), indexType);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  /**<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * @return Total memory occupied by this MemStore. This won't include any size occupied by the<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   *         snapshot. We assume the snapshot will get cleared soon. This is not thread safe and<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   *         the memstore may be changed while computing its size. It is the responsibility of the<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   *         caller to make sure this doesn't happen.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  @Override<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  public MemStoreSize size() {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    MemStoreSizing memstoreSizing = new MemStoreSizing();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    memstoreSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    for (Segment item : pipeline.getSegments()) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      memstoreSizing.incMemStoreSize(item.getMemStoreSize());<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    return memstoreSizing;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
-<span class="sourceLineNo">163</span><a name="line.163"></a>
-<span class="sourceLineNo">164</span>  /**<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * This method is called before the flush is executed.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @return an estimation (lower bound) of the unflushed sequence id in memstore after the flush<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * is executed. if memstore will be cleared returns {@code HConstants.NO_SEQNUM}.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  @Override<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public long preFlushSeqIDEstimation() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    if(compositeSnapshot) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return HConstants.NO_SEQNUM;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    Segment segment = getLastSegment();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    if(segment == null) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return HConstants.NO_SEQNUM;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    return segment.getMinSequenceId();<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  @Override<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public boolean isSloppy() {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    return true;<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>  /**<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * Push the current active memstore segment into the pipeline<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * and create a snapshot of the tail of current compaction pipeline<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Snapshot must be cleared by call to {@link #clearSnapshot}.<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * {@link #clearSnapshot(long)}.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @return {@link MemStoreSnapshot}<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public MemStoreSnapshot snapshot() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    // If snapshot currently has entries, then flusher failed or didn't call<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // cleanup.  Log a warning.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    if (!this.snapshot.isEmpty()) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.warn("Snapshot called again without clearing previous. " +<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          "Doing nothing. Another ongoing flush or did we fail last attempt?");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      LOG.debug("FLUSHING TO DISK {}, store={}",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      stopCompaction();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      pushActiveToPipeline(this.active);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      if (compositeSnapshot) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        pushPipelineToSnapshot();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      } else {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        pushTailToSnapshot();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      compactor.resetStats();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  /**<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   * On flush, how much memory we will clear.<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * @return size of data that is going to be flushed<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  @Override<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  public MemStoreSize getFlushableSize() {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      if (compositeSnapshot) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      } else {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        snapshotSizing = pipeline.getTailSizing();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        : new MemStoreSize(active.getMemStoreSize());<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  @Override<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  protected long keySize() {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    long k = this.active.keySize();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      k += segment.keySize();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    return k;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>  @Override<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  protected long heapSize() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    long h = this.active.heapSize();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      h += segment.heapSize();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    return h;<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>  @Override<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      WAL WAL = getRegionServices().getWAL();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      if (WAL != null) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  }<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>   * This message intends to inform the MemStore that next coming updates<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * are going to be part of the replaying edits from WAL<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  public void startReplayingFromWAL() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    inWalReplay = true;<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>  /**<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * are done<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   */<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public void stopReplayingFromWAL() {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    inWalReplay = false;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // the getSegments() method is used for tests only<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  @VisibleForTesting<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  @Override<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    list.add(this.active);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    list.addAll(pipelineList);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    return list;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      boolean merge) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // last true stands for updating the region size<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    return pipeline.swap(versionedList, result, !merge, true);<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>  /**<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   *           The flattening happens only if versions match.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  // setter is used only for testability<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  @VisibleForTesting<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  void setIndexType(IndexType type) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    indexType = type;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // If it is needed, please change in-memory flush size explicitly<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>  public IndexType getIndexType() {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return indexType;<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>  public boolean hasImmutableSegments() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    return !pipeline.isEmpty();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>  public VersionedSegmentsList getImmutableSegments() {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return pipeline.getVersionedList();<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>  public long getSmallestReadPoint() {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    return store.getSmallestReadPoint();<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>  public HStore getStore() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return store;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  public String getFamilyName() {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  @Override<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /*<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    MutableSegment activeTmp = active;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    // The order is the Segment ordinal<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    return list;<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>   @VisibleForTesting<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Check whether anything need to be done based on the current active set size.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * The method is invoked upon every addition to the active set.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * size is above threshold<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  @Override<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  protected void checkActiveSize() {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    if (shouldFlushInMemory()) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      * in the shared mode. */<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      if (LOG.isTraceEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        LOG.trace(<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      getPool().execute(runnable);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  // internally used method, externally visible only for tests<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  // otherwise there is a deadlock<a name="line.401"></a>
-<span class="sourceLineNo">402</span>  @VisibleForTesting<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  void flushInMemory() throws IOException {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    inMemoryFlushInProgress.set(true);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    try {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      // Phase I: Update the pipeline<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      getRegionServices().blockUpdates();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        pushActiveToPipeline(this.active);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      } finally {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        getRegionServices().unblockUpdates();<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      }<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>      // Used by tests<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      if (!allowCompaction.get()) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      // Phase II: Compact the pipeline<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      try {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        // compaction is in progress<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        compactor.start();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      } catch (IOException e) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.427"></a>
-<span class="sourceLineNo">428</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    } finally {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      inMemoryFlushInProgress.set(false);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      LOG.trace("IN-MEMORY FLUSH: end");<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
-<span class="sourceLineNo">435</span><a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private Segment getLastSegment() {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    Segment localActive = getActive();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    Segment tail = pipeline.getTail();<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return tail == null ? localActive : tail;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  private byte[] getFamilyNameInBytes() {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    return store.getColumnFamilyDescriptor().getName();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
-<span class="sourceLineNo">445</span><a name="line.445"></a>
-<span class="sourceLineNo">446</span>  private ThreadPoolExecutor getPool() {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    return getRegionServices().getInMemoryCompactionPool();<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>  @VisibleForTesting<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  protected boolean shouldFlushInMemory() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        return false;     // regardless the size<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      // the insert of the active into the compaction pipeline<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    return false;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
-<span class="sourceLineNo">462</span><a name="line.462"></a>
-<span class="sourceLineNo">463</span>  /**<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * The compaction may still happen if the request was sent too late<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * Non-blocking request<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  private void stopCompaction() {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    if (inMemoryFlushInProgress.get()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      compactor.stop();<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><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    if (!active.isEmpty()) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      pipeline.pushHead(active);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      resetActive();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<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>  private void pushTailToSnapshot() {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    pipeline.swap(segments,null,false, false);<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>  private void pushPipelineToSnapshot() {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    int iterationsCnt = 0;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    boolean done = false;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    while (!done) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      iterationsCnt++;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      // and the version increase, the chance of it happenning is very low<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      done = pipeline.swap(segments, null, false, false);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      if (iterationsCnt&gt;2) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        // practically it is impossible that this loop iterates more than two times<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.503"></a>
-<span class="sourceLineNo">504</span>            " while flushing to disk.");<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        break;<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      }<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><a name="line.510"></a>
-<span class="sourceLineNo">511</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    if(segments.isEmpty()) return;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      this.snapshot = segments.get(0);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      return;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    } else { // create composite snapshot<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      this.snapshot =<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<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><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  private RegionServicesForStores getRegionServices() {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return regionServices;<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>  /**<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  * There is at most one thread per memstore instance.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  * and compacts the pipeline.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  */<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    @Override<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    public void run() {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      try {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        flushInMemory();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      } catch (IOException e) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.539"></a>
-<span class="sourceLineNo">540</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.540"></a>
-<span class="sourceLineNo">541</span>            + "store: "+ getFamilyName(), e);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  @VisibleForTesting<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  boolean isMemStoreFlushingInMemory() {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return inMemoryFlushInProgress.get();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
-<span class="sourceLineNo">550</span><a name="line.550"></a>
-<span class="sourceLineNo">551</span>  /**<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   *             first.<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * @return Next row or null if none found.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  Cell getNextRow(final Cell cell) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    Cell lowest = null;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    for (Segment segment : segments) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      if (lowest == null) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      } else {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return lowest;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  }<a name="line.567"></a>
-<span class="sourceLineNo">568</span><a name="line.568"></a>
-<span class="sourceLineNo">569</span>  @VisibleForTesting<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  long getInmemoryFlushSize() {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    return inmemoryFlushSize;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  }<a name="line.572"></a>
-<span class="sourceLineNo">573</span><a name="line.573"></a>
-<span class="sourceLineNo">574</span>  // debug method<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public void debug() {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    String msg = "active size=" + this.active.keySize();<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    msg += " inMemoryFlushInProgress is "+ (inMemoryFlushInProgress.get() ? "true" : "false");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    LOG.debug(msg);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>}<a name="line.583"></a>
+<span class="sourceLineNo">122</span>    LOG.info("Store={}, in-memory flush size threshold={}, immutable segments index type={}, " +<a name="line.122"></a>
+<span class="sourceLineNo">123</span>            "compactor={}", this.store.getColumnFamilyName(),<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        StringUtils.byteDesc(this.inmemoryFlushSize), this.indexType,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        (this.compactor == null? "NULL": this.compactor.toString()));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  @VisibleForTesting<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  protected MemStoreCompactor createMemStoreCompactor(MemoryCompactionPolicy compactionPolicy)<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      throws IllegalArgumentIOException {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    return new MemStoreCompactor(this, compactionPolicy);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  }<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private void initInmemoryFlushSize(Configuration conf) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    double factor = 0;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    long memstoreFlushSize = getRegionServices().getMemStoreFlushSize();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    int numStores = getRegionServices().getNumStores();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    if (numStores &lt;= 1) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      // Family number might also be zero in some of our unit test case<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      numStores = 1;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    inmemoryFlushSize = memstoreFlushSize / numStores;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    // multiply by a factor (the same factor for all index types)<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    factor = conf.getDouble(IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY,<a name="line.144"></a>
+<span class="sourceLineNo">145</span>          IN_MEMORY_FLUSH_THRESHOLD_FACTOR_DEFAULT);<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    inmemoryFlushSize = (long) (inmemoryFlushSize * factor);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * @return Total memory occupied by this MemStore. This won't include any size occupied by the<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   *         snapshot. We assume the snapshot will get cleared soon. This is not thread safe and<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   *         the memstore may be changed while computing its size. It is the responsibility of the<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   *         caller to make sure this doesn't happen.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  @Override<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  public MemStoreSize size() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    MemStoreSizing memstoreSizing = new MemStoreSizing();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    memstoreSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    for (Segment item : pipeline.getSegments()) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      memstoreSizing.incMemStoreSize(item.getMemStoreSize());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    }<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    return memstoreSizing;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * This method is called before the flush is executed.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @return an estimation (lower bound) of the unflushed sequence id in memstore after the flush<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * is executed. if memstore will be cleared returns {@code HConstants.NO_SEQNUM}.<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  @Override<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public long preFlushSeqIDEstimation() {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    if(compositeSnapshot) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return HConstants.NO_SEQNUM;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    Segment segment = getLastSegment();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    if(segment == null) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      return HConstants.NO_SEQNUM;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    }<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return segment.getMinSequenceId();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @Override<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public boolean isSloppy() {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    return true;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * Push the current active memstore segment into the pipeline<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * and create a snapshot of the tail of current compaction pipeline<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Snapshot must be cleared by call to {@link #clearSnapshot}.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * {@link #clearSnapshot(long)}.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * @return {@link MemStoreSnapshot}<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   */<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  @Override<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  public MemStoreSnapshot snapshot() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    // If snapshot currently has entries, then flusher failed or didn't call<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    // cleanup.  Log a warning.<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (!this.snapshot.isEmpty()) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      LOG.warn("Snapshot called again without clearing previous. " +<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          "Doing nothing. Another ongoing flush or did we fail last attempt?");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    } else {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      LOG.debug("FLUSHING TO DISK {}, store={}",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      stopCompaction();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      pushActiveToPipeline(this.active);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      if (compositeSnapshot) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        pushPipelineToSnapshot();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      } else {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        pushTailToSnapshot();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      compactor.resetStats();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>  /**<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   * On flush, how much memory we will clear.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * @return size of data that is going to be flushed<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   */<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  @Override<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  public MemStoreSize getFlushableSize() {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      if (compositeSnapshot) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      } else {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        snapshotSizing = pipeline.getTailSizing();<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>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        : new MemStoreSize(active.getMemStoreSize());<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>  @Override<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  protected long keySize() {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    long k = this.active.keySize();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      k += segment.keySize();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    return k;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>  @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  protected long heapSize() {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    long h = this.active.heapSize();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      h += segment.heapSize();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    return h;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
+<span class="sourceLineNo">258</span><a name="line.258"></a>
+<span class="sourceLineNo">259</span>  @Override<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      WAL WAL = getRegionServices().getWAL();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (WAL != null) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * This message intends to inform the MemStore that next coming updates<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * are going to be part of the replaying edits from WAL<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  public void startReplayingFromWAL() {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    inWalReplay = true;<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>  /**<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * are done<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 stopReplayingFromWAL() {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    inWalReplay = false;<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>  // the getSegments() method is used for tests only<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  @VisibleForTesting<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Override<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    list.add(this.active);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    list.addAll(pipelineList);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span>    return list;<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>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      boolean merge) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    // last true stands for updating the region size<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    return pipeline.swap(versionedList, result, !merge, true);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<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>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   *           The flattening happens only if versions match.<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>  // setter is used only for testability<a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @VisibleForTesting<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  void setIndexType(IndexType type) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    indexType = type;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    // If it is needed, please change in-memory flush size explicitly<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>  public IndexType getIndexType() {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return indexType;<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>  public boolean hasImmutableSegments() {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return !pipeline.isEmpty();<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>  public VersionedSegmentsList getImmutableSegments() {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    return pipeline.getVersionedList();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  public long getSmallestReadPoint() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return store.getSmallestReadPoint();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>  public HStore getStore() {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return store;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>  public String getFamilyName() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  @Override<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  /*<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   */<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    MutableSegment activeTmp = active;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    // The order is the Segment ordinal<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return list;<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>   @VisibleForTesting<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   }<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>   * Check whether anything need to be done based on the current active set size.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * The method is invoked upon every addition to the active set.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * size is above threshold<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  @Override<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  protected void checkActiveSize() {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    if (shouldFlushInMemory()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      * in the shared mode. */<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      if (LOG.isTraceEnabled()) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        LOG.trace(<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      }<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      getPool().execute(runnable);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>  // internally used method, externally visible only for tests<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  // otherwise there is a deadlock<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @VisibleForTesting<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  void flushInMemory() throws IOException {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    inMemoryFlushInProgress.set(true);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    try {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // Phase I: Update the pipeline<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      getRegionServices().blockUpdates();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      try {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        pushActiveToPipeline(this.active);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        getRegionServices().unblockUpdates();<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>      // Used by tests<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      if (!allowCompaction.get()) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        return;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      // Phase II: Compact the pipeline<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      try {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        // compaction is in progress<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        compactor.start();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      } catch (IOException e) {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.429"></a>
+<span class="sourceLineNo">430</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    } finally {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      inMemoryFlushInProgress.set(false);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      LOG.trace("IN-MEMORY FLUSH: end");<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><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private Segment getLastSegment() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    Segment localActive = getActive();<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    Segment tail = pipeline.getTail();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    return tail == null ? localActive : tail;<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>  private byte[] getFamilyNameInBytes() {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    return store.getColumnFamilyDescriptor().getName();<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>  private ThreadPoolExecutor getPool() {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    return getRegionServices().getInMemoryCompactionPool();<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>  @VisibleForTesting<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  protected boolean shouldFlushInMemory() {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        return false;     // regardless the size<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // the insert of the active into the compaction pipeline<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    return false;<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>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * The compaction may still happen if the request was sent too late<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * Non-blocking request<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   */<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  private void stopCompaction() {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    if (inMemoryFlushInProgress.get()) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      compactor.stop();<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    if (!active.isEmpty()) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      pipeline.pushHead(active);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      resetActive();<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><a name="line.482"></a>
+<span class="sourceLineNo">483</span>  private void pushTailToSnapshot() {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    pipeline.swap(segments,null,false, false);<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>  private void pushPipelineToSnapshot() {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    int iterationsCnt = 0;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    boolean done = false;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    while (!done) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      iterationsCnt++;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      // and the version increase, the chance of it happenning is very low<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      done = pipeline.swap(segments, null, false, false);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      if (iterationsCnt&gt;2) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        // practically it is impossible that this loop iterates more than two times<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            " while flushing to disk.");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        break;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    if(segments.isEmpty()) return;<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      this.snapshot = segments.get(0);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      return;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    } else { // create composite snapshot<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      this.snapshot =<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<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>  private RegionServicesForStores getRegionServices() {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return regionServices;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<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>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  * There is at most one thread per memstore instance.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  * and compacts the pipeline.<a name="line.532"></a>
+<span class="sourceLineNo">533</span>  */<a name="line.533"></a>
+<span class="sourceLineNo">534</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.534"></a>
+<span class="sourceLineNo">535</span><a name="line.535"></a>
+<span class="sourceLineNo">536</span>    @Override<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    public void run() {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      try {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        flushInMemory();<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      } catch (IOException e) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.541"></a>
+<span class="sourceLineNo">542</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.542"></a>
+<span class="sourceLineNo">543</span>            + "store: "+ getFamilyName(), e);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>  }<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>  @VisibleForTesting<a name="line.548"></a>
+<span class="sourceLineNo">549</span>  boolean isMemStoreFlushingInMemory() {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    return inMemoryFlushInProgress.get();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   *             first.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>   * @return Next row or null if none found.<a name="line.556"></a>
+<span class="sourceLineNo">557</span>   */<a name="line.557"></a>
+<span class="sourceLineNo">558</span>  Cell getNextRow(final Cell cell) {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    Cell lowest = null;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    for (Segment segment : segments) {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      if (lowest == null) {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      } else {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      }<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    return lowest;<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>  @VisibleForTesting<a name="line.571"></a>
+<span class="sourceLineNo">572</span>  long getInmemoryFlushSize() {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return inmemoryFlushSize;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  // debug method<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  public void debug() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    String msg = "active size=" + this.active.keySize();<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.580"></a>
+<span class="sourceLineNo">581</sp

<TRUNCATED>

[24/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/apidocs/index-all.html
----------------------------------------------------------------------
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index 5a8c6c3..c5562f9 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -3756,8 +3756,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TableDescriptorBuilder.html#DEFAULT_MEMSTORE_FLUSH_SIZE">DEFAULT_MEMSTORE_FLUSH_SIZE</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a></dt>
 <dd>
-<div class="block">Constant that denotes the maximum default size of the memstore after which
- the contents are flushed to the store files</div>
+<div class="block">Constant that denotes the maximum default size of the memstore in bytes after which
+ the contents are flushed to the store files.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HTableDescriptor.html#DEFAULT_MEMSTORE_FLUSH_SIZE">DEFAULT_MEMSTORE_FLUSH_SIZE</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a></dt>
 <dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/apidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html b/apidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
index e5e2a7a..0bf1b4d 100644
--- a/apidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
+++ b/apidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
@@ -143,8 +143,8 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <tr class="rowColor">
 <td class="colFirst"><code>static long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptorBuilder.html#DEFAULT_MEMSTORE_FLUSH_SIZE">DEFAULT_MEMSTORE_FLUSH_SIZE</a></span></code>
-<div class="block">Constant that denotes the maximum default size of the memstore after which
- the contents are flushed to the store files</div>
+<div class="block">Constant that denotes the maximum default size of the memstore in bytes after which
+ the contents are flushed to the store files.</div>
 </td>
 </tr>
 <tr class="altColor">
@@ -422,8 +422,8 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <li class="blockList">
 <h4>DEFAULT_MEMSTORE_FLUSH_SIZE</h4>
 <pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html#line.188">DEFAULT_MEMSTORE_FLUSH_SIZE</a></pre>
-<div class="block">Constant that denotes the maximum default size of the memstore after which
- the contents are flushed to the store files</div>
+<div class="block">Constant that denotes the maximum default size of the memstore in bytes after which
+ the contents are flushed to the store files.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.client.TableDescriptorBuilder.DEFAULT_MEMSTORE_FLUSH_SIZE">Constant Field Values</a></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/apidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html b/apidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
index 64a63e6..fc17f3d 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
@@ -190,8 +190,8 @@
 <span class="sourceLineNo">182</span>  public static final boolean DEFAULT_NORMALIZATION_ENABLED = false;<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>   * Constant that denotes the maximum default size of the memstore after which<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * the contents are flushed to the store files<a name="line.186"></a>
+<span class="sourceLineNo">185</span>   * Constant that denotes the maximum default size of the memstore in bytes after which<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * the contents are flushed to the store files.<a name="line.186"></a>
 <span class="sourceLineNo">187</span>   */<a name="line.187"></a>
 <span class="sourceLineNo">188</span>  public static final long DEFAULT_MEMSTORE_FLUSH_SIZE = 1024 * 1024 * 128L;<a name="line.188"></a>
 <span class="sourceLineNo">189</span><a name="line.189"></a>


[21/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
index 72accd6..f0895d6 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/HFileBlock.html
@@ -1503,7 +1503,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>sanityCheckUncompressed</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1878">sanityCheckUncompressed</a>()
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1874">sanityCheckUncompressed</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">An additional sanity-check in case no compression or encryption is being used.</div>
 <dl>
@@ -1518,7 +1518,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getSerializedLength</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1890">getSerializedLength</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1886">getSerializedLength</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html#getSerializedLength--">Cacheable</a></code></span></div>
 <div class="block">Returns the length of the ByteBuffer required to serialized the object. If the
  object cannot be serialized, it should return 0.</div>
@@ -1536,7 +1536,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>serialize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1900">serialize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;destination)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1896">serialize</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;destination)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html#serialize-java.nio.ByteBuffer-">Cacheable</a></code></span></div>
 <div class="block">Serializes its data into destination.</div>
 <dl>
@@ -1553,7 +1553,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaData</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1915">getMetaData</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1911">getMetaData</a>()</pre>
 <div class="block">For use by bucketcache. This exposes internals.</div>
 </li>
 </ul>
@@ -1563,7 +1563,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>addMetaData</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1926">addMetaData</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;destination)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1922">addMetaData</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</a>&nbsp;destination)</pre>
 <div class="block">Adds metadata at current position (position is moved forward). Does not flip or reset.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1577,7 +1577,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getDeserializer</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheableDeserializer.html" title="interface in org.apache.hadoop.hbase.io.hfile">CacheableDeserializer</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1935">getDeserializer</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheableDeserializer.html" title="interface in org.apache.hadoop.hbase.io.hfile">CacheableDeserializer</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1931">getDeserializer</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html#getDeserializer--">Cacheable</a></code></span></div>
 <div class="block">Returns CacheableDeserializer instance which reconstructs original object from ByteBuffer.</div>
 <dl>
@@ -1594,7 +1594,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1940">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1936">hashCode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -1607,7 +1607,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1953">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;comparison)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1949">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;comparison)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -1620,7 +1620,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataBlockEncoding</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1992">getDataBlockEncoding</a>()</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1988">getDataBlockEncoding</a>()</pre>
 </li>
 </ul>
 <a name="getChecksumType--">
@@ -1629,7 +1629,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getChecksumType</h4>
-<pre>byte&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2000">getChecksumType</a>()</pre>
+<pre>byte&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.1996">getChecksumType</a>()</pre>
 </li>
 </ul>
 <a name="getBytesPerChecksum--">
@@ -1638,7 +1638,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getBytesPerChecksum</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2004">getBytesPerChecksum</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2000">getBytesPerChecksum</a>()</pre>
 </li>
 </ul>
 <a name="getOnDiskDataSizeWithHeader--">
@@ -1647,7 +1647,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getOnDiskDataSizeWithHeader</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2010">getOnDiskDataSizeWithHeader</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2006">getOnDiskDataSizeWithHeader</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the size of data on disk + header. Excludes checksum.</dd>
@@ -1660,7 +1660,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>totalChecksumBytes</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2018">totalChecksumBytes</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2014">totalChecksumBytes</a>()</pre>
 <div class="block">Calculate the number of bytes required to store all the checksums
  for this block. Each checksum value is a 4 byte integer.</div>
 </li>
@@ -1671,7 +1671,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>headerSize</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2033">headerSize</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2029">headerSize</a>()</pre>
 <div class="block">Returns the size of this block header.</div>
 </li>
 </ul>
@@ -1681,7 +1681,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>headerSize</h4>
-<pre>public static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2040">headerSize</a>(boolean&nbsp;usesHBaseChecksum)</pre>
+<pre>public static&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2036">headerSize</a>(boolean&nbsp;usesHBaseChecksum)</pre>
 <div class="block">Maps a minor version to the size of the header.</div>
 </li>
 </ul>
@@ -1691,7 +1691,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getDummyHeaderForVersion</h4>
-<pre>byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2050">getDummyHeaderForVersion</a>()</pre>
+<pre>byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2046">getDummyHeaderForVersion</a>()</pre>
 <div class="block">Return the appropriate DUMMY_HEADER for the minor version</div>
 </li>
 </ul>
@@ -1701,7 +1701,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getDummyHeaderForVersion</h4>
-<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2057">getDummyHeaderForVersion</a>(boolean&nbsp;usesHBaseChecksum)</pre>
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2053">getDummyHeaderForVersion</a>(boolean&nbsp;usesHBaseChecksum)</pre>
 <div class="block">Return the appropriate DUMMY_HEADER for the minor version</div>
 </li>
 </ul>
@@ -1711,7 +1711,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getHFileContext</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2065">getHFileContext</a>()</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2061">getHFileContext</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>This HFileBlocks fileContext which will a derivative of the
@@ -1725,7 +1725,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemoryType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile">Cacheable.MemoryType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2070">getMemoryType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile">Cacheable.MemoryType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2066">getMemoryType</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html#getMemoryType--">getMemoryType</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a></code></dd>
@@ -1740,7 +1740,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>usesSharedMemory</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2077">usesSharedMemory</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2073">usesSharedMemory</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if this block is backed by a shared memory area(such as that of a BucketCache).</dd>
@@ -1753,7 +1753,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockList">
 <li class="blockList">
 <h4>toStringHeader</h4>
-<pre>static&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/io/hfile/HFileBlock.html#line.2087">toStringHeader</a>(<a href="../../../../../../org/apache/hadoop/hbase/nio/ByteBuff.html" title="class in org.apache.hadoop.hbase.nio">ByteBuff</a>&nbsp;buf)
+<pre>static&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/io/hfile/HFileBlock.html#line.2083">toStringHeader</a>(<a href="../../../../../../org/apache/hadoop/hbase/nio/ByteBuff.html" title="class in org.apache.hadoop.hbase.nio">ByteBuff</a>&nbsp;buf)
                       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">Convert the contents of the block header into a human readable string.
  This is mostly helpful for debugging. This assumes that the block
@@ -1770,7 +1770,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deepClone</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2109">deepClone</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileBlock</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.html#line.2105">deepClone</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 340ec84..d6dd0dc 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/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/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.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/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 a6039ad..6a2998c 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -349,9 +349,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.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/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/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/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 7666acb..b80c346 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/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.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/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/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/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 2d4a29c..a7119b7 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/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/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/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>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 2eae19b..f9bf8d6 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -441,19 +441,19 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&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/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/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/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<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/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/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/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 cf0e9c9..037ce0f 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -213,8 +213,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.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/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/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 99ba6a9..d800946 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -228,12 +228,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.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/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/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/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/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/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/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/21347dff/devapidocs/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html b/devapidocs/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html
index f0138b1..1dccf4e 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -202,7 +202,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 </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/regionserver/AdaptiveMemStoreCompactionStrategy.html#name">name</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#NAME">NAME</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private double</code></td>
@@ -265,10 +265,14 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#getMergingAction--">getMergingAction</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i3" class="rowColor">
+<td class="colFirst"><code>protected <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/regionserver/AdaptiveMemStoreCompactionStrategy.html#getName--">getName</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#resetStats--">resetStats</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#updateStats-org.apache.hadoop.hbase.regionserver.Segment-">updateStats</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&nbsp;replacement)</code>&nbsp;</td>
 </tr>
@@ -278,14 +282,14 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#compact-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">compact</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#simpleMergeOrFlatten-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">simpleMergeOrFlatten</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#compact-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">compact</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#simpleMergeOrFlatten-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">simpleMergeOrFlatten</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#toString--">toString</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;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">Object</a></h3>
-<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
 </ul>
 </li>
 </ul>
@@ -301,16 +305,16 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <!--   -->
 </a>
 <h3>Field Detail</h3>
-<a name="name">
+<a name="NAME">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>name</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/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.45">name</a></pre>
+<h4>NAME</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/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.44">NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.AdaptiveMemStoreCompactionStrategy.name">Constant Field Values</a></dd>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.AdaptiveMemStoreCompactionStrategy.NAME">Constant Field Values</a></dd>
 </dl>
 </li>
 </ul>
@@ -320,7 +324,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockList">
 <li class="blockList">
 <h4>ADAPTIVE_COMPACTION_THRESHOLD_KEY</h4>
-<pre>public 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/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.46">ADAPTIVE_COMPACTION_THRESHOLD_KEY</a></pre>
+<pre>public 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/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.45">ADAPTIVE_COMPACTION_THRESHOLD_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.AdaptiveMemStoreCompactionStrategy.ADAPTIVE_COMPACTION_THRESHOLD_KEY">Constant Field Values</a></dd>
@@ -333,7 +337,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockList">
 <li class="blockList">
 <h4>ADAPTIVE_COMPACTION_THRESHOLD_DEFAULT</h4>
-<pre>private static final&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.48">ADAPTIVE_COMPACTION_THRESHOLD_DEFAULT</a></pre>
+<pre>private static final&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.47">ADAPTIVE_COMPACTION_THRESHOLD_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.AdaptiveMemStoreCompactionStrategy.ADAPTIVE_COMPACTION_THRESHOLD_DEFAULT">Constant Field Values</a></dd>
@@ -346,7 +350,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockList">
 <li class="blockList">
 <h4>ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_KEY</h4>
-<pre>public 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/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.49">ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_KEY</a></pre>
+<pre>public 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/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.48">ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.AdaptiveMemStoreCompactionStrategy.ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_KEY">Constant Field Values</a></dd>
@@ -359,7 +363,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockList">
 <li class="blockList">
 <h4>ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_DEFAULT</h4>
-<pre>private static final&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.51">ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_DEFAULT</a></pre>
+<pre>private static final&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.50">ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.AdaptiveMemStoreCompactionStrategy.ADAPTIVE_INITIAL_COMPACTION_PROBABILITY_DEFAULT">Constant Field Values</a></dd>
@@ -372,7 +376,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockList">
 <li class="blockList">
 <h4>ADAPTIVE_PROBABILITY_FACTOR</h4>
-<pre>private static final&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.52">ADAPTIVE_PROBABILITY_FACTOR</a></pre>
+<pre>private static final&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.51">ADAPTIVE_PROBABILITY_FACTOR</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.AdaptiveMemStoreCompactionStrategy.ADAPTIVE_PROBABILITY_FACTOR">Constant Field Values</a></dd>
@@ -385,7 +389,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockList">
 <li class="blockList">
 <h4>compactionThreshold</h4>
-<pre>private&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.54">compactionThreshold</a></pre>
+<pre>private&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.53">compactionThreshold</a></pre>
 </li>
 </ul>
 <a name="initialCompactionProbability">
@@ -394,7 +398,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockList">
 <li class="blockList">
 <h4>initialCompactionProbability</h4>
-<pre>private&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.55">initialCompactionProbability</a></pre>
+<pre>private&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.54">initialCompactionProbability</a></pre>
 </li>
 </ul>
 <a name="compactionProbability">
@@ -403,7 +407,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockList">
 <li class="blockList">
 <h4>compactionProbability</h4>
-<pre>private&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.56">compactionProbability</a></pre>
+<pre>private&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.55">compactionProbability</a></pre>
 </li>
 </ul>
 <a name="rand">
@@ -412,7 +416,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockList">
 <li class="blockList">
 <h4>rand</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.57">rand</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.56">rand</a></pre>
 </li>
 </ul>
 <a name="numCellsInVersionedList">
@@ -421,7 +425,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockList">
 <li class="blockList">
 <h4>numCellsInVersionedList</h4>
-<pre>private&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.58">numCellsInVersionedList</a></pre>
+<pre>private&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.57">numCellsInVersionedList</a></pre>
 </li>
 </ul>
 <a name="compacted">
@@ -430,7 +434,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>compacted</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.59">compacted</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.58">compacted</a></pre>
 </li>
 </ul>
 </li>
@@ -447,7 +451,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AdaptiveMemStoreCompactionStrategy</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.61">AdaptiveMemStoreCompactionStrategy</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.60">AdaptiveMemStoreCompactionStrategy</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                           <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cfName)</pre>
 </li>
 </ul>
@@ -465,7 +469,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockList">
 <li class="blockList">
 <h4>getAction</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.70">getAction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.69">getAction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getAction-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-">getAction</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy</a></code></dd>
@@ -514,7 +518,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <a name="getFlattenAction--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>getFlattenAction</h4>
 <pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.111">getFlattenAction</a>()</pre>
@@ -524,6 +528,19 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 </dl>
 </li>
 </ul>
+<a name="getName--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>getName</h4>
+<pre>protected&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/regionserver/AdaptiveMemStoreCompactionStrategy.html#line.116">getName</a>()</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getName--">getName</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy</a></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html b/devapidocs/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html
index 184023f..e80d299 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10};
+var methods = {"i0":10,"i1":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -156,7 +156,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 </tr>
 <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/regionserver/BasicMemStoreCompactionStrategy.html#name">name</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html#NAME">NAME</a></span></code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
@@ -202,20 +202,24 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html#getAction-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-">getAction</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList)</code>&nbsp;</td>
 </tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>protected <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/regionserver/BasicMemStoreCompactionStrategy.html#getName--">getName</a></span>()</code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.regionserver.MemStoreCompactionStrategy">
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#compact-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">compact</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getFlattenAction--">getFlattenAction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getMergingAction--">getMergingAction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#resetStats--">resetStats</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#simpleMergeOrFlatten-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">simpleMergeOrFlatten</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#updateStats-org.apache.hadoop.hbase.regionserver.Segment-">updateStats</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#compact-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">compact</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getFlattenAction--">getFlattenAction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getMergingAction--">getMergingAction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#resetStats--">resetStats</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#simpleMergeOrFlatten-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">simpleMergeOrFlatten</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#toString--">toString</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 CompactionStrategy.html#updateStats-org.apache.hadoop.hbase.regionserver.Segment-">updateStats</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;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">Object</a></h3>
-<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
 </ul>
 </li>
 </ul>
@@ -231,16 +235,16 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <!--   -->
 </a>
 <h3>Field Detail</h3>
-<a name="name">
+<a name="NAME">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>name</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/regionserver/BasicMemStoreCompactionStrategy.html#line.33">name</a></pre>
+<h4>NAME</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/regionserver/BasicMemStoreCompactionStrategy.html#line.32">NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.BasicMemStoreCompactionStrategy.name">Constant Field Values</a></dd>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.BasicMemStoreCompactionStrategy.NAME">Constant Field Values</a></dd>
 </dl>
 </li>
 </ul>
@@ -258,7 +262,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BasicMemStoreCompactionStrategy</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html#line.35">BasicMemStoreCompactionStrategy</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html#line.34">BasicMemStoreCompactionStrategy</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cfName)</pre>
 </li>
 </ul>
@@ -273,16 +277,29 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCom
 <a name="getAction-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>getAction</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html#line.40">getAction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/BasicMemStoreCompactionStrategy.html#line.39">getAction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getAction-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-">getAction</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy</a></code></dd>
 </dl>
 </li>
 </ul>
+<a name="getName--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>getName</h4>
+<pre>protected&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/regionserver/BasicMemStoreCompactionStrategy.html#line.44">getName</a>()</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getName--">getName</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy</a></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html b/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
index 44afa02..c453cfd 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.532">CompactingMemStore.InMemoryFlushRunnable</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.534">CompactingMemStore.InMemoryFlushRunnable</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">The in-memory-flusher thread performs the flush asynchronously.
@@ -193,7 +193,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>InMemoryFlushRunnable</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html#line.532">InMemoryFlushRunnable</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html#line.534">InMemoryFlushRunnable</a>()</pre>
 </li>
 </ul>
 </li>
@@ -210,7 +210,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/CompactingMemStore.InMemoryFlushRunnable.html#line.535">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html#line.537">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>


[25/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 1391d55..4b723bf 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,16 +5,16 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20180401144554+00'00')
-/CreationDate (D:20180401144554+00'00')
+/ModDate (D:20180403144547+00'00')
+/CreationDate (D:20180403144547+00'00')
 >>
 endobj
 2 0 obj
 << /Type /Catalog
 /Pages 3 0 R
 /Names 26 0 R
-/Outlines 4513 0 R
-/PageLabels 4736 0 R
+/Outlines 4533 0 R
+/PageLabels 4759 0 R
 /PageMode /UseOutlines
 /OpenAction [7 0 R /FitH 842.89]
 /ViewerPreferences << /DisplayDocTitle true
@@ -23,8 +23,8 @@ endobj
 endobj
 3 0 obj
 << /Type /Pages
-/Count 706
-/Kids [7 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 44 0 R 47 0 R 50 0 R 54 0 R 61 0 R 65 0 R 67 0 R 69 0 R 76 0 R 79 0 R 81 0 R 87 0 R 90 0 R 92 0 R 94 0 R 101 0 R 107 0 R 112 0 R 114 0 R 130 0 R 135 0 R 142 0 R 151 0 R 159 0 R 168 0 R 179 0 R 183 0 R 185 0 R 189 0 R 198 0 R 207 0 R 215 0 R 224 0 R 229 0 R 238 0 R 246 0 R 255 0 R 268 0 R 275 0 R 285 0 R 293 0 R 301 0 R 308 0 R 316 0 R 322 0 R 328 0 R 335 0 R 343 0 R 354 0 R 363 0 R 375 0 R 383 0 R 391 0 R 398 0 R 407 0 R 415 0 R 425 0 R 433 0 R 440 0 R 449 0 R 461 0 R 470 0 R 477 0 R 485 0 R 493 0 R 502 0 R 509 0 R 514 0 R 518 0 R 523 0 R 527 0 R 543 0 R 554 0 R 558 0 R 573 0 R 578 0 R 583 0 R 585 0 R 587 0 R 590 0 R 592 0 R 594 0 R 602 0 R 608 0 R 613 0 R 618 0 R 625 0 R 635 0 R 643 0 R 647 0 R 651 0 R 653 0 R 664 0 R 674 0 R 681 0 R 693 0 R 704 0 R 713 0 R 721 0 R 727 0 R 730 0 R 734 0 R 738 0 R 741 0 R 744 0 R 746 0 R 749 0 R 754 0 R 756 0 R 761 0 R 765 0 R 770 0 R 774 0 R 777 0 R 783 0 R 785 0 R 790 0 R 798 0 R 800 0 
 R 803 0 R 806 0 R 810 0 R 813 0 R 828 0 R 835 0 R 844 0 R 855 0 R 861 0 R 871 0 R 882 0 R 885 0 R 889 0 R 892 0 R 897 0 R 906 0 R 914 0 R 918 0 R 922 0 R 927 0 R 931 0 R 933 0 R 948 0 R 959 0 R 964 0 R 970 0 R 973 0 R 981 0 R 989 0 R 994 0 R 1000 0 R 1005 0 R 1007 0 R 1009 0 R 1011 0 R 1021 0 R 1029 0 R 1033 0 R 1040 0 R 1047 0 R 1055 0 R 1059 0 R 1065 0 R 1070 0 R 1078 0 R 1082 0 R 1087 0 R 1089 0 R 1095 0 R 1102 0 R 1104 0 R 1111 0 R 1122 0 R 1126 0 R 1128 0 R 1130 0 R 1134 0 R 1137 0 R 1142 0 R 1145 0 R 1157 0 R 1161 0 R 1167 0 R 1175 0 R 1180 0 R 1184 0 R 1188 0 R 1190 0 R 1193 0 R 1196 0 R 1199 0 R 1203 0 R 1207 0 R 1211 0 R 1216 0 R 1220 0 R 1223 0 R 1225 0 R 1235 0 R 1238 0 R 1246 0 R 1255 0 R 1261 0 R 1265 0 R 1267 0 R 1277 0 R 1280 0 R 1286 0 R 1295 0 R 1298 0 R 1305 0 R 1313 0 R 1315 0 R 1317 0 R 1326 0 R 1328 0 R 1330 0 R 1333 0 R 1335 0 R 1337 0 R 1339 0 R 1341 0 R 1344 0 R 1348 0 R 1353 0 R 1355 0 R 1357 0 R 1359 0 R 1364 0 R 1372 0 R 1377 0 R 1380 0 R 1382 0 R 1385 0 R
  1389 0 R 1393 0 R 1396 0 R 1398 0 R 1400 0 R 1403 0 R 1409 0 R 1414 0 R 1422 0 R 1436 0 R 1450 0 R 1454 0 R 1459 0 R 1472 0 R 1477 0 R 1492 0 R 1500 0 R 1504 0 R 1512 0 R 1527 0 R 1541 0 R 1553 0 R 1558 0 R 1564 0 R 1573 0 R 1579 0 R 1584 0 R 1592 0 R 1595 0 R 1605 0 R 1611 0 R 1614 0 R 1627 0 R 1629 0 R 1635 0 R 1639 0 R 1641 0 R 1649 0 R 1657 0 R 1661 0 R 1663 0 R 1665 0 R 1677 0 R 1683 0 R 1692 0 R 1698 0 R 1712 0 R 1717 0 R 1726 0 R 1734 0 R 1740 0 R 1745 0 R 1751 0 R 1754 0 R 1757 0 R 1762 0 R 1766 0 R 1773 0 R 1777 0 R 1782 0 R 1791 0 R 1796 0 R 1801 0 R 1803 0 R 1811 0 R 1818 0 R 1824 0 R 1829 0 R 1833 0 R 1836 0 R 1841 0 R 1846 0 R 1854 0 R 1856 0 R 1858 0 R 1861 0 R 1869 0 R 1872 0 R 1879 0 R 1888 0 R 1891 0 R 1896 0 R 1898 0 R 1901 0 R 1904 0 R 1907 0 R 1918 0 R 1923 0 R 1928 0 R 1930 0 R 1939 0 R 1946 0 R 1954 0 R 1960 0 R 1965 0 R 1967 0 R 1976 0 R 1985 0 R 1996 0 R 2002 0 R 2009 0 R 2011 0 R 2016 0 R 2018 0 R 2020 0 R 2023 0 R 2026 0 R 2029 0 R 2034 0 R 2038 0 R 2049 0
  R 2052 0 R 2057 0 R 2060 0 R 2062 0 R 2067 0 R 2077 0 R 2079 0 R 2081 0 R 2083 0 R 2085 0 R 2088 0 R 2090 0 R 2092 0 R 2095 0 R 2097 0 R 2099 0 R 2104 0 R 2109 0 R 2118 0 R 2120 0 R 2122 0 R 2129 0 R 2131 0 R 2136 0 R 2138 0 R 2140 0 R 2147 0 R 2152 0 R 2156 0 R 2160 0 R 2164 0 R 2166 0 R 2168 0 R 2172 0 R 2175 0 R 2177 0 R 2179 0 R 2183 0 R 2185 0 R 2188 0 R 2190 0 R 2192 0 R 2194 0 R 2201 0 R 2204 0 R 2209 0 R 2211 0 R 2213 0 R 2215 0 R 2217 0 R 2225 0 R 2236 0 R 2250 0 R 2261 0 R 2265 0 R 2271 0 R 2275 0 R 2278 0 R 2283 0 R 2288 0 R 2290 0 R 2293 0 R 2295 0 R 2297 0 R 2299 0 R 2304 0 R 2306 0 R 2319 0 R 2322 0 R 2330 0 R 2336 0 R 2348 0 R 2362 0 R 2375 0 R 2392 0 R 2396 0 R 2398 0 R 2402 0 R 2420 0 R 2427 0 R 2439 0 R 2443 0 R 2447 0 R 2456 0 R 2468 0 R 2473 0 R 2483 0 R 2496 0 R 2516 0 R 2525 0 R 2528 0 R 2537 0 R 2554 0 R 2561 0 R 2564 0 R 2569 0 R 2573 0 R 2576 0 R 2585 0 R 2593 0 R 2597 0 R 2599 0 R 2603 0 R 2617 0 R 2626 0 R 2631 0 R 2635 0 R 2638 0 R 2640 0 R 2642 0 R 2644
  0 R 2649 0 R 2662 0 R 2672 0 R 2680 0 R 2686 0 R 2692 0 R 2702 0 R 2709 0 R 2715 0 R 2717 0 R 2725 0 R 2734 0 R 2743 0 R 2748 0 R 2756 0 R 2760 0 R 2770 0 R 2778 0 R 2787 0 R 2792 0 R 2796 0 R 2800 0 R 2802 0 R 2808 0 R 2812 0 R 2816 0 R 2822 0 R 2828 0 R 2831 0 R 2837 0 R 2841 0 R 2851 0 R 2856 0 R 2861 0 R 2870 0 R 2876 0 R 2883 0 R 2886 0 R 2891 0 R 2897 0 R 2901 0 R 2904 0 R 2909 0 R 2919 0 R 2925 0 R 2927 0 R 2931 0 R 2938 0 R 2941 0 R 2951 0 R 2957 0 R 2966 0 R 2969 0 R 2979 0 R 2984 0 R 2988 0 R 2996 0 R 3002 0 R 3006 0 R 3008 0 R 3019 0 R 3024 0 R 3027 0 R 3029 0 R 3031 0 R 3041 0 R 3048 0 R 3052 0 R 3055 0 R 3061 0 R 3064 0 R 3067 0 R 3070 0 R 3077 0 R 3082 0 R 3088 0 R 3092 0 R 3095 0 R 3098 0 R 3100 0 R 3104 0 R 3115 0 R 3117 0 R 3121 0 R 3124 0 R 3128 0 R 3131 0 R 3135 0 R 3137 0 R 3150 0 R 3155 0 R 3160 0 R 3167 0 R 3176 0 R 3178 0 R 3186 0 R 3204 0 R 3216 0 R 3222 0 R 3238 0 R 3241 0 R 3246 0 R 3248 0 R 3256 0 R 3261 0 R 3264 0 R 3266 0 R 3268 0 R 3270 0 R 3273 0 R 32
 90 0 R 3293 0 R 3299 0 R 3305 0 R 3314 0 R 3320 0 R 3330 0 R 3341 0 R 3348 0 R 3357 0 R 3362 0 R 3365 0 R 3373 0 R 3377 0 R 3382 0 R 3387 0 R 3400 0 R 3403 0 R 3409 0 R 3414 0 R 3423 0 R 3432 0 R 3438 0 R 3451 0 R 3457 0 R 3461 0 R 3469 0 R 3473 0 R 3478 0 R 3480 0 R 3486 0 R 3493 0 R 3495 0 R 3502 0 R 3504 0 R 3510 0 R 3518 0 R 3524 0 R 3533 0 R 3540 0 R 3550 0 R 3559 0 R 3570 0 R 3583 0 R 3586 0 R 3588 0 R 3593 0 R 3606 0 R 3611 0 R 3617 0 R 3621 0 R 3624 0 R 3629 0 R 3631 0 R 3635 0 R 3637 0 R 3641 0 R 3644 0 R 3647 0 R 3655 0 R 3657 0 R 3661 0 R 3664 0 R 3671 0 R 3677 0 R 3681 0 R 3684 0 R 3686 0 R 3690 0 R 3695 0 R 3700 0 R 3703 0 R 3712 0 R 3717 0 R 3721 0 R 3724 0 R 3732 0 R 3736 0 R 3744 0 R 3749 0 R 3751 0 R 3757 0 R 3759 0 R 3764 0 R 3768 0 R 3773 0 R 3777 0 R 3790 0 R 3806 0 R 3821 0 R 3826 0 R 3829 0 R 3832 0 R 3838 0 R 3843 0 R 3845 0 R 3847 0 R 3849 0 R 3851 0 R 3853 0 R 3862 0 R 3866 0 R 3870 0 R 3874 0 R 3876 0 R 3883 0 R 3893 0 R 3900 0 R 3903 0 R 3906 0 R 3908 0 R 
 3915 0 R 3922 0 R 3932 0 R 3936 0 R 3941 0 R 3945 0 R 3948 0 R 3953 0 R 3956 0 R 3972 0 R 3976 0 R 3999 0 R 4003 0 R 4010 0 R 4021 0 R 4030 0 R 4032 0 R 4035 0 R 4038 0 R 4054 0 R 4060 0 R 4067 0 R]
+/Count 710
+/Kids [7 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 44 0 R 47 0 R 50 0 R 54 0 R 61 0 R 65 0 R 67 0 R 69 0 R 76 0 R 79 0 R 81 0 R 87 0 R 90 0 R 92 0 R 94 0 R 101 0 R 107 0 R 112 0 R 114 0 R 130 0 R 135 0 R 142 0 R 151 0 R 159 0 R 168 0 R 179 0 R 183 0 R 185 0 R 189 0 R 198 0 R 207 0 R 215 0 R 224 0 R 229 0 R 238 0 R 246 0 R 255 0 R 268 0 R 275 0 R 285 0 R 293 0 R 301 0 R 308 0 R 316 0 R 322 0 R 328 0 R 335 0 R 343 0 R 354 0 R 363 0 R 375 0 R 383 0 R 391 0 R 398 0 R 407 0 R 415 0 R 425 0 R 433 0 R 440 0 R 449 0 R 461 0 R 470 0 R 477 0 R 485 0 R 493 0 R 502 0 R 509 0 R 514 0 R 518 0 R 523 0 R 527 0 R 543 0 R 554 0 R 558 0 R 573 0 R 578 0 R 583 0 R 585 0 R 587 0 R 590 0 R 592 0 R 594 0 R 602 0 R 608 0 R 613 0 R 618 0 R 625 0 R 635 0 R 643 0 R 647 0 R 651 0 R 653 0 R 664 0 R 674 0 R 681 0 R 693 0 R 704 0 R 713 0 R 721 0 R 727 0 R 730 0 R 734 0 R 738 0 R 741 0 R 744 0 R 746 0 R 749 0 R 754 0 R 756 0 R 761 0 R 765 0 R 770 0 R 774 0 R 777 0 R 783 0 R 785 0 R 790 0 R 798 0 R 800 0 
 R 803 0 R 806 0 R 810 0 R 813 0 R 828 0 R 835 0 R 844 0 R 855 0 R 861 0 R 871 0 R 882 0 R 885 0 R 889 0 R 892 0 R 897 0 R 906 0 R 914 0 R 918 0 R 922 0 R 927 0 R 931 0 R 933 0 R 948 0 R 959 0 R 964 0 R 970 0 R 973 0 R 981 0 R 989 0 R 994 0 R 1000 0 R 1005 0 R 1007 0 R 1009 0 R 1011 0 R 1021 0 R 1029 0 R 1033 0 R 1040 0 R 1047 0 R 1055 0 R 1059 0 R 1065 0 R 1070 0 R 1078 0 R 1082 0 R 1087 0 R 1089 0 R 1095 0 R 1102 0 R 1104 0 R 1111 0 R 1122 0 R 1126 0 R 1128 0 R 1130 0 R 1134 0 R 1137 0 R 1142 0 R 1145 0 R 1157 0 R 1161 0 R 1167 0 R 1175 0 R 1180 0 R 1184 0 R 1188 0 R 1190 0 R 1193 0 R 1196 0 R 1199 0 R 1203 0 R 1207 0 R 1211 0 R 1216 0 R 1220 0 R 1223 0 R 1225 0 R 1235 0 R 1238 0 R 1246 0 R 1255 0 R 1261 0 R 1265 0 R 1267 0 R 1277 0 R 1280 0 R 1286 0 R 1295 0 R 1298 0 R 1305 0 R 1313 0 R 1315 0 R 1317 0 R 1326 0 R 1328 0 R 1330 0 R 1333 0 R 1335 0 R 1337 0 R 1339 0 R 1341 0 R 1344 0 R 1348 0 R 1353 0 R 1355 0 R 1357 0 R 1359 0 R 1364 0 R 1372 0 R 1377 0 R 1380 0 R 1382 0 R 1385 0 R
  1389 0 R 1393 0 R 1396 0 R 1398 0 R 1400 0 R 1403 0 R 1409 0 R 1414 0 R 1422 0 R 1436 0 R 1450 0 R 1454 0 R 1459 0 R 1472 0 R 1477 0 R 1492 0 R 1500 0 R 1504 0 R 1512 0 R 1527 0 R 1541 0 R 1553 0 R 1558 0 R 1564 0 R 1573 0 R 1579 0 R 1584 0 R 1592 0 R 1595 0 R 1605 0 R 1611 0 R 1614 0 R 1627 0 R 1629 0 R 1635 0 R 1639 0 R 1641 0 R 1649 0 R 1657 0 R 1661 0 R 1663 0 R 1665 0 R 1677 0 R 1683 0 R 1692 0 R 1698 0 R 1712 0 R 1717 0 R 1726 0 R 1734 0 R 1740 0 R 1745 0 R 1751 0 R 1754 0 R 1757 0 R 1762 0 R 1766 0 R 1773 0 R 1777 0 R 1782 0 R 1791 0 R 1796 0 R 1801 0 R 1803 0 R 1811 0 R 1818 0 R 1824 0 R 1829 0 R 1833 0 R 1836 0 R 1841 0 R 1846 0 R 1854 0 R 1856 0 R 1858 0 R 1861 0 R 1869 0 R 1872 0 R 1879 0 R 1888 0 R 1891 0 R 1896 0 R 1898 0 R 1901 0 R 1906 0 R 1909 0 R 1911 0 R 1914 0 R 1917 0 R 1920 0 R 1931 0 R 1936 0 R 1941 0 R 1943 0 R 1952 0 R 1959 0 R 1967 0 R 1973 0 R 1978 0 R 1980 0 R 1989 0 R 1998 0 R 2009 0 R 2015 0 R 2022 0 R 2024 0 R 2029 0 R 2031 0 R 2033 0 R 2036 0 R 2039 0
  R 2042 0 R 2047 0 R 2051 0 R 2062 0 R 2065 0 R 2070 0 R 2073 0 R 2075 0 R 2080 0 R 2090 0 R 2092 0 R 2094 0 R 2096 0 R 2098 0 R 2101 0 R 2103 0 R 2105 0 R 2108 0 R 2110 0 R 2112 0 R 2117 0 R 2122 0 R 2131 0 R 2133 0 R 2135 0 R 2142 0 R 2144 0 R 2149 0 R 2151 0 R 2153 0 R 2160 0 R 2165 0 R 2169 0 R 2173 0 R 2178 0 R 2180 0 R 2182 0 R 2186 0 R 2189 0 R 2191 0 R 2193 0 R 2197 0 R 2199 0 R 2202 0 R 2204 0 R 2206 0 R 2208 0 R 2215 0 R 2218 0 R 2223 0 R 2225 0 R 2227 0 R 2229 0 R 2231 0 R 2239 0 R 2250 0 R 2264 0 R 2275 0 R 2279 0 R 2284 0 R 2288 0 R 2291 0 R 2296 0 R 2301 0 R 2303 0 R 2306 0 R 2308 0 R 2310 0 R 2312 0 R 2317 0 R 2319 0 R 2332 0 R 2335 0 R 2343 0 R 2349 0 R 2361 0 R 2375 0 R 2388 0 R 2405 0 R 2409 0 R 2411 0 R 2415 0 R 2433 0 R 2440 0 R 2452 0 R 2456 0 R 2460 0 R 2469 0 R 2481 0 R 2486 0 R 2496 0 R 2509 0 R 2529 0 R 2538 0 R 2541 0 R 2550 0 R 2567 0 R 2574 0 R 2577 0 R 2582 0 R 2586 0 R 2589 0 R 2598 0 R 2606 0 R 2610 0 R 2612 0 R 2616 0 R 2630 0 R 2639 0 R 2644 0 R 2648
  0 R 2651 0 R 2653 0 R 2655 0 R 2657 0 R 2662 0 R 2675 0 R 2685 0 R 2693 0 R 2699 0 R 2705 0 R 2715 0 R 2722 0 R 2728 0 R 2730 0 R 2738 0 R 2747 0 R 2756 0 R 2761 0 R 2769 0 R 2773 0 R 2783 0 R 2791 0 R 2800 0 R 2805 0 R 2809 0 R 2813 0 R 2815 0 R 2821 0 R 2825 0 R 2829 0 R 2835 0 R 2841 0 R 2844 0 R 2850 0 R 2854 0 R 2865 0 R 2870 0 R 2875 0 R 2884 0 R 2890 0 R 2897 0 R 2900 0 R 2905 0 R 2911 0 R 2915 0 R 2918 0 R 2923 0 R 2932 0 R 2938 0 R 2940 0 R 2944 0 R 2951 0 R 2954 0 R 2964 0 R 2970 0 R 2979 0 R 2982 0 R 2992 0 R 2997 0 R 3001 0 R 3009 0 R 3015 0 R 3019 0 R 3021 0 R 3032 0 R 3037 0 R 3040 0 R 3042 0 R 3044 0 R 3054 0 R 3061 0 R 3065 0 R 3068 0 R 3074 0 R 3077 0 R 3080 0 R 3083 0 R 3090 0 R 3095 0 R 3101 0 R 3105 0 R 3108 0 R 3111 0 R 3113 0 R 3117 0 R 3128 0 R 3130 0 R 3134 0 R 3137 0 R 3141 0 R 3144 0 R 3148 0 R 3150 0 R 3163 0 R 3168 0 R 3173 0 R 3180 0 R 3189 0 R 3191 0 R 3199 0 R 3217 0 R 3229 0 R 3235 0 R 3251 0 R 3254 0 R 3259 0 R 3261 0 R 3269 0 R 3274 0 R 3277 0 R 32
 79 0 R 3281 0 R 3283 0 R 3286 0 R 3303 0 R 3306 0 R 3312 0 R 3318 0 R 3328 0 R 3333 0 R 3343 0 R 3354 0 R 3361 0 R 3370 0 R 3375 0 R 3378 0 R 3386 0 R 3390 0 R 3395 0 R 3400 0 R 3413 0 R 3416 0 R 3422 0 R 3427 0 R 3436 0 R 3445 0 R 3451 0 R 3464 0 R 3470 0 R 3474 0 R 3482 0 R 3486 0 R 3491 0 R 3493 0 R 3499 0 R 3506 0 R 3508 0 R 3515 0 R 3517 0 R 3523 0 R 3531 0 R 3537 0 R 3546 0 R 3553 0 R 3563 0 R 3572 0 R 3583 0 R 3596 0 R 3599 0 R 3601 0 R 3606 0 R 3619 0 R 3624 0 R 3630 0 R 3634 0 R 3637 0 R 3642 0 R 3644 0 R 3648 0 R 3650 0 R 3654 0 R 3657 0 R 3660 0 R 3668 0 R 3670 0 R 3674 0 R 3677 0 R 3684 0 R 3690 0 R 3694 0 R 3697 0 R 3699 0 R 3703 0 R 3708 0 R 3713 0 R 3716 0 R 3725 0 R 3730 0 R 3734 0 R 3737 0 R 3745 0 R 3749 0 R 3757 0 R 3762 0 R 3764 0 R 3770 0 R 3772 0 R 3777 0 R 3781 0 R 3786 0 R 3790 0 R 3803 0 R 3819 0 R 3834 0 R 3839 0 R 3842 0 R 3845 0 R 3851 0 R 3856 0 R 3858 0 R 3860 0 R 3862 0 R 3864 0 R 3866 0 R 3875 0 R 3879 0 R 3883 0 R 3887 0 R 3889 0 R 3896 0 R 3906 0 R 
 3913 0 R 3916 0 R 3919 0 R 3921 0 R 3928 0 R 3935 0 R 3945 0 R 3949 0 R 3954 0 R 3958 0 R 3961 0 R 3966 0 R 3969 0 R 3986 0 R 3990 0 R 4013 0 R 4017 0 R 4024 0 R 4035 0 R 4044 0 R 4046 0 R 4049 0 R 4052 0 R 4068 0 R 4074 0 R 4081 0 R]
 >>
 endobj
 4 0 obj
@@ -187,11 +187,11 @@ endobj
 << /Type /Font
 /BaseFont /71be00+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 4738 0 R
+/FontDescriptor 4761 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 4740 0 R
-/ToUnicode 4739 0 R
+/Widths 4763 0 R
+/ToUnicode 4762 0 R
 >>
 endobj
 11 0 obj
@@ -1750,7 +1750,7 @@ endobj
 /F1.0 10 0 R
 >>
 >>
-/Annots [4069 0 R 4070 0 R 4071 0 R 4072 0 R 4073 0 R 4074 0 R 4075 0 R 4076 0 R 4077 0 R 4078 0 R 4079 0 R 4080 0 R 4081 0 R 4082 0 R 4083 0 R 4084 0 R 4085 0 R 4086 0 R 4087 0 R 4088 0 R 4089 0 R 4090 0 R 4091 0 R 4092 0 R 4093 0 R 4094 0 R 4095 0 R 4096 0 R 4097 0 R 4098 0 R 4099 0 R 4100 0 R 4101 0 R 4102 0 R 4103 0 R 4104 0 R 4105 0 R 4106 0 R 4107 0 R 4108 0 R 4109 0 R 4110 0 R 4111 0 R 4112 0 R 4113 0 R 4114 0 R 4115 0 R 4116 0 R 4117 0 R 4118 0 R 4119 0 R 4120 0 R 4121 0 R 4122 0 R 4123 0 R 4124 0 R 4125 0 R 4126 0 R 4127 0 R 4128 0 R 4129 0 R 4130 0 R 4131 0 R 4132 0 R 4133 0 R 4134 0 R 4135 0 R 4136 0 R 4137 0 R 4138 0 R 4139 0 R 4140 0 R 4141 0 R 4142 0 R 4143 0 R 4144 0 R]
+/Annots [4083 0 R 4084 0 R 4085 0 R 4086 0 R 4087 0 R 4088 0 R 4089 0 R 4090 0 R 4091 0 R 4092 0 R 4093 0 R 4094 0 R 4095 0 R 4096 0 R 4097 0 R 4098 0 R 4099 0 R 4100 0 R 4101 0 R 4102 0 R 4103 0 R 4104 0 R 4105 0 R 4106 0 R 4107 0 R 4108 0 R 4109 0 R 4110 0 R 4111 0 R 4112 0 R 4113 0 R 4114 0 R 4115 0 R 4116 0 R 4117 0 R 4118 0 R 4119 0 R 4120 0 R 4121 0 R 4122 0 R 4123 0 R 4124 0 R 4125 0 R 4126 0 R 4127 0 R 4128 0 R 4129 0 R 4130 0 R 4131 0 R 4132 0 R 4133 0 R 4134 0 R 4135 0 R 4136 0 R 4137 0 R 4138 0 R 4139 0 R 4140 0 R 4141 0 R 4142 0 R 4143 0 R 4144 0 R 4145 0 R 4146 0 R 4147 0 R 4148 0 R 4149 0 R 4150 0 R 4151 0 R 4152 0 R 4153 0 R 4154 0 R 4155 0 R 4156 0 R 4157 0 R 4158 0 R]
 >>
 endobj
 13 0 obj
@@ -3417,11 +3417,11 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4145 0 R 4146 0 R 4147 0 R 4148 0 R 4149 0 R 4150 0 R 4151 0 R 4152 0 R 4153 0 R 4154 0 R 4155 0 R 4156 0 R 4157 0 R 4158 0 R 4159 0 R 4160 0 R 4161 0 R 4162 0 R 4163 0 R 4164 0 R 4165 0 R 4166 0 R 4167 0 R 4168 0 R 4169 0 R 4170 0 R 4171 0 R 4172 0 R 4173 0 R 4174 0 R 4175 0 R 4176 0 R 4177 0 R 4178 0 R 4179 0 R 4180 0 R 4181 0 R 4182 0 R 4183 0 R 4184 0 R 4185 0 R 4186 0 R 4187 0 R 4188 0 R 4189 0 R 4190 0 R 4191 0 R 4192 0 R 4193 0 R 4194 0 R 4195 0 R 4196 0 R 4197 0 R 4198 0 R 4199 0 R 4200 0 R 4201 0 R 4202 0 R 4203 0 R 4204 0 R 4205 0 R 4206 0 R 4207 0 R 4208 0 R 4209 0 R 4210 0 R 4211 0 R 4212 0 R 4213 0 R 4214 0 R 4215 0 R 4216 0 R 4217 0 R 4218 0 R 4219 0 R 4220 0 R 4221 0 R 4222 0 R 4223 0 R 4224 0 R 4225 0 R 4226 0 R]
+/Annots [4159 0 R 4160 0 R 4161 0 R 4162 0 R 4163 0 R 4164 0 R 4165 0 R 4166 0 R 4167 0 R 4168 0 R 4169 0 R 4170 0 R 4171 0 R 4172 0 R 4173 0 R 4174 0 R 4175 0 R 4176 0 R 4177 0 R 4178 0 R 4179 0 R 4180 0 R 4181 0 R 4182 0 R 4183 0 R 4184 0 R 4185 0 R 4186 0 R 4187 0 R 4188 0 R 4189 0 R 4190 0 R 4191 0 R 4192 0 R 4193 0 R 4194 0 R 4195 0 R 4196 0 R 4197 0 R 4198 0 R 4199 0 R 4200 0 R 4201 0 R 4202 0 R 4203 0 R 4204 0 R 4205 0 R 4206 0 R 4207 0 R 4208 0 R 4209 0 R 4210 0 R 4211 0 R 4212 0 R 4213 0 R 4214 0 R 4215 0 R 4216 0 R 4217 0 R 4218 0 R 4219 0 R 4220 0 R 4221 0 R 4222 0 R 4223 0 R 4224 0 R 4225 0 R 4226 0 R 4227 0 R 4228 0 R 4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R 4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R]
 >>
 endobj
 15 0 obj
-<< /Length 29427
+<< /Length 29483
 >>
 stream
 q
@@ -3713,7 +3713,7 @@ ET
 BT
 48.24 665.316 Td
 /F1.0 10.5 Tf
-<4261636b757020616e6420526573746f7265> Tj
+<496e2d6d656d6f727920436f6d70616374696f6e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3722,9 +3722,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-149.2921 665.316 Td
+170.6701 665.316 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3793,7 +3793,7 @@ ET
 BT
 60.24 628.356 Td
 /F1.0 10.5 Tf
-[<37372e2054> 29.7852 <65726d696e6f6c6f6779>] TJ
+<37372e20456e61626c696e67> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3802,9 +3802,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-143.9476 628.356 Td
+122.5696 628.356 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3831,9 +3831,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-60.24 609.876 Td
+48.24 609.876 Td
 /F1.0 10.5 Tf
-<37382e20506c616e6e696e67> Tj
+<4261636b757020616e6420526573746f7265> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3842,9 +3842,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-122.5696 609.876 Td
+149.2921 609.876 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3862,7 +3862,7 @@ ET
 BT
 529.4315 609.876 Td
 /F1.0 10.5 Tf
-<333230> Tj
+<333231> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3873,7 +3873,7 @@ ET
 BT
 60.24 591.396 Td
 /F1.0 10.5 Tf
-[<37392e2046697273742d74696d6520636f6e6669677572> 20.0195 <6174696f6e207374657073>] TJ
+<37382e204f76657276696577> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3882,9 +3882,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-229.4596 591.396 Td
+127.9141 591.396 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3913,7 +3913,7 @@ ET
 BT
 60.24 572.916 Td
 /F1.0 10.5 Tf
-<38302e204261636b757020616e6420526573746f726520636f6d6d616e6473> Tj
+[<37392e2054> 29.7852 <65726d696e6f6c6f6779>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -3922,9 +3922,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-234.8041 572.916 Td
+143.9476 572.916 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3942,7 +3942,7 @@ ET
 BT
 529.4315 572.916 Td
 /F1.0 10.5 Tf
-<333234> Tj
+<333233> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3953,7 +3953,7 @@ ET
 BT
 60.24 554.436 Td
 /F1.0 10.5 Tf
-[<38312e2041> 20.0195 <646d696e69737472> 20.0195 <6174696f6e206f66204261636b757020496d61676573>] TJ
+<38302e20506c616e6e696e67> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3962,9 +3962,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-245.4931 554.436 Td
+122.5696 554.436 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3982,7 +3982,7 @@ ET
 BT
 529.4315 554.436 Td
 /F1.0 10.5 Tf
-<333330> Tj
+<333234> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -3993,7 +3993,7 @@ ET
 BT
 60.24 535.956 Td
 /F1.0 10.5 Tf
-[<38322e20436f6e6669677572> 20.0195 <6174696f6e206b> 20.0195 <657973>] TJ
+[<38312e2046697273742d74696d6520636f6e6669677572> 20.0195 <6174696f6e207374657073>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -4002,9 +4002,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-176.0146 535.956 Td
+229.4596 535.956 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4022,7 +4022,7 @@ ET
 BT
 529.4315 535.956 Td
 /F1.0 10.5 Tf
-<333333> Tj
+<333236> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4033,7 +4033,7 @@ ET
 BT
 60.24 517.476 Td
 /F1.0 10.5 Tf
-[<38332e2042657374205072> 20.0195 <61637469636573>] TJ
+<38322e204261636b757020616e6420526573746f726520636f6d6d616e6473> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4042,9 +4042,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-149.2921 517.476 Td
+234.8041 517.476 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4062,7 +4062,7 @@ ET
 BT
 529.4315 517.476 Td
 /F1.0 10.5 Tf
-<333334> Tj
+<333238> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4073,7 +4073,7 @@ ET
 BT
 60.24 498.996 Td
 /F1.0 10.5 Tf
-<38342e205363656e6172696f3a20536166656775617264696e67204170706c69636174696f6e204461746173657473206f6e20416d617a6f6e205333> Tj
+[<38332e2041> 20.0195 <646d696e69737472> 20.0195 <6174696f6e206f66204261636b757020496d61676573>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -4082,9 +4082,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-373.7611 498.996 Td
+245.4931 498.996 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4102,7 +4102,7 @@ ET
 BT
 529.4315 498.996 Td
 /F1.0 10.5 Tf
-<333336> Tj
+<333334> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4113,7 +4113,7 @@ ET
 BT
 60.24 480.516 Td
 /F1.0 10.5 Tf
-<38352e205365637572697479206f66204261636b75702044617461> Tj
+[<38342e20436f6e6669677572> 20.0195 <6174696f6e206b> 20.0195 <657973>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -4122,9 +4122,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-197.3926 480.516 Td
+176.0146 480.516 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4142,7 +4142,7 @@ ET
 BT
 529.4315 480.516 Td
 /F1.0 10.5 Tf
-<333339> Tj
+<333337> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4153,7 +4153,7 @@ ET
 BT
 60.24 462.036 Td
 /F1.0 10.5 Tf
-[<38362e2054> 29.7852 <6563686e6963616c2044657461696c73206f6620496e6372656d656e74616c204261636b757020616e6420526573746f7265>] TJ
+[<38352e2042657374205072> 20.0195 <61637469636573>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -4162,9 +4162,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-341.6941 462.036 Td
+149.2921 462.036 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4182,7 +4182,7 @@ ET
 BT
 529.4315 462.036 Td
 /F1.0 10.5 Tf
-<333430> Tj
+<333338> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4193,7 +4193,7 @@ ET
 BT
 60.24 443.556 Td
 /F1.0 10.5 Tf
-[<38372e20412057> 49.8047 <61726e696e67206f6e2046696c652053> 20.0195 <797374656d2047726f777468>] TJ
+<38362e205363656e6172696f3a20536166656775617264696e67204170706c69636174696f6e204461746173657473206f6e20416d617a6f6e205333> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4202,9 +4202,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-250.8376 443.556 Td
+373.7611 443.556 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4222,7 +4222,7 @@ ET
 BT
 529.4315 443.556 Td
 /F1.0 10.5 Tf
-<333431> Tj
+<333430> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4233,7 +4233,7 @@ ET
 BT
 60.24 425.076 Td
 /F1.0 10.5 Tf
-<38382e20436170616369747920506c616e6e696e67> Tj
+<38372e205365637572697479206f66204261636b75702044617461> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4242,9 +4242,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-170.6701 425.076 Td
+197.3926 425.076 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4262,7 +4262,7 @@ ET
 BT
 529.4315 425.076 Td
 /F1.0 10.5 Tf
-<333432> Tj
+<333433> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4273,7 +4273,7 @@ ET
 BT
 60.24 406.596 Td
 /F1.0 10.5 Tf
-<38392e204c696d69746174696f6e73206f6620746865204261636b757020616e6420526573746f7265205574696c697479> Tj
+[<38382e2054> 29.7852 <6563686e6963616c2044657461696c73206f6620496e6372656d656e74616c204261636b757020616e6420526573746f7265>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -4282,9 +4282,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-304.2826 406.596 Td
+341.6941 406.596 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4311,9 +4311,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 388.116 Td
+60.24 388.116 Td
 /F1.0 10.5 Tf
-<4170616368652048426173652041504973> Tj
+[<38392e20412057> 49.8047 <61726e696e67206f6e2046696c652053> 20.0195 <797374656d2047726f777468>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -4322,9 +4322,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-149.2921 388.116 Td
+250.8376 388.116 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4342,7 +4342,7 @@ ET
 BT
 529.4315 388.116 Td
 /F1.0 10.5 Tf
-<333436> Tj
+<333435> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4353,7 +4353,7 @@ ET
 BT
 60.24 369.636 Td
 /F1.0 10.5 Tf
-<39302e204578616d706c6573> Tj
+<39302e20436170616369747920506c616e6e696e67> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4362,9 +4362,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-127.9141 369.636 Td
+170.6701 369.636 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4382,7 +4382,7 @@ ET
 BT
 529.4315 369.636 Td
 /F1.0 10.5 Tf
-<333437> Tj
+<333436> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4391,9 +4391,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 351.156 Td
+60.24 351.156 Td
 /F1.0 10.5 Tf
-<4170616368652048426173652045787465726e616c2041504973> Tj
+<39312e204c696d69746174696f6e73206f6620746865204261636b757020616e6420526573746f7265205574696c697479> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4402,9 +4402,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-192.0481 351.156 Td
+304.2826 351.156 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4422,7 +4422,7 @@ ET
 BT
 529.4315 351.156 Td
 /F1.0 10.5 Tf
-<333439> Tj
+<333438> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4431,9 +4431,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-60.24 332.676 Td
+48.24 332.676 Td
 /F1.0 10.5 Tf
-[<39312e20524553> 20.0195 <54>] TJ
+<4170616368652048426173652041504973> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4442,9 +4442,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-106.5361 332.676 Td
+149.2921 332.676 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4473,7 +4473,7 @@ ET
 BT
 60.24 314.196 Td
 /F1.0 10.5 Tf
-<39322e20546872696674> Tj
+<39322e204578616d706c6573> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4482,9 +4482,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-106.5361 314.196 Td
+127.9141 314.196 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4502,7 +4502,7 @@ ET
 BT
 529.4315 314.196 Td
 /F1.0 10.5 Tf
-<333631> Tj
+<333531> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4511,9 +4511,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-60.24 295.716 Td
+48.24 295.716 Td
 /F1.0 10.5 Tf
-<39332e20432f432b2b2041706163686520484261736520436c69656e74> Tj
+<4170616368652048426173652045787465726e616c2041504973> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4522,9 +4522,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-213.4261 295.716 Td
+192.0481 295.716 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4542,7 +4542,7 @@ ET
 BT
 529.4315 295.716 Td
 /F1.0 10.5 Tf
-<333632> Tj
+<333533> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4553,7 +4553,7 @@ ET
 BT
 60.24 277.236 Td
 /F1.0 10.5 Tf
-<39342e205573696e67204a6176612044617461204f626a6563747320284a444f292077697468204842617365> Tj
+[<39332e20524553> 20.0195 <54>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -4562,9 +4562,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-288.2491 277.236 Td
+106.5361 277.236 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4582,7 +4582,7 @@ ET
 BT
 529.4315 277.236 Td
 /F1.0 10.5 Tf
-<333633> Tj
+<333534> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4593,7 +4593,7 @@ ET
 BT
 60.24 258.756 Td
 /F1.0 10.5 Tf
-<39352e205363616c61> Tj
+<39342e20546872696674> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4622,7 +4622,7 @@ ET
 BT
 529.4315 258.756 Td
 /F1.0 10.5 Tf
-<333636> Tj
+<333635> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4633,7 +4633,7 @@ ET
 BT
 60.24 240.276 Td
 /F1.0 10.5 Tf
-<39362e204a7974686f6e> Tj
+<39352e20432f432b2b2041706163686520484261736520436c69656e74> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4642,9 +4642,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-111.8806 240.276 Td
+213.4261 240.276 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4662,7 +4662,7 @@ ET
 BT
 529.4315 240.276 Td
 /F1.0 10.5 Tf
-<333638> Tj
+<333636> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4671,9 +4671,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 221.796 Td
+60.24 221.796 Td
 /F1.0 10.5 Tf
-<5468726966742041504920616e642046696c746572204c616e6775616765> Tj
+<39362e205573696e67204a6176612044617461204f626a6563747320284a444f292077697468204842617365> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4682,9 +4682,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-202.7371 221.796 Td
+288.2491 221.796 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4702,7 +4702,7 @@ ET
 BT
 529.4315 221.796 Td
 /F1.0 10.5 Tf
-<333731> Tj
+<333637> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4713,7 +4713,7 @@ ET
 BT
 60.24 203.316 Td
 /F1.0 10.5 Tf
-<39372e2046696c746572204c616e6775616765> Tj
+<39372e205363616c61> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4722,9 +4722,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-159.9811 203.316 Td
+106.5361 203.316 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4742,7 +4742,7 @@ ET
 BT
 529.4315 203.316 Td
 /F1.0 10.5 Tf
-<333732> Tj
+<333730> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4751,9 +4751,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 184.836 Td
+60.24 184.836 Td
 /F1.0 10.5 Tf
-<484261736520616e6420537061726b> Tj
+<39382e204a7974686f6e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4762,9 +4762,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-138.6031 184.836 Td
+111.8806 184.836 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4782,7 +4782,7 @@ ET
 BT
 529.4315 184.836 Td
 /F1.0 10.5 Tf
-<333738> Tj
+<333732> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4791,9 +4791,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-60.24 166.356 Td
+48.24 166.356 Td
 /F1.0 10.5 Tf
-<39382e20426173696320537061726b> Tj
+<5468726966742041504920616e642046696c746572204c616e6775616765> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4802,9 +4802,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-138.6031 166.356 Td
+202.7371 166.356 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4822,7 +4822,7 @@ ET
 BT
 529.4315 166.356 Td
 /F1.0 10.5 Tf
-<333739> Tj
+<333735> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4833,7 +4833,7 @@ ET
 BT
 60.24 147.876 Td
 /F1.0 10.5 Tf
-<39392e20537061726b2053747265616d696e67> Tj
+<39392e2046696c746572204c616e6775616765> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4842,9 +4842,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-165.3256 147.876 Td
+159.9811 147.876 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4862,7 +4862,7 @@ ET
 BT
 529.4315 147.876 Td
 /F1.0 10.5 Tf
-<333832> Tj
+<333736> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4871,9 +4871,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-60.24 129.396 Td
+48.24 129.396 Td
 /F1.0 10.5 Tf
-<3130302e2042756c6b204c6f6164> Tj
+<484261736520616e6420537061726b> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4902,7 +4902,7 @@ ET
 BT
 529.4315 129.396 Td
 /F1.0 10.5 Tf
-<333834> Tj
+<333832> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4913,7 +4913,7 @@ ET
 BT
 60.24 110.916 Td
 /F1.0 10.5 Tf
-[<3130312e20537061726b53514c2f446174614672> 20.0195 <616d6573>] TJ
+<3130302e20426173696320537061726b> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4922,9 +4922,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-197.3926 110.916 Td
+143.9476 110.916 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4942,7 +4942,7 @@ ET
 BT
 529.4315 110.916 Td
 /F1.0 10.5 Tf
-<333838> Tj
+<333833> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4951,9 +4951,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 92.436 Td
+60.24 92.436 Td
 /F1.0 10.5 Tf
-<41706163686520484261736520436f70726f636573736f7273> Tj
+<3130312e20537061726b2053747265616d696e67> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4962,9 +4962,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-192.0481 92.436 Td
+170.6701 92.436 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4982,7 +4982,7 @@ ET
 BT
 529.4315 92.436 Td
 /F1.0 10.5 Tf
-<333935> Tj
+<333836> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -4993,7 +4993,7 @@ ET
 BT
 60.24 73.956 Td
 /F1.0 10.5 Tf
-<3130322e20436f70726f636573736f72204f76657276696577> Tj
+<3130322e2042756c6b204c6f6164> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5002,9 +5002,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-197.3926 73.956 Td
+138.6031 73.956 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5022,7 +5022,7 @@ ET
 BT
 529.4315 73.956 Td
 /F1.0 10.5 Tf
-<333936> Tj
+<333838> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5033,7 +5033,7 @@ ET
 BT
 60.24 55.476 Td
 /F1.0 10.5 Tf
-<3130332e205479706573206f6620436f70726f636573736f7273> Tj
+[<3130332e20537061726b53514c2f446174614672> 20.0195 <616d6573>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -5062,7 +5062,7 @@ ET
 BT
 529.4315 55.476 Td
 /F1.0 10.5 Tf
-<333937> Tj
+<333932> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5084,11 +5084,11 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4227 0 R 4228 0 R 4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R 4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R 4241 0 R 4242 0 R 4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R 4260 0 R 4261 0 R 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R 4267 0 R 4268 0 R 4269 0 R 4270 0 R 4271 0 R 4272 0 R 4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R]
+/Annots [4241 0 R 4242 0 R 4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R 4260 0 R 4261 0 R 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R 4267 0 R 4268 0 R 4269 0 R 4270 0 R 4271 0 R 4272 0 R 4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R 4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4314 0 R 4315 0 R 4316 0 R 4317 0 R 4318 0 R 4319 0 R 4320 0 R 4321 0 R 4322 0 R]
 >>
 endobj
 17 0 obj
-<< /Length 29577
+<< /Length 29527
 >>
 stream
 q
@@ -5098,9 +5098,9 @@ q
 0.2 0.2 0.2 SCN
 
 BT
-60.24 794.676 Td
+48.24 794.676 Td
 /F1.0 10.5 Tf
-<3130342e204c6f6164696e6720436f70726f636573736f7273> Tj
+<41706163686520484261736520436f70726f636573736f7273> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5109,9 +5109,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-197.3926 794.676 Td
+192.0481 794.676 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5140,7 +5140,7 @@ ET
 BT
 60.24 776.196 Td
 /F1.0 10.5 Tf
-<3130352e204578616d706c6573> Tj
+<3130342e20436f70726f636573736f72204f76657276696577> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5149,9 +5149,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-133.2586 776.196 Td
+197.3926 776.196 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5169,7 +5169,7 @@ ET
 BT
 529.4315 776.196 Td
 /F1.0 10.5 Tf
-<343034> Tj
+<343030> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5180,7 +5180,7 @@ ET
 BT
 60.24 757.716 Td
 /F1.0 10.5 Tf
-[<3130362e2047756964656c696e65732046> 40.0391 <6f72204465706c6f> 20.0195 <79696e67204120436f70726f636573736f72>] TJ
+<3130352e205479706573206f6620436f70726f636573736f7273> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5189,9 +5189,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-288.2491 757.716 Td
+197.3926 757.716 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5209,7 +5209,7 @@ ET
 BT
 529.4315 757.716 Td
 /F1.0 10.5 Tf
-<343130> Tj
+<343031> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5220,7 +5220,7 @@ ET
 BT
 60.24 739.236 Td
 /F1.0 10.5 Tf
-<3130372e205265737472696374696e6720436f70726f636573736f72205573616765> Tj
+<3130362e204c6f6164696e6720436f70726f636573736f7273> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5229,9 +5229,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-234.8041 739.236 Td
+197.3926 739.236 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5249,7 +5249,7 @@ ET
 BT
 529.4315 739.236 Td
 /F1.0 10.5 Tf
-<343132> Tj
+<343033> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5258,9 +5258,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 720.756 Td
+60.24 720.756 Td
 /F1.0 10.5 Tf
-<41706163686520484261736520506572666f726d616e63652054756e696e67> Tj
+<3130372e204578616d706c6573> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5269,9 +5269,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-229.4596 720.756 Td
+133.2586 720.756 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5289,7 +5289,7 @@ ET
 BT
 529.4315 720.756 Td
 /F1.0 10.5 Tf
-<343133> Tj
+<343038> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5300,7 +5300,7 @@ ET
 BT
 60.24 702.276 Td
 /F1.0 10.5 Tf
-[<3130382e204f706572> 20.0195 <6174696e672053> 20.0195 <797374656d>] TJ
+[<3130382e2047756964656c696e65732046> 40.0391 <6f72204465706c6f> 20.0195 <79696e67204120436f70726f636573736f72>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -5309,9 +5309,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-176.0146 702.276 Td
+288.2491 702.276 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5340,7 +5340,7 @@ ET
 BT
 60.24 683.796 Td
 /F1.0 10.5 Tf
-<3130392e204e6574776f726b> Tj
+<3130392e205265737472696374696e6720436f70726f636573736f72205573616765> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5349,9 +5349,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-127.9141 683.796 Td
+234.8041 683.796 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5369,7 +5369,7 @@ ET
 BT
 529.4315 683.796 Td
 /F1.0 10.5 Tf
-<343135> Tj
+<343136> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5378,9 +5378,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-60.24 665.316 Td
+48.24 665.316 Td
 /F1.0 10.5 Tf
-<3131302e204a617661> Tj
+<41706163686520484261736520506572666f726d616e63652054756e696e67> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5389,9 +5389,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-106.5361 665.316 Td
+229.4596 665.316 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5420,7 +5420,7 @@ ET
 BT
 60.24 646.836 Td
 /F1.0 10.5 Tf
-[<3131312e20484261736520436f6e6669677572> 20.0195 <6174696f6e73>] TJ
+[<3131302e204f706572> 20.0195 <6174696e672053> 20.0195 <797374656d>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -5429,9 +5429,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-192.0481 646.836 Td
+176.0146 646.836 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5460,7 +5460,7 @@ ET
 BT
 60.24 628.356 Td
 /F1.0 10.5 Tf
-[<3131322e205a6f6f4b> 20.0195 <6565706572>] TJ
+<3131312e204e6574776f726b> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5469,9 +5469,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-138.6031 628.356 Td
+127.9141 628.356 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5489,7 +5489,7 @@ ET
 BT
 529.4315 628.356 Td
 /F1.0 10.5 Tf
-<343232> Tj
+<343139> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5500,7 +5500,7 @@ ET
 BT
 60.24 609.876 Td
 /F1.0 10.5 Tf
-<3131332e20536368656d612044657369676e> Tj
+<3131322e204a617661> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5509,9 +5509,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-159.9811 609.876 Td
+106.5361 609.876 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5529,7 +5529,7 @@ ET
 BT
 529.4315 609.876 Td
 /F1.0 10.5 Tf
-<343233> Tj
+<343231> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5540,7 +5540,7 @@ ET
 BT
 60.24 591.396 Td
 /F1.0 10.5 Tf
-[<3131342e2048426173652047656e6572> 20.0195 <616c205061747465726e73>] TJ
+[<3131332e20484261736520436f6e6669677572> 20.0195 <6174696f6e73>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -5549,9 +5549,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-202.7371 591.396 Td
+192.0481 591.396 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5569,7 +5569,7 @@ ET
 BT
 529.4315 591.396 Td
 /F1.0 10.5 Tf
-<343237> Tj
+<343232> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5580,7 +5580,7 @@ ET
 BT
 60.24 572.916 Td
 /F1.0 10.5 Tf
-<3131352e2057726974696e6720746f204842617365> Tj
+[<3131342e205a6f6f4b> 20.0195 <6565706572>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -5589,9 +5589,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-170.6701 572.916 Td
+138.6031 572.916 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5609,7 +5609,7 @@ ET
 BT
 529.4315 572.916 Td
 /F1.0 10.5 Tf
-<343238> Tj
+<343236> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5620,7 +5620,7 @@ ET
 BT
 60.24 554.436 Td
 /F1.0 10.5 Tf
-<3131362e2052656164696e672066726f6d204842617365> Tj
+<3131352e20536368656d612044657369676e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5629,9 +5629,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-186.7036 554.436 Td
+159.9811 554.436 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5649,7 +5649,7 @@ ET
 BT
 529.4315 554.436 Td
 /F1.0 10.5 Tf
-<343331> Tj
+<343237> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5660,7 +5660,7 @@ ET
 BT
 60.24 535.956 Td
 /F1.0 10.5 Tf
-<3131372e2044656c6574696e672066726f6d204842617365> Tj
+[<3131362e2048426173652047656e6572> 20.0195 <616c205061747465726e73>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -5669,9 +5669,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-186.7036 535.956 Td
+202.7371 535.956 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5689,7 +5689,7 @@ ET
 BT
 529.4315 535.956 Td
 /F1.0 10.5 Tf
-<343336> Tj
+<343331> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5700,7 +5700,7 @@ ET
 BT
 60.24 517.476 Td
 /F1.0 10.5 Tf
-<3131382e2048444653> Tj
+<3131372e2057726974696e6720746f204842617365> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5709,9 +5709,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-111.8806 517.476 Td
+170.6701 517.476 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5729,7 +5729,7 @@ ET
 BT
 529.4315 517.476 Td
 /F1.0 10.5 Tf
-<343337> Tj
+<343332> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5740,7 +5740,7 @@ ET
 BT
 60.24 498.996 Td
 /F1.0 10.5 Tf
-<3131392e20416d617a6f6e20454332> Tj
+<3131382e2052656164696e672066726f6d204842617365> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5749,9 +5749,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-149.2921 498.996 Td
+186.7036 498.996 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5769,7 +5769,7 @@ ET
 BT
 529.4315 498.996 Td
 /F1.0 10.5 Tf
-<343339> Tj
+<343335> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5780,7 +5780,7 @@ ET
 BT
 60.24 480.516 Td
 /F1.0 10.5 Tf
-<3132302e20436f6c6c6f636174696e6720484261736520616e64204d6170526564756365> Tj
+<3131392e2044656c6574696e672066726f6d204842617365> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5789,9 +5789,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-256.1821 480.516 Td
+186.7036 480.516 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5820,7 +5820,7 @@ ET
 BT
 60.24 462.036 Td
 /F1.0 10.5 Tf
-<3132312e20436173652053747564696573> Tj
+<3132302e2048444653> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5829,9 +5829,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-149.2921 462.036 Td
+111.8806 462.036 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5858,9 +5858,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 443.556 Td
+60.24 443.556 Td
 /F1.0 10.5 Tf
-<54726f75626c6573686f6f74696e6720616e6420446562756767696e6720417061636865204842617365> Tj
+<3132312e20416d617a6f6e20454332> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5869,9 +5869,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-282.9046 443.556 Td
+149.2921 443.556 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5889,7 +5889,7 @@ ET
 BT
 529.4315 443.556 Td
 /F1.0 10.5 Tf
-<343432> Tj
+<343433> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5900,7 +5900,7 @@ ET
 BT
 60.24 425.076 Td
 /F1.0 10.5 Tf
-[<3132322e2047656e6572> 20.0195 <616c2047756964656c696e6573>] TJ
+<3132322e20436f6c6c6f636174696e6720484261736520616e64204d6170526564756365> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5909,9 +5909,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-181.3591 425.076 Td
+256.1821 425.076 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5929,7 +5929,7 @@ ET
 BT
 529.4315 425.076 Td
 /F1.0 10.5 Tf
-<343433> Tj
+<343434> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5940,7 +5940,7 @@ ET
 BT
 60.24 406.596 Td
 /F1.0 10.5 Tf
-<3132332e204c6f6773> Tj
+<3132332e20436173652053747564696573> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5949,9 +5949,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-106.5361 406.596 Td
+149.2921 406.596 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5969,7 +5969,7 @@ ET
 BT
 529.4315 406.596 Td
 /F1.0 10.5 Tf
-<343434> Tj
+<343435> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5978,9 +5978,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-60.24 388.116 Td
+48.24 388.116 Td
 /F1.0 10.5 Tf
-<3132342e205265736f7572636573> Tj
+<54726f75626c6573686f6f74696e6720616e6420446562756767696e6720417061636865204842617365> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -5989,9 +5989,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-138.6031 388.116 Td
+282.9046 388.116 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6009,7 +6009,7 @@ ET
 BT
 529.4315 388.116 Td
 /F1.0 10.5 Tf
-<343438> Tj
+<343436> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6020,7 +6020,7 @@ ET
 BT
 60.24 369.636 Td
 /F1.0 10.5 Tf
-[<3132352e2054> 29.7852 <6f6f6c73>] TJ
+[<3132342e2047656e6572> 20.0195 <616c2047756964656c696e6573>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -6029,9 +6029,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-111.8806 369.636 Td
+181.3591 369.636 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6049,7 +6049,7 @@ ET
 BT
 529.4315 369.636 Td
 /F1.0 10.5 Tf
-<343439> Tj
+<343437> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6060,7 +6060,7 @@ ET
 BT
 60.24 351.156 Td
 /F1.0 10.5 Tf
-<3132362e20436c69656e74> Tj
+<3132352e204c6f6773> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6069,9 +6069,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-117.2251 351.156 Td
+106.5361 351.156 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6089,7 +6089,7 @@ ET
 BT
 529.4315 351.156 Td
 /F1.0 10.5 Tf
-<343537> Tj
+<343438> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6100,7 +6100,7 @@ ET
 BT
 60.24 332.676 Td
 /F1.0 10.5 Tf
-<3132372e204d6170526564756365> Tj
+<3132362e205265736f7572636573> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6109,9 +6109,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-143.9476 332.676 Td
+138.6031 332.676 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6129,7 +6129,7 @@ ET
 BT
 529.4315 332.676 Td
 /F1.0 10.5 Tf
-<343631> Tj
+<343532> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6140,7 +6140,7 @@ ET
 BT
 60.24 314.196 Td
 /F1.0 10.5 Tf
-<3132382e204e616d654e6f6465> Tj
+[<3132372e2054> 29.7852 <6f6f6c73>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -6149,9 +6149,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-143.9476 314.196 Td
+111.8806 314.196 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6169,7 +6169,7 @@ ET
 BT
 529.4315 314.196 Td
 /F1.0 10.5 Tf
-<343633> Tj
+<343533> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6180,7 +6180,7 @@ ET
 BT
 60.24 295.716 Td
 /F1.0 10.5 Tf
-<3132392e204e6574776f726b> Tj
+<3132382e20436c69656e74> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6189,9 +6189,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-127.9141 295.716 Td
+117.2251 295.716 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6209,7 +6209,7 @@ ET
 BT
 529.4315 295.716 Td
 /F1.0 10.5 Tf
-<343636> Tj
+<343631> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6220,7 +6220,7 @@ ET
 BT
 60.24 277.236 Td
 /F1.0 10.5 Tf
-<3133302e20526567696f6e536572766572> Tj
+<3132392e204d6170526564756365> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6229,9 +6229,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-154.6366 277.236 Td
+143.9476 277.236 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6249,7 +6249,7 @@ ET
 BT
 529.4315 277.236 Td
 /F1.0 10.5 Tf
-<343637> Tj
+<343635> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6260,7 +6260,7 @@ ET
 BT
 60.24 258.756 Td
 /F1.0 10.5 Tf
-<3133312e204d6173746572> Tj
+<3133302e204e616d654e6f6465> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6269,9 +6269,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-122.5696 258.756 Td
+143.9476 258.756 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6289,7 +6289,7 @@ ET
 BT
 529.4315 258.756 Td
 /F1.0 10.5 Tf
-<343732> Tj
+<343637> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6300,7 +6300,7 @@ ET
 BT
 60.24 240.276 Td
 /F1.0 10.5 Tf
-[<3133322e205a6f6f4b> 20.0195 <6565706572>] TJ
+<3133312e204e6574776f726b> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6309,9 +6309,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-138.6031 240.276 Td
+127.9141 240.276 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6329,7 +6329,7 @@ ET
 BT
 529.4315 240.276 Td
 /F1.0 10.5 Tf
-<343733> Tj
+<343730> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6340,7 +6340,7 @@ ET
 BT
 60.24 221.796 Td
 /F1.0 10.5 Tf
-<3133332e20416d617a6f6e20454332> Tj
+<3133322e20526567696f6e536572766572> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6349,9 +6349,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-149.2921 221.796 Td
+154.6366 221.796 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6369,7 +6369,7 @@ ET
 BT
 529.4315 221.796 Td
 /F1.0 10.5 Tf
-<343734> Tj
+<343731> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6380,7 +6380,7 @@ ET
 BT
 60.24 203.316 Td
 /F1.0 10.5 Tf
-<3133342e20484261736520616e64204861646f6f702076657273696f6e20697373756573> Tj
+<3133332e204d6173746572> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6389,9 +6389,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-256.1821 203.316 Td
+122.5696 203.316 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6409,7 +6409,7 @@ ET
 BT
 529.4315 203.316 Td
 /F1.0 10.5 Tf
-<343735> Tj
+<343736> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6420,7 +6420,7 @@ ET
 BT
 60.24 184.836 Td
 /F1.0 10.5 Tf
-<3133352e20484261736520616e642048444653> Tj
+[<3133342e205a6f6f4b> 20.0195 <6565706572>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -6429,9 +6429,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-170.6701 184.836 Td
+138.6031 184.836 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6449,7 +6449,7 @@ ET
 BT
 529.4315 184.836 Td
 /F1.0 10.5 Tf
-<343736> Tj
+<343737> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6460,7 +6460,7 @@ ET
 BT
 60.24 166.356 Td
 /F1.0 10.5 Tf
-[<3133362e2052756e6e696e6720756e6974206f7220696e74656772> 20.0195 <6174696f6e207465737473>] TJ
+<3133352e20416d617a6f6e20454332> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6469,9 +6469,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-250.8376 166.356 Td
+149.2921 166.356 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6489,7 +6489,7 @@ ET
 BT
 529.4315 166.356 Td
 /F1.0 10.5 Tf
-<343739> Tj
+<343738> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6500,7 +6500,7 @@ ET
 BT
 60.24 147.876 Td
 /F1.0 10.5 Tf
-<3133372e20436173652053747564696573> Tj
+<3133362e20484261736520616e64204861646f6f702076657273696f6e20697373756573> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6509,9 +6509,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-149.2921 147.876 Td
+256.1821 147.876 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6529,7 +6529,7 @@ ET
 BT
 529.4315 147.876 Td
 /F1.0 10.5 Tf
-<343830> Tj
+<343739> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6540,7 +6540,7 @@ ET
 BT
 60.24 129.396 Td
 /F1.0 10.5 Tf
-[<3133382e2043727970746f6772> 20.0195 <61706869632046> 40.0391 <65617475726573>] TJ
+<3133372e20484261736520616e642048444653> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6549,9 +6549,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-202.7371 129.396 Td
+170.6701 129.396 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6569,7 +6569,7 @@ ET
 BT
 529.4315 129.396 Td
 /F1.0 10.5 Tf
-<343831> Tj
+<343830> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6580,7 +6580,7 @@ ET
 BT
 60.24 110.916 Td
 /F1.0 10.5 Tf
-[<3133392e204f706572> 20.0195 <6174696e672053> 20.0195 <797374656d20537065636966696320497373756573>] TJ
+[<3133382e2052756e6e696e6720756e6974206f7220696e74656772> 20.0195 <6174696f6e207465737473>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -6609,7 +6609,7 @@ ET
 BT
 529.4315 110.916 Td
 /F1.0 10.5 Tf
-<343832> Tj
+<343833> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6620,7 +6620,7 @@ ET
 BT
 60.24 92.436 Td
 /F1.0 10.5 Tf
-<3134302e204a444b20497373756573> Tj
+<3133392e20436173652053747564696573> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6629,9 +6629,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-138.6031 92.436 Td
+149.2921 92.436 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6649,7 +6649,7 @@ ET
 BT
 529.4315 92.436 Td
 /F1.0 10.5 Tf
-<343833> Tj
+<343834> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6658,9 +6658,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-48.24 73.956 Td
+60.24 73.956 Td
 /F1.0 10.5 Tf
-<41706163686520484261736520436173652053747564696573> Tj
+[<3134302e2043727970746f6772> 20.0195 <61706869632046> 40.0391 <65617475726573>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -6669,9 +6669,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-186.7036 73.956 Td
+202.7371 73.956 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6689,7 +6689,7 @@ ET
 BT
 529.4315 73.956 Td
 /F1.0 10.5 Tf
-<343834> Tj
+<343835> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6700,7 +6700,7 @@ ET
 BT
 60.24 55.476 Td
 /F1.0 10.5 Tf
-<3134312e204f76657276696577> Tj
+[<3134312e204f706572> 20.0195 <6174696e672053> 20.0195 <797374656d20537065636966696320497373756573>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -6709,9 +6709,9 @@ ET
 0.6627 0.6627 0.6627 SCN
 
 BT
-133.2586 55.476 Td
+250.8376 55.476 Td
 /F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6729,7 +6729,7 @@ ET
 BT
 529.4315 55.476 Td
 /F1.0 10.5 Tf
-<343835> Tj
+<343836> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -6751,11 +6751,11 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4314 0 R 4315 0 R 4316 0 R 4317 0 R 4318 0 R 4319 0 R 4320 0 R 4321 0 R 4322 0 R 4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R 4328 0 R 4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R 4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R 4350 0 R 4351 0 R 4352 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R 4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R 4390 0 R]
+/Annots [4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R 4328 0 R 4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R 4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R 4350 0 R 4351 0 R 4352 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R 4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R 4390 0 R 4391 0 R 4392 0 R 4393 0 R 4394 0 R 4395 0 R 4396 0 R 4397 0 R 4398 0 R 4399 0 R 4400 0 R 4401 0 R 4402 0 R 440

<TRUNCATED>

[05/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
index 3dbdec3..22e7059 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
@@ -127,468 +127,470 @@
 <span class="sourceLineNo">119</span>    // initialization of the flush size should happen after initialization of the index type<a name="line.119"></a>
 <span class="sourceLineNo">120</span>    // so do not transfer the following method<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    initInmemoryFlushSize(conf);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  @VisibleForTesting<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  protected MemStoreCompactor createMemStoreCompactor(MemoryCompactionPolicy compactionPolicy)<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      throws IllegalArgumentIOException {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    return new MemStoreCompactor(this, compactionPolicy);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private void initInmemoryFlushSize(Configuration conf) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    double factor = 0;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    long memstoreFlushSize = getRegionServices().getMemStoreFlushSize();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    int numStores = getRegionServices().getNumStores();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    if (numStores &lt;= 1) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      // Family number might also be zero in some of our unit test case<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      numStores = 1;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    inmemoryFlushSize = memstoreFlushSize / numStores;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    // multiply by a factor (the same factor for all index types)<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    factor = conf.getDouble(IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY,<a name="line.140"></a>
-<span class="sourceLineNo">141</span>          IN_MEMORY_FLUSH_THRESHOLD_FACTOR_DEFAULT);<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>    inmemoryFlushSize = (long) (inmemoryFlushSize * factor);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    LOG.info("Setting in-memory flush size threshold to {} and immutable segments index to type={}",<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        StringUtils.byteDesc(inmemoryFlushSize), indexType);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  /**<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * @return Total memory occupied by this MemStore. This won't include any size occupied by the<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   *         snapshot. We assume the snapshot will get cleared soon. This is not thread safe and<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   *         the memstore may be changed while computing its size. It is the responsibility of the<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   *         caller to make sure this doesn't happen.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  @Override<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  public MemStoreSize size() {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    MemStoreSizing memstoreSizing = new MemStoreSizing();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    memstoreSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    for (Segment item : pipeline.getSegments()) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      memstoreSizing.incMemStoreSize(item.getMemStoreSize());<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    return memstoreSizing;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
-<span class="sourceLineNo">163</span><a name="line.163"></a>
-<span class="sourceLineNo">164</span>  /**<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * This method is called before the flush is executed.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @return an estimation (lower bound) of the unflushed sequence id in memstore after the flush<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * is executed. if memstore will be cleared returns {@code HConstants.NO_SEQNUM}.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  @Override<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public long preFlushSeqIDEstimation() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    if(compositeSnapshot) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return HConstants.NO_SEQNUM;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    Segment segment = getLastSegment();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    if(segment == null) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return HConstants.NO_SEQNUM;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    return segment.getMinSequenceId();<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  @Override<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public boolean isSloppy() {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    return true;<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>  /**<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * Push the current active memstore segment into the pipeline<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * and create a snapshot of the tail of current compaction pipeline<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Snapshot must be cleared by call to {@link #clearSnapshot}.<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * {@link #clearSnapshot(long)}.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @return {@link MemStoreSnapshot}<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public MemStoreSnapshot snapshot() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    // If snapshot currently has entries, then flusher failed or didn't call<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // cleanup.  Log a warning.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    if (!this.snapshot.isEmpty()) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      LOG.warn("Snapshot called again without clearing previous. " +<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          "Doing nothing. Another ongoing flush or did we fail last attempt?");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      LOG.debug("FLUSHING TO DISK {}, store={}",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      stopCompaction();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      pushActiveToPipeline(this.active);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      if (compositeSnapshot) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        pushPipelineToSnapshot();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      } else {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        pushTailToSnapshot();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      compactor.resetStats();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  /**<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   * On flush, how much memory we will clear.<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * @return size of data that is going to be flushed<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  @Override<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  public MemStoreSize getFlushableSize() {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      if (compositeSnapshot) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      } else {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        snapshotSizing = pipeline.getTailSizing();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        : new MemStoreSize(active.getMemStoreSize());<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  @Override<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  protected long keySize() {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    long k = this.active.keySize();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      k += segment.keySize();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    return k;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>  @Override<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  protected long heapSize() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    long h = this.active.heapSize();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      h += segment.heapSize();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    return h;<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>  @Override<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      WAL WAL = getRegionServices().getWAL();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      if (WAL != null) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  }<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>   * This message intends to inform the MemStore that next coming updates<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * are going to be part of the replaying edits from WAL<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  public void startReplayingFromWAL() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    inWalReplay = true;<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>  /**<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * are done<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   */<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public void stopReplayingFromWAL() {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    inWalReplay = false;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // the getSegments() method is used for tests only<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  @VisibleForTesting<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  @Override<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    list.add(this.active);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    list.addAll(pipelineList);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    return list;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      boolean merge) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    // last true stands for updating the region size<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    return pipeline.swap(versionedList, result, !merge, true);<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>  /**<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   *           The flattening happens only if versions match.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  // setter is used only for testability<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  @VisibleForTesting<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  void setIndexType(IndexType type) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    indexType = type;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    // If it is needed, please change in-memory flush size explicitly<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>  public IndexType getIndexType() {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return indexType;<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>  public boolean hasImmutableSegments() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    return !pipeline.isEmpty();<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>  public VersionedSegmentsList getImmutableSegments() {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return pipeline.getVersionedList();<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>  public long getSmallestReadPoint() {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    return store.getSmallestReadPoint();<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>  public HStore getStore() {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return store;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  public String getFamilyName() {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  @Override<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /*<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    MutableSegment activeTmp = active;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    // The order is the Segment ordinal<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    return list;<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>   @VisibleForTesting<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Check whether anything need to be done based on the current active set size.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * The method is invoked upon every addition to the active set.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * size is above threshold<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  @Override<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  protected void checkActiveSize() {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    if (shouldFlushInMemory()) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      * in the shared mode. */<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      if (LOG.isTraceEnabled()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        LOG.trace(<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      getPool().execute(runnable);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  // internally used method, externally visible only for tests<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  // otherwise there is a deadlock<a name="line.401"></a>
-<span class="sourceLineNo">402</span>  @VisibleForTesting<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  void flushInMemory() throws IOException {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    inMemoryFlushInProgress.set(true);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    try {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      // Phase I: Update the pipeline<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      getRegionServices().blockUpdates();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        pushActiveToPipeline(this.active);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      } finally {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        getRegionServices().unblockUpdates();<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      }<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>      // Used by tests<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      if (!allowCompaction.get()) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      // Phase II: Compact the pipeline<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      try {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        // compaction is in progress<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        compactor.start();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      } catch (IOException e) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.427"></a>
-<span class="sourceLineNo">428</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    } finally {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      inMemoryFlushInProgress.set(false);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      LOG.trace("IN-MEMORY FLUSH: end");<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
-<span class="sourceLineNo">435</span><a name="line.435"></a>
-<span class="sourceLineNo">436</span>  private Segment getLastSegment() {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    Segment localActive = getActive();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    Segment tail = pipeline.getTail();<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    return tail == null ? localActive : tail;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>  private byte[] getFamilyNameInBytes() {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    return store.getColumnFamilyDescriptor().getName();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
-<span class="sourceLineNo">445</span><a name="line.445"></a>
-<span class="sourceLineNo">446</span>  private ThreadPoolExecutor getPool() {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    return getRegionServices().getInMemoryCompactionPool();<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>  @VisibleForTesting<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  protected boolean shouldFlushInMemory() {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        return false;     // regardless the size<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      // the insert of the active into the compaction pipeline<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    return false;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
-<span class="sourceLineNo">462</span><a name="line.462"></a>
-<span class="sourceLineNo">463</span>  /**<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * The compaction may still happen if the request was sent too late<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * Non-blocking request<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  private void stopCompaction() {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    if (inMemoryFlushInProgress.get()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      compactor.stop();<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><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    if (!active.isEmpty()) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      pipeline.pushHead(active);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      resetActive();<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<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>  private void pushTailToSnapshot() {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    pipeline.swap(segments,null,false, false);<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>  private void pushPipelineToSnapshot() {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    int iterationsCnt = 0;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    boolean done = false;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    while (!done) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      iterationsCnt++;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      // and the version increase, the chance of it happenning is very low<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      done = pipeline.swap(segments, null, false, false);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      if (iterationsCnt&gt;2) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        // practically it is impossible that this loop iterates more than two times<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.503"></a>
-<span class="sourceLineNo">504</span>            " while flushing to disk.");<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        break;<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      }<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><a name="line.510"></a>
-<span class="sourceLineNo">511</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    if(segments.isEmpty()) return;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      this.snapshot = segments.get(0);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      return;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    } else { // create composite snapshot<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      this.snapshot =<a name="line.517"></a>
-<span class="sourceLineNo">518</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<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><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  private RegionServicesForStores getRegionServices() {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    return regionServices;<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>  /**<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  * There is at most one thread per memstore instance.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  * and compacts the pipeline.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  */<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    @Override<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    public void run() {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      try {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        flushInMemory();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      } catch (IOException e) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.539"></a>
-<span class="sourceLineNo">540</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.540"></a>
-<span class="sourceLineNo">541</span>            + "store: "+ getFamilyName(), e);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  @VisibleForTesting<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  boolean isMemStoreFlushingInMemory() {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return inMemoryFlushInProgress.get();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
-<span class="sourceLineNo">550</span><a name="line.550"></a>
-<span class="sourceLineNo">551</span>  /**<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   *             first.<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * @return Next row or null if none found.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  Cell getNextRow(final Cell cell) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    Cell lowest = null;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    for (Segment segment : segments) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      if (lowest == null) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      } else {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return lowest;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  }<a name="line.567"></a>
-<span class="sourceLineNo">568</span><a name="line.568"></a>
-<span class="sourceLineNo">569</span>  @VisibleForTesting<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  long getInmemoryFlushSize() {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    return inmemoryFlushSize;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  }<a name="line.572"></a>
-<span class="sourceLineNo">573</span><a name="line.573"></a>
-<span class="sourceLineNo">574</span>  // debug method<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public void debug() {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    String msg = "active size=" + this.active.keySize();<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    msg += " inMemoryFlushInProgress is "+ (inMemoryFlushInProgress.get() ? "true" : "false");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    LOG.debug(msg);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>}<a name="line.583"></a>
+<span class="sourceLineNo">122</span>    LOG.info("Store={}, in-memory flush size threshold={}, immutable segments index type={}, " +<a name="line.122"></a>
+<span class="sourceLineNo">123</span>            "compactor={}", this.store.getColumnFamilyName(),<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        StringUtils.byteDesc(this.inmemoryFlushSize), this.indexType,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        (this.compactor == null? "NULL": this.compactor.toString()));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  @VisibleForTesting<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  protected MemStoreCompactor createMemStoreCompactor(MemoryCompactionPolicy compactionPolicy)<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      throws IllegalArgumentIOException {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    return new MemStoreCompactor(this, compactionPolicy);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  }<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private void initInmemoryFlushSize(Configuration conf) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    double factor = 0;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    long memstoreFlushSize = getRegionServices().getMemStoreFlushSize();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    int numStores = getRegionServices().getNumStores();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    if (numStores &lt;= 1) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      // Family number might also be zero in some of our unit test case<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      numStores = 1;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    inmemoryFlushSize = memstoreFlushSize / numStores;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    // multiply by a factor (the same factor for all index types)<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    factor = conf.getDouble(IN_MEMORY_FLUSH_THRESHOLD_FACTOR_KEY,<a name="line.144"></a>
+<span class="sourceLineNo">145</span>          IN_MEMORY_FLUSH_THRESHOLD_FACTOR_DEFAULT);<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    inmemoryFlushSize = (long) (inmemoryFlushSize * factor);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * @return Total memory occupied by this MemStore. This won't include any size occupied by the<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   *         snapshot. We assume the snapshot will get cleared soon. This is not thread safe and<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   *         the memstore may be changed while computing its size. It is the responsibility of the<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   *         caller to make sure this doesn't happen.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  @Override<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  public MemStoreSize size() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    MemStoreSizing memstoreSizing = new MemStoreSizing();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    memstoreSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    for (Segment item : pipeline.getSegments()) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      memstoreSizing.incMemStoreSize(item.getMemStoreSize());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    }<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    return memstoreSizing;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>  /**<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * This method is called before the flush is executed.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @return an estimation (lower bound) of the unflushed sequence id in memstore after the flush<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * is executed. if memstore will be cleared returns {@code HConstants.NO_SEQNUM}.<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  @Override<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public long preFlushSeqIDEstimation() {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    if(compositeSnapshot) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return HConstants.NO_SEQNUM;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    Segment segment = getLastSegment();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    if(segment == null) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      return HConstants.NO_SEQNUM;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    }<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return segment.getMinSequenceId();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @Override<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public boolean isSloppy() {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    return true;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * Push the current active memstore segment into the pipeline<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * and create a snapshot of the tail of current compaction pipeline<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Snapshot must be cleared by call to {@link #clearSnapshot}.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * {@link #clearSnapshot(long)}.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * @return {@link MemStoreSnapshot}<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   */<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  @Override<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  public MemStoreSnapshot snapshot() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    // If snapshot currently has entries, then flusher failed or didn't call<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    // cleanup.  Log a warning.<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (!this.snapshot.isEmpty()) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      LOG.warn("Snapshot called again without clearing previous. " +<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          "Doing nothing. Another ongoing flush or did we fail last attempt?");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    } else {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      LOG.debug("FLUSHING TO DISK {}, store={}",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      stopCompaction();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      pushActiveToPipeline(this.active);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      if (compositeSnapshot) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        pushPipelineToSnapshot();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      } else {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        pushTailToSnapshot();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      compactor.resetStats();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>  /**<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   * On flush, how much memory we will clear.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * @return size of data that is going to be flushed<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   */<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  @Override<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  public MemStoreSize getFlushableSize() {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      if (compositeSnapshot) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      } else {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        snapshotSizing = pipeline.getTailSizing();<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>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        : new MemStoreSize(active.getMemStoreSize());<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>  @Override<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  protected long keySize() {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    long k = this.active.keySize();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      k += segment.keySize();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    return k;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>  @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  protected long heapSize() {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    long h = this.active.heapSize();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      h += segment.heapSize();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    }<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    return h;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
+<span class="sourceLineNo">258</span><a name="line.258"></a>
+<span class="sourceLineNo">259</span>  @Override<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      WAL WAL = getRegionServices().getWAL();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (WAL != null) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * This message intends to inform the MemStore that next coming updates<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * are going to be part of the replaying edits from WAL<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  public void startReplayingFromWAL() {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    inWalReplay = true;<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>  /**<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * are done<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 stopReplayingFromWAL() {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    inWalReplay = false;<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>  // the getSegments() method is used for tests only<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  @VisibleForTesting<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Override<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    list.add(this.active);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    list.addAll(pipelineList);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span>    return list;<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>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      boolean merge) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    // last true stands for updating the region size<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    return pipeline.swap(versionedList, result, !merge, true);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<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>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.316"></a>
+<span class="sourceLineNo">317</span>   *           The flattening happens only if versions match.<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>  // setter is used only for testability<a name="line.323"></a>
+<span class="sourceLineNo">324</span>  @VisibleForTesting<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  void setIndexType(IndexType type) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    indexType = type;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    // If it is needed, please change in-memory flush size explicitly<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>  public IndexType getIndexType() {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return indexType;<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>  public boolean hasImmutableSegments() {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return !pipeline.isEmpty();<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>  public VersionedSegmentsList getImmutableSegments() {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    return pipeline.getVersionedList();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  public long getSmallestReadPoint() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return store.getSmallestReadPoint();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>  public HStore getStore() {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    return store;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>  public String getFamilyName() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  @Override<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  /*<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   */<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    MutableSegment activeTmp = active;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    // The order is the Segment ordinal<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return list;<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>   @VisibleForTesting<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   }<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>   * Check whether anything need to be done based on the current active set size.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * The method is invoked upon every addition to the active set.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * size is above threshold<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  @Override<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  protected void checkActiveSize() {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    if (shouldFlushInMemory()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      * in the shared mode. */<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      if (LOG.isTraceEnabled()) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        LOG.trace(<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      }<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      getPool().execute(runnable);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>  // internally used method, externally visible only for tests<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  // otherwise there is a deadlock<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @VisibleForTesting<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  void flushInMemory() throws IOException {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    inMemoryFlushInProgress.set(true);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    try {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // Phase I: Update the pipeline<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      getRegionServices().blockUpdates();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      try {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        pushActiveToPipeline(this.active);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      } finally {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        getRegionServices().unblockUpdates();<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>      // Used by tests<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      if (!allowCompaction.get()) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        return;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      // Phase II: Compact the pipeline<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      try {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        // compaction is in progress<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        compactor.start();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      } catch (IOException e) {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.429"></a>
+<span class="sourceLineNo">430</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    } finally {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      inMemoryFlushInProgress.set(false);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      LOG.trace("IN-MEMORY FLUSH: end");<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><a name="line.437"></a>
+<span class="sourceLineNo">438</span>  private Segment getLastSegment() {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    Segment localActive = getActive();<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    Segment tail = pipeline.getTail();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    return tail == null ? localActive : tail;<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>  private byte[] getFamilyNameInBytes() {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    return store.getColumnFamilyDescriptor().getName();<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>  private ThreadPoolExecutor getPool() {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    return getRegionServices().getInMemoryCompactionPool();<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>  @VisibleForTesting<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  protected boolean shouldFlushInMemory() {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        return false;     // regardless the size<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // the insert of the active into the compaction pipeline<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    return false;<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>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * The compaction may still happen if the request was sent too late<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * Non-blocking request<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   */<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  private void stopCompaction() {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    if (inMemoryFlushInProgress.get()) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      compactor.stop();<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>  }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    if (!active.isEmpty()) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      pipeline.pushHead(active);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      resetActive();<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><a name="line.482"></a>
+<span class="sourceLineNo">483</span>  private void pushTailToSnapshot() {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    pipeline.swap(segments,null,false, false);<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>  private void pushPipelineToSnapshot() {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    int iterationsCnt = 0;<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    boolean done = false;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    while (!done) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      iterationsCnt++;<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      // and the version increase, the chance of it happenning is very low<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      done = pipeline.swap(segments, null, false, false);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      if (iterationsCnt&gt;2) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        // practically it is impossible that this loop iterates more than two times<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            " while flushing to disk.");<a name="line.506"></a>
+<span class="sourceLineNo">507</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        break;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span><a name="line.512"></a>
+<span class="sourceLineNo">513</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    if(segments.isEmpty()) return;<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>      this.snapshot = segments.get(0);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      return;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    } else { // create composite snapshot<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      this.snapshot =<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    }<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>  private RegionServicesForStores getRegionServices() {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    return regionServices;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>  }<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>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  * There is at most one thread per memstore instance.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  * and compacts the pipeline.<a name="line.532"></a>
+<span class="sourceLineNo">533</span>  */<a name="line.533"></a>
+<span class="sourceLineNo">534</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.534"></a>
+<span class="sourceLineNo">535</span><a name="line.535"></a>
+<span class="sourceLineNo">536</span>    @Override<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    public void run() {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      try {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        flushInMemory();<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      } catch (IOException e) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.541"></a>
+<span class="sourceLineNo">542</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.542"></a>
+<span class="sourceLineNo">543</span>            + "store: "+ getFamilyName(), e);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>  }<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>  @VisibleForTesting<a name="line.548"></a>
+<span class="sourceLineNo">549</span>  boolean isMemStoreFlushingInMemory() {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    return inMemoryFlushInProgress.get();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   *             first.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>   * @return Next row or null if none found.<a name="line.556"></a>
+<span class="sourceLineNo">557</span>   */<a name="line.557"></a>
+<span class="sourceLineNo">558</span>  Cell getNextRow(final Cell cell) {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    Cell lowest = null;<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    for (Segment segment : segments) {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      if (lowest == null) {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      } else {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      }<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    }<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    return lowest;<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>  @VisibleForTesting<a name="line.571"></a>
+<span class="sourceLineNo">572</span>  long getInmemoryFlushSize() {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return inmemoryFlushSize;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  // debug method<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  public void debug() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    String msg = "active size=" + this.active.keySize();<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    msg += " inMemoryFlushInProgress is "+ (inMemoryFlushInProgress.get() ? "true" : "false");<a name="line

<TRUNCATED>

[18/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html
index 3d9a087..b48d11e 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html
@@ -287,7 +287,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/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html#line.112">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html#line.118">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:
@@ -307,7 +307,7 @@ for (MemStoreCompactionStrategy.Action c : MemStoreCompactionStrategy.Action.val
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html#line.112">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/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html#line.118">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 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html
index 371bde3..a5c2872 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":6,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10};
+var methods = {"i0":10,"i1":6,"i2":10,"i3":10,"i4":6,"i5":10,"i6":10,"i7":10,"i8":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -236,15 +236,23 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#getMergingAction--">getMergingAction</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i4" class="altColor">
+<td class="colFirst"><code>protected abstract <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/regionserver/MemStoreCompactionStrategy.html#getName--">getName</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#resetStats--">resetStats</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#simpleMergeOrFlatten-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">simpleMergeOrFlatten</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList,
                     <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;strategy)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
+<td class="colFirst"><code><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/regionserver/MemStoreCompactionStrategy.html#toString--">toString</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#updateStats-org.apache.hadoop.hbase.regionserver.Segment-">updateStats</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&nbsp;replacement)</code>&nbsp;</td>
 </tr>
@@ -254,7 +262,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;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">Object</a></h3>
-<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
 </ul>
 </li>
 </ul>
@@ -349,13 +357,35 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <!--   -->
 </a>
 <h3>Method Detail</h3>
+<a name="toString--">
+<!--   -->
+</a>
+<ul class="blockList">
+<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/regionserver/MemStoreCompactionStrategy.html#line.77">toString</a>()</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="getName--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getName</h4>
+<pre>protected abstract&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/regionserver/MemStoreCompactionStrategy.html#line.81">getName</a>()</pre>
+</li>
+</ul>
 <a name="getAction-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getAction</h4>
-<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.77">getAction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList)</pre>
+<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.84">getAction</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList)</pre>
 </li>
 </ul>
 <a name="updateStats-org.apache.hadoop.hbase.regionserver.Segment-">
@@ -364,7 +394,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateStats</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.80">updateStats</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&nbsp;replacement)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.87">updateStats</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&nbsp;replacement)</pre>
 </li>
 </ul>
 <a name="resetStats--">
@@ -373,7 +403,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>resetStats</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.82">resetStats</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.89">resetStats</a>()</pre>
 </li>
 </ul>
 <a name="simpleMergeOrFlatten-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">
@@ -382,7 +412,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>simpleMergeOrFlatten</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.84">simpleMergeOrFlatten</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.91">simpleMergeOrFlatten</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList,
                                                                  <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;strategy)</pre>
 </li>
 </ul>
@@ -392,7 +422,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMergingAction</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.97">getMergingAction</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.104">getMergingAction</a>()</pre>
 </li>
 </ul>
 <a name="getFlattenAction--">
@@ -401,7 +431,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlattenAction</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.101">getFlattenAction</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.108">getFlattenAction</a>()</pre>
 </li>
 </ul>
 <a name="compact-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-java.lang.String-">
@@ -410,7 +440,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>compact</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.105">compact</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.html#line.112">compact</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList,
                                                     <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;strategyInfo)</pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html
index 1de79ae..78e1e45 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -249,13 +249,17 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  Non-blocking request</div>
 </td>
 </tr>
+<tr id="i7" class="rowColor">
+<td class="colFirst"><code><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/regionserver/MemStoreCompactor.html#toString--">toString</a></span>()</code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;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">Object</a></h3>
-<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
 </ul>
 </li>
 </ul>
@@ -365,13 +369,26 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <!--   -->
 </a>
 <h3>Method Detail</h3>
+<a name="toString--">
+<!--   -->
+</a>
+<ul class="blockList">
+<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/regionserver/MemStoreCompactor.html#line.83">toString</a>()</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="start--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.87">start</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.92">start</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">----------------------------------------------------------------------
  The request to dispatch the compaction asynchronous task.
@@ -389,7 +406,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.118">stop</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.123">stop</a>()</pre>
 <div class="block">----------------------------------------------------------------------
  The request to cancel the compaction asynchronous task
  The compaction may still happen if the request was sent too late
@@ -402,7 +419,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>resetStats</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.123">resetStats</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.128">resetStats</a>()</pre>
 </li>
 </ul>
 <a name="releaseResources--">
@@ -411,7 +428,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseResources</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.131">releaseResources</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.136">releaseResources</a>()</pre>
 <div class="block">----------------------------------------------------------------------
  Reset the interruption indicator and clear the pointers in order to allow good
  garbage collection</div>
@@ -423,7 +440,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>doCompaction</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.141">doCompaction</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.146">doCompaction</a>()</pre>
 <div class="block">----------------------------------------------------------------------
  The worker thread performs the compaction asynchronously.
  The solo (per compactor) thread only reads the compaction pipeline.
@@ -436,7 +453,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createSubstitution</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">ImmutableSegment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.200">createSubstitution</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;action)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">ImmutableSegment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.205">createSubstitution</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;action)
                                      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">----------------------------------------------------------------------
  Creation of the ImmutableSegment either by merge or copy-compact of the segments of the
@@ -453,7 +470,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>initiateCompactionStrategy</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.237">initiateCompactionStrategy</a>(<a href="../../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase">MemoryCompactionPolicy</a>&nbsp;compType,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.html#line.242">initiateCompactionStrategy</a>(<a href="../../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase">MemoryCompactionPolicy</a>&nbsp;compType,
                                 org.apache.hadoop.conf.Configuration&nbsp;configuration,
                                 <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;cfName)
                          throws <a href="../../../../../org/apache/hadoop/hbase/exceptions/IllegalArgumentIOException.html" title="class in org.apache.hadoop.hbase.exceptions">IllegalArgumentIOException</a></pre>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/MemStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/MemStore.html b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/MemStore.html
index 72e47bf..8ec88c9 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/MemStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/MemStore.html
@@ -135,6 +135,19 @@
 </tr>
 </tbody>
 </table>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
+<caption><span>Methods in <a href="../../../../../../org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a> that return <a href="../../../../../../org/apache/hadoop/hbase/regionserver/MemStore.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStore</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 <a href="../../../../../../org/apache/hadoop/hbase/regionserver/MemStore.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStore</a></code></td>
+<td class="colLast"><span class="typeNameLabel">HStore.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getMemstore--">getMemstore</a></span>()</code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 1b36782..8d5fac5 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -704,20 +704,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/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/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/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/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/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/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/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 2731576..b377318 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -130,9 +130,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&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/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
-<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/21347dff/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 f6fc79b..a4ab1b7 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/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index bf7ef69..f6d74ff 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -138,8 +138,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.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 29d7634..13f949c 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/21347dff/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 5958135..696a5c1 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -533,13 +533,13 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&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/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/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/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/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/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/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/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/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/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index c0e28b4..9ec5b35 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -189,8 +189,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&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/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">WALFactory.Providers</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/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 68f6ec1..643aaaa 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 = "1e56938757d2958631ac1ea07387eaa61997d84a";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "219625233c1e8ad9daf2c35bc2e3a0844e1b97ba";<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 Apr  1 14:41:16 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Tue Apr  3 14:41:01 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 = "2e76f99b04d039004b3db1b121ecb142";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "f835792dd6c4970ab511e58632d939d6";<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/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.ModifyableTableDescriptor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.ModifyableTableDescriptor.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.ModifyableTableDescriptor.html
index 64a63e6..fc17f3d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.ModifyableTableDescriptor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.ModifyableTableDescriptor.html
@@ -190,8 +190,8 @@
 <span class="sourceLineNo">182</span>  public static final boolean DEFAULT_NORMALIZATION_ENABLED = false;<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>   * Constant that denotes the maximum default size of the memstore after which<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * the contents are flushed to the store files<a name="line.186"></a>
+<span class="sourceLineNo">185</span>   * Constant that denotes the maximum default size of the memstore in bytes after which<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * the contents are flushed to the store files.<a name="line.186"></a>
 <span class="sourceLineNo">187</span>   */<a name="line.187"></a>
 <span class="sourceLineNo">188</span>  public static final long DEFAULT_MEMSTORE_FLUSH_SIZE = 1024 * 1024 * 128L;<a name="line.188"></a>
 <span class="sourceLineNo">189</span><a name="line.189"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
index 64a63e6..fc17f3d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html
@@ -190,8 +190,8 @@
 <span class="sourceLineNo">182</span>  public static final boolean DEFAULT_NORMALIZATION_ENABLED = false;<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>   * Constant that denotes the maximum default size of the memstore after which<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * the contents are flushed to the store files<a name="line.186"></a>
+<span class="sourceLineNo">185</span>   * Constant that denotes the maximum default size of the memstore in bytes after which<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * the contents are flushed to the store files.<a name="line.186"></a>
 <span class="sourceLineNo">187</span>   */<a name="line.187"></a>
 <span class="sourceLineNo">188</span>  public static final long DEFAULT_MEMSTORE_FLUSH_SIZE = 1024 * 1024 * 128L;<a name="line.188"></a>
 <span class="sourceLineNo">189</span><a name="line.189"></a>


[14/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
index 12d10e1..97ceefd 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileBlock.FSReaderImpl.html
@@ -1740,384 +1740,380 @@
 <span class="sourceLineNo">1732</span>      // and will save us having to seek the stream backwards to reread the header we<a name="line.1732"></a>
 <span class="sourceLineNo">1733</span>      // read the last time through here.<a name="line.1733"></a>
 <span class="sourceLineNo">1734</span>      ByteBuffer headerBuf = getCachedHeader(offset);<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>      if (LOG.isTraceEnabled()) {<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        LOG.trace("Reading " + this.fileContext.getHFileName() + " at offset=" + offset +<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>          ", pread=" + pread + ", verifyChecksum=" + verifyChecksum + ", cachedHeader=" +<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>          headerBuf + ", onDiskSizeWithHeader=" + onDiskSizeWithHeader);<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>      }<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>      // file has support for checksums (version 2+).<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>      long startTime = System.currentTimeMillis();<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>        if (headerBuf == null) {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>          if (LOG.isTraceEnabled()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>          }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>              offset, pread);<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      // the header we read last time through here.<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>      if (headerBuf != null) {<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>        // read. Copy to this block's header.<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>      } else {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>      }<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      if (verifyChecksum &amp;&amp;<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span>        return null;<a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>      }<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>      if (updateMetrics) {<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>        HFile.updateReadLatency(duration, pread);<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>      }<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>      HFileBlock hFileBlock =<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>      // Run check on uncompressed sizings.<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>      }<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>      if (LOG.isTraceEnabled()) {<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>        LOG.trace("Read " + hFileBlock + " in " + duration + " ns");<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>      }<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>      // Cache next block header if we read it for the next time through here.<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>      }<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>      return hFileBlock;<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    }<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span><a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>    @Override<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    }<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span><a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    @Override<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    }<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span><a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>    @Override<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>      return this.encodedBlockDecodingCtx;<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>    }<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span><a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    @Override<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>      return this.defaultDecodingCtx;<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>    }<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span><a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    /**<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>     * If the block doesn't uses checksum, returns false.<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>     * @return True if checksum matches, else false.<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>     */<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>        throws IOException {<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>      // checksum validation failure.<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>        return false;<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>      }<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    @Override<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    public void closeStreams() throws IOException {<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      streamWrapper.close();<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    }<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    @Override<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    public void unbufferStream() {<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>      // unbuffer it.<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>      if (streamLock.tryLock()) {<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>        try {<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>          this.streamWrapper.unbuffer();<a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>        } finally {<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>          streamLock.unlock();<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>        }<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>      }<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>    }<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span><a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    @Override<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>    public String toString() {<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    }<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>  }<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span><a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>  @VisibleForTesting<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>        totalChecksumBytes()) {<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>      throw new IOException("Using no compression but "<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>    }<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>  }<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span><a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>  // Cacheable implementation<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>  @Override<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>  public int getSerializedLength() {<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    if (buf != null) {<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>      // Include extra bytes for block metadata.<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    return 0;<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>  }<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span><a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>  // Cacheable implementation<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>  @Override<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>  public void serialize(ByteBuffer destination) {<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    // Make sure any changes in here are reflected over there.<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    destination = addMetaData(destination);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>    // metadata.<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    destination.flip();<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>  }<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span><a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>  /**<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>   * For use by bucketcache. This exposes internals.<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>   */<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>  public ByteBuffer getMetaData() {<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    bb = addMetaData(bb);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>    bb.flip();<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    return bb;<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>  }<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span><a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>  /**<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>   */<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    destination.putLong(this.offset);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    return destination;<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>  }<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span><a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>  // Cacheable implementation<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>  @Override<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span>  }<a name="line.1937"></a>
-<span class="sourceLineNo">1938</span><a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>  @Override<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>  public int hashCode() {<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    int result = 1;<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>    result = result * 31 + blockType.hashCode();<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    result = result * 31 + buf.hashCode();<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    return result;<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>  }<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span><a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>  @Override<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>  public boolean equals(Object comparison) {<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    if (this == comparison) {<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span>      return true;<a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    }<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    if (comparison == null) {<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>      return false;<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    }<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>      return false;<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    }<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span><a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span><a name="line.1965"></a>
-<span class="sourceLineNo">1966</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>      return false;<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    }<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1969"></a>
+<span class="sourceLineNo">1735</span>      LOG.trace("Reading {} at offset={}, pread={}, verifyChecksum={}, cachedHeader={}, " +<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>          "onDiskSizeWithHeader={}", this.fileContext.getHFileName(), offset, pread,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>          verifyChecksum, headerBuf, onDiskSizeWithHeader);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      // This is NOT same as verifyChecksum. This latter is whether to do hbase<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>      // checksums. Can change with circumstances. The below flag is whether the<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>      // file has support for checksums (version 2+).<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>      boolean checksumSupport = this.fileContext.isUseHBaseChecksum();<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      long startTime = System.currentTimeMillis();<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      if (onDiskSizeWithHeader &lt;= 0) {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        // We were not passed the block size. Need to get it from the header. If header was<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>        // not cached (see getCachedHeader above), need to seek to pull it in. This is costly<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        // and should happen very rarely. Currently happens on open of a hfile reader where we<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>        // read the trailer blocks to pull in the indices. Otherwise, we are reading block sizes<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>        // out of the hfile index. To check, enable TRACE in this file and you'll get an exception<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>        // in a LOG every time we seek. See HBASE-17072 for more detail.<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>        if (headerBuf == null) {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>          if (LOG.isTraceEnabled()) {<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>            LOG.trace("Extra see to get block size!", new RuntimeException());<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          }<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          headerBuf = ByteBuffer.allocate(hdrSize);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>          readAtOffset(is, headerBuf.array(), headerBuf.arrayOffset(), hdrSize, false,<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>              offset, pread);<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        }<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>        onDiskSizeWithHeader = getOnDiskSizeWithHeader(headerBuf, checksumSupport);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>      }<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>      int preReadHeaderSize = headerBuf == null? 0 : hdrSize;<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>      // Allocate enough space to fit the next block's header too; saves a seek next time through.<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>      // onDiskBlock is whole block + header + checksums then extra hdrSize to read next header;<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>      // onDiskSizeWithHeader is header, body, and any checksums if present. preReadHeaderSize<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>      // says where to start reading. If we have the header cached, then we don't need to read<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>      // it again and we can likely read from last place we left off w/o need to backup and reread<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      // the header we read last time through here.<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>      // TODO: Make this ByteBuffer-based. Will make it easier to go to HDFS with BBPool (offheap).<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>      byte [] onDiskBlock = new byte[onDiskSizeWithHeader + hdrSize];<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>      int nextBlockOnDiskSize = readAtOffset(is, onDiskBlock, preReadHeaderSize,<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>          onDiskSizeWithHeader - preReadHeaderSize, true, offset + preReadHeaderSize, pread);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      if (headerBuf != null) {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        // The header has been read when reading the previous block OR in a distinct header-only<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>        // read. Copy to this block's header.<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>        System.arraycopy(headerBuf.array(), headerBuf.arrayOffset(), onDiskBlock, 0, hdrSize);<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>      } else {<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>        headerBuf = ByteBuffer.wrap(onDiskBlock, 0, hdrSize);<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>      }<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>      // Do a few checks before we go instantiate HFileBlock.<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>      assert onDiskSizeWithHeader &gt; this.hdrSize;<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>      verifyOnDiskSizeMatchesHeader(onDiskSizeWithHeader, headerBuf, offset, checksumSupport);<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>      ByteBuffer onDiskBlockByteBuffer = ByteBuffer.wrap(onDiskBlock, 0, onDiskSizeWithHeader);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>      // Verify checksum of the data before using it for building HFileBlock.<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>      if (verifyChecksum &amp;&amp;<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>          !validateChecksum(offset, onDiskBlockByteBuffer, hdrSize)) {<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        return null;<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>      }<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>      long duration = System.currentTimeMillis() - startTime;<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>      if (updateMetrics) {<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>        HFile.updateReadLatency(duration, pread);<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>      }<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      // The onDiskBlock will become the headerAndDataBuffer for this block.<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>      // If nextBlockOnDiskSizeWithHeader is not zero, the onDiskBlock already<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>      // contains the header of next block, so no need to set next block's header in it.<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>      HFileBlock hFileBlock =<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>          new HFileBlock(new SingleByteBuff(onDiskBlockByteBuffer), checksumSupport,<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>              MemoryType.EXCLUSIVE, offset, nextBlockOnDiskSize, fileContext);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>      // Run check on uncompressed sizings.<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>      if (!fileContext.isCompressedOrEncrypted()) {<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>        hFileBlock.sanityCheckUncompressed();<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>      }<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>      LOG.trace("Read {} in {} ns", hFileBlock, duration);<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>      // Cache next block header if we read it for the next time through here.<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>      if (nextBlockOnDiskSize != -1) {<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>        cacheNextBlockHeader(offset + hFileBlock.getOnDiskSizeWithHeader(),<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>            onDiskBlock, onDiskSizeWithHeader, hdrSize);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>      }<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>      return hFileBlock;<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>    }<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span><a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>    @Override<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    public void setIncludesMemStoreTS(boolean includesMemstoreTS) {<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>      this.fileContext.setIncludesMvcc(includesMemstoreTS);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    }<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span><a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>    @Override<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    public void setDataBlockEncoder(HFileDataBlockEncoder encoder) {<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span>      encodedBlockDecodingCtx = encoder.newDataBlockDecodingContext(this.fileContext);<a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    }<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span><a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    @Override<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    public HFileBlockDecodingContext getBlockDecodingContext() {<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>      return this.encodedBlockDecodingCtx;<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    }<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span><a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>    @Override<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>    public HFileBlockDecodingContext getDefaultBlockDecodingContext() {<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>      return this.defaultDecodingCtx;<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span>    }<a name="line.1828"></a>
+<span class="sourceLineNo">1829</span><a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    /**<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>     * Generates the checksum for the header as well as the data and then validates it.<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>     * If the block doesn't uses checksum, returns false.<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>     * @return True if checksum matches, else false.<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>     */<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    private boolean validateChecksum(long offset, ByteBuffer data, int hdrSize)<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>        throws IOException {<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>      // If this is an older version of the block that does not have checksums, then return false<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>      // indicating that checksum verification did not succeed. Actually, this method should never<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>      // be called when the minorVersion is 0, thus this is a defensive check for a cannot-happen<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>      // case. Since this is a cannot-happen case, it is better to return false to indicate a<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>      // checksum validation failure.<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>      if (!fileContext.isUseHBaseChecksum()) {<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>        return false;<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>      }<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>      return ChecksumUtil.validateChecksum(data, pathName, offset, hdrSize);<a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    }<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span><a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    @Override<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    public void closeStreams() throws IOException {<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>      streamWrapper.close();<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    }<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    @Override<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    public void unbufferStream() {<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      // To handle concurrent reads, ensure that no other client is accessing the streams while we<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>      // unbuffer it.<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span>      if (streamLock.tryLock()) {<a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>        try {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>          this.streamWrapper.unbuffer();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>        } finally {<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>          streamLock.unlock();<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        }<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>      }<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span>    }<a name="line.1864"></a>
+<span class="sourceLineNo">1865</span><a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    @Override<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    public String toString() {<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>      return "hfs=" + hfs + ", path=" + pathName + ", fileContext=" + fileContext;<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>    }<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>  }<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span><a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>  /** An additional sanity-check in case no compression or encryption is being used. */<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>  @VisibleForTesting<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>  void sanityCheckUncompressed() throws IOException {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>    if (onDiskSizeWithoutHeader != uncompressedSizeWithoutHeader +<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>        totalChecksumBytes()) {<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>      throw new IOException("Using no compression but "<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>          + "onDiskSizeWithoutHeader=" + onDiskSizeWithoutHeader + ", "<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>          + "uncompressedSizeWithoutHeader=" + uncompressedSizeWithoutHeader<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>          + ", numChecksumbytes=" + totalChecksumBytes());<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>    }<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span><a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>  // Cacheable implementation<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Override<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public int getSerializedLength() {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    if (buf != null) {<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>      // Include extra bytes for block metadata.<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>      return this.buf.limit() + BLOCK_METADATA_SPACE;<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    }<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    return 0;<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>  }<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span><a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>  // Cacheable implementation<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>  @Override<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>  public void serialize(ByteBuffer destination) {<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // BE CAREFUL!! There is a custom version of this serialization over in BucketCache#doDrain.<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    // Make sure any changes in here are reflected over there.<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    this.buf.get(destination, 0, getSerializedLength() - BLOCK_METADATA_SPACE);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    destination = addMetaData(destination);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Make it ready for reading. flip sets position to zero and limit to current position which<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    // is what we want if we do not want to serialize the block plus checksums if present plus<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>    // metadata.<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    destination.flip();<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>  }<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span><a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>  /**<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   * For use by bucketcache. This exposes internals.<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>   */<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>  public ByteBuffer getMetaData() {<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    ByteBuffer bb = ByteBuffer.allocate(BLOCK_METADATA_SPACE);<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    bb = addMetaData(bb);<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    bb.flip();<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    return bb;<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>  }<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span><a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>  /**<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>   * Adds metadata at current position (position is moved forward). Does not flip or reset.<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>   * @return The passed &lt;code&gt;destination&lt;/code&gt; with metadata added.<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>   */<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>  private ByteBuffer addMetaData(final ByteBuffer destination) {<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    destination.put(this.fileContext.isUseHBaseChecksum() ? (byte) 1 : (byte) 0);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>    destination.putLong(this.offset);<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    destination.putInt(this.nextBlockOnDiskSize);<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    return destination;<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>  }<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span><a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>  // Cacheable implementation<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span>  @Override<a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>  public CacheableDeserializer&lt;Cacheable&gt; getDeserializer() {<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    return HFileBlock.BLOCK_DESERIALIZER;<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>  }<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span><a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>  @Override<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>  public int hashCode() {<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    int result = 1;<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span>    result = result * 31 + blockType.hashCode();<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    result = result * 31 + nextBlockOnDiskSize;<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    result = result * 31 + (int) (offset ^ (offset &gt;&gt;&gt; 32));<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>    result = result * 31 + onDiskSizeWithoutHeader;<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    result = result * 31 + (int) (prevBlockOffset ^ (prevBlockOffset &gt;&gt;&gt; 32));<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span>    result = result * 31 + uncompressedSizeWithoutHeader;<a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    result = result * 31 + buf.hashCode();<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    return result;<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>  }<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span><a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>  @Override<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>  public boolean equals(Object comparison) {<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    if (this == comparison) {<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>      return true;<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    }<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    if (comparison == null) {<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>      return false;<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    }<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>    if (comparison.getClass() != this.getClass()) {<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>      return false;<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    }<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span><a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    HFileBlock castedComparison = (HFileBlock) comparison;<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    if (castedComparison.blockType != this.blockType) {<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>      return false;<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    }<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>    if (castedComparison.nextBlockOnDiskSize != this.nextBlockOnDiskSize) {<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>      return false;<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span>    }<a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    if (castedComparison.offset != this.offset) {<a name="line.1969"></a>
 <span class="sourceLineNo">1970</span>      return false;<a name="line.1970"></a>
 <span class="sourceLineNo">1971</span>    }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>    // Offset is important. Needed when we have to remake cachekey when block is returned to cache.<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>    if (castedComparison.offset != this.offset) {<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>      return false;<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    }<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>      return false;<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    }<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>      return false;<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span>    }<a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1982"></a>
+<span class="sourceLineNo">1972</span>    if (castedComparison.onDiskSizeWithoutHeader != this.onDiskSizeWithoutHeader) {<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>      return false;<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>    }<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>    if (castedComparison.prevBlockOffset != this.prevBlockOffset) {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      return false;<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    }<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    if (castedComparison.uncompressedSizeWithoutHeader != this.uncompressedSizeWithoutHeader) {<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>      return false;<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>        castedComparison.buf.limit()) != 0) {<a name="line.1982"></a>
 <span class="sourceLineNo">1983</span>      return false;<a name="line.1983"></a>
 <span class="sourceLineNo">1984</span>    }<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    if (ByteBuff.compareTo(this.buf, 0, this.buf.limit(), castedComparison.buf, 0,<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        castedComparison.buf.limit()) != 0) {<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      return false;<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    }<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    return true;<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>  }<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span><a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    }<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    return DataBlockEncoding.NONE;<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>  }<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span><a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>  @VisibleForTesting<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>  byte getChecksumType() {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>    return this.fileContext.getChecksumType().getCode();<a name="line.2001"></a>
+<span class="sourceLineNo">1985</span>    return true;<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  }<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span><a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>  DataBlockEncoding getDataBlockEncoding() {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    if (blockType == BlockType.ENCODED_DATA) {<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>      return DataBlockEncoding.getEncodingById(getDataBlockEncodingId());<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>    }<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    return DataBlockEncoding.NONE;<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>  }<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span><a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>  @VisibleForTesting<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>  byte getChecksumType() {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>    return this.fileContext.getChecksumType().getCode();<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>  }<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span><a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>  int getBytesPerChecksum() {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2001"></a>
 <span class="sourceLineNo">2002</span>  }<a name="line.2002"></a>
 <span class="sourceLineNo">2003</span><a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>  int getBytesPerChecksum() {<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>    return this.fileContext.getBytesPerChecksum();<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>  }<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>  @VisibleForTesting<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    return this.onDiskDataSizeWithHeader;<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  /**<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>   */<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>  int totalChecksumBytes() {<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    // indicates that cached blocks do not have checksum data because<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>    // checksums were already validated when the block was read from disk.<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      return 0;<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        this.fileContext.getBytesPerChecksum());<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  }<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span><a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>  /**<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>   * Returns the size of this block header.<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>   */<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>  public int headerSize() {<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>  }<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span><a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>  /**<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>   * Maps a minor version to the size of the header.<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>   */<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    return usesHBaseChecksum?<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>  }<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span><a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>  /**<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>   */<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>  @VisibleForTesting<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>  // TODO: Why is this in here?<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>  byte[] getDummyHeaderForVersion() {<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>  }<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span><a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>  /**<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>  }<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span><a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>  /**<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>   */<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>  HFileContext getHFileContext() {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    return this.fileContext;<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>  }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span><a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>  @Override<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>  public MemoryType getMemoryType() {<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    return this.memType;<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span><a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>   */<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  boolean usesSharedMemory() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return this.memType == MemoryType.SHARED;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * Convert the contents of the block header into a human readable string.<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>   * has minor version &gt; 0.<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>   */<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>  @VisibleForTesting<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    buf.get(magicBuf);<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    long prevBlockOffset = buf.getLong();<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    byte cksumtype = buf.get();<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    long bytesPerChecksum = buf.getInt();<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>                   " blockType " + bt +<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>                   " compressedBlockSizeNoHeader " +<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>                   compressedBlockSizeNoHeader +<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>                   uncompressedBlockSizeNoHeader +<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2106"></a>
+<span class="sourceLineNo">2004</span>  /** @return the size of data on disk + header. Excludes checksum. */<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>  @VisibleForTesting<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>  int getOnDiskDataSizeWithHeader() {<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    return this.onDiskDataSizeWithHeader;<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>  }<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span><a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>  /**<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>   * Calculate the number of bytes required to store all the checksums<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>   * for this block. Each checksum value is a 4 byte integer.<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>   */<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>  int totalChecksumBytes() {<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>    // If the hfile block has minorVersion 0, then there are no checksum<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>    // data to validate. Similarly, a zero value in this.bytesPerChecksum<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    // indicates that cached blocks do not have checksum data because<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    // checksums were already validated when the block was read from disk.<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    if (!fileContext.isUseHBaseChecksum() || this.fileContext.getBytesPerChecksum() == 0) {<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      return 0;<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>    return (int) ChecksumUtil.numBytes(onDiskDataSizeWithHeader,<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>        this.fileContext.getBytesPerChecksum());<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  }<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span><a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>  /**<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>   * Returns the size of this block header.<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span>   */<a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  public int headerSize() {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>    return headerSize(this.fileContext.isUseHBaseChecksum());<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>  }<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>  /**<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>   * Maps a minor version to the size of the header.<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>   */<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>  public static int headerSize(boolean usesHBaseChecksum) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    return usesHBaseChecksum?<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>        HConstants.HFILEBLOCK_HEADER_SIZE: HConstants.HFILEBLOCK_HEADER_SIZE_NO_CHECKSUM;<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span><a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>  /**<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>   */<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>  @VisibleForTesting<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>  // TODO: Why is this in here?<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>  byte[] getDummyHeaderForVersion() {<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    return getDummyHeaderForVersion(this.fileContext.isUseHBaseChecksum());<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>  }<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span><a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>  /**<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>   * Return the appropriate DUMMY_HEADER for the minor version<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>   */<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>  static private byte[] getDummyHeaderForVersion(boolean usesHBaseChecksum) {<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    return usesHBaseChecksum? HConstants.HFILEBLOCK_DUMMY_HEADER: DUMMY_HEADER_NO_CHECKSUM;<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>  }<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span><a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>  /**<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>   * @return This HFileBlocks fileContext which will a derivative of the<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>   * fileContext for the file from which this block's data was originally read.<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>   */<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>  HFileContext getHFileContext() {<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    return this.fileContext;<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>  }<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span><a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>  @Override<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>  public MemoryType getMemoryType() {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    return this.memType;<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>  }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span><a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>  /**<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>   * @return true if this block is backed by a shared memory area(such as that of a BucketCache).<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>   */<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>  boolean usesSharedMemory() {<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    return this.memType == MemoryType.SHARED;<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>  }<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span><a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>  /**<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>   * Convert the contents of the block header into a human readable string.<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>   * This is mostly helpful for debugging. This assumes that the block<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>   * has minor version &gt; 0.<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>   */<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>  @VisibleForTesting<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>  static String toStringHeader(ByteBuff buf) throws IOException {<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>    byte[] magicBuf = new byte[Math.min(buf.limit() - buf.position(), BlockType.MAGIC_LENGTH)];<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    buf.get(magicBuf);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    BlockType bt = BlockType.parse(magicBuf, 0, BlockType.MAGIC_LENGTH);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    int compressedBlockSizeNoHeader = buf.getInt();<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    int uncompressedBlockSizeNoHeader = buf.getInt();<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span>    long prevBlockOffset = buf.getLong();<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    byte cksumtype = buf.get();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    long bytesPerChecksum = buf.getInt();<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    long onDiskDataSizeWithHeader = buf.getInt();<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>    return " Header dump: magic: " + Bytes.toString(magicBuf) +<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>                   " blockType " + bt +<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>                   " compressedBlockSizeNoHeader " +<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>                   compressedBlockSizeNoHeader +<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>                   " uncompressedBlockSizeNoHeader " +<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>                   uncompressedBlockSizeNoHeader +<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>                   " prevBlockOffset " + prevBlockOffset +<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>                   " checksumType " + ChecksumType.codeToType(cksumtype) +<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>                   " bytesPerChecksum " + bytesPerChecksum +<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>                   " onDiskDataSizeWithHeader " + onDiskDataSizeWithHeader;<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  }<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span><a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public HFileBlock deepClone() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    return new HFileBlock(this, true);<a name="line.2106"></a>
 <span class="sourceLineNo">2107</span>  }<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>  public HFileBlock deepClone() {<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    return new HFileBlock(this, true);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>}<a name="line.2112"></a>
+<span class="sourceLineNo">2108</span>}<a name="line.2108"></a>
 
 
 


[19/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
index 7ae1c82..3735b20 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":9,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":9,"i35":10,"i36":9,"i37":9,"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":41,"i94":41,"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};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":9,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":9,"i35":10,"i36":9,"i37":9,"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":41,"i95":41,"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"],32:["t6","Deprecated Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -243,7 +243,9 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private <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></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#currentParallelPutCount">currentParallelPutCount</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#currentParallelPutCount">currentParallelPutCount</a></span></code>
+<div class="block">Use this counter to track concurrent puts.</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a></code></td>
@@ -753,42 +755,46 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getMaxStoreFileAge--">getMaxStoreFileAge</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i65" class="rowColor">
+<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStore</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getMemstore--">getMemstore</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i66" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getMemStoreFlushSize--">getMemStoreFlushSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i66" class="altColor">
+<tr id="i67" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getMemStoreSize--">getMemStoreSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i67" class="rowColor">
+<tr id="i68" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html?is-external=true" title="class or interface in java.util">OptionalLong</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getMinStoreFileAge--">getMinStoreFileAge</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i68" class="altColor">
+<tr id="i69" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getNumHFiles--">getNumHFiles</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i69" class="rowColor">
+<tr id="i70" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getNumReferenceFiles--">getNumReferenceFiles</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i70" class="altColor">
+<tr id="i71" class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/OffPeakHours.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">OffPeakHours</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getOffPeakHours--">getOffPeakHours</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i71" class="rowColor">
+<tr id="i72" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getRegionFileSystem--">getRegionFileSystem</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i72" class="altColor">
+<tr id="i73" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getRegionInfo--">getRegionInfo</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i73" class="rowColor">
+<tr id="i74" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getScanInfo--">getScanInfo</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i74" class="altColor">
+<tr id="i75" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getScanner-org.apache.hadoop.hbase.client.Scan-java.util.NavigableSet-long-">getScanner</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableSet.html?is-external=true" title="class or interface in java.util">NavigableSet</a>&lt;byte[]&gt;&nbsp;targetCols,
@@ -796,7 +802,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block">Return a scanner for both the memstore and the HStore files.</div>
 </td>
 </tr>
-<tr id="i75" class="rowColor">
+<tr id="i76" class="altColor">
 <td class="colFirst"><code><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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getScanners-boolean-boolean-boolean-boolean-org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher-byte:A-byte:A-long-">getScanners</a></span>(boolean&nbsp;cacheBlocks,
            boolean&nbsp;isGet,
@@ -809,7 +815,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block">Get all scanners with no filtering based on TTL (that happens further down the line).</div>
 </td>
 </tr>
-<tr id="i76" class="altColor">
+<tr id="i77" class="rowColor">
 <td class="colFirst"><code><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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getScanners-boolean-boolean-boolean-org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher-byte:A-boolean-byte:A-boolean-long-">getScanners</a></span>(boolean&nbsp;cacheBlocks,
            boolean&nbsp;usePread,
@@ -823,7 +829,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block">Get all scanners with no filtering based on TTL (that happens further down the line).</div>
 </td>
 </tr>
-<tr id="i77" class="rowColor">
+<tr id="i78" class="altColor">
 <td class="colFirst"><code><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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getScanners-java.util.List-boolean-boolean-boolean-boolean-org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher-byte:A-byte:A-long-boolean-">getScanners</a></span>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
            boolean&nbsp;cacheBlocks,
@@ -839,7 +845,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
  (that happens further down the line).</div>
 </td>
 </tr>
-<tr id="i78" class="altColor">
+<tr id="i79" class="rowColor">
 <td class="colFirst"><code><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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getScanners-java.util.List-boolean-boolean-boolean-org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher-byte:A-boolean-byte:A-boolean-long-boolean-">getScanners</a></span>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
            boolean&nbsp;cacheBlocks,
@@ -856,69 +862,69 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
  (that happens further down the line).</div>
 </td>
 </tr>
-<tr id="i79" class="rowColor">
+<tr id="i80" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getSize--">getSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i80" class="altColor">
+<tr id="i81" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getSmallestReadPoint--">getSmallestReadPoint</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i81" class="rowColor">
+<tr id="i82" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getSnapshotSize--">getSnapshotSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i82" class="altColor">
+<tr id="i83" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;byte[]&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getSplitPoint--">getSplitPoint</a></span>()</code>
 <div class="block">Determines if Store should be split.</div>
 </td>
 </tr>
-<tr id="i83" class="rowColor">
+<tr id="i84" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">StoreEngine</a>&lt;?,?,?,?&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStoreEngine--">getStoreEngine</a></span>()</code>
 <div class="block">Returns the StoreEngine that is backing this concrete implementation of Store.</div>
 </td>
 </tr>
-<tr id="i84" class="altColor">
+<tr id="i85" class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/stream/LongStream.html?is-external=true" title="class or interface in java.util.stream">LongStream</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStoreFileAgeStream--">getStoreFileAgeStream</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i85" class="rowColor">
+<tr id="i86" class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStoreFileFieldSize-java.util.function.ToLongFunction-">getStoreFileFieldSize</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/ToLongFunction.html?is-external=true" title="class or interface in java.util.function">ToLongFunction</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileReader.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileReader</a>&gt;&nbsp;f)</code>&nbsp;</td>
 </tr>
-<tr id="i86" class="altColor">
+<tr id="i87" class="rowColor">
 <td class="colFirst"><code><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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStorefiles--">getStorefiles</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i87" class="rowColor">
+<tr id="i88" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesCount--">getStorefilesCount</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i88" class="altColor">
+<tr id="i89" class="rowColor">
 <td class="colFirst"><code>(package private) long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStoreFileSize-org.apache.hadoop.hbase.regionserver.HStoreFile-">getStoreFileSize</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;file)</code>
 <div class="block">Computes the length of a store file without succumbing to any errors along the way.</div>
 </td>
 </tr>
-<tr id="i89" class="rowColor">
+<tr id="i90" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesRootLevelIndexSize--">getStorefilesRootLevelIndexSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i90" class="altColor">
+<tr id="i91" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesSize--">getStorefilesSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i91" class="rowColor">
+<tr id="i92" class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesSize-java.util.function.Predicate-">getStorefilesSize</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html?is-external=true" title="class or interface in java.util.function">Predicate</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;predicate)</code>&nbsp;</td>
 </tr>
-<tr id="i92" class="altColor">
+<tr id="i93" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStoreFileTtl--">getStoreFileTtl</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i93" class="rowColor">
+<tr id="i94" class="altColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStoreHomedir-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.client.RegionInfo-byte:A-">getStoreHomedir</a></span>(org.apache.hadoop.fs.Path&nbsp;tabledir,
                <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri,
@@ -926,7 +932,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
 </td>
 </tr>
-<tr id="i94" class="altColor">
+<tr id="i95" class="rowColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStoreHomedir-org.apache.hadoop.fs.Path-java.lang.String-byte:A-">getStoreHomedir</a></span>(org.apache.hadoop.fs.Path&nbsp;tabledir,
                <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;encodedName,
@@ -934,25 +940,25 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
 </td>
 </tr>
-<tr id="i95" class="rowColor">
+<tr id="i96" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStoreSizeUncompressed--">getStoreSizeUncompressed</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i96" class="altColor">
+<tr id="i97" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getTableName--">getTableName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i97" class="rowColor">
+<tr id="i98" class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getTotalSize-java.util.Collection-">getTotalSize</a></span>(<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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs)</code>&nbsp;</td>
 </tr>
-<tr id="i98" class="altColor">
+<tr id="i99" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getTotalStaticBloomSize--">getTotalStaticBloomSize</a></span>()</code>
 <div class="block">Returns the total byte size of all Bloom filter bit arrays.</div>
 </td>
 </tr>
-<tr id="i99" class="rowColor">
+<tr id="i100" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getTotalStaticIndexSize--">getTotalStaticIndexSize</a></span>()</code>
 <div class="block">Returns the total size of all index blocks in the data block indexes, including the root level,
@@ -960,34 +966,34 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
  single-level indexes.</div>
 </td>
 </tr>
-<tr id="i100" class="altColor">
+<tr id="i101" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#hasReferences--">hasReferences</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i101" class="rowColor">
+<tr id="i102" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#hasTooManyStoreFiles--">hasTooManyStoreFiles</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i102" class="altColor">
+<tr id="i103" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#heapSize--">heapSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i103" class="rowColor">
+<tr id="i104" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#isPrimaryReplicaStore--">isPrimaryReplicaStore</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i104" class="altColor">
+<tr id="i105" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#isSloppyMemStore--">isSloppyMemStore</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i105" class="rowColor">
+<tr id="i106" class="altColor">
 <td class="colFirst"><code>private <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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#loadStoreFiles--">loadStoreFiles</a></span>()</code>
 <div class="block">Creates an unsorted list of StoreFile loaded in parallel
  from the given directory.</div>
 </td>
 </tr>
-<tr id="i106" class="altColor">
+<tr id="i107" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#logCompactionEndMessage-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl-java.util.List-long-long-">logCompactionEndMessage</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr,
                        <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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs,
@@ -996,63 +1002,63 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block">Log a very elaborate compaction completion message.</div>
 </td>
 </tr>
-<tr id="i107" class="rowColor">
+<tr id="i108" class="altColor">
 <td class="colFirst"><code>private <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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#moveCompactedFilesIntoPlace-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl-java.util.List-org.apache.hadoop.hbase.security.User-">moveCompactedFilesIntoPlace</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr,
                            <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.fs.Path&gt;&nbsp;newFiles,
                            <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</code>&nbsp;</td>
 </tr>
-<tr id="i108" class="altColor">
+<tr id="i109" class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#moveFileIntoPlace-org.apache.hadoop.fs.Path-">moveFileIntoPlace</a></span>(org.apache.hadoop.fs.Path&nbsp;newFile)</code>&nbsp;</td>
 </tr>
-<tr id="i109" class="rowColor">
+<tr id="i110" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#needsCompaction--">needsCompaction</a></span>()</code>
 <div class="block">See if there's too much store files in this store</div>
 </td>
 </tr>
-<tr id="i110" class="altColor">
+<tr id="i111" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#notifyChangedReadersObservers-java.util.List-">notifyChangedReadersObservers</a></span>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs)</code>
 <div class="block">Notify all observers that set of Readers has changed.</div>
 </td>
 </tr>
-<tr id="i111" 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/regionserver/HStore.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">onConfigurationChange</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <div class="block">This method would be called by the <a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>
 </td>
 </tr>
-<tr id="i112" class="altColor">
+<tr id="i113" class="rowColor">
 <td class="colFirst"><code>private <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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#openStoreFiles-java.util.Collection-">openStoreFiles</a></span>(<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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;files)</code>&nbsp;</td>
 </tr>
-<tr id="i113" 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/regionserver/HStore.html#postSnapshotOperation--">postSnapshotOperation</a></span>()</code>
 <div class="block">Perform tasks needed after the completion of snapshot operation.</div>
 </td>
 </tr>
-<tr id="i114" class="altColor">
+<tr id="i115" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;org.apache.hadoop.fs.Path,org.apache.hadoop.fs.Path&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#preBulkLoadHFile-java.lang.String-long-">preBulkLoadHFile</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;srcPathStr,
                 long&nbsp;seqNum)</code>
 <div class="block">This method should only be called from Region.</div>
 </td>
 </tr>
-<tr id="i115" class="rowColor">
+<tr id="i116" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#preFlushSeqIDEstimation--">preFlushSeqIDEstimation</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i116" 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/regionserver/HStore.html#preSnapshotOperation--">preSnapshotOperation</a></span>()</code>
 <div class="block">Sets the store up for a region level snapshot operation.</div>
 </td>
 </tr>
-<tr id="i117" class="rowColor">
+<tr id="i118" class="altColor">
 <td class="colFirst"><code><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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#recreateScanners-java.util.List-boolean-boolean-boolean-org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher-byte:A-boolean-byte:A-boolean-long-boolean-">recreateScanners</a></span>(<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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;currentFileScanners,
                 boolean&nbsp;cacheBlocks,
@@ -1068,20 +1074,20 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block">Recreates the scanners on the current list of active store file scanners</div>
 </td>
 </tr>
-<tr id="i118" 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/regionserver/HStore.html#refreshStoreFiles--">refreshStoreFiles</a></span>()</code>
 <div class="block">Checks the underlying store files, and opens the files that have not been opened, and removes
  the store file readers for store files no longer available.</div>
 </td>
 </tr>
-<tr id="i119" 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/regionserver/HStore.html#refreshStoreFiles-java.util.Collection-">refreshStoreFiles</a></span>(<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;<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;&nbsp;newFiles)</code>
 <div class="block">Replaces the store files that the store has with the given files.</div>
 </td>
 </tr>
-<tr id="i120" class="altColor">
+<tr id="i121" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#refreshStoreFilesInternal-java.util.Collection-">refreshStoreFilesInternal</a></span>(<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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;newFiles)</code>
 <div class="block">Checks the underlying store files, and opens the files that  have not
@@ -1089,28 +1095,28 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
  available.</div>
 </td>
 </tr>
-<tr id="i121" 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/regionserver/HStore.html#registerChildren-org.apache.hadoop.hbase.conf.ConfigurationManager-">registerChildren</a></span>(<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&nbsp;manager)</code>
 <div class="block">Needs to be called to register the children to the manager.</div>
 </td>
 </tr>
-<tr id="i122" class="altColor">
+<tr id="i123" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#removeCompactedfiles-java.util.Collection-">removeCompactedfiles</a></span>(<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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;compactedfiles)</code>
 <div class="block">Archives and removes the compacted files</div>
 </td>
 </tr>
-<tr id="i123" class="rowColor">
+<tr id="i124" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#removeUnneededFiles--">removeUnneededFiles</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i124" class="altColor">
+<tr id="i125" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#replaceStoreFiles-java.util.Collection-java.util.Collection-">replaceStoreFiles</a></span>(<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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;compactedFiles,
                  <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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i125" 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/regionserver/HStore.html#replayCompactionMarker-org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor-boolean-boolean-">replayCompactionMarker</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor&nbsp;compaction,
                       boolean&nbsp;pickCompactionFiles,
@@ -1118,78 +1124,78 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block">Call to complete a compaction.</div>
 </td>
 </tr>
-<tr id="i126" class="altColor">
+<tr id="i127" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#reportArchivedFilesForQuota-java.util.List-java.util.List-">reportArchivedFilesForQuota</a></span>(<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;? extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFile.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFile</a>&gt;&nbsp;archivedFiles,
                            <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="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;fileSizes)</code>&nbsp;</td>
 </tr>
-<tr id="i127" class="rowColor">
+<tr id="i128" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#requestCompaction--">requestCompaction</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i128" class="altColor">
+<tr id="i129" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#requestCompaction-int-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.security.User-">requestCompaction</a></span>(int&nbsp;priority,
                  <a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver.compactions">CompactionLifeCycleTracker</a>&nbsp;tracker,
                  <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</code>&nbsp;</td>
 </tr>
-<tr id="i129" class="rowColor">
+<tr id="i130" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#setDataBlockEncoderInTest-org.apache.hadoop.hbase.io.hfile.HFileDataBlockEncoder-">setDataBlockEncoderInTest</a></span>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;blockEncoder)</code>
 <div class="block">Should be used only in tests.</div>
 </td>
 </tr>
-<tr id="i130" class="altColor">
+<tr id="i131" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#setScanInfo-org.apache.hadoop.hbase.regionserver.ScanInfo-">setScanInfo</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;scanInfo)</code>
 <div class="block">Set scan info, used by test</div>
 </td>
 </tr>
-<tr id="i131" class="rowColor">
+<tr id="i132" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#shouldPerformMajorCompaction--">shouldPerformMajorCompaction</a></span>()</code>
 <div class="block">Tests whether we should run a major compaction.</div>
 </td>
 </tr>
-<tr id="i132" class="altColor">
+<tr id="i133" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#snapshot--">snapshot</a></span>()</code>
 <div class="block">Snapshot this stores memstore.</div>
 </td>
 </tr>
-<tr id="i133" class="rowColor">
+<tr id="i134" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#startReplayingFromWAL--">startReplayingFromWAL</a></span>()</code>
 <div class="block">This message intends to inform the MemStore that next coming updates
  are going to be part of the replaying edits from WAL</div>
 </td>
 </tr>
-<tr id="i134" class="altColor">
+<tr id="i135" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#stopReplayingFromWAL--">stopReplayingFromWAL</a></span>()</code>
 <div class="block">This message intends to inform the MemStore that the replaying edits from WAL
  are done</div>
 </td>
 </tr>
-<tr id="i135" class="rowColor">
+<tr id="i136" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#throttleCompaction-long-">throttleCompaction</a></span>(long&nbsp;compactionSize)</code>&nbsp;</td>
 </tr>
-<tr id="i136" class="altColor">
+<tr id="i137" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#timeOfOldestEdit--">timeOfOldestEdit</a></span>()</code>
 <div class="block">When was the last edit done in the memstore</div>
 </td>
 </tr>
-<tr id="i137" class="rowColor">
+<tr id="i138" class="altColor">
 <td class="colFirst"><code><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/regionserver/HStore.html#toString--">toString</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i138" class="altColor">
+<tr id="i139" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#triggerMajorCompaction--">triggerMajorCompaction</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i139" class="rowColor">
+<tr id="i140" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#updateSpaceQuotaAfterFileReplacement-org.apache.hadoop.hbase.quotas.RegionSizeStore-org.apache.hadoop.hbase.client.RegionInfo-java.util.Collection-java.util.Collection-">updateSpaceQuotaAfterFileReplacement</a></span>(<a href="../../../../../org/apache/hadoop/hbase/quotas/RegionSizeStore.html" title="interface in org.apache.hadoop.hbase.quotas">RegionSizeStore</a>&nbsp;sizeStore,
                                     <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
@@ -1199,14 +1205,14 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
  and adding in the size for new files.</div>
 </td>
 </tr>
-<tr id="i140" class="altColor">
+<tr id="i141" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#updateStorefiles-java.util.List-long-">updateStorefiles</a></span>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs,
                 long&nbsp;snapshotId)</code>
 <div class="block">Change storeFiles adding into place the Reader produced by this new flush.</div>
 </td>
 </tr>
-<tr id="i141" class="rowColor">
+<tr id="i142" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#upsert-java.lang.Iterable-long-org.apache.hadoop.hbase.regionserver.MemStoreSizing-">upsert</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells,
       long&nbsp;readpoint,
@@ -1214,17 +1220,17 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block">Adds or replaces the specified KeyValues.</div>
 </td>
 </tr>
-<tr id="i142" class="altColor">
+<tr id="i143" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#validateStoreFile-org.apache.hadoop.fs.Path-">validateStoreFile</a></span>(org.apache.hadoop.fs.Path&nbsp;path)</code>
 <div class="block">Validates a store file by opening and closing it.</div>
 </td>
 </tr>
-<tr id="i143" class="rowColor">
+<tr id="i144" class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#versionsToReturn-int-">versionsToReturn</a></span>(int&nbsp;wantedVersions)</code>&nbsp;</td>
 </tr>
-<tr id="i144" class="altColor">
+<tr id="i145" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#writeCompactionWalRecord-java.util.Collection-java.util.Collection-">writeCompactionWalRecord</a></span>(<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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;filesCompacted,
                         <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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;newFiles)</code>
@@ -1501,7 +1507,10 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>currentParallelPutCount</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/HStore.html#line.185">currentParallelPutCount</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/HStore.html#line.190">currentParallelPutCount</a></pre>
+<div class="block">Use this counter to track concurrent puts. If TRACE-log is enabled, if we are over the
+ threshold set by hbase.region.store.parallel.put.print.threshold (Default is 50) we will
+ log a message that identifies the Store experience this high-level of concurrency.</div>
 </li>
 </ul>
 <a name="parallelPutCountPrintThreshold">
@@ -1510,7 +1519,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>parallelPutCountPrintThreshold</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.186">parallelPutCountPrintThreshold</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.191">parallelPutCountPrintThreshold</a></pre>
 </li>
 </ul>
 <a name="scanInfo">
@@ -1519,7 +1528,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>scanInfo</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.188">scanInfo</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.193">scanInfo</a></pre>
 </li>
 </ul>
 <a name="filesCompacting">
@@ -1528,7 +1537,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>filesCompacting</h4>
-<pre>private final&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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.192">filesCompacting</a></pre>
+<pre>private final&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;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.197">filesCompacting</a></pre>
 </li>
 </ul>
 <a name="changedReaderObservers">
@@ -1537,7 +1546,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>changedReaderObservers</h4>
-<pre>private final&nbsp;<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/regionserver/ChangedReadersObserver.html" title="interface in org.apache.hadoop.hbase.regionserver">ChangedReadersObserver</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.195">changedReaderObservers</a></pre>
+<pre>private final&nbsp;<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/regionserver/ChangedReadersObserver.html" title="interface in org.apache.hadoop.hbase.regionserver">ChangedReadersObserver</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.200">changedReaderObservers</a></pre>
 </li>
 </ul>
 <a name="blocksize">
@@ -1546,7 +1555,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>blocksize</h4>
-<pre>protected final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.198">blocksize</a></pre>
+<pre>protected final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.203">blocksize</a></pre>
 </li>
 </ul>
 <a name="dataBlockEncoder">
@@ -1555,7 +1564,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>dataBlockEncoder</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.199">dataBlockEncoder</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.204">dataBlockEncoder</a></pre>
 </li>
 </ul>
 <a name="checksumType">
@@ -1564,7 +1573,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>checksumType</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util">ChecksumType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.202">checksumType</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util">ChecksumType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.207">checksumType</a></pre>
 <div class="block">Checksum configuration</div>
 </li>
 </ul>
@@ -1574,7 +1583,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>bytesPerChecksum</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.203">bytesPerChecksum</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.208">bytesPerChecksum</a></pre>
 </li>
 </ul>
 <a name="comparator">
@@ -1583,7 +1592,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>comparator</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.206">comparator</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.211">comparator</a></pre>
 </li>
 </ul>
 <a name="storeEngine">
@@ -1592,7 +1601,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>storeEngine</h4>
-<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">StoreEngine</a>&lt;?,?,?,?&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.208">storeEngine</a></pre>
+<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">StoreEngine</a>&lt;?,?,?,?&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.213">storeEngine</a></pre>
 </li>
 </ul>
 <a name="offPeakCompactionTracker">
@@ -1601,7 +1610,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>offPeakCompactionTracker</h4>
-<pre>private static 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/HStore.html#line.210">offPeakCompactionTracker</a></pre>
+<pre>private static 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/HStore.html#line.215">offPeakCompactionTracker</a></pre>
 </li>
 </ul>
 <a name="offPeakHours">
@@ -1610,7 +1619,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>offPeakHours</h4>
-<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/OffPeakHours.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">OffPeakHours</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.211">offPeakHours</a></pre>
+<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/OffPeakHours.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">OffPeakHours</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.216">offPeakHours</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_FLUSH_RETRIES_NUMBER">
@@ -1619,7 +1628,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_FLUSH_RETRIES_NUMBER</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.213">DEFAULT_FLUSH_RETRIES_NUMBER</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.218">DEFAULT_FLUSH_RETRIES_NUMBER</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HStore.DEFAULT_FLUSH_RETRIES_NUMBER">Constant Field Values</a></dd>
@@ -1632,7 +1641,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>flushRetriesNumber</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.214">flushRetriesNumber</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.219">flushRetriesNumber</a></pre>
 </li>
 </ul>
 <a name="pauseTime">
@@ -1641,7 +1650,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>pauseTime</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.215">pauseTime</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.220">pauseTime</a></pre>
 </li>
 </ul>
 <a name="blockingFileCount">
@@ -1650,7 +1659,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>blockingFileCount</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.217">blockingFileCount</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.222">blockingFileCount</a></pre>
 </li>
 </ul>
 <a name="compactionCheckMultiplier">
@@ -1659,7 +1668,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>compactionCheckMultiplier</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.218">compactionCheckMultiplier</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.223">compactionCheckMultiplier</a></pre>
 </li>
 </ul>
 <a name="cryptoContext">
@@ -1668,7 +1677,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>cryptoContext</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/crypto/Encryption.Context.html" title="class in org.apache.hadoop.hbase.io.crypto">Encryption.Context</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.219">cryptoContext</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/crypto/Encryption.Context.html" title="class in org.apache.hadoop.hbase.io.crypto">Encryption.Context</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.224">cryptoContext</a></pre>
 </li>
 </ul>
 <a name="flushedCellsCount">
@@ -1677,7 +1686,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>flushedCellsCount</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.221">flushedCellsCount</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.226">flushedCellsCount</a></pre>
 </li>
 </ul>
 <a name="compactedCellsCount">
@@ -1686,7 +1695,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>compactedCellsCount</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.222">compactedCellsCount</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.227">compactedCellsCount</a></pre>
 </li>
 </ul>
 <a name="majorCompactedCellsCount">
@@ -1695,7 +1704,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>majorCompactedCellsCount</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.223">majorCompactedCellsCount</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.228">majorCompactedCellsCount</a></pre>
 </li>
 </ul>
 <a name="flushedCellsSize">
@@ -1704,7 +1713,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>flushedCellsSize</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.224">flushedCellsSize</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.229">flushedCellsSize</a></pre>
 </li>
 </ul>
 <a name="flushedOutputFileSize">
@@ -1713,7 +1722,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>flushedOutputFileSize</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.225">flushedOutputFileSize</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.230">flushedOutputFileSize</a></pre>
 </li>
 </ul>
 <a name="compactedCellsSize">
@@ -1722,7 +1731,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>compactedCellsSize</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.226">compactedCellsSize</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.231">compactedCellsSize</a></pre>
 </li>
 </ul>
 <a name="majorCompactedCellsSize">
@@ -1731,7 +1740,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>majorCompactedCellsSize</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.227">majorCompactedCellsSize</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.232">majorCompactedCellsSize</a></pre>
 </li>
 </ul>
 <a name="FIXED_OVERHEAD">
@@ -1740,7 +1749,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>FIXED_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2395">FIXED_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2406">FIXED_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="DEEP_OVERHEAD">
@@ -1749,7 +1758,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEEP_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2399">DEEP_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2410">DEEP_OVERHEAD</a></pre>
 </li>
 </ul>
 </li>
@@ -1766,7 +1775,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HStore</h4>
-<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.237">HStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.242">HStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                  <a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&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>
@@ -1790,13 +1799,26 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <!--   -->
 </a>
 <h3>Method Detail</h3>
+<a name="getMemstore--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getMemstore</h4>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.336">getMemstore</a>()</pre>
+<dl>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>MemStore Instance to use in this store.</dd>
+</dl>
+</li>
+</ul>
 <a name="createCacheConf-org.apache.hadoop.hbase.client.ColumnFamilyDescriptor-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>createCacheConf</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.354">createCacheConf</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.369">createCacheConf</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
 <div class="block">Creates the cache config.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1810,7 +1832,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createStoreEngine</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">StoreEngine</a>&lt;?,?,?,?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.366">createStoreEngine</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">StoreEngine</a>&lt;?,?,?,?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.381">createStoreEngine</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
                                                  org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                  <a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a>&nbsp;kvComparator)
                                           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>
@@ -1834,7 +1856,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>determineTTLFromFamily</h4>
-<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.375">determineTTLFromFamily</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
+<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.390">determineTTLFromFamily</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>family</code> - </dd>
@@ -1849,7 +1871,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getColumnFamilyName</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/regionserver/HStore.html#line.391">getColumnFamilyName</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/regionserver/HStore.html#line.406">getColumnFamilyName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getColumnFamilyName--">getColumnFamilyName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1862,7 +1884,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.396">getTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.411">getTableName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getTableName--">getTableName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1875,7 +1897,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getFileSystem</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.401">getFileSystem</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.416">getFileSystem</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getFileSystem--">getFileSystem</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1888,7 +1910,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionFileSystem</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.405">getRegionFileSystem</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.420">getRegionFileSystem</a>()</pre>
 </li>
 </ul>
 <a name="getStoreFileTtl--">
@@ -1897,7 +1919,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFileTtl</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.411">getStoreFileTtl</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.426">getStoreFileTtl</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html#getStoreFileTtl--">getStoreFileTtl</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreConfigInformation</a></code></dd>
@@ -1912,7 +1934,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreFlushSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.417">getMemStoreFlushSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.432">getMemStoreFlushSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html#getMemStoreFlushSize--">getMemStoreFlushSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreConfigInformation</a></code></dd>
@@ -1927,7 +1949,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushableSize</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.423">getFlushableSize</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.438">getFlushableSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getFlushableSize--">getFlushableSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1944,7 +1966,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapshotSize</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.428">getSnapshotSize</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.443">getSnapshotSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getSnapshotSize--">getSnapshotSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1959,7 +1981,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactionCheckMultiplier</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.433">getCompactionCheckMultiplier</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.448">getCompactionCheckMultiplier</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html#getCompactionCheckMultiplier--">getCompactionCheckMultiplier</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfi

<TRUNCATED>

[04/26] hbase-site git commit: Published site at 219625233c1e8ad9daf2c35bc2e3a0844e1b97ba.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/21347dff/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html
index 6ab9121..8d0867b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/EagerMemStoreCompactionStrategy.html
@@ -31,17 +31,22 @@
 <span class="sourceLineNo">023</span><a name="line.23"></a>
 <span class="sourceLineNo">024</span>@InterfaceAudience.Private<a name="line.24"></a>
 <span class="sourceLineNo">025</span>public class EagerMemStoreCompactionStrategy extends MemStoreCompactionStrategy{<a name="line.25"></a>
-<span class="sourceLineNo">026</span><a name="line.26"></a>
-<span class="sourceLineNo">027</span>  private static final String name = "EAGER";<a name="line.27"></a>
+<span class="sourceLineNo">026</span>  private static final String NAME = "EAGER";<a name="line.26"></a>
+<span class="sourceLineNo">027</span><a name="line.27"></a>
 <span class="sourceLineNo">028</span>  public EagerMemStoreCompactionStrategy(Configuration conf, String cfName) {<a name="line.28"></a>
 <span class="sourceLineNo">029</span>    super(conf, cfName);<a name="line.29"></a>
 <span class="sourceLineNo">030</span>  }<a name="line.30"></a>
 <span class="sourceLineNo">031</span><a name="line.31"></a>
 <span class="sourceLineNo">032</span>  @Override<a name="line.32"></a>
 <span class="sourceLineNo">033</span>  public Action getAction(VersionedSegmentsList versionedList) {<a name="line.33"></a>
-<span class="sourceLineNo">034</span>    return compact(versionedList, name);<a name="line.34"></a>
+<span class="sourceLineNo">034</span>    return compact(versionedList, getName());<a name="line.34"></a>
 <span class="sourceLineNo">035</span>  }<a name="line.35"></a>
-<span class="sourceLineNo">036</span>}<a name="line.36"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>  @Override<a name="line.37"></a>
+<span class="sourceLineNo">038</span>  protected String getName() {<a name="line.38"></a>
+<span class="sourceLineNo">039</span>    return NAME;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  }<a name="line.40"></a>
+<span class="sourceLineNo">041</span>}<a name="line.41"></a>