1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.regionserver.wal;
20
21 import java.io.DataInput;
22 import java.io.DataOutput;
23 import java.io.IOException;
24
25 import org.apache.hadoop.hbase.KeyValue;
26 import org.apache.hadoop.hbase.util.Bytes;
27 import org.apache.hadoop.io.WritableUtils;
28
29
30
31
32
33
34
35
36 class KeyValueCompression {
37
38
39
40
41
42
43
44
45
46 public static KeyValue readKV(DataInput in, CompressionContext readContext)
47 throws IOException {
48 int keylength = WritableUtils.readVInt(in);
49 int vlength = WritableUtils.readVInt(in);
50 int length = KeyValue.KEYVALUE_INFRASTRUCTURE_SIZE + keylength + vlength;
51
52 byte[] backingArray = new byte[length];
53 int pos = 0;
54 pos = Bytes.putInt(backingArray, pos, keylength);
55 pos = Bytes.putInt(backingArray, pos, vlength);
56
57
58 int elemLen = Compressor.uncompressIntoArray(backingArray,
59 pos + Bytes.SIZEOF_SHORT, in, readContext.rowDict);
60 checkLength(elemLen, Short.MAX_VALUE);
61 pos = Bytes.putShort(backingArray, pos, (short)elemLen);
62 pos += elemLen;
63
64
65 elemLen = Compressor.uncompressIntoArray(backingArray,
66 pos + Bytes.SIZEOF_BYTE, in, readContext.familyDict);
67 checkLength(elemLen, Byte.MAX_VALUE);
68 pos = Bytes.putByte(backingArray, pos, (byte)elemLen);
69 pos += elemLen;
70
71
72 elemLen = Compressor.uncompressIntoArray(backingArray, pos, in,
73 readContext.qualifierDict);
74 pos += elemLen;
75
76
77 in.readFully(backingArray, pos, length - pos);
78
79 return new KeyValue(backingArray);
80 }
81
82 private static void checkLength(int len, int max) throws IOException {
83 if (len < 0 || len > max) {
84 throw new IOException(
85 "Invalid length for compresesed portion of keyvalue: " + len);
86 }
87 }
88
89
90
91
92
93
94
95
96
97 public static void writeKV(final DataOutput out, KeyValue keyVal,
98 CompressionContext writeContext) throws IOException {
99 byte[] backingArray = keyVal.getBuffer();
100 int offset = keyVal.getOffset();
101
102
103 WritableUtils.writeVInt(out, keyVal.getKeyLength());
104 WritableUtils.writeVInt(out, keyVal.getValueLength());
105
106
107
108 Compressor.writeCompressed(keyVal.getBuffer(), keyVal.getRowOffset(),
109 keyVal.getRowLength(), out, writeContext.rowDict);
110
111
112
113 Compressor.writeCompressed(keyVal.getBuffer(), keyVal.getFamilyOffset(),
114 keyVal.getFamilyLength(), out, writeContext.familyDict);
115
116
117 Compressor.writeCompressed(keyVal.getBuffer(), keyVal.getQualifierOffset(),
118 keyVal.getQualifierLength(), out,
119 writeContext.qualifierDict);
120
121
122 int pos = keyVal.getTimestampOffset();
123 int remainingLength = keyVal.getLength() + offset - (pos);
124 out.write(backingArray, pos, remainingLength);
125 }
126 }