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}