blob: 00c4ad224e0aa76e551286226f762ce8f3873a1f [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en">
<head>
<!-- Generated by javadoc (17) -->
<title>Source code</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="source: package: org.apache.hadoop.hbase.io.encoding, class: BufferedDataBlockEncoder, class: OffheapDecodedExtendedCell">
<meta name="generator" content="javadoc/SourceToHTMLConverter">
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
</head>
<body class="source-page">
<main role="main">
<div class="source-container">
<pre><span class="source-line-no">001</span><span id="line-1">/*</span>
<span class="source-line-no">002</span><span id="line-2"> * Licensed to the Apache Software Foundation (ASF) under one</span>
<span class="source-line-no">003</span><span id="line-3"> * or more contributor license agreements. See the NOTICE file</span>
<span class="source-line-no">004</span><span id="line-4"> * distributed with this work for additional information</span>
<span class="source-line-no">005</span><span id="line-5"> * regarding copyright ownership. The ASF licenses this file</span>
<span class="source-line-no">006</span><span id="line-6"> * to you under the Apache License, Version 2.0 (the</span>
<span class="source-line-no">007</span><span id="line-7"> * "License"); you may not use this file except in compliance</span>
<span class="source-line-no">008</span><span id="line-8"> * with the License. You may obtain a copy of the License at</span>
<span class="source-line-no">009</span><span id="line-9"> *</span>
<span class="source-line-no">010</span><span id="line-10"> * http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="source-line-no">011</span><span id="line-11"> *</span>
<span class="source-line-no">012</span><span id="line-12"> * Unless required by applicable law or agreed to in writing, software</span>
<span class="source-line-no">013</span><span id="line-13"> * distributed under the License is distributed on an "AS IS" BASIS,</span>
<span class="source-line-no">014</span><span id="line-14"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<span class="source-line-no">015</span><span id="line-15"> * See the License for the specific language governing permissions and</span>
<span class="source-line-no">016</span><span id="line-16"> * limitations under the License.</span>
<span class="source-line-no">017</span><span id="line-17"> */</span>
<span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase.io.encoding;</span>
<span class="source-line-no">019</span><span id="line-19"></span>
<span class="source-line-no">020</span><span id="line-20">import java.io.DataInputStream;</span>
<span class="source-line-no">021</span><span id="line-21">import java.io.DataOutputStream;</span>
<span class="source-line-no">022</span><span id="line-22">import java.io.IOException;</span>
<span class="source-line-no">023</span><span id="line-23">import java.io.OutputStream;</span>
<span class="source-line-no">024</span><span id="line-24">import java.nio.ByteBuffer;</span>
<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.ByteBufferExtendedCell;</span>
<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.Cell;</span>
<span class="source-line-no">027</span><span id="line-27">import org.apache.hadoop.hbase.CellComparator;</span>
<span class="source-line-no">028</span><span id="line-28">import org.apache.hadoop.hbase.CellUtil;</span>
<span class="source-line-no">029</span><span id="line-29">import org.apache.hadoop.hbase.ExtendedCell;</span>
<span class="source-line-no">030</span><span id="line-30">import org.apache.hadoop.hbase.HConstants;</span>
<span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.hbase.KeyValue;</span>
<span class="source-line-no">032</span><span id="line-32">import org.apache.hadoop.hbase.KeyValueUtil;</span>
<span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.PrivateCellUtil;</span>
<span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.io.TagCompressionContext;</span>
<span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.io.util.LRUDictionary;</span>
<span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.io.util.StreamUtils;</span>
<span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.nio.ByteBuff;</span>
<span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.util.ByteBufferUtils;</span>
<span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.util.Bytes;</span>
<span class="source-line-no">040</span><span id="line-40">import org.apache.hadoop.hbase.util.ClassSize;</span>
<span class="source-line-no">041</span><span id="line-41">import org.apache.hadoop.hbase.util.ObjectIntPair;</span>
<span class="source-line-no">042</span><span id="line-42">import org.apache.hadoop.io.WritableUtils;</span>
<span class="source-line-no">043</span><span id="line-43">import org.apache.yetus.audience.InterfaceAudience;</span>
<span class="source-line-no">044</span><span id="line-44"></span>
<span class="source-line-no">045</span><span id="line-45">/**</span>
<span class="source-line-no">046</span><span id="line-46"> * Base class for all data block encoders that use a buffer.</span>
<span class="source-line-no">047</span><span id="line-47"> */</span>
<span class="source-line-no">048</span><span id="line-48">@InterfaceAudience.Private</span>
<span class="source-line-no">049</span><span id="line-49">abstract class BufferedDataBlockEncoder extends AbstractDataBlockEncoder {</span>
<span class="source-line-no">050</span><span id="line-50"> /**</span>
<span class="source-line-no">051</span><span id="line-51"> * TODO: This datablockencoder is dealing in internals of hfileblocks. Purge reference to HFBs</span>
<span class="source-line-no">052</span><span id="line-52"> */</span>
<span class="source-line-no">053</span><span id="line-53"> private static int INITIAL_KEY_BUFFER_SIZE = 512;</span>
<span class="source-line-no">054</span><span id="line-54"></span>
<span class="source-line-no">055</span><span id="line-55"> @Override</span>
<span class="source-line-no">056</span><span id="line-56"> public ByteBuffer decodeKeyValues(DataInputStream source,</span>
<span class="source-line-no">057</span><span id="line-57"> HFileBlockDecodingContext blkDecodingCtx) throws IOException {</span>
<span class="source-line-no">058</span><span id="line-58"> if (blkDecodingCtx.getClass() != HFileBlockDefaultDecodingContext.class) {</span>
<span class="source-line-no">059</span><span id="line-59"> throw new IOException(this.getClass().getName() + " only accepts "</span>
<span class="source-line-no">060</span><span id="line-60"> + HFileBlockDefaultDecodingContext.class.getName() + " as the decoding context.");</span>
<span class="source-line-no">061</span><span id="line-61"> }</span>
<span class="source-line-no">062</span><span id="line-62"></span>
<span class="source-line-no">063</span><span id="line-63"> HFileBlockDefaultDecodingContext decodingCtx =</span>
<span class="source-line-no">064</span><span id="line-64"> (HFileBlockDefaultDecodingContext) blkDecodingCtx;</span>
<span class="source-line-no">065</span><span id="line-65"> if (</span>
<span class="source-line-no">066</span><span id="line-66"> decodingCtx.getHFileContext().isIncludesTags()</span>
<span class="source-line-no">067</span><span id="line-67"> &amp;&amp; decodingCtx.getHFileContext().isCompressTags()</span>
<span class="source-line-no">068</span><span id="line-68"> ) {</span>
<span class="source-line-no">069</span><span id="line-69"> if (decodingCtx.getTagCompressionContext() != null) {</span>
<span class="source-line-no">070</span><span id="line-70"> // It will be overhead to create the TagCompressionContext again and again for every block</span>
<span class="source-line-no">071</span><span id="line-71"> // decoding.</span>
<span class="source-line-no">072</span><span id="line-72"> decodingCtx.getTagCompressionContext().clear();</span>
<span class="source-line-no">073</span><span id="line-73"> } else {</span>
<span class="source-line-no">074</span><span id="line-74"> try {</span>
<span class="source-line-no">075</span><span id="line-75"> TagCompressionContext tagCompressionContext =</span>
<span class="source-line-no">076</span><span id="line-76"> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);</span>
<span class="source-line-no">077</span><span id="line-77"> decodingCtx.setTagCompressionContext(tagCompressionContext);</span>
<span class="source-line-no">078</span><span id="line-78"> } catch (Exception e) {</span>
<span class="source-line-no">079</span><span id="line-79"> throw new IOException("Failed to initialize TagCompressionContext", e);</span>
<span class="source-line-no">080</span><span id="line-80"> }</span>
<span class="source-line-no">081</span><span id="line-81"> }</span>
<span class="source-line-no">082</span><span id="line-82"> }</span>
<span class="source-line-no">083</span><span id="line-83"> return internalDecodeKeyValues(source, 0, 0, decodingCtx);</span>
<span class="source-line-no">084</span><span id="line-84"> }</span>
<span class="source-line-no">085</span><span id="line-85"></span>
<span class="source-line-no">086</span><span id="line-86"> /********************* common prefixes *************************/</span>
<span class="source-line-no">087</span><span id="line-87"> // Having this as static is fine but if META is having DBE then we should</span>
<span class="source-line-no">088</span><span id="line-88"> // change this.</span>
<span class="source-line-no">089</span><span id="line-89"> public static int compareCommonRowPrefix(Cell left, Cell right, int rowCommonPrefix) {</span>
<span class="source-line-no">090</span><span id="line-90"> if (left instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">091</span><span id="line-91"> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;</span>
<span class="source-line-no">092</span><span id="line-92"> if (right instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">093</span><span id="line-93"> ByteBufferExtendedCell bbRight = (ByteBufferExtendedCell) right;</span>
<span class="source-line-no">094</span><span id="line-94"> return ByteBufferUtils.compareTo(bbLeft.getRowByteBuffer(),</span>
<span class="source-line-no">095</span><span id="line-95"> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,</span>
<span class="source-line-no">096</span><span id="line-96"> bbRight.getRowByteBuffer(), bbRight.getRowPosition() + rowCommonPrefix,</span>
<span class="source-line-no">097</span><span id="line-97"> right.getRowLength() - rowCommonPrefix);</span>
<span class="source-line-no">098</span><span id="line-98"> } else {</span>
<span class="source-line-no">099</span><span id="line-99"> return ByteBufferUtils.compareTo(bbLeft.getRowByteBuffer(),</span>
<span class="source-line-no">100</span><span id="line-100"> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,</span>
<span class="source-line-no">101</span><span id="line-101"> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,</span>
<span class="source-line-no">102</span><span id="line-102"> right.getRowLength() - rowCommonPrefix);</span>
<span class="source-line-no">103</span><span id="line-103"> }</span>
<span class="source-line-no">104</span><span id="line-104"> } else {</span>
<span class="source-line-no">105</span><span id="line-105"> if (right instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">106</span><span id="line-106"> ByteBufferExtendedCell bbRight = (ByteBufferExtendedCell) right;</span>
<span class="source-line-no">107</span><span id="line-107"> return ByteBufferUtils.compareTo(left.getRowArray(), left.getRowOffset() + rowCommonPrefix,</span>
<span class="source-line-no">108</span><span id="line-108"> left.getRowLength() - rowCommonPrefix, bbRight.getRowByteBuffer(),</span>
<span class="source-line-no">109</span><span id="line-109"> bbRight.getRowPosition() + rowCommonPrefix, right.getRowLength() - rowCommonPrefix);</span>
<span class="source-line-no">110</span><span id="line-110"> } else {</span>
<span class="source-line-no">111</span><span id="line-111"> return Bytes.compareTo(left.getRowArray(), left.getRowOffset() + rowCommonPrefix,</span>
<span class="source-line-no">112</span><span id="line-112"> left.getRowLength() - rowCommonPrefix, right.getRowArray(),</span>
<span class="source-line-no">113</span><span id="line-113"> right.getRowOffset() + rowCommonPrefix, right.getRowLength() - rowCommonPrefix);</span>
<span class="source-line-no">114</span><span id="line-114"> }</span>
<span class="source-line-no">115</span><span id="line-115"> }</span>
<span class="source-line-no">116</span><span id="line-116"> }</span>
<span class="source-line-no">117</span><span id="line-117"></span>
<span class="source-line-no">118</span><span id="line-118"> public static int compareCommonFamilyPrefix(Cell left, Cell right, int familyCommonPrefix) {</span>
<span class="source-line-no">119</span><span id="line-119"> if (left instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">120</span><span id="line-120"> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;</span>
<span class="source-line-no">121</span><span id="line-121"> if (right instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">122</span><span id="line-122"> ByteBufferExtendedCell bbRight = (ByteBufferExtendedCell) right;</span>
<span class="source-line-no">123</span><span id="line-123"> return ByteBufferUtils.compareTo(bbLeft.getFamilyByteBuffer(),</span>
<span class="source-line-no">124</span><span id="line-124"> bbLeft.getFamilyPosition() + familyCommonPrefix,</span>
<span class="source-line-no">125</span><span id="line-125"> left.getFamilyLength() - familyCommonPrefix, bbRight.getFamilyByteBuffer(),</span>
<span class="source-line-no">126</span><span id="line-126"> bbRight.getFamilyPosition() + familyCommonPrefix,</span>
<span class="source-line-no">127</span><span id="line-127"> right.getFamilyLength() - familyCommonPrefix);</span>
<span class="source-line-no">128</span><span id="line-128"> } else {</span>
<span class="source-line-no">129</span><span id="line-129"> return ByteBufferUtils.compareTo(bbLeft.getFamilyByteBuffer(),</span>
<span class="source-line-no">130</span><span id="line-130"> bbLeft.getFamilyPosition() + familyCommonPrefix,</span>
<span class="source-line-no">131</span><span id="line-131"> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),</span>
<span class="source-line-no">132</span><span id="line-132"> right.getFamilyOffset() + familyCommonPrefix,</span>
<span class="source-line-no">133</span><span id="line-133"> right.getFamilyLength() - familyCommonPrefix);</span>
<span class="source-line-no">134</span><span id="line-134"> }</span>
<span class="source-line-no">135</span><span id="line-135"> } else {</span>
<span class="source-line-no">136</span><span id="line-136"> if (right instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">137</span><span id="line-137"> ByteBufferExtendedCell bbRight = (ByteBufferExtendedCell) right;</span>
<span class="source-line-no">138</span><span id="line-138"> return ByteBufferUtils.compareTo(left.getFamilyArray(),</span>
<span class="source-line-no">139</span><span id="line-139"> left.getFamilyOffset() + familyCommonPrefix, left.getFamilyLength() - familyCommonPrefix,</span>
<span class="source-line-no">140</span><span id="line-140"> bbRight.getFamilyByteBuffer(), bbRight.getFamilyPosition() + familyCommonPrefix,</span>
<span class="source-line-no">141</span><span id="line-141"> right.getFamilyLength() - familyCommonPrefix);</span>
<span class="source-line-no">142</span><span id="line-142"> } else {</span>
<span class="source-line-no">143</span><span id="line-143"> return Bytes.compareTo(left.getFamilyArray(), left.getFamilyOffset() + familyCommonPrefix,</span>
<span class="source-line-no">144</span><span id="line-144"> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),</span>
<span class="source-line-no">145</span><span id="line-145"> right.getFamilyOffset() + familyCommonPrefix,</span>
<span class="source-line-no">146</span><span id="line-146"> right.getFamilyLength() - familyCommonPrefix);</span>
<span class="source-line-no">147</span><span id="line-147"> }</span>
<span class="source-line-no">148</span><span id="line-148"> }</span>
<span class="source-line-no">149</span><span id="line-149"> }</span>
<span class="source-line-no">150</span><span id="line-150"></span>
<span class="source-line-no">151</span><span id="line-151"> public static int compareCommonQualifierPrefix(Cell left, Cell right, int qualCommonPrefix) {</span>
<span class="source-line-no">152</span><span id="line-152"> if (left instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">153</span><span id="line-153"> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;</span>
<span class="source-line-no">154</span><span id="line-154"> if (right instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">155</span><span id="line-155"> ByteBufferExtendedCell bbRight = (ByteBufferExtendedCell) right;</span>
<span class="source-line-no">156</span><span id="line-156"> return ByteBufferUtils.compareTo(bbLeft.getQualifierByteBuffer(),</span>
<span class="source-line-no">157</span><span id="line-157"> bbLeft.getQualifierPosition() + qualCommonPrefix,</span>
<span class="source-line-no">158</span><span id="line-158"> left.getQualifierLength() - qualCommonPrefix, bbRight.getQualifierByteBuffer(),</span>
<span class="source-line-no">159</span><span id="line-159"> bbRight.getQualifierPosition() + qualCommonPrefix,</span>
<span class="source-line-no">160</span><span id="line-160"> right.getQualifierLength() - qualCommonPrefix);</span>
<span class="source-line-no">161</span><span id="line-161"> } else {</span>
<span class="source-line-no">162</span><span id="line-162"> return ByteBufferUtils.compareTo(bbLeft.getQualifierByteBuffer(),</span>
<span class="source-line-no">163</span><span id="line-163"> bbLeft.getQualifierPosition() + qualCommonPrefix,</span>
<span class="source-line-no">164</span><span id="line-164"> left.getQualifierLength() - qualCommonPrefix, right.getQualifierArray(),</span>
<span class="source-line-no">165</span><span id="line-165"> right.getQualifierOffset() + qualCommonPrefix,</span>
<span class="source-line-no">166</span><span id="line-166"> right.getQualifierLength() - qualCommonPrefix);</span>
<span class="source-line-no">167</span><span id="line-167"> }</span>
<span class="source-line-no">168</span><span id="line-168"> } else {</span>
<span class="source-line-no">169</span><span id="line-169"> if (right instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">170</span><span id="line-170"> ByteBufferExtendedCell bbRight = (ByteBufferExtendedCell) right;</span>
<span class="source-line-no">171</span><span id="line-171"> return ByteBufferUtils.compareTo(left.getQualifierArray(),</span>
<span class="source-line-no">172</span><span id="line-172"> left.getQualifierOffset() + qualCommonPrefix,</span>
<span class="source-line-no">173</span><span id="line-173"> left.getQualifierLength() - qualCommonPrefix, bbRight.getQualifierByteBuffer(),</span>
<span class="source-line-no">174</span><span id="line-174"> bbRight.getQualifierPosition() + qualCommonPrefix,</span>
<span class="source-line-no">175</span><span id="line-175"> right.getQualifierLength() - qualCommonPrefix);</span>
<span class="source-line-no">176</span><span id="line-176"> } else {</span>
<span class="source-line-no">177</span><span id="line-177"> return Bytes.compareTo(left.getQualifierArray(),</span>
<span class="source-line-no">178</span><span id="line-178"> left.getQualifierOffset() + qualCommonPrefix,</span>
<span class="source-line-no">179</span><span id="line-179"> left.getQualifierLength() - qualCommonPrefix, right.getQualifierArray(),</span>
<span class="source-line-no">180</span><span id="line-180"> right.getQualifierOffset() + qualCommonPrefix,</span>
<span class="source-line-no">181</span><span id="line-181"> right.getQualifierLength() - qualCommonPrefix);</span>
<span class="source-line-no">182</span><span id="line-182"> }</span>
<span class="source-line-no">183</span><span id="line-183"> }</span>
<span class="source-line-no">184</span><span id="line-184"> }</span>
<span class="source-line-no">185</span><span id="line-185"></span>
<span class="source-line-no">186</span><span id="line-186"> protected static class SeekerState {</span>
<span class="source-line-no">187</span><span id="line-187"> protected ByteBuff currentBuffer;</span>
<span class="source-line-no">188</span><span id="line-188"> protected TagCompressionContext tagCompressionContext;</span>
<span class="source-line-no">189</span><span id="line-189"> protected int valueOffset = -1;</span>
<span class="source-line-no">190</span><span id="line-190"> protected int keyLength;</span>
<span class="source-line-no">191</span><span id="line-191"> protected int valueLength;</span>
<span class="source-line-no">192</span><span id="line-192"> protected int lastCommonPrefix;</span>
<span class="source-line-no">193</span><span id="line-193"> protected int tagsLength = 0;</span>
<span class="source-line-no">194</span><span id="line-194"> protected int tagsOffset = -1;</span>
<span class="source-line-no">195</span><span id="line-195"> protected int tagsCompressedLength = 0;</span>
<span class="source-line-no">196</span><span id="line-196"> protected boolean uncompressTags = true;</span>
<span class="source-line-no">197</span><span id="line-197"></span>
<span class="source-line-no">198</span><span id="line-198"> /** We need to store a copy of the key. */</span>
<span class="source-line-no">199</span><span id="line-199"> protected byte[] keyBuffer = HConstants.EMPTY_BYTE_ARRAY;</span>
<span class="source-line-no">200</span><span id="line-200"> protected byte[] tagsBuffer = HConstants.EMPTY_BYTE_ARRAY;</span>
<span class="source-line-no">201</span><span id="line-201"></span>
<span class="source-line-no">202</span><span id="line-202"> protected long memstoreTS;</span>
<span class="source-line-no">203</span><span id="line-203"> protected int nextKvOffset;</span>
<span class="source-line-no">204</span><span id="line-204"> protected KeyValue.KeyOnlyKeyValue currentKey = new KeyValue.KeyOnlyKeyValue();</span>
<span class="source-line-no">205</span><span id="line-205"> // A temp pair object which will be reused by ByteBuff#asSubByteBuffer calls. This avoids too</span>
<span class="source-line-no">206</span><span id="line-206"> // many object creations.</span>
<span class="source-line-no">207</span><span id="line-207"> private final ObjectIntPair&lt;ByteBuffer&gt; tmpPair;</span>
<span class="source-line-no">208</span><span id="line-208"> private final boolean includeTags;</span>
<span class="source-line-no">209</span><span id="line-209"></span>
<span class="source-line-no">210</span><span id="line-210"> public SeekerState(ObjectIntPair&lt;ByteBuffer&gt; tmpPair, boolean includeTags) {</span>
<span class="source-line-no">211</span><span id="line-211"> this.tmpPair = tmpPair;</span>
<span class="source-line-no">212</span><span id="line-212"> this.includeTags = includeTags;</span>
<span class="source-line-no">213</span><span id="line-213"> }</span>
<span class="source-line-no">214</span><span id="line-214"></span>
<span class="source-line-no">215</span><span id="line-215"> protected boolean isValid() {</span>
<span class="source-line-no">216</span><span id="line-216"> return valueOffset != -1;</span>
<span class="source-line-no">217</span><span id="line-217"> }</span>
<span class="source-line-no">218</span><span id="line-218"></span>
<span class="source-line-no">219</span><span id="line-219"> protected void invalidate() {</span>
<span class="source-line-no">220</span><span id="line-220"> valueOffset = -1;</span>
<span class="source-line-no">221</span><span id="line-221"> tagsCompressedLength = 0;</span>
<span class="source-line-no">222</span><span id="line-222"> currentKey.clear();</span>
<span class="source-line-no">223</span><span id="line-223"> uncompressTags = true;</span>
<span class="source-line-no">224</span><span id="line-224"> currentBuffer = null;</span>
<span class="source-line-no">225</span><span id="line-225"> }</span>
<span class="source-line-no">226</span><span id="line-226"></span>
<span class="source-line-no">227</span><span id="line-227"> protected void ensureSpaceForKey() {</span>
<span class="source-line-no">228</span><span id="line-228"> if (keyLength &gt; keyBuffer.length) {</span>
<span class="source-line-no">229</span><span id="line-229"> int newKeyBufferLength =</span>
<span class="source-line-no">230</span><span id="line-230"> Integer.highestOneBit(Math.max(INITIAL_KEY_BUFFER_SIZE, keyLength) - 1) &lt;&lt; 1;</span>
<span class="source-line-no">231</span><span id="line-231"> byte[] newKeyBuffer = new byte[newKeyBufferLength];</span>
<span class="source-line-no">232</span><span id="line-232"> System.arraycopy(keyBuffer, 0, newKeyBuffer, 0, keyBuffer.length);</span>
<span class="source-line-no">233</span><span id="line-233"> keyBuffer = newKeyBuffer;</span>
<span class="source-line-no">234</span><span id="line-234"> }</span>
<span class="source-line-no">235</span><span id="line-235"> }</span>
<span class="source-line-no">236</span><span id="line-236"></span>
<span class="source-line-no">237</span><span id="line-237"> protected void ensureSpaceForTags() {</span>
<span class="source-line-no">238</span><span id="line-238"> if (tagsLength &gt; tagsBuffer.length) {</span>
<span class="source-line-no">239</span><span id="line-239"> int newTagsBufferLength =</span>
<span class="source-line-no">240</span><span id="line-240"> Integer.highestOneBit(Math.max(INITIAL_KEY_BUFFER_SIZE, tagsLength) - 1) &lt;&lt; 1;</span>
<span class="source-line-no">241</span><span id="line-241"> byte[] newTagsBuffer = new byte[newTagsBufferLength];</span>
<span class="source-line-no">242</span><span id="line-242"> System.arraycopy(tagsBuffer, 0, newTagsBuffer, 0, tagsBuffer.length);</span>
<span class="source-line-no">243</span><span id="line-243"> tagsBuffer = newTagsBuffer;</span>
<span class="source-line-no">244</span><span id="line-244"> }</span>
<span class="source-line-no">245</span><span id="line-245"> }</span>
<span class="source-line-no">246</span><span id="line-246"></span>
<span class="source-line-no">247</span><span id="line-247"> protected void setKey(byte[] keyBuffer, long memTS) {</span>
<span class="source-line-no">248</span><span id="line-248"> currentKey.setKey(keyBuffer, 0, keyLength);</span>
<span class="source-line-no">249</span><span id="line-249"> memstoreTS = memTS;</span>
<span class="source-line-no">250</span><span id="line-250"> }</span>
<span class="source-line-no">251</span><span id="line-251"></span>
<span class="source-line-no">252</span><span id="line-252"> /**</span>
<span class="source-line-no">253</span><span id="line-253"> * Copy the state from the next one into this instance (the previous state placeholder). Used to</span>
<span class="source-line-no">254</span><span id="line-254"> * save the previous state when we are advancing the seeker to the next key/value.</span>
<span class="source-line-no">255</span><span id="line-255"> */</span>
<span class="source-line-no">256</span><span id="line-256"> protected void copyFromNext(SeekerState nextState) {</span>
<span class="source-line-no">257</span><span id="line-257"> if (keyBuffer.length != nextState.keyBuffer.length) {</span>
<span class="source-line-no">258</span><span id="line-258"> keyBuffer = nextState.keyBuffer.clone();</span>
<span class="source-line-no">259</span><span id="line-259"> } else if (!isValid()) {</span>
<span class="source-line-no">260</span><span id="line-260"> // Note: we can only call isValid before we override our state, so this</span>
<span class="source-line-no">261</span><span id="line-261"> // comes before all the assignments at the end of this method.</span>
<span class="source-line-no">262</span><span id="line-262"> System.arraycopy(nextState.keyBuffer, 0, keyBuffer, 0, nextState.keyLength);</span>
<span class="source-line-no">263</span><span id="line-263"> } else {</span>
<span class="source-line-no">264</span><span id="line-264"> // don't copy the common prefix between this key and the previous one</span>
<span class="source-line-no">265</span><span id="line-265"> System.arraycopy(nextState.keyBuffer, nextState.lastCommonPrefix, keyBuffer,</span>
<span class="source-line-no">266</span><span id="line-266"> nextState.lastCommonPrefix, nextState.keyLength - nextState.lastCommonPrefix);</span>
<span class="source-line-no">267</span><span id="line-267"> }</span>
<span class="source-line-no">268</span><span id="line-268"> currentKey.set(nextState.currentKey);</span>
<span class="source-line-no">269</span><span id="line-269"></span>
<span class="source-line-no">270</span><span id="line-270"> valueOffset = nextState.valueOffset;</span>
<span class="source-line-no">271</span><span id="line-271"> keyLength = nextState.keyLength;</span>
<span class="source-line-no">272</span><span id="line-272"> valueLength = nextState.valueLength;</span>
<span class="source-line-no">273</span><span id="line-273"> lastCommonPrefix = nextState.lastCommonPrefix;</span>
<span class="source-line-no">274</span><span id="line-274"> nextKvOffset = nextState.nextKvOffset;</span>
<span class="source-line-no">275</span><span id="line-275"> memstoreTS = nextState.memstoreTS;</span>
<span class="source-line-no">276</span><span id="line-276"> currentBuffer = nextState.currentBuffer;</span>
<span class="source-line-no">277</span><span id="line-277"> tagsOffset = nextState.tagsOffset;</span>
<span class="source-line-no">278</span><span id="line-278"> tagsLength = nextState.tagsLength;</span>
<span class="source-line-no">279</span><span id="line-279"> if (nextState.tagCompressionContext != null) {</span>
<span class="source-line-no">280</span><span id="line-280"> tagCompressionContext = nextState.tagCompressionContext;</span>
<span class="source-line-no">281</span><span id="line-281"> }</span>
<span class="source-line-no">282</span><span id="line-282"> }</span>
<span class="source-line-no">283</span><span id="line-283"></span>
<span class="source-line-no">284</span><span id="line-284"> public ExtendedCell toCell() {</span>
<span class="source-line-no">285</span><span id="line-285"> // Buffer backing the value and tags part from the HFileBlock's buffer</span>
<span class="source-line-no">286</span><span id="line-286"> // When tag compression in use, this will be only the value bytes area.</span>
<span class="source-line-no">287</span><span id="line-287"> ByteBuffer valAndTagsBuffer;</span>
<span class="source-line-no">288</span><span id="line-288"> int vOffset;</span>
<span class="source-line-no">289</span><span id="line-289"> int valAndTagsLength = this.valueLength;</span>
<span class="source-line-no">290</span><span id="line-290"> int tagsLenSerializationSize = 0;</span>
<span class="source-line-no">291</span><span id="line-291"> if (this.includeTags &amp;&amp; this.tagCompressionContext == null) {</span>
<span class="source-line-no">292</span><span id="line-292"> // Include the tags part also. This will be the tags bytes + 2 bytes of for storing tags</span>
<span class="source-line-no">293</span><span id="line-293"> // length</span>
<span class="source-line-no">294</span><span id="line-294"> tagsLenSerializationSize = this.tagsOffset - (this.valueOffset + this.valueLength);</span>
<span class="source-line-no">295</span><span id="line-295"> valAndTagsLength += tagsLenSerializationSize + this.tagsLength;</span>
<span class="source-line-no">296</span><span id="line-296"> }</span>
<span class="source-line-no">297</span><span id="line-297"> this.currentBuffer.asSubByteBuffer(this.valueOffset, valAndTagsLength, this.tmpPair);</span>
<span class="source-line-no">298</span><span id="line-298"> valAndTagsBuffer = this.tmpPair.getFirst();</span>
<span class="source-line-no">299</span><span id="line-299"> vOffset = this.tmpPair.getSecond();// This is the offset to value part in the BB</span>
<span class="source-line-no">300</span><span id="line-300"> if (valAndTagsBuffer.hasArray()) {</span>
<span class="source-line-no">301</span><span id="line-301"> return toOnheapCell(valAndTagsBuffer, vOffset, tagsLenSerializationSize);</span>
<span class="source-line-no">302</span><span id="line-302"> } else {</span>
<span class="source-line-no">303</span><span id="line-303"> return toOffheapCell(valAndTagsBuffer, vOffset, tagsLenSerializationSize);</span>
<span class="source-line-no">304</span><span id="line-304"> }</span>
<span class="source-line-no">305</span><span id="line-305"> }</span>
<span class="source-line-no">306</span><span id="line-306"></span>
<span class="source-line-no">307</span><span id="line-307"> private ExtendedCell toOnheapCell(ByteBuffer valAndTagsBuffer, int vOffset,</span>
<span class="source-line-no">308</span><span id="line-308"> int tagsLenSerializationSize) {</span>
<span class="source-line-no">309</span><span id="line-309"> byte[] tagsArray = HConstants.EMPTY_BYTE_ARRAY;</span>
<span class="source-line-no">310</span><span id="line-310"> int tOffset = 0;</span>
<span class="source-line-no">311</span><span id="line-311"> if (this.includeTags) {</span>
<span class="source-line-no">312</span><span id="line-312"> if (this.tagCompressionContext == null) {</span>
<span class="source-line-no">313</span><span id="line-313"> tagsArray = valAndTagsBuffer.array();</span>
<span class="source-line-no">314</span><span id="line-314"> tOffset =</span>
<span class="source-line-no">315</span><span id="line-315"> valAndTagsBuffer.arrayOffset() + vOffset + this.valueLength + tagsLenSerializationSize;</span>
<span class="source-line-no">316</span><span id="line-316"> } else {</span>
<span class="source-line-no">317</span><span id="line-317"> tagsArray = Bytes.copy(tagsBuffer, 0, this.tagsLength);</span>
<span class="source-line-no">318</span><span id="line-318"> tOffset = 0;</span>
<span class="source-line-no">319</span><span id="line-319"> }</span>
<span class="source-line-no">320</span><span id="line-320"> }</span>
<span class="source-line-no">321</span><span id="line-321"> return new OnheapDecodedCell(Bytes.copy(keyBuffer, 0, this.keyLength),</span>
<span class="source-line-no">322</span><span id="line-322"> currentKey.getRowLength(), currentKey.getFamilyOffset(), currentKey.getFamilyLength(),</span>
<span class="source-line-no">323</span><span id="line-323"> currentKey.getQualifierOffset(), currentKey.getQualifierLength(), currentKey.getTimestamp(),</span>
<span class="source-line-no">324</span><span id="line-324"> currentKey.getTypeByte(), valAndTagsBuffer.array(),</span>
<span class="source-line-no">325</span><span id="line-325"> valAndTagsBuffer.arrayOffset() + vOffset, this.valueLength, memstoreTS, tagsArray, tOffset,</span>
<span class="source-line-no">326</span><span id="line-326"> this.tagsLength);</span>
<span class="source-line-no">327</span><span id="line-327"> }</span>
<span class="source-line-no">328</span><span id="line-328"></span>
<span class="source-line-no">329</span><span id="line-329"> private ExtendedCell toOffheapCell(ByteBuffer valAndTagsBuffer, int vOffset,</span>
<span class="source-line-no">330</span><span id="line-330"> int tagsLenSerializationSize) {</span>
<span class="source-line-no">331</span><span id="line-331"> ByteBuffer tagsBuf = HConstants.EMPTY_BYTE_BUFFER;</span>
<span class="source-line-no">332</span><span id="line-332"> int tOffset = 0;</span>
<span class="source-line-no">333</span><span id="line-333"> if (this.includeTags) {</span>
<span class="source-line-no">334</span><span id="line-334"> if (this.tagCompressionContext == null) {</span>
<span class="source-line-no">335</span><span id="line-335"> tagsBuf = valAndTagsBuffer;</span>
<span class="source-line-no">336</span><span id="line-336"> tOffset = vOffset + this.valueLength + tagsLenSerializationSize;</span>
<span class="source-line-no">337</span><span id="line-337"> } else {</span>
<span class="source-line-no">338</span><span id="line-338"> tagsBuf = ByteBuffer.wrap(Bytes.copy(tagsBuffer, 0, this.tagsLength));</span>
<span class="source-line-no">339</span><span id="line-339"> tOffset = 0;</span>
<span class="source-line-no">340</span><span id="line-340"> }</span>
<span class="source-line-no">341</span><span id="line-341"> }</span>
<span class="source-line-no">342</span><span id="line-342"> return new OffheapDecodedExtendedCell(</span>
<span class="source-line-no">343</span><span id="line-343"> ByteBuffer.wrap(Bytes.copy(keyBuffer, 0, this.keyLength)), currentKey.getRowLength(),</span>
<span class="source-line-no">344</span><span id="line-344"> currentKey.getFamilyOffset(), currentKey.getFamilyLength(), currentKey.getQualifierOffset(),</span>
<span class="source-line-no">345</span><span id="line-345"> currentKey.getQualifierLength(), currentKey.getTimestamp(), currentKey.getTypeByte(),</span>
<span class="source-line-no">346</span><span id="line-346"> valAndTagsBuffer, vOffset, this.valueLength, memstoreTS, tagsBuf, tOffset, this.tagsLength);</span>
<span class="source-line-no">347</span><span id="line-347"> }</span>
<span class="source-line-no">348</span><span id="line-348"> }</span>
<span class="source-line-no">349</span><span id="line-349"></span>
<span class="source-line-no">350</span><span id="line-350"> /**</span>
<span class="source-line-no">351</span><span id="line-351"> * Copies only the key part of the keybuffer by doing a deep copy and passes the seeker state</span>
<span class="source-line-no">352</span><span id="line-352"> * members for taking a clone. Note that the value byte[] part is still pointing to the</span>
<span class="source-line-no">353</span><span id="line-353"> * currentBuffer and represented by the valueOffset and valueLength</span>
<span class="source-line-no">354</span><span id="line-354"> */</span>
<span class="source-line-no">355</span><span id="line-355"> // We return this as a Cell to the upper layers of read flow and might try setting a new SeqId</span>
<span class="source-line-no">356</span><span id="line-356"> // there. So this has to be an instance of ExtendedCell.</span>
<span class="source-line-no">357</span><span id="line-357"> protected static class OnheapDecodedCell implements ExtendedCell {</span>
<span class="source-line-no">358</span><span id="line-358"> private static final long FIXED_OVERHEAD = ClassSize.align(ClassSize.OBJECT</span>
<span class="source-line-no">359</span><span id="line-359"> + (3 * ClassSize.REFERENCE) + (2 * Bytes.SIZEOF_LONG) + (7 * Bytes.SIZEOF_INT)</span>
<span class="source-line-no">360</span><span id="line-360"> + Bytes.SIZEOF_SHORT + (2 * Bytes.SIZEOF_BYTE) + (3 * ClassSize.ARRAY));</span>
<span class="source-line-no">361</span><span id="line-361"> private byte[] keyOnlyBuffer;</span>
<span class="source-line-no">362</span><span id="line-362"> private short rowLength;</span>
<span class="source-line-no">363</span><span id="line-363"> private int familyOffset;</span>
<span class="source-line-no">364</span><span id="line-364"> private byte familyLength;</span>
<span class="source-line-no">365</span><span id="line-365"> private int qualifierOffset;</span>
<span class="source-line-no">366</span><span id="line-366"> private int qualifierLength;</span>
<span class="source-line-no">367</span><span id="line-367"> private long timeStamp;</span>
<span class="source-line-no">368</span><span id="line-368"> private byte typeByte;</span>
<span class="source-line-no">369</span><span id="line-369"> private byte[] valueBuffer;</span>
<span class="source-line-no">370</span><span id="line-370"> private int valueOffset;</span>
<span class="source-line-no">371</span><span id="line-371"> private int valueLength;</span>
<span class="source-line-no">372</span><span id="line-372"> private byte[] tagsBuffer;</span>
<span class="source-line-no">373</span><span id="line-373"> private int tagsOffset;</span>
<span class="source-line-no">374</span><span id="line-374"> private int tagsLength;</span>
<span class="source-line-no">375</span><span id="line-375"> private long seqId;</span>
<span class="source-line-no">376</span><span id="line-376"></span>
<span class="source-line-no">377</span><span id="line-377"> protected OnheapDecodedCell(byte[] keyBuffer, short rowLength, int familyOffset,</span>
<span class="source-line-no">378</span><span id="line-378"> byte familyLength, int qualOffset, int qualLength, long timeStamp, byte typeByte,</span>
<span class="source-line-no">379</span><span id="line-379"> byte[] valueBuffer, int valueOffset, int valueLen, long seqId, byte[] tagsBuffer,</span>
<span class="source-line-no">380</span><span id="line-380"> int tagsOffset, int tagsLength) {</span>
<span class="source-line-no">381</span><span id="line-381"> this.keyOnlyBuffer = keyBuffer;</span>
<span class="source-line-no">382</span><span id="line-382"> this.rowLength = rowLength;</span>
<span class="source-line-no">383</span><span id="line-383"> this.familyOffset = familyOffset;</span>
<span class="source-line-no">384</span><span id="line-384"> this.familyLength = familyLength;</span>
<span class="source-line-no">385</span><span id="line-385"> this.qualifierOffset = qualOffset;</span>
<span class="source-line-no">386</span><span id="line-386"> this.qualifierLength = qualLength;</span>
<span class="source-line-no">387</span><span id="line-387"> this.timeStamp = timeStamp;</span>
<span class="source-line-no">388</span><span id="line-388"> this.typeByte = typeByte;</span>
<span class="source-line-no">389</span><span id="line-389"> this.valueBuffer = valueBuffer;</span>
<span class="source-line-no">390</span><span id="line-390"> this.valueOffset = valueOffset;</span>
<span class="source-line-no">391</span><span id="line-391"> this.valueLength = valueLen;</span>
<span class="source-line-no">392</span><span id="line-392"> this.tagsBuffer = tagsBuffer;</span>
<span class="source-line-no">393</span><span id="line-393"> this.tagsOffset = tagsOffset;</span>
<span class="source-line-no">394</span><span id="line-394"> this.tagsLength = tagsLength;</span>
<span class="source-line-no">395</span><span id="line-395"> setSequenceId(seqId);</span>
<span class="source-line-no">396</span><span id="line-396"> }</span>
<span class="source-line-no">397</span><span id="line-397"></span>
<span class="source-line-no">398</span><span id="line-398"> @Override</span>
<span class="source-line-no">399</span><span id="line-399"> public byte[] getRowArray() {</span>
<span class="source-line-no">400</span><span id="line-400"> return keyOnlyBuffer;</span>
<span class="source-line-no">401</span><span id="line-401"> }</span>
<span class="source-line-no">402</span><span id="line-402"></span>
<span class="source-line-no">403</span><span id="line-403"> @Override</span>
<span class="source-line-no">404</span><span id="line-404"> public byte[] getFamilyArray() {</span>
<span class="source-line-no">405</span><span id="line-405"> return keyOnlyBuffer;</span>
<span class="source-line-no">406</span><span id="line-406"> }</span>
<span class="source-line-no">407</span><span id="line-407"></span>
<span class="source-line-no">408</span><span id="line-408"> @Override</span>
<span class="source-line-no">409</span><span id="line-409"> public byte[] getQualifierArray() {</span>
<span class="source-line-no">410</span><span id="line-410"> return keyOnlyBuffer;</span>
<span class="source-line-no">411</span><span id="line-411"> }</span>
<span class="source-line-no">412</span><span id="line-412"></span>
<span class="source-line-no">413</span><span id="line-413"> @Override</span>
<span class="source-line-no">414</span><span id="line-414"> public int getRowOffset() {</span>
<span class="source-line-no">415</span><span id="line-415"> return Bytes.SIZEOF_SHORT;</span>
<span class="source-line-no">416</span><span id="line-416"> }</span>
<span class="source-line-no">417</span><span id="line-417"></span>
<span class="source-line-no">418</span><span id="line-418"> @Override</span>
<span class="source-line-no">419</span><span id="line-419"> public short getRowLength() {</span>
<span class="source-line-no">420</span><span id="line-420"> return rowLength;</span>
<span class="source-line-no">421</span><span id="line-421"> }</span>
<span class="source-line-no">422</span><span id="line-422"></span>
<span class="source-line-no">423</span><span id="line-423"> @Override</span>
<span class="source-line-no">424</span><span id="line-424"> public int getFamilyOffset() {</span>
<span class="source-line-no">425</span><span id="line-425"> return familyOffset;</span>
<span class="source-line-no">426</span><span id="line-426"> }</span>
<span class="source-line-no">427</span><span id="line-427"></span>
<span class="source-line-no">428</span><span id="line-428"> @Override</span>
<span class="source-line-no">429</span><span id="line-429"> public byte getFamilyLength() {</span>
<span class="source-line-no">430</span><span id="line-430"> return familyLength;</span>
<span class="source-line-no">431</span><span id="line-431"> }</span>
<span class="source-line-no">432</span><span id="line-432"></span>
<span class="source-line-no">433</span><span id="line-433"> @Override</span>
<span class="source-line-no">434</span><span id="line-434"> public int getQualifierOffset() {</span>
<span class="source-line-no">435</span><span id="line-435"> return qualifierOffset;</span>
<span class="source-line-no">436</span><span id="line-436"> }</span>
<span class="source-line-no">437</span><span id="line-437"></span>
<span class="source-line-no">438</span><span id="line-438"> @Override</span>
<span class="source-line-no">439</span><span id="line-439"> public int getQualifierLength() {</span>
<span class="source-line-no">440</span><span id="line-440"> return qualifierLength;</span>
<span class="source-line-no">441</span><span id="line-441"> }</span>
<span class="source-line-no">442</span><span id="line-442"></span>
<span class="source-line-no">443</span><span id="line-443"> @Override</span>
<span class="source-line-no">444</span><span id="line-444"> public long getTimestamp() {</span>
<span class="source-line-no">445</span><span id="line-445"> return timeStamp;</span>
<span class="source-line-no">446</span><span id="line-446"> }</span>
<span class="source-line-no">447</span><span id="line-447"></span>
<span class="source-line-no">448</span><span id="line-448"> @Override</span>
<span class="source-line-no">449</span><span id="line-449"> public byte getTypeByte() {</span>
<span class="source-line-no">450</span><span id="line-450"> return typeByte;</span>
<span class="source-line-no">451</span><span id="line-451"> }</span>
<span class="source-line-no">452</span><span id="line-452"></span>
<span class="source-line-no">453</span><span id="line-453"> @Override</span>
<span class="source-line-no">454</span><span id="line-454"> public long getSequenceId() {</span>
<span class="source-line-no">455</span><span id="line-455"> return seqId;</span>
<span class="source-line-no">456</span><span id="line-456"> }</span>
<span class="source-line-no">457</span><span id="line-457"></span>
<span class="source-line-no">458</span><span id="line-458"> @Override</span>
<span class="source-line-no">459</span><span id="line-459"> public byte[] getValueArray() {</span>
<span class="source-line-no">460</span><span id="line-460"> return this.valueBuffer;</span>
<span class="source-line-no">461</span><span id="line-461"> }</span>
<span class="source-line-no">462</span><span id="line-462"></span>
<span class="source-line-no">463</span><span id="line-463"> @Override</span>
<span class="source-line-no">464</span><span id="line-464"> public int getValueOffset() {</span>
<span class="source-line-no">465</span><span id="line-465"> return valueOffset;</span>
<span class="source-line-no">466</span><span id="line-466"> }</span>
<span class="source-line-no">467</span><span id="line-467"></span>
<span class="source-line-no">468</span><span id="line-468"> @Override</span>
<span class="source-line-no">469</span><span id="line-469"> public int getValueLength() {</span>
<span class="source-line-no">470</span><span id="line-470"> return valueLength;</span>
<span class="source-line-no">471</span><span id="line-471"> }</span>
<span class="source-line-no">472</span><span id="line-472"></span>
<span class="source-line-no">473</span><span id="line-473"> @Override</span>
<span class="source-line-no">474</span><span id="line-474"> public byte[] getTagsArray() {</span>
<span class="source-line-no">475</span><span id="line-475"> return this.tagsBuffer;</span>
<span class="source-line-no">476</span><span id="line-476"> }</span>
<span class="source-line-no">477</span><span id="line-477"></span>
<span class="source-line-no">478</span><span id="line-478"> @Override</span>
<span class="source-line-no">479</span><span id="line-479"> public int getTagsOffset() {</span>
<span class="source-line-no">480</span><span id="line-480"> return this.tagsOffset;</span>
<span class="source-line-no">481</span><span id="line-481"> }</span>
<span class="source-line-no">482</span><span id="line-482"></span>
<span class="source-line-no">483</span><span id="line-483"> @Override</span>
<span class="source-line-no">484</span><span id="line-484"> public int getTagsLength() {</span>
<span class="source-line-no">485</span><span id="line-485"> return tagsLength;</span>
<span class="source-line-no">486</span><span id="line-486"> }</span>
<span class="source-line-no">487</span><span id="line-487"></span>
<span class="source-line-no">488</span><span id="line-488"> @Override</span>
<span class="source-line-no">489</span><span id="line-489"> public String toString() {</span>
<span class="source-line-no">490</span><span id="line-490"> return KeyValue.keyToString(this.keyOnlyBuffer, 0, KeyValueUtil.keyLength(this)) + "/vlen="</span>
<span class="source-line-no">491</span><span id="line-491"> + getValueLength() + "/seqid=" + seqId;</span>
<span class="source-line-no">492</span><span id="line-492"> }</span>
<span class="source-line-no">493</span><span id="line-493"></span>
<span class="source-line-no">494</span><span id="line-494"> @Override</span>
<span class="source-line-no">495</span><span id="line-495"> public void setSequenceId(long seqId) {</span>
<span class="source-line-no">496</span><span id="line-496"> this.seqId = seqId;</span>
<span class="source-line-no">497</span><span id="line-497"> }</span>
<span class="source-line-no">498</span><span id="line-498"></span>
<span class="source-line-no">499</span><span id="line-499"> @Override</span>
<span class="source-line-no">500</span><span id="line-500"> public long heapSize() {</span>
<span class="source-line-no">501</span><span id="line-501"> return FIXED_OVERHEAD + rowLength + familyLength + qualifierLength + valueLength + tagsLength;</span>
<span class="source-line-no">502</span><span id="line-502"> }</span>
<span class="source-line-no">503</span><span id="line-503"></span>
<span class="source-line-no">504</span><span id="line-504"> @Override</span>
<span class="source-line-no">505</span><span id="line-505"> public int write(OutputStream out, boolean withTags) throws IOException {</span>
<span class="source-line-no">506</span><span id="line-506"> int lenToWrite = getSerializedSize(withTags);</span>
<span class="source-line-no">507</span><span id="line-507"> ByteBufferUtils.putInt(out, keyOnlyBuffer.length);</span>
<span class="source-line-no">508</span><span id="line-508"> ByteBufferUtils.putInt(out, valueLength);</span>
<span class="source-line-no">509</span><span id="line-509"> // Write key</span>
<span class="source-line-no">510</span><span id="line-510"> out.write(keyOnlyBuffer);</span>
<span class="source-line-no">511</span><span id="line-511"> // Write value</span>
<span class="source-line-no">512</span><span id="line-512"> out.write(this.valueBuffer, this.valueOffset, this.valueLength);</span>
<span class="source-line-no">513</span><span id="line-513"> if (withTags &amp;&amp; this.tagsLength &gt; 0) {</span>
<span class="source-line-no">514</span><span id="line-514"> // 2 bytes tags length followed by tags bytes</span>
<span class="source-line-no">515</span><span id="line-515"> // tags length is serialized with 2 bytes only(short way) even if the type is int.</span>
<span class="source-line-no">516</span><span id="line-516"> // As this is non -ve numbers, we save the sign bit. See HBASE-11437</span>
<span class="source-line-no">517</span><span id="line-517"> out.write((byte) (0xff &amp; (this.tagsLength &gt;&gt; 8)));</span>
<span class="source-line-no">518</span><span id="line-518"> out.write((byte) (0xff &amp; this.tagsLength));</span>
<span class="source-line-no">519</span><span id="line-519"> out.write(this.tagsBuffer, this.tagsOffset, this.tagsLength);</span>
<span class="source-line-no">520</span><span id="line-520"> }</span>
<span class="source-line-no">521</span><span id="line-521"> return lenToWrite;</span>
<span class="source-line-no">522</span><span id="line-522"> }</span>
<span class="source-line-no">523</span><span id="line-523"></span>
<span class="source-line-no">524</span><span id="line-524"> @Override</span>
<span class="source-line-no">525</span><span id="line-525"> public int getSerializedSize(boolean withTags) {</span>
<span class="source-line-no">526</span><span id="line-526"> return KeyValueUtil.length(rowLength, familyLength, qualifierLength, valueLength, tagsLength,</span>
<span class="source-line-no">527</span><span id="line-527"> withTags);</span>
<span class="source-line-no">528</span><span id="line-528"> }</span>
<span class="source-line-no">529</span><span id="line-529"></span>
<span class="source-line-no">530</span><span id="line-530"> @Override</span>
<span class="source-line-no">531</span><span id="line-531"> public void write(ByteBuffer buf, int offset) {</span>
<span class="source-line-no">532</span><span id="line-532"> // This is not used in actual flow. Throwing UnsupportedOperationException</span>
<span class="source-line-no">533</span><span id="line-533"> throw new UnsupportedOperationException();</span>
<span class="source-line-no">534</span><span id="line-534"> }</span>
<span class="source-line-no">535</span><span id="line-535"></span>
<span class="source-line-no">536</span><span id="line-536"> @Override</span>
<span class="source-line-no">537</span><span id="line-537"> public void setTimestamp(long ts) throws IOException {</span>
<span class="source-line-no">538</span><span id="line-538"> // This is not used in actual flow. Throwing UnsupportedOperationException</span>
<span class="source-line-no">539</span><span id="line-539"> throw new UnsupportedOperationException();</span>
<span class="source-line-no">540</span><span id="line-540"> }</span>
<span class="source-line-no">541</span><span id="line-541"></span>
<span class="source-line-no">542</span><span id="line-542"> @Override</span>
<span class="source-line-no">543</span><span id="line-543"> public void setTimestamp(byte[] ts) throws IOException {</span>
<span class="source-line-no">544</span><span id="line-544"> // This is not used in actual flow. Throwing UnsupportedOperationException</span>
<span class="source-line-no">545</span><span id="line-545"> throw new UnsupportedOperationException();</span>
<span class="source-line-no">546</span><span id="line-546"> }</span>
<span class="source-line-no">547</span><span id="line-547"></span>
<span class="source-line-no">548</span><span id="line-548"> @Override</span>
<span class="source-line-no">549</span><span id="line-549"> public ExtendedCell deepClone() {</span>
<span class="source-line-no">550</span><span id="line-550"> // This is not used in actual flow. Throwing UnsupportedOperationException</span>
<span class="source-line-no">551</span><span id="line-551"> throw new UnsupportedOperationException();</span>
<span class="source-line-no">552</span><span id="line-552"> }</span>
<span class="source-line-no">553</span><span id="line-553"> }</span>
<span class="source-line-no">554</span><span id="line-554"></span>
<span class="source-line-no">555</span><span id="line-555"> protected static class OffheapDecodedExtendedCell extends ByteBufferExtendedCell {</span>
<span class="source-line-no">556</span><span id="line-556"> private static final long FIXED_OVERHEAD =</span>
<span class="source-line-no">557</span><span id="line-557"> (long) ClassSize.align(ClassSize.OBJECT + (3 * ClassSize.REFERENCE) + (2 * Bytes.SIZEOF_LONG)</span>
<span class="source-line-no">558</span><span id="line-558"> + (7 * Bytes.SIZEOF_INT) + Bytes.SIZEOF_SHORT) + (2 * Bytes.SIZEOF_BYTE)</span>
<span class="source-line-no">559</span><span id="line-559"> + (3 * ClassSize.BYTE_BUFFER);</span>
<span class="source-line-no">560</span><span id="line-560"> private ByteBuffer keyBuffer;</span>
<span class="source-line-no">561</span><span id="line-561"> private short rowLength;</span>
<span class="source-line-no">562</span><span id="line-562"> private int familyOffset;</span>
<span class="source-line-no">563</span><span id="line-563"> private byte familyLength;</span>
<span class="source-line-no">564</span><span id="line-564"> private int qualifierOffset;</span>
<span class="source-line-no">565</span><span id="line-565"> private int qualifierLength;</span>
<span class="source-line-no">566</span><span id="line-566"> private long timeStamp;</span>
<span class="source-line-no">567</span><span id="line-567"> private byte typeByte;</span>
<span class="source-line-no">568</span><span id="line-568"> private ByteBuffer valueBuffer;</span>
<span class="source-line-no">569</span><span id="line-569"> private int valueOffset;</span>
<span class="source-line-no">570</span><span id="line-570"> private int valueLength;</span>
<span class="source-line-no">571</span><span id="line-571"> private ByteBuffer tagsBuffer;</span>
<span class="source-line-no">572</span><span id="line-572"> private int tagsOffset;</span>
<span class="source-line-no">573</span><span id="line-573"> private int tagsLength;</span>
<span class="source-line-no">574</span><span id="line-574"> private long seqId;</span>
<span class="source-line-no">575</span><span id="line-575"></span>
<span class="source-line-no">576</span><span id="line-576"> protected OffheapDecodedExtendedCell(ByteBuffer keyBuffer, short rowLength, int familyOffset,</span>
<span class="source-line-no">577</span><span id="line-577"> byte familyLength, int qualOffset, int qualLength, long timeStamp, byte typeByte,</span>
<span class="source-line-no">578</span><span id="line-578"> ByteBuffer valueBuffer, int valueOffset, int valueLen, long seqId, ByteBuffer tagsBuffer,</span>
<span class="source-line-no">579</span><span id="line-579"> int tagsOffset, int tagsLength) {</span>
<span class="source-line-no">580</span><span id="line-580"> // The keyBuffer is always onheap</span>
<span class="source-line-no">581</span><span id="line-581"> assert keyBuffer.hasArray();</span>
<span class="source-line-no">582</span><span id="line-582"> assert keyBuffer.arrayOffset() == 0;</span>
<span class="source-line-no">583</span><span id="line-583"> this.keyBuffer = keyBuffer;</span>
<span class="source-line-no">584</span><span id="line-584"> this.rowLength = rowLength;</span>
<span class="source-line-no">585</span><span id="line-585"> this.familyOffset = familyOffset;</span>
<span class="source-line-no">586</span><span id="line-586"> this.familyLength = familyLength;</span>
<span class="source-line-no">587</span><span id="line-587"> this.qualifierOffset = qualOffset;</span>
<span class="source-line-no">588</span><span id="line-588"> this.qualifierLength = qualLength;</span>
<span class="source-line-no">589</span><span id="line-589"> this.timeStamp = timeStamp;</span>
<span class="source-line-no">590</span><span id="line-590"> this.typeByte = typeByte;</span>
<span class="source-line-no">591</span><span id="line-591"> this.valueBuffer = valueBuffer;</span>
<span class="source-line-no">592</span><span id="line-592"> this.valueOffset = valueOffset;</span>
<span class="source-line-no">593</span><span id="line-593"> this.valueLength = valueLen;</span>
<span class="source-line-no">594</span><span id="line-594"> this.tagsBuffer = tagsBuffer;</span>
<span class="source-line-no">595</span><span id="line-595"> this.tagsOffset = tagsOffset;</span>
<span class="source-line-no">596</span><span id="line-596"> this.tagsLength = tagsLength;</span>
<span class="source-line-no">597</span><span id="line-597"> setSequenceId(seqId);</span>
<span class="source-line-no">598</span><span id="line-598"> }</span>
<span class="source-line-no">599</span><span id="line-599"></span>
<span class="source-line-no">600</span><span id="line-600"> @Override</span>
<span class="source-line-no">601</span><span id="line-601"> @SuppressWarnings("ByteBufferBackingArray")</span>
<span class="source-line-no">602</span><span id="line-602"> public byte[] getRowArray() {</span>
<span class="source-line-no">603</span><span id="line-603"> return this.keyBuffer.array();</span>
<span class="source-line-no">604</span><span id="line-604"> }</span>
<span class="source-line-no">605</span><span id="line-605"></span>
<span class="source-line-no">606</span><span id="line-606"> @Override</span>
<span class="source-line-no">607</span><span id="line-607"> public int getRowOffset() {</span>
<span class="source-line-no">608</span><span id="line-608"> return getRowPosition();</span>
<span class="source-line-no">609</span><span id="line-609"> }</span>
<span class="source-line-no">610</span><span id="line-610"></span>
<span class="source-line-no">611</span><span id="line-611"> @Override</span>
<span class="source-line-no">612</span><span id="line-612"> public short getRowLength() {</span>
<span class="source-line-no">613</span><span id="line-613"> return this.rowLength;</span>
<span class="source-line-no">614</span><span id="line-614"> }</span>
<span class="source-line-no">615</span><span id="line-615"></span>
<span class="source-line-no">616</span><span id="line-616"> @Override</span>
<span class="source-line-no">617</span><span id="line-617"> @SuppressWarnings("ByteBufferBackingArray")</span>
<span class="source-line-no">618</span><span id="line-618"> public byte[] getFamilyArray() {</span>
<span class="source-line-no">619</span><span id="line-619"> return this.keyBuffer.array();</span>
<span class="source-line-no">620</span><span id="line-620"> }</span>
<span class="source-line-no">621</span><span id="line-621"></span>
<span class="source-line-no">622</span><span id="line-622"> @Override</span>
<span class="source-line-no">623</span><span id="line-623"> public int getFamilyOffset() {</span>
<span class="source-line-no">624</span><span id="line-624"> return getFamilyPosition();</span>
<span class="source-line-no">625</span><span id="line-625"> }</span>
<span class="source-line-no">626</span><span id="line-626"></span>
<span class="source-line-no">627</span><span id="line-627"> @Override</span>
<span class="source-line-no">628</span><span id="line-628"> public byte getFamilyLength() {</span>
<span class="source-line-no">629</span><span id="line-629"> return this.familyLength;</span>
<span class="source-line-no">630</span><span id="line-630"> }</span>
<span class="source-line-no">631</span><span id="line-631"></span>
<span class="source-line-no">632</span><span id="line-632"> @Override</span>
<span class="source-line-no">633</span><span id="line-633"> @SuppressWarnings("ByteBufferBackingArray")</span>
<span class="source-line-no">634</span><span id="line-634"> public byte[] getQualifierArray() {</span>
<span class="source-line-no">635</span><span id="line-635"> return this.keyBuffer.array();</span>
<span class="source-line-no">636</span><span id="line-636"> }</span>
<span class="source-line-no">637</span><span id="line-637"></span>
<span class="source-line-no">638</span><span id="line-638"> @Override</span>
<span class="source-line-no">639</span><span id="line-639"> public int getQualifierOffset() {</span>
<span class="source-line-no">640</span><span id="line-640"> return getQualifierPosition();</span>
<span class="source-line-no">641</span><span id="line-641"> }</span>
<span class="source-line-no">642</span><span id="line-642"></span>
<span class="source-line-no">643</span><span id="line-643"> @Override</span>
<span class="source-line-no">644</span><span id="line-644"> public int getQualifierLength() {</span>
<span class="source-line-no">645</span><span id="line-645"> return this.qualifierLength;</span>
<span class="source-line-no">646</span><span id="line-646"> }</span>
<span class="source-line-no">647</span><span id="line-647"></span>
<span class="source-line-no">648</span><span id="line-648"> @Override</span>
<span class="source-line-no">649</span><span id="line-649"> public long getTimestamp() {</span>
<span class="source-line-no">650</span><span id="line-650"> return this.timeStamp;</span>
<span class="source-line-no">651</span><span id="line-651"> }</span>
<span class="source-line-no">652</span><span id="line-652"></span>
<span class="source-line-no">653</span><span id="line-653"> @Override</span>
<span class="source-line-no">654</span><span id="line-654"> public byte getTypeByte() {</span>
<span class="source-line-no">655</span><span id="line-655"> return this.typeByte;</span>
<span class="source-line-no">656</span><span id="line-656"> }</span>
<span class="source-line-no">657</span><span id="line-657"></span>
<span class="source-line-no">658</span><span id="line-658"> @Override</span>
<span class="source-line-no">659</span><span id="line-659"> public long getSequenceId() {</span>
<span class="source-line-no">660</span><span id="line-660"> return this.seqId;</span>
<span class="source-line-no">661</span><span id="line-661"> }</span>
<span class="source-line-no">662</span><span id="line-662"></span>
<span class="source-line-no">663</span><span id="line-663"> @Override</span>
<span class="source-line-no">664</span><span id="line-664"> public byte[] getValueArray() {</span>
<span class="source-line-no">665</span><span id="line-665"> return CellUtil.cloneValue(this);</span>
<span class="source-line-no">666</span><span id="line-666"> }</span>
<span class="source-line-no">667</span><span id="line-667"></span>
<span class="source-line-no">668</span><span id="line-668"> @Override</span>
<span class="source-line-no">669</span><span id="line-669"> public int getValueOffset() {</span>
<span class="source-line-no">670</span><span id="line-670"> return 0;</span>
<span class="source-line-no">671</span><span id="line-671"> }</span>
<span class="source-line-no">672</span><span id="line-672"></span>
<span class="source-line-no">673</span><span id="line-673"> @Override</span>
<span class="source-line-no">674</span><span id="line-674"> public int getValueLength() {</span>
<span class="source-line-no">675</span><span id="line-675"> return this.valueLength;</span>
<span class="source-line-no">676</span><span id="line-676"> }</span>
<span class="source-line-no">677</span><span id="line-677"></span>
<span class="source-line-no">678</span><span id="line-678"> @Override</span>
<span class="source-line-no">679</span><span id="line-679"> public byte[] getTagsArray() {</span>
<span class="source-line-no">680</span><span id="line-680"> return PrivateCellUtil.cloneTags(this);</span>
<span class="source-line-no">681</span><span id="line-681"> }</span>
<span class="source-line-no">682</span><span id="line-682"></span>
<span class="source-line-no">683</span><span id="line-683"> @Override</span>
<span class="source-line-no">684</span><span id="line-684"> public int getTagsOffset() {</span>
<span class="source-line-no">685</span><span id="line-685"> return 0;</span>
<span class="source-line-no">686</span><span id="line-686"> }</span>
<span class="source-line-no">687</span><span id="line-687"></span>
<span class="source-line-no">688</span><span id="line-688"> @Override</span>
<span class="source-line-no">689</span><span id="line-689"> public int getTagsLength() {</span>
<span class="source-line-no">690</span><span id="line-690"> return this.tagsLength;</span>
<span class="source-line-no">691</span><span id="line-691"> }</span>
<span class="source-line-no">692</span><span id="line-692"></span>
<span class="source-line-no">693</span><span id="line-693"> @Override</span>
<span class="source-line-no">694</span><span id="line-694"> public ByteBuffer getRowByteBuffer() {</span>
<span class="source-line-no">695</span><span id="line-695"> return this.keyBuffer;</span>
<span class="source-line-no">696</span><span id="line-696"> }</span>
<span class="source-line-no">697</span><span id="line-697"></span>
<span class="source-line-no">698</span><span id="line-698"> @Override</span>
<span class="source-line-no">699</span><span id="line-699"> public int getRowPosition() {</span>
<span class="source-line-no">700</span><span id="line-700"> return Bytes.SIZEOF_SHORT;</span>
<span class="source-line-no">701</span><span id="line-701"> }</span>
<span class="source-line-no">702</span><span id="line-702"></span>
<span class="source-line-no">703</span><span id="line-703"> @Override</span>
<span class="source-line-no">704</span><span id="line-704"> public ByteBuffer getFamilyByteBuffer() {</span>
<span class="source-line-no">705</span><span id="line-705"> return this.keyBuffer;</span>
<span class="source-line-no">706</span><span id="line-706"> }</span>
<span class="source-line-no">707</span><span id="line-707"></span>
<span class="source-line-no">708</span><span id="line-708"> @Override</span>
<span class="source-line-no">709</span><span id="line-709"> public int getFamilyPosition() {</span>
<span class="source-line-no">710</span><span id="line-710"> return this.familyOffset;</span>
<span class="source-line-no">711</span><span id="line-711"> }</span>
<span class="source-line-no">712</span><span id="line-712"></span>
<span class="source-line-no">713</span><span id="line-713"> @Override</span>
<span class="source-line-no">714</span><span id="line-714"> public ByteBuffer getQualifierByteBuffer() {</span>
<span class="source-line-no">715</span><span id="line-715"> return this.keyBuffer;</span>
<span class="source-line-no">716</span><span id="line-716"> }</span>
<span class="source-line-no">717</span><span id="line-717"></span>
<span class="source-line-no">718</span><span id="line-718"> @Override</span>
<span class="source-line-no">719</span><span id="line-719"> public int getQualifierPosition() {</span>
<span class="source-line-no">720</span><span id="line-720"> return this.qualifierOffset;</span>
<span class="source-line-no">721</span><span id="line-721"> }</span>
<span class="source-line-no">722</span><span id="line-722"></span>
<span class="source-line-no">723</span><span id="line-723"> @Override</span>
<span class="source-line-no">724</span><span id="line-724"> public ByteBuffer getValueByteBuffer() {</span>
<span class="source-line-no">725</span><span id="line-725"> return this.valueBuffer;</span>
<span class="source-line-no">726</span><span id="line-726"> }</span>
<span class="source-line-no">727</span><span id="line-727"></span>
<span class="source-line-no">728</span><span id="line-728"> @Override</span>
<span class="source-line-no">729</span><span id="line-729"> public int getValuePosition() {</span>
<span class="source-line-no">730</span><span id="line-730"> return this.valueOffset;</span>
<span class="source-line-no">731</span><span id="line-731"> }</span>
<span class="source-line-no">732</span><span id="line-732"></span>
<span class="source-line-no">733</span><span id="line-733"> @Override</span>
<span class="source-line-no">734</span><span id="line-734"> public ByteBuffer getTagsByteBuffer() {</span>
<span class="source-line-no">735</span><span id="line-735"> return this.tagsBuffer;</span>
<span class="source-line-no">736</span><span id="line-736"> }</span>
<span class="source-line-no">737</span><span id="line-737"></span>
<span class="source-line-no">738</span><span id="line-738"> @Override</span>
<span class="source-line-no">739</span><span id="line-739"> public int getTagsPosition() {</span>
<span class="source-line-no">740</span><span id="line-740"> return this.tagsOffset;</span>
<span class="source-line-no">741</span><span id="line-741"> }</span>
<span class="source-line-no">742</span><span id="line-742"></span>
<span class="source-line-no">743</span><span id="line-743"> @Override</span>
<span class="source-line-no">744</span><span id="line-744"> public long heapSize() {</span>
<span class="source-line-no">745</span><span id="line-745"> return FIXED_OVERHEAD;</span>
<span class="source-line-no">746</span><span id="line-746"> }</span>
<span class="source-line-no">747</span><span id="line-747"></span>
<span class="source-line-no">748</span><span id="line-748"> @Override</span>
<span class="source-line-no">749</span><span id="line-749"> public void setSequenceId(long seqId) {</span>
<span class="source-line-no">750</span><span id="line-750"> this.seqId = seqId;</span>
<span class="source-line-no">751</span><span id="line-751"> }</span>
<span class="source-line-no">752</span><span id="line-752"></span>
<span class="source-line-no">753</span><span id="line-753"> @Override</span>
<span class="source-line-no">754</span><span id="line-754"> public int write(OutputStream out, boolean withTags) throws IOException {</span>
<span class="source-line-no">755</span><span id="line-755"> int lenToWrite = getSerializedSize(withTags);</span>
<span class="source-line-no">756</span><span id="line-756"> ByteBufferUtils.putInt(out, keyBuffer.remaining());</span>
<span class="source-line-no">757</span><span id="line-757"> ByteBufferUtils.putInt(out, valueLength);</span>
<span class="source-line-no">758</span><span id="line-758"> // Write key</span>
<span class="source-line-no">759</span><span id="line-759"> out.write(keyBuffer.array(), keyBuffer.arrayOffset(), keyBuffer.remaining());</span>
<span class="source-line-no">760</span><span id="line-760"> // Write value</span>
<span class="source-line-no">761</span><span id="line-761"> ByteBufferUtils.copyBufferToStream(out, this.valueBuffer, this.valueOffset, this.valueLength);</span>
<span class="source-line-no">762</span><span id="line-762"> if (withTags &amp;&amp; this.tagsLength &gt; 0) {</span>
<span class="source-line-no">763</span><span id="line-763"> // 2 bytes tags length followed by tags bytes</span>
<span class="source-line-no">764</span><span id="line-764"> // tags length is serialized with 2 bytes only(short way) even if the type is int.</span>
<span class="source-line-no">765</span><span id="line-765"> // As this is non -ve numbers, we save the sign bit. See HBASE-11437</span>
<span class="source-line-no">766</span><span id="line-766"> out.write((byte) (0xff &amp; (this.tagsLength &gt;&gt; 8)));</span>
<span class="source-line-no">767</span><span id="line-767"> out.write((byte) (0xff &amp; this.tagsLength));</span>
<span class="source-line-no">768</span><span id="line-768"> ByteBufferUtils.copyBufferToStream(out, this.tagsBuffer, this.tagsOffset, this.tagsLength);</span>
<span class="source-line-no">769</span><span id="line-769"> }</span>
<span class="source-line-no">770</span><span id="line-770"> return lenToWrite;</span>
<span class="source-line-no">771</span><span id="line-771"> }</span>
<span class="source-line-no">772</span><span id="line-772"></span>
<span class="source-line-no">773</span><span id="line-773"> @Override</span>
<span class="source-line-no">774</span><span id="line-774"> public int getSerializedSize(boolean withTags) {</span>
<span class="source-line-no">775</span><span id="line-775"> return KeyValueUtil.length(rowLength, familyLength, qualifierLength, valueLength, tagsLength,</span>
<span class="source-line-no">776</span><span id="line-776"> withTags);</span>
<span class="source-line-no">777</span><span id="line-777"> }</span>
<span class="source-line-no">778</span><span id="line-778"></span>
<span class="source-line-no">779</span><span id="line-779"> @Override</span>
<span class="source-line-no">780</span><span id="line-780"> public void setTimestamp(long ts) throws IOException {</span>
<span class="source-line-no">781</span><span id="line-781"> // This is not used in actual flow. Throwing UnsupportedOperationException</span>
<span class="source-line-no">782</span><span id="line-782"> throw new UnsupportedOperationException();</span>
<span class="source-line-no">783</span><span id="line-783"> }</span>
<span class="source-line-no">784</span><span id="line-784"></span>
<span class="source-line-no">785</span><span id="line-785"> @Override</span>
<span class="source-line-no">786</span><span id="line-786"> public void setTimestamp(byte[] ts) throws IOException {</span>
<span class="source-line-no">787</span><span id="line-787"> // This is not used in actual flow. Throwing UnsupportedOperationException</span>
<span class="source-line-no">788</span><span id="line-788"> throw new UnsupportedOperationException();</span>
<span class="source-line-no">789</span><span id="line-789"> }</span>
<span class="source-line-no">790</span><span id="line-790"></span>
<span class="source-line-no">791</span><span id="line-791"> @Override</span>
<span class="source-line-no">792</span><span id="line-792"> public void write(ByteBuffer buf, int offset) {</span>
<span class="source-line-no">793</span><span id="line-793"> // This is not used in actual flow. Throwing UnsupportedOperationException</span>
<span class="source-line-no">794</span><span id="line-794"> throw new UnsupportedOperationException();</span>
<span class="source-line-no">795</span><span id="line-795"> }</span>
<span class="source-line-no">796</span><span id="line-796"></span>
<span class="source-line-no">797</span><span id="line-797"> @Override</span>
<span class="source-line-no">798</span><span id="line-798"> public ExtendedCell deepClone() {</span>
<span class="source-line-no">799</span><span id="line-799"> // This is not used in actual flow. Throwing UnsupportedOperationException</span>
<span class="source-line-no">800</span><span id="line-800"> throw new UnsupportedOperationException();</span>
<span class="source-line-no">801</span><span id="line-801"> }</span>
<span class="source-line-no">802</span><span id="line-802"> }</span>
<span class="source-line-no">803</span><span id="line-803"></span>
<span class="source-line-no">804</span><span id="line-804"> protected abstract static class BufferedEncodedSeeker&lt;STATE extends SeekerState&gt;</span>
<span class="source-line-no">805</span><span id="line-805"> extends AbstractEncodedSeeker {</span>
<span class="source-line-no">806</span><span id="line-806"> protected ByteBuff currentBuffer;</span>
<span class="source-line-no">807</span><span id="line-807"> protected TagCompressionContext tagCompressionContext = null;</span>
<span class="source-line-no">808</span><span id="line-808"> protected KeyValue.KeyOnlyKeyValue keyOnlyKV = new KeyValue.KeyOnlyKeyValue();</span>
<span class="source-line-no">809</span><span id="line-809"> // A temp pair object which will be reused by ByteBuff#asSubByteBuffer calls. This avoids too</span>
<span class="source-line-no">810</span><span id="line-810"> // many object creations.</span>
<span class="source-line-no">811</span><span id="line-811"> protected final ObjectIntPair&lt;ByteBuffer&gt; tmpPair = new ObjectIntPair&lt;&gt;();</span>
<span class="source-line-no">812</span><span id="line-812"> protected STATE current, previous;</span>
<span class="source-line-no">813</span><span id="line-813"></span>
<span class="source-line-no">814</span><span id="line-814"> public BufferedEncodedSeeker(HFileBlockDecodingContext decodingCtx) {</span>
<span class="source-line-no">815</span><span id="line-815"> super(decodingCtx);</span>
<span class="source-line-no">816</span><span id="line-816"> if (decodingCtx.getHFileContext().isCompressTags()) {</span>
<span class="source-line-no">817</span><span id="line-817"> try {</span>
<span class="source-line-no">818</span><span id="line-818"> tagCompressionContext = new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);</span>
<span class="source-line-no">819</span><span id="line-819"> } catch (Exception e) {</span>
<span class="source-line-no">820</span><span id="line-820"> throw new RuntimeException("Failed to initialize TagCompressionContext", e);</span>
<span class="source-line-no">821</span><span id="line-821"> }</span>
<span class="source-line-no">822</span><span id="line-822"> }</span>
<span class="source-line-no">823</span><span id="line-823"> current = createSeekerState(); // always valid</span>
<span class="source-line-no">824</span><span id="line-824"> previous = createSeekerState(); // may not be valid</span>
<span class="source-line-no">825</span><span id="line-825"> }</span>
<span class="source-line-no">826</span><span id="line-826"></span>
<span class="source-line-no">827</span><span id="line-827"> @Override</span>
<span class="source-line-no">828</span><span id="line-828"> public int compareKey(CellComparator comparator, ExtendedCell key) {</span>
<span class="source-line-no">829</span><span id="line-829"> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);</span>
<span class="source-line-no">830</span><span id="line-830"> return PrivateCellUtil.compareKeyIgnoresMvcc(comparator, key, keyOnlyKV);</span>
<span class="source-line-no">831</span><span id="line-831"> }</span>
<span class="source-line-no">832</span><span id="line-832"></span>
<span class="source-line-no">833</span><span id="line-833"> @Override</span>
<span class="source-line-no">834</span><span id="line-834"> public void setCurrentBuffer(ByteBuff buffer) {</span>
<span class="source-line-no">835</span><span id="line-835"> if (this.tagCompressionContext != null) {</span>
<span class="source-line-no">836</span><span id="line-836"> this.tagCompressionContext.clear();</span>
<span class="source-line-no">837</span><span id="line-837"></span>
<span class="source-line-no">838</span><span id="line-838"> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous</span>
<span class="source-line-no">839</span><span id="line-839"> // seeker state. This is an optimization so we don't have to uncompress tags again when</span>
<span class="source-line-no">840</span><span id="line-840"> // reading last state.</span>
<span class="source-line-no">841</span><span id="line-841"> // In seekBefore flow, if block change happens then rewind is not called and</span>
<span class="source-line-no">842</span><span id="line-842"> // setCurrentBuffer is called, so need to uncompress any tags we see.</span>
<span class="source-line-no">843</span><span id="line-843"> current.uncompressTags = true;</span>
<span class="source-line-no">844</span><span id="line-844"> }</span>
<span class="source-line-no">845</span><span id="line-845"> currentBuffer = buffer;</span>
<span class="source-line-no">846</span><span id="line-846"> current.currentBuffer = currentBuffer;</span>
<span class="source-line-no">847</span><span id="line-847"> if (tagCompressionContext != null) {</span>
<span class="source-line-no">848</span><span id="line-848"> current.tagCompressionContext = tagCompressionContext;</span>
<span class="source-line-no">849</span><span id="line-849"> }</span>
<span class="source-line-no">850</span><span id="line-850"> decodeFirst();</span>
<span class="source-line-no">851</span><span id="line-851"> current.setKey(current.keyBuffer, current.memstoreTS);</span>
<span class="source-line-no">852</span><span id="line-852"> previous.invalidate();</span>
<span class="source-line-no">853</span><span id="line-853"> }</span>
<span class="source-line-no">854</span><span id="line-854"></span>
<span class="source-line-no">855</span><span id="line-855"> @Override</span>
<span class="source-line-no">856</span><span id="line-856"> public ExtendedCell getKey() {</span>
<span class="source-line-no">857</span><span id="line-857"> byte[] key = new byte[current.keyLength];</span>
<span class="source-line-no">858</span><span id="line-858"> System.arraycopy(current.keyBuffer, 0, key, 0, current.keyLength);</span>
<span class="source-line-no">859</span><span id="line-859"> return new KeyValue.KeyOnlyKeyValue(key);</span>
<span class="source-line-no">860</span><span id="line-860"> }</span>
<span class="source-line-no">861</span><span id="line-861"></span>
<span class="source-line-no">862</span><span id="line-862"> @Override</span>
<span class="source-line-no">863</span><span id="line-863"> public ByteBuffer getValueShallowCopy() {</span>
<span class="source-line-no">864</span><span id="line-864"> currentBuffer.asSubByteBuffer(current.valueOffset, current.valueLength, tmpPair);</span>
<span class="source-line-no">865</span><span id="line-865"> ByteBuffer dup = tmpPair.getFirst().duplicate();</span>
<span class="source-line-no">866</span><span id="line-866"> dup.position(tmpPair.getSecond());</span>
<span class="source-line-no">867</span><span id="line-867"> dup.limit(tmpPair.getSecond() + current.valueLength);</span>
<span class="source-line-no">868</span><span id="line-868"> return dup.slice();</span>
<span class="source-line-no">869</span><span id="line-869"> }</span>
<span class="source-line-no">870</span><span id="line-870"></span>
<span class="source-line-no">871</span><span id="line-871"> @Override</span>
<span class="source-line-no">872</span><span id="line-872"> public ExtendedCell getCell() {</span>
<span class="source-line-no">873</span><span id="line-873"> return current.toCell();</span>
<span class="source-line-no">874</span><span id="line-874"> }</span>
<span class="source-line-no">875</span><span id="line-875"></span>
<span class="source-line-no">876</span><span id="line-876"> @Override</span>
<span class="source-line-no">877</span><span id="line-877"> public void rewind() {</span>
<span class="source-line-no">878</span><span id="line-878"> currentBuffer.rewind();</span>
<span class="source-line-no">879</span><span id="line-879"> if (tagCompressionContext != null) {</span>
<span class="source-line-no">880</span><span id="line-880"> tagCompressionContext.clear();</span>
<span class="source-line-no">881</span><span id="line-881"> // Prior seekToKeyInBlock may have reset this to false if we fell back to previous</span>
<span class="source-line-no">882</span><span id="line-882"> // seeker state. This is an optimization so we don't have to uncompress tags again when</span>
<span class="source-line-no">883</span><span id="line-883"> // reading last state.</span>
<span class="source-line-no">884</span><span id="line-884"> // In case of rewind, we are starting from the beginning of the buffer, so we need</span>
<span class="source-line-no">885</span><span id="line-885"> // to uncompress any tags we see.</span>
<span class="source-line-no">886</span><span id="line-886"> current.uncompressTags = true;</span>
<span class="source-line-no">887</span><span id="line-887"> }</span>
<span class="source-line-no">888</span><span id="line-888"> decodeFirst();</span>
<span class="source-line-no">889</span><span id="line-889"> current.setKey(current.keyBuffer, current.memstoreTS);</span>
<span class="source-line-no">890</span><span id="line-890"> previous.invalidate();</span>
<span class="source-line-no">891</span><span id="line-891"> }</span>
<span class="source-line-no">892</span><span id="line-892"></span>
<span class="source-line-no">893</span><span id="line-893"> @Override</span>
<span class="source-line-no">894</span><span id="line-894"> public boolean next() {</span>
<span class="source-line-no">895</span><span id="line-895"> if (!currentBuffer.hasRemaining()) {</span>
<span class="source-line-no">896</span><span id="line-896"> return false;</span>
<span class="source-line-no">897</span><span id="line-897"> }</span>
<span class="source-line-no">898</span><span id="line-898"> decodeNext();</span>
<span class="source-line-no">899</span><span id="line-899"> current.setKey(current.keyBuffer, current.memstoreTS);</span>
<span class="source-line-no">900</span><span id="line-900"> previous.invalidate();</span>
<span class="source-line-no">901</span><span id="line-901"> return true;</span>
<span class="source-line-no">902</span><span id="line-902"> }</span>
<span class="source-line-no">903</span><span id="line-903"></span>
<span class="source-line-no">904</span><span id="line-904"> protected void decodeTags() {</span>
<span class="source-line-no">905</span><span id="line-905"> current.tagsLength = ByteBuff.readCompressedInt(currentBuffer);</span>
<span class="source-line-no">906</span><span id="line-906"> if (tagCompressionContext != null) {</span>
<span class="source-line-no">907</span><span id="line-907"> if (current.uncompressTags) {</span>
<span class="source-line-no">908</span><span id="line-908"> // Tag compression is been used. uncompress it into tagsBuffer</span>
<span class="source-line-no">909</span><span id="line-909"> current.ensureSpaceForTags();</span>
<span class="source-line-no">910</span><span id="line-910"> try {</span>
<span class="source-line-no">911</span><span id="line-911"> current.tagsCompressedLength = tagCompressionContext.uncompressTags(currentBuffer,</span>
<span class="source-line-no">912</span><span id="line-912"> current.tagsBuffer, 0, current.tagsLength);</span>
<span class="source-line-no">913</span><span id="line-913"> } catch (Exception e) {</span>
<span class="source-line-no">914</span><span id="line-914"> throw new RuntimeException("Exception while uncompressing tags", e);</span>
<span class="source-line-no">915</span><span id="line-915"> }</span>
<span class="source-line-no">916</span><span id="line-916"> } else {</span>
<span class="source-line-no">917</span><span id="line-917"> currentBuffer.skip(current.tagsCompressedLength);</span>
<span class="source-line-no">918</span><span id="line-918"> current.uncompressTags = true;// Reset this.</span>
<span class="source-line-no">919</span><span id="line-919"> }</span>
<span class="source-line-no">920</span><span id="line-920"> current.tagsOffset = -1;</span>
<span class="source-line-no">921</span><span id="line-921"> } else {</span>
<span class="source-line-no">922</span><span id="line-922"> // When tag compress is not used, let us not do copying of tags bytes into tagsBuffer.</span>
<span class="source-line-no">923</span><span id="line-923"> // Just mark the tags Offset so as to create the KV buffer later in getKeyValueBuffer()</span>
<span class="source-line-no">924</span><span id="line-924"> current.tagsOffset = currentBuffer.position();</span>
<span class="source-line-no">925</span><span id="line-925"> currentBuffer.skip(current.tagsLength);</span>
<span class="source-line-no">926</span><span id="line-926"> }</span>
<span class="source-line-no">927</span><span id="line-927"> }</span>
<span class="source-line-no">928</span><span id="line-928"></span>
<span class="source-line-no">929</span><span id="line-929"> @Override</span>
<span class="source-line-no">930</span><span id="line-930"> public int seekToKeyInBlock(ExtendedCell seekCell, boolean seekBefore) {</span>
<span class="source-line-no">931</span><span id="line-931"> int rowCommonPrefix = 0;</span>
<span class="source-line-no">932</span><span id="line-932"> int familyCommonPrefix = 0;</span>
<span class="source-line-no">933</span><span id="line-933"> int qualCommonPrefix = 0;</span>
<span class="source-line-no">934</span><span id="line-934"> previous.invalidate();</span>
<span class="source-line-no">935</span><span id="line-935"> do {</span>
<span class="source-line-no">936</span><span id="line-936"> int comp;</span>
<span class="source-line-no">937</span><span id="line-937"> keyOnlyKV.setKey(current.keyBuffer, 0, current.keyLength);</span>
<span class="source-line-no">938</span><span id="line-938"> if (current.lastCommonPrefix != 0) {</span>
<span class="source-line-no">939</span><span id="line-939"> // The KV format has row key length also in the byte array. The</span>
<span class="source-line-no">940</span><span id="line-940"> // common prefix</span>
<span class="source-line-no">941</span><span id="line-941"> // includes it. So we need to subtract to find out the common prefix</span>
<span class="source-line-no">942</span><span id="line-942"> // in the</span>
<span class="source-line-no">943</span><span id="line-943"> // row part alone</span>
<span class="source-line-no">944</span><span id="line-944"> rowCommonPrefix = Math.min(rowCommonPrefix, current.lastCommonPrefix - 2);</span>
<span class="source-line-no">945</span><span id="line-945"> }</span>
<span class="source-line-no">946</span><span id="line-946"> if (current.lastCommonPrefix &lt;= 2) {</span>
<span class="source-line-no">947</span><span id="line-947"> rowCommonPrefix = 0;</span>
<span class="source-line-no">948</span><span id="line-948"> }</span>
<span class="source-line-no">949</span><span id="line-949"> rowCommonPrefix += findCommonPrefixInRowPart(seekCell, keyOnlyKV, rowCommonPrefix);</span>
<span class="source-line-no">950</span><span id="line-950"> comp = compareCommonRowPrefix(seekCell, keyOnlyKV, rowCommonPrefix);</span>
<span class="source-line-no">951</span><span id="line-951"> if (comp == 0) {</span>
<span class="source-line-no">952</span><span id="line-952"> comp = compareTypeBytes(seekCell, keyOnlyKV);</span>
<span class="source-line-no">953</span><span id="line-953"> if (comp == 0) {</span>
<span class="source-line-no">954</span><span id="line-954"> // Subtract the fixed row key length and the family key fixed length</span>
<span class="source-line-no">955</span><span id="line-955"> familyCommonPrefix = Math.max(0, Math.min(familyCommonPrefix,</span>
<span class="source-line-no">956</span><span id="line-956"> current.lastCommonPrefix - (3 + keyOnlyKV.getRowLength())));</span>
<span class="source-line-no">957</span><span id="line-957"> familyCommonPrefix +=</span>
<span class="source-line-no">958</span><span id="line-958"> findCommonPrefixInFamilyPart(seekCell, keyOnlyKV, familyCommonPrefix);</span>
<span class="source-line-no">959</span><span id="line-959"> comp = compareCommonFamilyPrefix(seekCell, keyOnlyKV, familyCommonPrefix);</span>
<span class="source-line-no">960</span><span id="line-960"> if (comp == 0) {</span>
<span class="source-line-no">961</span><span id="line-961"> // subtract the rowkey fixed length and the family key fixed</span>
<span class="source-line-no">962</span><span id="line-962"> // length</span>
<span class="source-line-no">963</span><span id="line-963"> qualCommonPrefix = Math.max(0, Math.min(qualCommonPrefix, current.lastCommonPrefix</span>
<span class="source-line-no">964</span><span id="line-964"> - (3 + keyOnlyKV.getRowLength() + keyOnlyKV.getFamilyLength())));</span>
<span class="source-line-no">965</span><span id="line-965"> qualCommonPrefix +=</span>
<span class="source-line-no">966</span><span id="line-966"> findCommonPrefixInQualifierPart(seekCell, keyOnlyKV, qualCommonPrefix);</span>
<span class="source-line-no">967</span><span id="line-967"> comp = compareCommonQualifierPrefix(seekCell, keyOnlyKV, qualCommonPrefix);</span>
<span class="source-line-no">968</span><span id="line-968"> if (comp == 0) {</span>
<span class="source-line-no">969</span><span id="line-969"> comp = CellComparator.getInstance().compareTimestamps(seekCell, keyOnlyKV);</span>
<span class="source-line-no">970</span><span id="line-970"> if (comp == 0) {</span>
<span class="source-line-no">971</span><span id="line-971"> // Compare types. Let the delete types sort ahead of puts;</span>
<span class="source-line-no">972</span><span id="line-972"> // i.e. types</span>
<span class="source-line-no">973</span><span id="line-973"> // of higher numbers sort before those of lesser numbers.</span>
<span class="source-line-no">974</span><span id="line-974"> // Maximum</span>
<span class="source-line-no">975</span><span id="line-975"> // (255)</span>
<span class="source-line-no">976</span><span id="line-976"> // appears ahead of everything, and minimum (0) appears</span>
<span class="source-line-no">977</span><span id="line-977"> // after</span>
<span class="source-line-no">978</span><span id="line-978"> // everything.</span>
<span class="source-line-no">979</span><span id="line-979"> comp = (0xff &amp; keyOnlyKV.getTypeByte()) - (0xff &amp; seekCell.getTypeByte());</span>
<span class="source-line-no">980</span><span id="line-980"> }</span>
<span class="source-line-no">981</span><span id="line-981"> }</span>
<span class="source-line-no">982</span><span id="line-982"> }</span>
<span class="source-line-no">983</span><span id="line-983"> }</span>
<span class="source-line-no">984</span><span id="line-984"> }</span>
<span class="source-line-no">985</span><span id="line-985"> if (comp == 0) { // exact match</span>
<span class="source-line-no">986</span><span id="line-986"> if (seekBefore) {</span>
<span class="source-line-no">987</span><span id="line-987"> if (!previous.isValid()) {</span>
<span class="source-line-no">988</span><span id="line-988"> // The caller (seekBefore) has to ensure that we are not at the</span>
<span class="source-line-no">989</span><span id="line-989"> // first key in the block.</span>
<span class="source-line-no">990</span><span id="line-990"> throw new IllegalStateException(</span>
<span class="source-line-no">991</span><span id="line-991"> "Cannot seekBefore if " + "positioned at the first key in the block: key="</span>
<span class="source-line-no">992</span><span id="line-992"> + Bytes.toStringBinary(seekCell.getRowArray()));</span>
<span class="source-line-no">993</span><span id="line-993"> }</span>
<span class="source-line-no">994</span><span id="line-994"> moveToPrevious();</span>
<span class="source-line-no">995</span><span id="line-995"> return 1;</span>
<span class="source-line-no">996</span><span id="line-996"> }</span>
<span class="source-line-no">997</span><span id="line-997"> return 0;</span>
<span class="source-line-no">998</span><span id="line-998"> }</span>
<span class="source-line-no">999</span><span id="line-999"></span>
<span class="source-line-no">1000</span><span id="line-1000"> if (comp &lt; 0) { // already too large, check previous</span>
<span class="source-line-no">1001</span><span id="line-1001"> if (previous.isValid()) {</span>
<span class="source-line-no">1002</span><span id="line-1002"> moveToPrevious();</span>
<span class="source-line-no">1003</span><span id="line-1003"> } else {</span>
<span class="source-line-no">1004</span><span id="line-1004"> return HConstants.INDEX_KEY_MAGIC; // using optimized index key</span>
<span class="source-line-no">1005</span><span id="line-1005"> }</span>
<span class="source-line-no">1006</span><span id="line-1006"> return 1;</span>
<span class="source-line-no">1007</span><span id="line-1007"> }</span>
<span class="source-line-no">1008</span><span id="line-1008"></span>
<span class="source-line-no">1009</span><span id="line-1009"> // move to next, if more data is available</span>
<span class="source-line-no">1010</span><span id="line-1010"> if (currentBuffer.hasRemaining()) {</span>
<span class="source-line-no">1011</span><span id="line-1011"> previous.copyFromNext(current);</span>
<span class="source-line-no">1012</span><span id="line-1012"> decodeNext();</span>
<span class="source-line-no">1013</span><span id="line-1013"> current.setKey(current.keyBuffer, current.memstoreTS);</span>
<span class="source-line-no">1014</span><span id="line-1014"> } else {</span>
<span class="source-line-no">1015</span><span id="line-1015"> break;</span>
<span class="source-line-no">1016</span><span id="line-1016"> }</span>
<span class="source-line-no">1017</span><span id="line-1017"> } while (true);</span>
<span class="source-line-no">1018</span><span id="line-1018"></span>
<span class="source-line-no">1019</span><span id="line-1019"> // we hit the end of the block, not an exact match</span>
<span class="source-line-no">1020</span><span id="line-1020"> return 1;</span>
<span class="source-line-no">1021</span><span id="line-1021"> }</span>
<span class="source-line-no">1022</span><span id="line-1022"></span>
<span class="source-line-no">1023</span><span id="line-1023"> private int compareTypeBytes(ExtendedCell key, ExtendedCell right) {</span>
<span class="source-line-no">1024</span><span id="line-1024"> if (</span>
<span class="source-line-no">1025</span><span id="line-1025"> key.getFamilyLength() + key.getQualifierLength() == 0</span>
<span class="source-line-no">1026</span><span id="line-1026"> &amp;&amp; key.getTypeByte() == KeyValue.Type.Minimum.getCode()</span>
<span class="source-line-no">1027</span><span id="line-1027"> ) {</span>
<span class="source-line-no">1028</span><span id="line-1028"> // left is "bigger", i.e. it appears later in the sorted order</span>
<span class="source-line-no">1029</span><span id="line-1029"> return 1;</span>
<span class="source-line-no">1030</span><span id="line-1030"> }</span>
<span class="source-line-no">1031</span><span id="line-1031"> if (</span>
<span class="source-line-no">1032</span><span id="line-1032"> right.getFamilyLength() + right.getQualifierLength() == 0</span>
<span class="source-line-no">1033</span><span id="line-1033"> &amp;&amp; right.getTypeByte() == KeyValue.Type.Minimum.getCode()</span>
<span class="source-line-no">1034</span><span id="line-1034"> ) {</span>
<span class="source-line-no">1035</span><span id="line-1035"> return -1;</span>
<span class="source-line-no">1036</span><span id="line-1036"> }</span>
<span class="source-line-no">1037</span><span id="line-1037"> return 0;</span>
<span class="source-line-no">1038</span><span id="line-1038"> }</span>
<span class="source-line-no">1039</span><span id="line-1039"></span>
<span class="source-line-no">1040</span><span id="line-1040"> // These findCommonPrefix* methods rely on the fact that keyOnlyKv is the "right" cell argument</span>
<span class="source-line-no">1041</span><span id="line-1041"> // and always on-heap</span>
<span class="source-line-no">1042</span><span id="line-1042"></span>
<span class="source-line-no">1043</span><span id="line-1043"> private static int findCommonPrefixInRowPart(Cell left, KeyValue.KeyOnlyKeyValue right,</span>
<span class="source-line-no">1044</span><span id="line-1044"> int rowCommonPrefix) {</span>
<span class="source-line-no">1045</span><span id="line-1045"> if (left instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">1046</span><span id="line-1046"> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;</span>
<span class="source-line-no">1047</span><span id="line-1047"> return ByteBufferUtils.findCommonPrefix(bbLeft.getRowByteBuffer(),</span>
<span class="source-line-no">1048</span><span id="line-1048"> bbLeft.getRowPosition() + rowCommonPrefix, left.getRowLength() - rowCommonPrefix,</span>
<span class="source-line-no">1049</span><span id="line-1049"> right.getRowArray(), right.getRowOffset() + rowCommonPrefix,</span>
<span class="source-line-no">1050</span><span id="line-1050"> right.getRowLength() - rowCommonPrefix);</span>
<span class="source-line-no">1051</span><span id="line-1051"> } else {</span>
<span class="source-line-no">1052</span><span id="line-1052"> return Bytes.findCommonPrefix(left.getRowArray(), right.getRowArray(),</span>
<span class="source-line-no">1053</span><span id="line-1053"> left.getRowLength() - rowCommonPrefix, right.getRowLength() - rowCommonPrefix,</span>
<span class="source-line-no">1054</span><span id="line-1054"> left.getRowOffset() + rowCommonPrefix, right.getRowOffset() + rowCommonPrefix);</span>
<span class="source-line-no">1055</span><span id="line-1055"> }</span>
<span class="source-line-no">1056</span><span id="line-1056"> }</span>
<span class="source-line-no">1057</span><span id="line-1057"></span>
<span class="source-line-no">1058</span><span id="line-1058"> private static int findCommonPrefixInFamilyPart(Cell left, KeyValue.KeyOnlyKeyValue right,</span>
<span class="source-line-no">1059</span><span id="line-1059"> int familyCommonPrefix) {</span>
<span class="source-line-no">1060</span><span id="line-1060"> if (left instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">1061</span><span id="line-1061"> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;</span>
<span class="source-line-no">1062</span><span id="line-1062"> return ByteBufferUtils.findCommonPrefix(bbLeft.getFamilyByteBuffer(),</span>
<span class="source-line-no">1063</span><span id="line-1063"> bbLeft.getFamilyPosition() + familyCommonPrefix,</span>
<span class="source-line-no">1064</span><span id="line-1064"> left.getFamilyLength() - familyCommonPrefix, right.getFamilyArray(),</span>
<span class="source-line-no">1065</span><span id="line-1065"> right.getFamilyOffset() + familyCommonPrefix,</span>
<span class="source-line-no">1066</span><span id="line-1066"> right.getFamilyLength() - familyCommonPrefix);</span>
<span class="source-line-no">1067</span><span id="line-1067"> } else {</span>
<span class="source-line-no">1068</span><span id="line-1068"> return Bytes.findCommonPrefix(left.getFamilyArray(), right.getFamilyArray(),</span>
<span class="source-line-no">1069</span><span id="line-1069"> left.getFamilyLength() - familyCommonPrefix, right.getFamilyLength() - familyCommonPrefix,</span>
<span class="source-line-no">1070</span><span id="line-1070"> left.getFamilyOffset() + familyCommonPrefix,</span>
<span class="source-line-no">1071</span><span id="line-1071"> right.getFamilyOffset() + familyCommonPrefix);</span>
<span class="source-line-no">1072</span><span id="line-1072"> }</span>
<span class="source-line-no">1073</span><span id="line-1073"> }</span>
<span class="source-line-no">1074</span><span id="line-1074"></span>
<span class="source-line-no">1075</span><span id="line-1075"> private static int findCommonPrefixInQualifierPart(Cell left, KeyValue.KeyOnlyKeyValue right,</span>
<span class="source-line-no">1076</span><span id="line-1076"> int qualifierCommonPrefix) {</span>
<span class="source-line-no">1077</span><span id="line-1077"> if (left instanceof ByteBufferExtendedCell) {</span>
<span class="source-line-no">1078</span><span id="line-1078"> ByteBufferExtendedCell bbLeft = (ByteBufferExtendedCell) left;</span>
<span class="source-line-no">1079</span><span id="line-1079"> return ByteBufferUtils.findCommonPrefix(bbLeft.getQualifierByteBuffer(),</span>
<span class="source-line-no">1080</span><span id="line-1080"> bbLeft.getQualifierPosition() + qualifierCommonPrefix,</span>
<span class="source-line-no">1081</span><span id="line-1081"> left.getQualifierLength() - qualifierCommonPrefix, right.getQualifierArray(),</span>
<span class="source-line-no">1082</span><span id="line-1082"> right.getQualifierOffset() + qualifierCommonPrefix,</span>
<span class="source-line-no">1083</span><span id="line-1083"> right.getQualifierLength() - qualifierCommonPrefix);</span>
<span class="source-line-no">1084</span><span id="line-1084"> } else {</span>
<span class="source-line-no">1085</span><span id="line-1085"> return Bytes.findCommonPrefix(left.getQualifierArray(), right.getQualifierArray(),</span>
<span class="source-line-no">1086</span><span id="line-1086"> left.getQualifierLength() - qualifierCommonPrefix,</span>
<span class="source-line-no">1087</span><span id="line-1087"> right.getQualifierLength() - qualifierCommonPrefix,</span>
<span class="source-line-no">1088</span><span id="line-1088"> left.getQualifierOffset() + qualifierCommonPrefix,</span>
<span class="source-line-no">1089</span><span id="line-1089"> right.getQualifierOffset() + qualifierCommonPrefix);</span>
<span class="source-line-no">1090</span><span id="line-1090"> }</span>
<span class="source-line-no">1091</span><span id="line-1091"> }</span>
<span class="source-line-no">1092</span><span id="line-1092"></span>
<span class="source-line-no">1093</span><span id="line-1093"> private void moveToPrevious() {</span>
<span class="source-line-no">1094</span><span id="line-1094"> if (!previous.isValid()) {</span>
<span class="source-line-no">1095</span><span id="line-1095"> throw new IllegalStateException(</span>
<span class="source-line-no">1096</span><span id="line-1096"> "Can move back only once and not in first key in the block.");</span>
<span class="source-line-no">1097</span><span id="line-1097"> }</span>
<span class="source-line-no">1098</span><span id="line-1098"></span>
<span class="source-line-no">1099</span><span id="line-1099"> STATE tmp = previous;</span>
<span class="source-line-no">1100</span><span id="line-1100"> previous = current;</span>
<span class="source-line-no">1101</span><span id="line-1101"> current = tmp;</span>
<span class="source-line-no">1102</span><span id="line-1102"></span>
<span class="source-line-no">1103</span><span id="line-1103"> // move after last key value</span>
<span class="source-line-no">1104</span><span id="line-1104"> currentBuffer.position(current.nextKvOffset);</span>
<span class="source-line-no">1105</span><span id="line-1105"> // Already decoded the tag bytes. We cache this tags into current state and also the total</span>
<span class="source-line-no">1106</span><span id="line-1106"> // compressed length of the tags bytes. For the next time decodeNext() we don't need to decode</span>
<span class="source-line-no">1107</span><span id="line-1107"> // the tags again. This might pollute the Data Dictionary what we use for the compression.</span>
<span class="source-line-no">1108</span><span id="line-1108"> // When current.uncompressTags is false, we will just reuse the current.tagsBuffer and skip</span>
<span class="source-line-no">1109</span><span id="line-1109"> // 'tagsCompressedLength' bytes of source stream.</span>
<span class="source-line-no">1110</span><span id="line-1110"> // See in decodeTags()</span>
<span class="source-line-no">1111</span><span id="line-1111"> current.tagsBuffer = previous.tagsBuffer;</span>
<span class="source-line-no">1112</span><span id="line-1112"> current.tagsCompressedLength = previous.tagsCompressedLength;</span>
<span class="source-line-no">1113</span><span id="line-1113"> current.uncompressTags = false;</span>
<span class="source-line-no">1114</span><span id="line-1114"> // The current key has to be reset with the previous Cell</span>
<span class="source-line-no">1115</span><span id="line-1115"> current.setKey(current.keyBuffer, current.memstoreTS);</span>
<span class="source-line-no">1116</span><span id="line-1116"> previous.invalidate();</span>
<span class="source-line-no">1117</span><span id="line-1117"> }</span>
<span class="source-line-no">1118</span><span id="line-1118"></span>
<span class="source-line-no">1119</span><span id="line-1119"> @SuppressWarnings("unchecked")</span>
<span class="source-line-no">1120</span><span id="line-1120"> protected STATE createSeekerState() {</span>
<span class="source-line-no">1121</span><span id="line-1121"> // This will fail for non-default seeker state if the subclass does not</span>
<span class="source-line-no">1122</span><span id="line-1122"> // override this method.</span>
<span class="source-line-no">1123</span><span id="line-1123"> return (STATE) new SeekerState(this.tmpPair, this.includesTags());</span>
<span class="source-line-no">1124</span><span id="line-1124"> }</span>
<span class="source-line-no">1125</span><span id="line-1125"></span>
<span class="source-line-no">1126</span><span id="line-1126"> abstract protected void decodeFirst();</span>
<span class="source-line-no">1127</span><span id="line-1127"></span>
<span class="source-line-no">1128</span><span id="line-1128"> abstract protected void decodeNext();</span>
<span class="source-line-no">1129</span><span id="line-1129"> }</span>
<span class="source-line-no">1130</span><span id="line-1130"></span>
<span class="source-line-no">1131</span><span id="line-1131"> /** Returns unencoded size added */</span>
<span class="source-line-no">1132</span><span id="line-1132"> protected final int afterEncodingKeyValue(ExtendedCell cell, DataOutputStream out,</span>
<span class="source-line-no">1133</span><span id="line-1133"> HFileBlockDefaultEncodingContext encodingCtx) throws IOException {</span>
<span class="source-line-no">1134</span><span id="line-1134"> int size = 0;</span>
<span class="source-line-no">1135</span><span id="line-1135"> if (encodingCtx.getHFileContext().isIncludesTags()) {</span>
<span class="source-line-no">1136</span><span id="line-1136"> int tagsLength = cell.getTagsLength();</span>
<span class="source-line-no">1137</span><span id="line-1137"> ByteBufferUtils.putCompressedInt(out, tagsLength);</span>
<span class="source-line-no">1138</span><span id="line-1138"> // There are some tags to be written</span>
<span class="source-line-no">1139</span><span id="line-1139"> if (tagsLength &gt; 0) {</span>
<span class="source-line-no">1140</span><span id="line-1140"> TagCompressionContext tagCompressionContext = encodingCtx.getTagCompressionContext();</span>
<span class="source-line-no">1141</span><span id="line-1141"> // When tag compression is enabled, tagCompressionContext will have a not null value. Write</span>
<span class="source-line-no">1142</span><span id="line-1142"> // the tags using Dictionary compression in such a case</span>
<span class="source-line-no">1143</span><span id="line-1143"> if (tagCompressionContext != null) {</span>
<span class="source-line-no">1144</span><span id="line-1144"> // Not passing tagsLength considering that parsing of the tagsLength is not costly</span>
<span class="source-line-no">1145</span><span id="line-1145"> PrivateCellUtil.compressTags(out, cell, tagCompressionContext);</span>
<span class="source-line-no">1146</span><span id="line-1146"> } else {</span>
<span class="source-line-no">1147</span><span id="line-1147"> PrivateCellUtil.writeTags(out, cell, tagsLength);</span>
<span class="source-line-no">1148</span><span id="line-1148"> }</span>
<span class="source-line-no">1149</span><span id="line-1149"> }</span>
<span class="source-line-no">1150</span><span id="line-1150"> size += tagsLength + KeyValue.TAGS_LENGTH_SIZE;</span>
<span class="source-line-no">1151</span><span id="line-1151"> }</span>
<span class="source-line-no">1152</span><span id="line-1152"> if (encodingCtx.getHFileContext().isIncludesMvcc()) {</span>
<span class="source-line-no">1153</span><span id="line-1153"> // Copy memstore timestamp from the byte buffer to the output stream.</span>
<span class="source-line-no">1154</span><span id="line-1154"> long memstoreTS = cell.getSequenceId();</span>
<span class="source-line-no">1155</span><span id="line-1155"> WritableUtils.writeVLong(out, memstoreTS);</span>
<span class="source-line-no">1156</span><span id="line-1156"> // TODO use a writeVLong which returns the #bytes written so that 2 time parsing can be</span>
<span class="source-line-no">1157</span><span id="line-1157"> // avoided.</span>
<span class="source-line-no">1158</span><span id="line-1158"> size += WritableUtils.getVIntSize(memstoreTS);</span>
<span class="source-line-no">1159</span><span id="line-1159"> }</span>
<span class="source-line-no">1160</span><span id="line-1160"> return size;</span>
<span class="source-line-no">1161</span><span id="line-1161"> }</span>
<span class="source-line-no">1162</span><span id="line-1162"></span>
<span class="source-line-no">1163</span><span id="line-1163"> protected final void afterDecodingKeyValue(DataInputStream source, ByteBuffer dest,</span>
<span class="source-line-no">1164</span><span id="line-1164"> HFileBlockDefaultDecodingContext decodingCtx) throws IOException {</span>
<span class="source-line-no">1165</span><span id="line-1165"> if (decodingCtx.getHFileContext().isIncludesTags()) {</span>
<span class="source-line-no">1166</span><span id="line-1166"> int tagsLength = ByteBufferUtils.readCompressedInt(source);</span>
<span class="source-line-no">1167</span><span id="line-1167"> // Put as unsigned short</span>
<span class="source-line-no">1168</span><span id="line-1168"> dest.put((byte) ((tagsLength &gt;&gt; 8) &amp; 0xff));</span>
<span class="source-line-no">1169</span><span id="line-1169"> dest.put((byte) (tagsLength &amp; 0xff));</span>
<span class="source-line-no">1170</span><span id="line-1170"> if (tagsLength &gt; 0) {</span>
<span class="source-line-no">1171</span><span id="line-1171"> TagCompressionContext tagCompressionContext = decodingCtx.getTagCompressionContext();</span>
<span class="source-line-no">1172</span><span id="line-1172"> // When tag compression is been used in this file, tagCompressionContext will have a not</span>
<span class="source-line-no">1173</span><span id="line-1173"> // null value passed.</span>
<span class="source-line-no">1174</span><span id="line-1174"> if (tagCompressionContext != null) {</span>
<span class="source-line-no">1175</span><span id="line-1175"> tagCompressionContext.uncompressTags(source, dest, tagsLength);</span>
<span class="source-line-no">1176</span><span id="line-1176"> } else {</span>
<span class="source-line-no">1177</span><span id="line-1177"> ByteBufferUtils.copyFromStreamToBuffer(dest, source, tagsLength);</span>
<span class="source-line-no">1178</span><span id="line-1178"> }</span>
<span class="source-line-no">1179</span><span id="line-1179"> }</span>
<span class="source-line-no">1180</span><span id="line-1180"> }</span>
<span class="source-line-no">1181</span><span id="line-1181"> if (decodingCtx.getHFileContext().isIncludesMvcc()) {</span>
<span class="source-line-no">1182</span><span id="line-1182"> long memstoreTS = -1;</span>
<span class="source-line-no">1183</span><span id="line-1183"> try {</span>
<span class="source-line-no">1184</span><span id="line-1184"> // Copy memstore timestamp from the data input stream to the byte</span>
<span class="source-line-no">1185</span><span id="line-1185"> // buffer.</span>
<span class="source-line-no">1186</span><span id="line-1186"> memstoreTS = WritableUtils.readVLong(source);</span>
<span class="source-line-no">1187</span><span id="line-1187"> ByteBufferUtils.writeVLong(dest, memstoreTS);</span>
<span class="source-line-no">1188</span><span id="line-1188"> } catch (IOException ex) {</span>
<span class="source-line-no">1189</span><span id="line-1189"> throw new RuntimeException(</span>
<span class="source-line-no">1190</span><span id="line-1190"> "Unable to copy memstore timestamp " + memstoreTS + " after decoding a key/value");</span>
<span class="source-line-no">1191</span><span id="line-1191"> }</span>
<span class="source-line-no">1192</span><span id="line-1192"> }</span>
<span class="source-line-no">1193</span><span id="line-1193"> }</span>
<span class="source-line-no">1194</span><span id="line-1194"></span>
<span class="source-line-no">1195</span><span id="line-1195"> protected abstract ByteBuffer internalDecodeKeyValues(DataInputStream source,</span>
<span class="source-line-no">1196</span><span id="line-1196"> int allocateHeaderLength, int skipLastBytes, HFileBlockDefaultDecodingContext decodingCtx)</span>
<span class="source-line-no">1197</span><span id="line-1197"> throws IOException;</span>
<span class="source-line-no">1198</span><span id="line-1198"></span>
<span class="source-line-no">1199</span><span id="line-1199"> /**</span>
<span class="source-line-no">1200</span><span id="line-1200"> * Asserts that there is at least the given amount of unfilled space remaining in the given</span>
<span class="source-line-no">1201</span><span id="line-1201"> * buffer.</span>
<span class="source-line-no">1202</span><span id="line-1202"> * @param out typically, the buffer we are writing to</span>
<span class="source-line-no">1203</span><span id="line-1203"> * @param length the required space in the buffer</span>
<span class="source-line-no">1204</span><span id="line-1204"> * @throws EncoderBufferTooSmallException If there are no enough bytes.</span>
<span class="source-line-no">1205</span><span id="line-1205"> */</span>
<span class="source-line-no">1206</span><span id="line-1206"> protected static void ensureSpace(ByteBuffer out, int length)</span>
<span class="source-line-no">1207</span><span id="line-1207"> throws EncoderBufferTooSmallException {</span>
<span class="source-line-no">1208</span><span id="line-1208"> if (out.position() + length &gt; out.limit()) {</span>
<span class="source-line-no">1209</span><span id="line-1209"> throw new EncoderBufferTooSmallException("Buffer position=" + out.position()</span>
<span class="source-line-no">1210</span><span id="line-1210"> + ", buffer limit=" + out.limit() + ", length to be written=" + length);</span>
<span class="source-line-no">1211</span><span id="line-1211"> }</span>
<span class="source-line-no">1212</span><span id="line-1212"> }</span>
<span class="source-line-no">1213</span><span id="line-1213"></span>
<span class="source-line-no">1214</span><span id="line-1214"> @Override</span>
<span class="source-line-no">1215</span><span id="line-1215"> public void startBlockEncoding(HFileBlockEncodingContext blkEncodingCtx, DataOutputStream out)</span>
<span class="source-line-no">1216</span><span id="line-1216"> throws IOException {</span>
<span class="source-line-no">1217</span><span id="line-1217"> if (blkEncodingCtx.getClass() != HFileBlockDefaultEncodingContext.class) {</span>
<span class="source-line-no">1218</span><span id="line-1218"> throw new IOException(this.getClass().getName() + " only accepts "</span>
<span class="source-line-no">1219</span><span id="line-1219"> + HFileBlockDefaultEncodingContext.class.getName() + " as the " + "encoding context.");</span>
<span class="source-line-no">1220</span><span id="line-1220"> }</span>
<span class="source-line-no">1221</span><span id="line-1221"></span>
<span class="source-line-no">1222</span><span id="line-1222"> HFileBlockDefaultEncodingContext encodingCtx =</span>
<span class="source-line-no">1223</span><span id="line-1223"> (HFileBlockDefaultEncodingContext) blkEncodingCtx;</span>
<span class="source-line-no">1224</span><span id="line-1224"> encodingCtx.prepareEncoding(out);</span>
<span class="source-line-no">1225</span><span id="line-1225"> if (</span>
<span class="source-line-no">1226</span><span id="line-1226"> encodingCtx.getHFileContext().isIncludesTags()</span>
<span class="source-line-no">1227</span><span id="line-1227"> &amp;&amp; encodingCtx.getHFileContext().isCompressTags()</span>
<span class="source-line-no">1228</span><span id="line-1228"> ) {</span>
<span class="source-line-no">1229</span><span id="line-1229"> if (encodingCtx.getTagCompressionContext() != null) {</span>
<span class="source-line-no">1230</span><span id="line-1230"> // It will be overhead to create the TagCompressionContext again and again for every block</span>
<span class="source-line-no">1231</span><span id="line-1231"> // encoding.</span>
<span class="source-line-no">1232</span><span id="line-1232"> encodingCtx.getTagCompressionContext().clear();</span>
<span class="source-line-no">1233</span><span id="line-1233"> } else {</span>
<span class="source-line-no">1234</span><span id="line-1234"> try {</span>
<span class="source-line-no">1235</span><span id="line-1235"> TagCompressionContext tagCompressionContext =</span>
<span class="source-line-no">1236</span><span id="line-1236"> new TagCompressionContext(LRUDictionary.class, Byte.MAX_VALUE);</span>
<span class="source-line-no">1237</span><span id="line-1237"> encodingCtx.setTagCompressionContext(tagCompressionContext);</span>
<span class="source-line-no">1238</span><span id="line-1238"> } catch (Exception e) {</span>
<span class="source-line-no">1239</span><span id="line-1239"> throw new IOException("Failed to initialize TagCompressionContext", e);</span>
<span class="source-line-no">1240</span><span id="line-1240"> }</span>
<span class="source-line-no">1241</span><span id="line-1241"> }</span>
<span class="source-line-no">1242</span><span id="line-1242"> }</span>
<span class="source-line-no">1243</span><span id="line-1243"> StreamUtils.writeInt(out, 0); // DUMMY length. This will be updated in endBlockEncoding()</span>
<span class="source-line-no">1244</span><span id="line-1244"> blkEncodingCtx.setEncodingState(new EncodingState());</span>
<span class="source-line-no">1245</span><span id="line-1245"> }</span>
<span class="source-line-no">1246</span><span id="line-1246"></span>
<span class="source-line-no">1247</span><span id="line-1247"> @Override</span>
<span class="source-line-no">1248</span><span id="line-1248"> public void encode(ExtendedCell cell, HFileBlockEncodingContext encodingCtx, DataOutputStream out)</span>
<span class="source-line-no">1249</span><span id="line-1249"> throws IOException {</span>
<span class="source-line-no">1250</span><span id="line-1250"> EncodingState state = encodingCtx.getEncodingState();</span>
<span class="source-line-no">1251</span><span id="line-1251"> int posBeforeEncode = out.size();</span>
<span class="source-line-no">1252</span><span id="line-1252"> int encodedKvSize = internalEncode(cell, (HFileBlockDefaultEncodingContext) encodingCtx, out);</span>
<span class="source-line-no">1253</span><span id="line-1253"> state.postCellEncode(encodedKvSize, out.size() - posBeforeEncode);</span>
<span class="source-line-no">1254</span><span id="line-1254"> }</span>
<span class="source-line-no">1255</span><span id="line-1255"></span>
<span class="source-line-no">1256</span><span id="line-1256"> public abstract int internalEncode(ExtendedCell cell,</span>
<span class="source-line-no">1257</span><span id="line-1257"> HFileBlockDefaultEncodingContext encodingCtx, DataOutputStream out) throws IOException;</span>
<span class="source-line-no">1258</span><span id="line-1258"></span>
<span class="source-line-no">1259</span><span id="line-1259"> @Override</span>
<span class="source-line-no">1260</span><span id="line-1260"> public void endBlockEncoding(HFileBlockEncodingContext encodingCtx, DataOutputStream out,</span>
<span class="source-line-no">1261</span><span id="line-1261"> byte[] uncompressedBytesWithHeader) throws IOException {</span>
<span class="source-line-no">1262</span><span id="line-1262"> EncodingState state = encodingCtx.getEncodingState();</span>
<span class="source-line-no">1263</span><span id="line-1263"> // Write the unencodedDataSizeWritten (with header size)</span>
<span class="source-line-no">1264</span><span id="line-1264"> Bytes.putInt(uncompressedBytesWithHeader,</span>
<span class="source-line-no">1265</span><span id="line-1265"> HConstants.HFILEBLOCK_HEADER_SIZE + DataBlockEncoding.ID_SIZE,</span>
<span class="source-line-no">1266</span><span id="line-1266"> state.getUnencodedDataSizeWritten());</span>
<span class="source-line-no">1267</span><span id="line-1267"> postEncoding(encodingCtx);</span>
<span class="source-line-no">1268</span><span id="line-1268"> }</span>
<span class="source-line-no">1269</span><span id="line-1269"></span>
<span class="source-line-no">1270</span><span id="line-1270">}</span>
</pre>
</div>
</main>
</body>
</html>