1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.regionserver;
19
20
21 import java.io.IOException;
22 import java.util.ArrayList;
23 import java.util.List;
24
25 import org.apache.hadoop.hbase.HConstants;
26 import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;
27 import org.apache.hadoop.hbase.regionserver.compactions.RatioBasedCompactionPolicy;
28 import org.apache.hadoop.hbase.testclassification.SmallTests;
29 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
30 import org.apache.hadoop.hbase.util.TimeOffsetEnvironmentEdge;
31 import org.junit.Assert;
32 import org.junit.Test;
33 import org.junit.experimental.categories.Category;
34
35 @Category(SmallTests.class)
36 public class TestDefaultCompactSelection extends TestCompactionPolicy {
37
38 @Test
39 public void testCompactionRatio() throws IOException {
40 TimeOffsetEnvironmentEdge edge = new TimeOffsetEnvironmentEdge();
41 EnvironmentEdgeManager.injectEdge(edge);
42
43
44
45
46
47 long tooBig = maxSize + 1;
48
49
50 compactEquals(sfCreate(100,50,23,12,12), 23, 12, 12);
51
52 compactEquals(sfCreate(100,50,25,12,12)
53
54 compactEquals(sfCreate(tooBig, tooBig, 700, 700, 700), 700, 700, 700);
55
56 compactEquals(sfCreate(tooBig, tooBig, 700,700)
57
58 compactEquals(sfCreate(7,1,1), 7,1,1);
59
60
61
62 compactEquals(sfCreate(7, 6, 5, 4, 3, 2, 1), 5, 4, 3, 2, 1);
63
64 compactEquals(sfCreate(50, 10, 10 ,10, 10), 10, 10, 10, 10);
65
66 compactEquals(sfCreate(10, 10, 10, 10, 50), 10, 10, 10, 10);
67
68 compactEquals(sfCreate(251, 253, 251, maxSize -1), 251, 253, 251);
69
70 compactEquals(sfCreate(maxSize -1,maxSize -1,maxSize -1)
71
72
73 this.conf.setLong("hbase.hstore.compaction.min.size", 1);
74 store.storeEngine.getCompactionPolicy().setConf(conf);
75 compactEquals(sfCreate(512,256,128,64,32,16,8,4,2,1), 4,2,1);
76 this.conf.setLong("hbase.hstore.compaction.min.size", minSize);
77 store.storeEngine.getCompactionPolicy().setConf(conf);
78
79
80
81 compactEquals(sfCreate(50,25,12,12), true, 50, 25, 12, 12);
82
83 compactEquals(sfCreate(12,12), true, 12, 12);
84
85 compactEquals(sfCreate(tooBig, 12,12), true, tooBig, 12, 12);
86
87 store.forceMajor = true;
88 compactEquals(sfCreate(7, 6, 5, 4, 3, 2, 1), 5, 4, 3, 2, 1);
89 store.forceMajor = false;
90
91
92
93 compactEquals(sfCreate(100,50,23,12,12), true, 23, 12, 12);
94 conf.setLong(HConstants.MAJOR_COMPACTION_PERIOD, 1);
95 conf.setFloat("hbase.hregion.majorcompaction.jitter", 0);
96 store.storeEngine.getCompactionPolicy().setConf(conf);
97 try {
98
99
100
101
102 List<StoreFile> candidates = sfCreate(50, 25, 12, 12);
103 edge.increment(2);
104 compactEquals(candidates, 50, 25, 12, 12);
105
106 candidates = sfCreate(100, 50, 23, 12, 12);
107 edge.increment(2);
108 compactEquals(candidates, 23, 12, 12);
109 } finally {
110 conf.setLong(HConstants.MAJOR_COMPACTION_PERIOD, 1000*60*60*24);
111 conf.setFloat("hbase.hregion.majorcompaction.jitter", 0.20F);
112 }
113
114
115
116 compactEquals(sfCreate(true, 100,50,25,12,12), 100, 50, 25, 12, 12);
117
118 compactEquals(sfCreate(true, tooBig, 12,12), tooBig, 12, 12);
119
120 compactEquals(sfCreate(true, 7, 6, 5, 4, 3, 2, 1), 7, 6, 5, 4, 3);
121
122
123 compactEquals(new ArrayList<StoreFile>()
124
125 compactEquals(sfCreate(tooBig, tooBig)
126 }
127
128 @Test
129 public void testOffPeakCompactionRatio() throws IOException {
130
131
132
133
134
135
136 this.conf.setFloat("hbase.hstore.compaction.ratio.offpeak", 5.0F);
137 store.storeEngine.getCompactionPolicy().setConf(this.conf);
138
139 compactEquals(sfCreate(999, 50, 12, 12, 1), false, true, 50, 12, 12, 1);
140 compactEquals(sfCreate(999, 50, 12, 12, 1), 12, 12, 1);
141 }
142
143 @Test
144 public void testStuckStoreCompaction() throws IOException {
145
146 compactEquals(sfCreate(99,99,99,99,99,99, 30,30,30,30), 30, 30, 30);
147
148 compactEquals(sfCreate(99,99,99,99,99, 30,30,30,30), 99, 30, 30, 30, 30);
149
150
151 compactEquals(sfCreate(99,99,99,99,99,99, 30,30,30,15), 30, 30, 30, 15);
152
153 compactEquals(sfCreate(99,99,99,99, 30,26,26,29,25,25), 30, 26, 26);
154
155 compactEquals(sfCreate(99,99,99,99, 27,27,27,20,20,20), 20, 20, 20);
156 }
157
158 @Test
159 public void testCompactionEmptyHFile() throws IOException {
160
161 ScanInfo oldScanInfo = store.getScanInfo();
162 ScanInfo newScanInfo = new ScanInfo(oldScanInfo.getConfiguration(), oldScanInfo.getFamily(),
163 oldScanInfo.getMinVersions(), oldScanInfo.getMaxVersions(), 600,
164 oldScanInfo.getKeepDeletedCells(), oldScanInfo.getTimeToPurgeDeletes(),
165 oldScanInfo.getComparator());
166 store.setScanInfo(newScanInfo);
167
168 List<StoreFile> candidates = sfCreate(0);
169 for (StoreFile file : candidates) {
170 if (file instanceof MockStoreFile) {
171 MockStoreFile mockFile = (MockStoreFile) file;
172 mockFile.setTimeRangeTracker(new TimeRangeTracker(-1, -1));
173 mockFile.setEntries(0);
174 }
175 }
176
177 CompactionRequest result = ((RatioBasedCompactionPolicy) store.storeEngine
178 .getCompactionPolicy()).selectCompaction(candidates,
179 new ArrayList<StoreFile>(), false, false, false);
180 Assert.assertTrue(result.getFiles().size() == 0);
181 store.setScanInfo(oldScanInfo);
182 }
183 }