1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.io.hfile;
21
22 import java.nio.ByteBuffer;
23
24 import org.apache.hadoop.hbase.regionserver.metrics.SchemaMetrics;
25
26 import junit.framework.TestCase;
27 import org.apache.hadoop.hbase.SmallTests;
28 import org.junit.experimental.categories.Category;
29
30 @Category(SmallTests.class)
31 public class TestCachedBlockQueue extends TestCase {
32
33 public void testQueue() throws Exception {
34
35 CachedBlock cb1 = new CachedBlock(1000, "cb1", 1);
36 CachedBlock cb2 = new CachedBlock(1500, "cb2", 2);
37 CachedBlock cb3 = new CachedBlock(1000, "cb3", 3);
38 CachedBlock cb4 = new CachedBlock(1500, "cb4", 4);
39 CachedBlock cb5 = new CachedBlock(1000, "cb5", 5);
40 CachedBlock cb6 = new CachedBlock(1750, "cb6", 6);
41 CachedBlock cb7 = new CachedBlock(1000, "cb7", 7);
42 CachedBlock cb8 = new CachedBlock(1500, "cb8", 8);
43 CachedBlock cb9 = new CachedBlock(1000, "cb9", 9);
44 CachedBlock cb10 = new CachedBlock(1500, "cb10", 10);
45
46 CachedBlockQueue queue = new CachedBlockQueue(10000,1000);
47
48 queue.add(cb1);
49 queue.add(cb2);
50 queue.add(cb3);
51 queue.add(cb4);
52 queue.add(cb5);
53 queue.add(cb6);
54 queue.add(cb7);
55 queue.add(cb8);
56 queue.add(cb9);
57 queue.add(cb10);
58
59
60 long expectedSize = cb1.heapSize() + cb2.heapSize() + cb3.heapSize() +
61 cb4.heapSize() + cb5.heapSize() + cb6.heapSize() + cb7.heapSize() +
62 cb8.heapSize();
63
64 assertEquals(queue.heapSize(), expectedSize);
65
66 for (int i = 1; i <= 8; i++) {
67 assertEquals(queue.pollLast().getCacheKey().getHfileName(), "cb"+i);
68 }
69 }
70
71 public void testQueueSmallBlockEdgeCase() throws Exception {
72
73 CachedBlock cb1 = new CachedBlock(1000, "cb1", 1);
74 CachedBlock cb2 = new CachedBlock(1500, "cb2", 2);
75 CachedBlock cb3 = new CachedBlock(1000, "cb3", 3);
76 CachedBlock cb4 = new CachedBlock(1500, "cb4", 4);
77 CachedBlock cb5 = new CachedBlock(1000, "cb5", 5);
78 CachedBlock cb6 = new CachedBlock(1750, "cb6", 6);
79 CachedBlock cb7 = new CachedBlock(1000, "cb7", 7);
80 CachedBlock cb8 = new CachedBlock(1500, "cb8", 8);
81 CachedBlock cb9 = new CachedBlock(1000, "cb9", 9);
82 CachedBlock cb10 = new CachedBlock(1500, "cb10", 10);
83
84 CachedBlockQueue queue = new CachedBlockQueue(10000,1000);
85
86 queue.add(cb1);
87 queue.add(cb2);
88 queue.add(cb3);
89 queue.add(cb4);
90 queue.add(cb5);
91 queue.add(cb6);
92 queue.add(cb7);
93 queue.add(cb8);
94 queue.add(cb9);
95 queue.add(cb10);
96
97 CachedBlock cb0 = new CachedBlock(10 + CachedBlock.PER_BLOCK_OVERHEAD, "cb0", 0);
98 queue.add(cb0);
99
100
101
102
103
104
105 long expectedSize = cb1.heapSize() + cb2.heapSize() + cb3.heapSize() +
106 cb4.heapSize() + cb5.heapSize() + cb6.heapSize() + cb7.heapSize() +
107 cb8.heapSize() + cb0.heapSize();
108
109 assertEquals(queue.heapSize(), expectedSize);
110
111 for (int i = 0; i <= 8; i++) {
112 assertEquals(queue.pollLast().getCacheKey().getHfileName(), "cb"+i);
113 }
114 }
115
116 private static class CachedBlock extends org.apache.hadoop.hbase.io.hfile.CachedBlock
117 {
118 public CachedBlock(final long heapSize, String name, long accessTime) {
119 super(new BlockCacheKey(name, 0),
120 new Cacheable() {
121 @Override
122 public long heapSize() {
123 return ((int)(heapSize - CachedBlock.PER_BLOCK_OVERHEAD));
124 }
125
126 @Override
127 public int getSerializedLength() {
128 return 0;
129 }
130
131 @Override
132 public void serialize(ByteBuffer destination) {
133 }
134
135 @Override
136 public CacheableDeserializer<Cacheable> getDeserializer() {
137
138 return null;
139 }
140
141 @Override
142 public BlockType getBlockType() {
143 return BlockType.DATA;
144 }
145
146 @Override
147 public SchemaMetrics getSchemaMetrics() {
148 return SchemaMetrics.ALL_SCHEMA_METRICS;
149 }
150 }, accessTime, false);
151 }
152 }
153
154 @org.junit.Rule
155 public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =
156 new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();
157 }
158