001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.regionserver.querymatcher;
019
020import static org.junit.Assert.assertEquals;
021
022import java.io.IOException;
023import org.apache.hadoop.hbase.CellComparator;
024import org.apache.hadoop.hbase.CellComparatorImpl;
025import org.apache.hadoop.hbase.HBaseClassTestRule;
026import org.apache.hadoop.hbase.KeyValue;
027import org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker.DeleteResult;
028import org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.MatchCode;
029import org.apache.hadoop.hbase.testclassification.RegionServerTests;
030import org.apache.hadoop.hbase.testclassification.SmallTests;
031import org.apache.hadoop.hbase.util.Bytes;
032import org.junit.ClassRule;
033import org.junit.Test;
034import org.junit.experimental.categories.Category;
035
036@Category({ RegionServerTests.class, SmallTests.class })
037public class TestNewVersionBehaviorTracker {
038
039  @ClassRule
040  public static final HBaseClassTestRule CLASS_RULE =
041      HBaseClassTestRule.forClass(TestNewVersionBehaviorTracker.class);
042
043  private final byte[] col1 = Bytes.toBytes("col1");
044  private final byte[] col2 = Bytes.toBytes("col2");
045  private final byte[] row = Bytes.toBytes("row");
046  private final byte[] family = Bytes.toBytes("family");
047  private final byte[] value = Bytes.toBytes("value");
048  private final CellComparator comparator = CellComparatorImpl.COMPARATOR;
049  @Test
050  public void testMaxVersionMask() {
051    NewVersionBehaviorTracker tracker =
052        new NewVersionBehaviorTracker(null, comparator, 1, 3, 3, 10000);
053
054    KeyValue keyValue = new KeyValue(row, family, col1, 20000, KeyValue.Type.Put, value);
055    keyValue.setTimestamp(20000);
056    keyValue.setSequenceId(1000);
057    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
058    keyValue.setTimestamp(19999);
059    keyValue.setSequenceId(999);
060    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
061    keyValue.setTimestamp(19999);
062    keyValue.setSequenceId(998);
063    assertEquals(DeleteResult.VERSION_MASKED, tracker.isDeleted(keyValue));
064    keyValue.setTimestamp(19998);
065    keyValue.setSequenceId(997);
066    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
067    keyValue.setTimestamp(19997);
068    keyValue.setSequenceId(996);
069    assertEquals(DeleteResult.VERSION_MASKED, tracker.isDeleted(keyValue));
070
071    keyValue = new KeyValue(row, family, col2, 20000, KeyValue.Type.Put, value);
072    keyValue.setTimestamp(20000);
073    keyValue.setSequenceId(1000);
074    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
075    keyValue.setTimestamp(19999);
076    keyValue.setSequenceId(1002);
077    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
078    keyValue.setTimestamp(19999);
079    keyValue.setSequenceId(1001);
080    assertEquals(DeleteResult.VERSION_MASKED, tracker.isDeleted(keyValue));
081    keyValue.setTimestamp(19998);
082    keyValue.setSequenceId(1003);
083    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
084    keyValue.setTimestamp(19997);
085    keyValue.setSequenceId(1004);
086    assertEquals(DeleteResult.VERSION_MASKED, tracker.isDeleted(keyValue));
087  }
088
089  @Test
090  public void testVersionsDelete() {
091    NewVersionBehaviorTracker tracker =
092        new NewVersionBehaviorTracker(null, comparator, 1, 3, 3, 10000);
093    KeyValue put = new KeyValue(row, family, col1, 20000, KeyValue.Type.Put, value);
094    KeyValue delete = new KeyValue(row, family, col1, 20000, KeyValue.Type.DeleteColumn, value);
095    delete.setSequenceId(1000);
096    delete.setTimestamp(20000);
097    tracker.add(delete);
098    put.setSequenceId(1001);
099    put.setTimestamp(19999);
100    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(put));
101    put.setSequenceId(999);
102    put.setTimestamp(19998);
103    assertEquals(DeleteResult.COLUMN_DELETED, tracker.isDeleted(put));
104
105    delete = new KeyValue(row, family, col2, 20000, KeyValue.Type.DeleteColumn, value);
106    delete.setSequenceId(1002);
107    delete.setTimestamp(20000);
108    tracker.add(delete);
109    put = new KeyValue(row, family, col2, 20000, KeyValue.Type.Put, value);
110    put.setSequenceId(1001);
111    put.setTimestamp(19999);
112    assertEquals(DeleteResult.COLUMN_DELETED, tracker.isDeleted(put));
113    put.setSequenceId(999);
114    put.setTimestamp(19998);
115    assertEquals(DeleteResult.COLUMN_DELETED, tracker.isDeleted(put));
116  }
117
118  @Test
119  public void testVersionDelete() {
120    NewVersionBehaviorTracker tracker =
121        new NewVersionBehaviorTracker(null, comparator, 1, 3, 3, 10000);
122    KeyValue put = new KeyValue(row, family, col1, 20000, KeyValue.Type.Put, value);
123    KeyValue delete = new KeyValue(row, family, col1, 20000, KeyValue.Type.Delete, value);
124    delete.setSequenceId(1000);
125    delete.setTimestamp(20000);
126    tracker.add(delete);
127    put.setSequenceId(1001);
128    put.setTimestamp(20000);
129    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(put));
130    put.setSequenceId(999);
131    put.setTimestamp(20000);
132    assertEquals(DeleteResult.VERSION_DELETED, tracker.isDeleted(put));
133
134    delete = new KeyValue(row, family, col2, 20000, KeyValue.Type.Delete, value);
135    delete.setSequenceId(1002);
136    delete.setTimestamp(20000);
137    tracker.add(delete);
138    put = new KeyValue(row, family, col2, 20000, KeyValue.Type.Put, value);
139    put.setSequenceId(1001);
140    put.setTimestamp(20000);
141    assertEquals(DeleteResult.VERSION_DELETED, tracker.isDeleted(put));
142    put.setSequenceId(999);
143    put.setTimestamp(20000);
144    assertEquals(DeleteResult.VERSION_DELETED, tracker.isDeleted(put));
145    put.setSequenceId(1002);
146    put.setTimestamp(19999);
147    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(put));
148    put.setSequenceId(998);
149    put.setTimestamp(19999);
150    assertEquals(DeleteResult.VERSION_MASKED, tracker.isDeleted(put));
151  }
152
153  @Test
154  public void testFamilyVersionsDelete() {
155    NewVersionBehaviorTracker tracker =
156        new NewVersionBehaviorTracker(null, comparator, 1, 3, 3, 10000);
157
158    KeyValue delete = new KeyValue(row, family, null, 20000, KeyValue.Type.DeleteFamily, value);
159    delete.setSequenceId(1000);
160    delete.setTimestamp(20000);
161
162    KeyValue put = new KeyValue(row, family, col1, 20000, KeyValue.Type.Put, value);
163    tracker.add(delete);
164    put.setSequenceId(1001);
165    put.setTimestamp(20000);
166    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(put));
167    put.setSequenceId(999);
168    put.setTimestamp(19998);
169    assertEquals(DeleteResult.COLUMN_DELETED, tracker.isDeleted(put));
170
171    put = new KeyValue(row, family, col2, 20000, KeyValue.Type.Put, value);
172    put.setSequenceId(998);
173    put.setTimestamp(19999);
174    assertEquals(DeleteResult.COLUMN_DELETED, tracker.isDeleted(put));
175    put.setSequenceId(999);
176    put.setTimestamp(19998);
177    assertEquals(DeleteResult.COLUMN_DELETED, tracker.isDeleted(put));
178  }
179
180  @Test
181  public void testFamilyVersionDelete() {
182    NewVersionBehaviorTracker tracker =
183        new NewVersionBehaviorTracker(null, comparator, 1, 3, 3, 10000);
184
185    KeyValue delete = new KeyValue(row, family, null, 20000, KeyValue.Type.DeleteFamilyVersion,
186        value);
187    delete.setSequenceId(1000);
188    delete.setTimestamp(20000);
189    tracker.add(delete);
190
191    KeyValue put = new KeyValue(row, family, col1, 20000, KeyValue.Type.Put, value);
192    put.setSequenceId(1001);
193    put.setTimestamp(20000);
194    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(put));
195    put.setSequenceId(999);
196    put.setTimestamp(20000);
197    assertEquals(DeleteResult.VERSION_DELETED, tracker.isDeleted(put));
198
199    put = new KeyValue(row, family, col2, 20000, KeyValue.Type.Put, value);
200    put.setSequenceId(1001);
201    put.setTimestamp(20000);
202    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(put));
203    put.setSequenceId(999);
204    put.setTimestamp(20000);
205    assertEquals(DeleteResult.VERSION_DELETED, tracker.isDeleted(put));
206    put.setSequenceId(1002);
207    put.setTimestamp(19999);
208    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(put));
209    put.setSequenceId(998);
210    put.setTimestamp(19999);
211    assertEquals(DeleteResult.VERSION_MASKED, tracker.isDeleted(put));
212  }
213
214  @Test
215  public void testMinVersionsAndTTL() throws IOException {
216    NewVersionBehaviorTracker tracker =
217        new NewVersionBehaviorTracker(null, comparator, 1, 3, 3, 30000);
218
219    KeyValue keyValue = new KeyValue(row, family, col1, 20000, KeyValue.Type.Put, value);
220    keyValue.setTimestamp(20000);
221    keyValue.setSequenceId(1000);
222    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
223    assertEquals(MatchCode.INCLUDE_AND_SEEK_NEXT_COL,
224        tracker.checkVersions(keyValue, keyValue.getTimestamp(), keyValue.getTypeByte(), false));
225    keyValue.setTimestamp(19999);
226    keyValue.setSequenceId(999);
227    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
228    assertEquals(
229        MatchCode.SEEK_NEXT_COL,
230        tracker.checkVersions(keyValue, keyValue.getTimestamp(), keyValue.getTypeByte(), false));
231    keyValue.setTimestamp(19999);
232    keyValue.setSequenceId(998);
233    assertEquals(DeleteResult.VERSION_MASKED, tracker.isDeleted(keyValue));
234    assertEquals(MatchCode.SEEK_NEXT_COL,
235        tracker.checkVersions(keyValue, keyValue.getTimestamp(), keyValue.getTypeByte(), false));
236    keyValue.setTimestamp(19998);
237    keyValue.setSequenceId(997);
238    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
239    assertEquals(MatchCode.SEEK_NEXT_COL,
240        tracker.checkVersions(keyValue, keyValue.getTimestamp(), keyValue.getTypeByte(), false));
241    keyValue.setTimestamp(19997);
242    keyValue.setSequenceId(996);
243    assertEquals(DeleteResult.VERSION_MASKED, tracker.isDeleted(keyValue));
244    assertEquals(MatchCode.SEEK_NEXT_COL,
245        tracker.checkVersions(keyValue, keyValue.getTimestamp(), keyValue.getTypeByte(), false));
246
247    keyValue = new KeyValue(row, family, col2, 20000, KeyValue.Type.Put, value);
248    keyValue.setTimestamp(20000);
249    keyValue.setSequenceId(1000);
250    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
251    assertEquals(MatchCode.INCLUDE_AND_SEEK_NEXT_COL,
252        tracker.checkVersions(keyValue, keyValue.getTimestamp(), keyValue.getTypeByte(), false));
253    keyValue.setTimestamp(19999);
254    keyValue.setSequenceId(1002);
255    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
256    assertEquals(MatchCode.SEEK_NEXT_COL,
257        tracker.checkVersions(keyValue, keyValue.getTimestamp(), keyValue.getTypeByte(), false));
258    keyValue.setTimestamp(19999);
259    keyValue.setSequenceId(1001);
260    assertEquals(DeleteResult.VERSION_MASKED, tracker.isDeleted(keyValue));
261    assertEquals(MatchCode.SEEK_NEXT_COL,
262        tracker.checkVersions(keyValue, keyValue.getTimestamp(), keyValue.getTypeByte(), false));
263    keyValue.setTimestamp(19998);
264    keyValue.setSequenceId(1003);
265    assertEquals(DeleteResult.NOT_DELETED, tracker.isDeleted(keyValue));
266    assertEquals(MatchCode.SEEK_NEXT_COL,
267        tracker.checkVersions(keyValue, keyValue.getTimestamp(), keyValue.getTypeByte(), false));
268    keyValue.setTimestamp(19997);
269    keyValue.setSequenceId(1004);
270    assertEquals(DeleteResult.VERSION_MASKED, tracker.isDeleted(keyValue));
271    assertEquals(MatchCode.SEEK_NEXT_COL,
272        tracker.checkVersions(keyValue, keyValue.getTimestamp(), keyValue.getTypeByte(), false));
273  }
274}