1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.regionserver;
21
22 import org.apache.hadoop.classification.InterfaceAudience;
23 import org.apache.hadoop.hbase.KeyValue;
24 import org.apache.hadoop.hbase.util.Bytes;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 @InterfaceAudience.Private
42 public class ScanDeleteTracker implements DeleteTracker {
43
44 private boolean hasFamilyStamp = false;
45 private long familyStamp = 0L;
46 private byte [] deleteBuffer = null;
47 private int deleteOffset = 0;
48 private int deleteLength = 0;
49 private byte deleteType = 0;
50 private long deleteTimestamp = 0L;
51
52
53
54
55 public ScanDeleteTracker() {
56 super();
57 }
58
59
60
61
62
63
64
65
66
67
68
69
70 @Override
71 public void add(byte[] buffer, int qualifierOffset, int qualifierLength,
72 long timestamp, byte type) {
73 if (!hasFamilyStamp || timestamp > familyStamp) {
74 if (type == KeyValue.Type.DeleteFamily.getCode()) {
75 hasFamilyStamp = true;
76 familyStamp = timestamp;
77 return;
78 }
79
80 if (deleteBuffer != null && type < deleteType) {
81
82 if (Bytes.equals(deleteBuffer, deleteOffset, deleteLength,
83 buffer, qualifierOffset, qualifierLength)){
84 return;
85 }
86 }
87
88 deleteBuffer = buffer;
89 deleteOffset = qualifierOffset;
90 deleteLength = qualifierLength;
91 deleteType = type;
92 deleteTimestamp = timestamp;
93 }
94
95 }
96
97
98
99
100
101
102
103
104
105
106
107 @Override
108 public DeleteResult isDeleted(byte [] buffer, int qualifierOffset,
109 int qualifierLength, long timestamp) {
110 if (hasFamilyStamp && timestamp <= familyStamp) {
111 return DeleteResult.FAMILY_DELETED;
112 }
113
114 if (deleteBuffer != null) {
115 int ret = Bytes.compareTo(deleteBuffer, deleteOffset, deleteLength,
116 buffer, qualifierOffset, qualifierLength);
117
118 if (ret == 0) {
119 if (deleteType == KeyValue.Type.DeleteColumn.getCode()) {
120 return DeleteResult.COLUMN_DELETED;
121 }
122
123
124 if (timestamp == deleteTimestamp) {
125 return DeleteResult.VERSION_DELETED;
126 }
127
128 assert timestamp < deleteTimestamp;
129
130
131 deleteBuffer = null;
132 } else if(ret < 0){
133
134 deleteBuffer = null;
135 } else {
136 throw new IllegalStateException("isDelete failed: deleteBuffer="
137 + Bytes.toStringBinary(deleteBuffer, deleteOffset, deleteLength)
138 + ", qualifier="
139 + Bytes.toStringBinary(buffer, qualifierOffset, qualifierLength)
140 + ", timestamp=" + timestamp + ", comparison result: " + ret);
141 }
142 }
143
144 return DeleteResult.NOT_DELETED;
145 }
146
147 @Override
148 public boolean isEmpty() {
149 return deleteBuffer == null && !hasFamilyStamp;
150 }
151
152 @Override
153
154 public void reset() {
155 hasFamilyStamp = false;
156 familyStamp = 0L;
157 deleteBuffer = null;
158 }
159
160 @Override
161
162 public void update() {
163 this.reset();
164 }
165 }