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