forked from matteobertozzi/Hadoop
-
Notifications
You must be signed in to change notification settings - Fork 0
/
HFILE-appendMetaBlock.patch
77 lines (75 loc) · 2.67 KB
/
HFILE-appendMetaBlock.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Index: src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java
===================================================================
--- src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java (revision 1067406)
+++ src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java (working copy)
@@ -463,15 +463,10 @@
*/
public void appendMetaBlock(String metaBlockName, Writable content) {
byte[] key = Bytes.toBytes(metaBlockName);
- int i;
- for (i = 0; i < metaNames.size(); ++i) {
- // stop when the current key is greater than our own
- byte[] cur = metaNames.get(i);
- if (Bytes.BYTES_RAWCOMPARATOR.compare(cur, 0, cur.length,
- key, 0, key.length) > 0) {
- break;
- }
- }
+ int i = Bytes.binarySearch(metaNames, key, 0, key.length, Bytes.BYTES_RAWCOMPARATOR);
+ if (i < 0)
+ i = -(i + 1);
+
metaNames.add(i, key);
metaData.add(i, content);
}
Index: src/main/java/org/apache/hadoop/hbase/util/Bytes.java
===================================================================
--- src/main/java/org/apache/hadoop/hbase/util/Bytes.java (revision 1067406)
+++ src/main/java/org/apache/hadoop/hbase/util/Bytes.java (working copy)
@@ -35,6 +35,7 @@
import java.nio.ByteBuffer;
import java.util.Comparator;
import java.util.Iterator;
+import java.util.List;
/**
* Utility class that handles byte arrays, conversions to/from other types,
@@ -1172,6 +1173,40 @@
}
/**
+ * Binary search for keys in indexes.
+ * @param list list of byte arrays to search for
+ * @param key the key you want to find
+ * @param offset the offset in the key you want to find
+ * @param length the length of the key
+ * @param comparator a comparator to compare.
+ * @return index of key
+ */
+ public static int binarySearch(List<byte[]> list, byte []key, int offset,
+ int length, RawComparator<byte []> comparator) {
+ int low = 0;
+ int high = list.size() - 1;
+
+ while (low <= high) {
+ int mid = (low+high) >>> 1;
+ // we have to compare in this order, because the comparator order
+ // has special logic when the 'left side' is a special key.
+ byte[] curr = list.get(mid);
+ int cmp = comparator.compare(key, offset, length,
+ curr, 0, curr.length);
+ // key lives above the midpoint
+ if (cmp > 0)
+ low = mid + 1;
+ // key lives below the midpoint
+ else if (cmp < 0)
+ high = mid - 1;
+ // BAM. how often does this really happen?
+ else
+ return mid;
+ }
+ return - (low+1);
+ }
+
+ /**
* Bytewise binary increment/deincrement of long contained in byte array
* on given amount.
*