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