View Javadoc

1   /*
2    *
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *     http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   */
19  
20  package org.apache.hadoop.hbase.regionserver;
21  
22  import org.apache.hadoop.hbase.*;
23  import org.apache.hadoop.hbase.regionserver.DeleteTracker.DeleteResult;
24  import org.apache.hadoop.hbase.util.Bytes;
25  import org.junit.experimental.categories.Category;
26  
27  
28  @Category(SmallTests.class)
29  public class TestScanDeleteTracker extends HBaseTestCase {
30  
31    private ScanDeleteTracker sdt;
32    private long timestamp = 10L;
33    private byte deleteType = 0;
34  
35    public void setUp() throws Exception {
36      super.setUp();
37      sdt = new ScanDeleteTracker();
38    }
39  
40    public void testDeletedBy_Delete() {
41      byte [] qualifier = Bytes.toBytes("qualifier");
42      deleteType = KeyValue.Type.Delete.getCode();
43  
44      sdt.add(qualifier, 0, qualifier.length, timestamp, deleteType);
45      DeleteResult ret = sdt.isDeleted(qualifier, 0, qualifier.length, timestamp);
46      assertEquals(DeleteResult.VERSION_DELETED, ret);
47    }
48  
49    public void testDeletedBy_DeleteColumn() {
50      byte [] qualifier = Bytes.toBytes("qualifier");
51      deleteType = KeyValue.Type.DeleteColumn.getCode();
52  
53      sdt.add(qualifier, 0, qualifier.length, timestamp, deleteType);
54      timestamp -= 5;
55      DeleteResult ret = sdt.isDeleted(qualifier, 0, qualifier.length, timestamp);
56      assertEquals(DeleteResult.COLUMN_DELETED, ret);
57    }
58  
59    public void testDeletedBy_DeleteFamily() {
60      byte [] qualifier = Bytes.toBytes("qualifier");
61      deleteType = KeyValue.Type.DeleteFamily.getCode();
62  
63      sdt.add(qualifier, 0, qualifier.length, timestamp, deleteType);
64  
65      timestamp -= 5;
66      DeleteResult ret = sdt.isDeleted(qualifier, 0, qualifier.length, timestamp);
67      assertEquals(DeleteResult.FAMILY_DELETED, ret);
68    }
69  
70    public void testDeletedBy_DeleteFamilyVersion() {
71      byte [] qualifier1 = Bytes.toBytes("qualifier1");
72      byte [] qualifier2 = Bytes.toBytes("qualifier2");
73      byte [] qualifier3 = Bytes.toBytes("qualifier3");
74      byte [] qualifier4 = Bytes.toBytes("qualifier4");
75      deleteType = KeyValue.Type.DeleteFamilyVersion.getCode();
76  
77      sdt.add(null, 0, 0, timestamp, deleteType);
78  
79      DeleteResult ret = sdt.isDeleted(qualifier1, 0, qualifier1.length, timestamp);
80      assertEquals(DeleteResult.FAMILY_VERSION_DELETED, ret);
81      ret = sdt.isDeleted(qualifier2, 0, qualifier2.length, timestamp);
82      assertEquals(DeleteResult.FAMILY_VERSION_DELETED, ret);
83      ret = sdt.isDeleted(qualifier3, 0, qualifier3.length, timestamp);
84      assertEquals(DeleteResult.FAMILY_VERSION_DELETED, ret);
85      ret = sdt.isDeleted(qualifier4, 0, qualifier4.length, timestamp);
86      assertEquals(DeleteResult.FAMILY_VERSION_DELETED, ret);
87  
88      ret = sdt.isDeleted(qualifier1, 0, qualifier1.length, timestamp + 3);
89      assertEquals(DeleteResult.NOT_DELETED, ret);
90      ret = sdt.isDeleted(qualifier2, 0, qualifier2.length, timestamp - 2);
91      assertEquals(DeleteResult.NOT_DELETED, ret);
92      ret = sdt.isDeleted(qualifier3, 0, qualifier3.length, timestamp - 5);
93      assertEquals(DeleteResult.NOT_DELETED, ret);
94      ret = sdt.isDeleted(qualifier4, 0, qualifier4.length, timestamp + 8);
95      assertEquals(DeleteResult.NOT_DELETED, ret);
96    }
97  
98  
99    public void testDelete_DeleteColumn() {
100     byte [] qualifier = Bytes.toBytes("qualifier");
101     deleteType = KeyValue.Type.Delete.getCode();
102 
103     sdt.add(qualifier, 0, qualifier.length, timestamp, deleteType);
104 
105     timestamp -= 5;
106     deleteType = KeyValue.Type.DeleteColumn.getCode();
107     sdt.add(qualifier, 0, qualifier.length, timestamp, deleteType);
108 
109     timestamp -= 5;
110     DeleteResult ret = sdt.isDeleted(qualifier, 0, qualifier.length, timestamp);
111     assertEquals(DeleteResult.COLUMN_DELETED, ret);
112   }
113 
114 
115   public void testDeleteColumn_Delete() {
116     byte [] qualifier = Bytes.toBytes("qualifier");
117     deleteType = KeyValue.Type.DeleteColumn.getCode();
118 
119     sdt.add(qualifier, 0, qualifier.length, timestamp, deleteType);
120 
121     qualifier = Bytes.toBytes("qualifier1");
122     deleteType = KeyValue.Type.Delete.getCode();
123     sdt.add(qualifier, 0, qualifier.length, timestamp, deleteType);
124 
125     DeleteResult ret = sdt.isDeleted(qualifier, 0, qualifier.length, timestamp);
126     assertEquals( DeleteResult.VERSION_DELETED, ret);
127   }
128 
129   //Testing new way where we save the Delete in case of a Delete for specific
130   //ts, could have just added the last line to the first test, but rather keep
131   //them separated
132   public void testDelete_KeepDelete(){
133     byte [] qualifier = Bytes.toBytes("qualifier");
134     deleteType = KeyValue.Type.Delete.getCode();
135 
136     sdt.add(qualifier, 0, qualifier.length, timestamp, deleteType);
137     sdt.isDeleted(qualifier, 0, qualifier.length, timestamp);
138     assertEquals(false ,sdt.isEmpty());
139   }
140 
141   public void testDelete_KeepVersionZero(){
142     byte [] qualifier = Bytes.toBytes("qualifier");
143     deleteType = KeyValue.Type.Delete.getCode();
144 
145     long deleteTimestamp = 10;
146     long valueTimestamp = 0;
147 
148     sdt.reset();
149     sdt.add(qualifier, 0, qualifier.length, deleteTimestamp, deleteType);
150     DeleteResult ret = sdt.isDeleted(qualifier, 0, qualifier.length, valueTimestamp);
151     assertEquals(DeleteResult.NOT_DELETED, ret);
152   }
153 
154 
155 }
156