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