Skip to content

Commit 6a4ecc3

Browse files
authored
Merge pull request #271 from oceanbase/cherry-pick-161a7cef-to-hbase_2.0-20250710_101718
Cherry-pick: fix delete family version result error
2 parents 72a0772 + 84c92fc commit 6a4ecc3

File tree

3 files changed

+39
-19
lines changed

3 files changed

+39
-19
lines changed

src/main/java/com/alipay/oceanbase/hbase/OHTable.java

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import org.apache.hadoop.hbase.util.VersionInfo;
6666
import org.slf4j.Logger;
6767

68+
import javax.swing.plaf.synth.Region;
6869
import java.io.ByteArrayOutputStream;
6970
import java.io.IOException;
7071
import java.util.*;
@@ -195,6 +196,7 @@ public class OHTable implements Table {
195196

196197
private int scannerTimeout;
197198

199+
private RegionLocator regionLocator;
198200
/**
199201
* Creates an object to access a HBase table.
200202
* Shares oceanbase table obTableClient and other resources with other OHTable instances
@@ -2082,7 +2084,7 @@ private QueryAndMutate buildDeleteQueryAndMutate(KeyValue kv,
20822084
if (!isTableGroup) {
20832085
filter = buildObHTableFilter(null, null, Integer.MAX_VALUE);
20842086
} else {
2085-
filter = buildObHTableFilter(null, null, Integer.MAX_VALUE);
2087+
filter = buildObHTableFilter(null, null, Integer.MAX_VALUE, kv.getQualifier());
20862088
}
20872089
} else {
20882090
range.setStartKey(ObRowKey.getInstance(CellUtil.cloneRow(kv), ObObj.getMin(),
@@ -2104,19 +2106,21 @@ private QueryAndMutate buildDeleteQueryAndMutate(KeyValue kv,
21042106
ObObj.getMin()));
21052107
range.setEndKey(ObRowKey.getInstance(CellUtil.cloneRow(kv), ObObj.getMax(),
21062108
ObObj.getMax()));
2107-
filter = buildObHTableFilter(null, null, Integer.MAX_VALUE);
2109+
// [MAX_VALUE, MAX_VALUE), delete nothing
2110+
filter = buildObHTableFilter(null, new TimeRange(Long.MAX_VALUE), Integer.MAX_VALUE);
21082111
} else {
2112+
TimeRange timeRange = new TimeRange(kv.getTimestamp(), kv.getTimestamp() + 1);
21092113
range.setStartKey(ObRowKey.getInstance(CellUtil.cloneRow(kv), ObObj.getMin(),
21102114
ObObj.getMin()));
21112115
range.setEndKey(ObRowKey.getInstance(CellUtil.cloneRow(kv), ObObj.getMax(),
21122116
ObObj.getMax()));
21132117
if (!isTableGroup) {
21142118
filter = buildObHTableFilter(null,
2115-
new TimeRange(0, kv.getTimestamp() + 1),
2119+
timeRange,
21162120
Integer.MAX_VALUE);
21172121
} else {
21182122
filter = buildObHTableFilter(null,
2119-
new TimeRange(0, kv.getTimestamp() + 1),
2123+
timeRange,
21202124
Integer.MAX_VALUE, CellUtil.cloneQualifier(kv));
21212125
}
21222126
}
@@ -2432,27 +2436,27 @@ public void refreshTableEntry(String familyString, boolean hasTestLoad) throws E
24322436
}
24332437

24342438
public byte[][] getStartKeys() throws IOException {
2435-
byte[][] startKeys = new byte[0][];
2436-
try {
2437-
startKeys = obTableClient.getHBaseTableStartKeys(tableNameString);
2438-
} catch (Exception e) {
2439-
throw new IOException("Fail to get start keys of HBase Table: " + tableNameString, e);
2439+
if (regionLocator == null) {
2440+
OHRegionLocatorExecutor executor = new OHRegionLocatorExecutor(tableNameString, obTableClient);
2441+
regionLocator = executor.getRegionLocator(tableNameString);
24402442
}
2441-
return startKeys;
2443+
return regionLocator.getStartKeys();
24422444
}
24432445

24442446
public byte[][] getEndKeys() throws IOException {
2445-
byte[][] endKeys = new byte[0][];
2446-
try {
2447-
endKeys = obTableClient.getHBaseTableEndKeys(tableNameString);
2448-
} catch (Exception e) {
2449-
throw new IOException("Fail to get start keys of HBase Table: " + tableNameString, e);
2447+
if (regionLocator == null) {
2448+
OHRegionLocatorExecutor executor = new OHRegionLocatorExecutor(tableNameString, obTableClient);
2449+
regionLocator = executor.getRegionLocator(tableNameString);
24502450
}
2451-
return endKeys;
2451+
return regionLocator.getEndKeys();
24522452
}
24532453

24542454
public Pair<byte[][], byte[][]> getStartEndKeys() throws IOException {
2455-
return new Pair<>(getStartKeys(), getEndKeys());
2455+
if (regionLocator == null) {
2456+
OHRegionLocatorExecutor executor = new OHRegionLocatorExecutor(tableNameString, obTableClient);
2457+
regionLocator = executor.getRegionLocator(tableNameString);
2458+
}
2459+
return regionLocator.getStartEndKeys();
24562460
}
24572461

24582462
private CompareFilter.CompareOp getCompareOp(CompareOperator cmpOp) {

src/main/java/com/alipay/oceanbase/hbase/util/OHRegionLocatorExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class OHRegionLocatorExecutor extends AbstractObTableMetaExecutor<OHRegio
3939
private final String tableName;
4040
private final ObTableClient client;
4141

42-
OHRegionLocatorExecutor(String tableName, ObTableClient client) {
42+
public OHRegionLocatorExecutor(String tableName, ObTableClient client) {
4343
this.tableName = tableName;
4444
this.client = client;
4545
}

src/test/java/com/alipay/oceanbase/hbase/secondary/OHTableSecondaryPartDeleteTest.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,23 @@ public static void testMultiCFDeleteFamilyVersionImpl(Map.Entry<String, List<Str
482482
get.addColumn(toBytes(family), toBytes(column + family));
483483
}
484484
Result result = hTable.get(get);
485-
Assert(entry.getValue(), ()->Assert.assertEquals(6, result.size()));
485+
// (ts1, ts3, ts4) * 3
486+
Result finalResult = result;
487+
Assert(entry.getValue(), ()->Assert.assertEquals(3 * entry.getValue().size(), finalResult.size()));
488+
489+
put = new Put(toBytes(key));
490+
delete = new Delete(toBytes(key));
491+
for (String tableName : entry.getValue()) {
492+
String family = getColumnFamilyName(tableName);
493+
Long ts = Long.MAX_VALUE;
494+
put.addColumn(toBytes(family), toBytes(column + family), ts, toBytes(value + ts));
495+
delete.addFamilyVersion(family.getBytes(), Long.MAX_VALUE); // do nothing
496+
}
497+
hTable.put(put);
498+
hTable.delete(delete);
499+
result = hTable.get(get);
500+
Result finalResult1 = result;
501+
Assert(entry.getValue(), ()->Assert.assertEquals(4 * entry.getValue().size(), finalResult1.size()));
486502
hTable.close();
487503
}
488504

0 commit comments

Comments
 (0)