From 84c92fc36296bec275163afcf937dd79179477bb Mon Sep 17 00:00:00 2001 From: maochongxin Date: Wed, 9 Jul 2025 16:12:25 +0800 Subject: [PATCH] fix delete family version result error --- .../com/alipay/oceanbase/hbase/OHTable.java | 38 ++++++++++--------- .../hbase/util/OHRegionLocatorExecutor.java | 2 +- .../OHTableSecondaryPartDeleteTest.java | 18 ++++++++- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java index d0463ab5..53722886 100644 --- a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java +++ b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java @@ -65,6 +65,7 @@ import org.apache.hadoop.hbase.util.VersionInfo; import org.slf4j.Logger; +import javax.swing.plaf.synth.Region; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.*; @@ -195,6 +196,7 @@ public class OHTable implements Table { private int scannerTimeout; + private RegionLocator regionLocator; /** * Creates an object to access a HBase table. * Shares oceanbase table obTableClient and other resources with other OHTable instances @@ -2082,7 +2084,7 @@ private QueryAndMutate buildDeleteQueryAndMutate(KeyValue kv, if (!isTableGroup) { filter = buildObHTableFilter(null, null, Integer.MAX_VALUE); } else { - filter = buildObHTableFilter(null, null, Integer.MAX_VALUE); + filter = buildObHTableFilter(null, null, Integer.MAX_VALUE, kv.getQualifier()); } } else { range.setStartKey(ObRowKey.getInstance(CellUtil.cloneRow(kv), ObObj.getMin(), @@ -2104,19 +2106,21 @@ private QueryAndMutate buildDeleteQueryAndMutate(KeyValue kv, ObObj.getMin())); range.setEndKey(ObRowKey.getInstance(CellUtil.cloneRow(kv), ObObj.getMax(), ObObj.getMax())); - filter = buildObHTableFilter(null, null, Integer.MAX_VALUE); + // [MAX_VALUE, MAX_VALUE), delete nothing + filter = buildObHTableFilter(null, new TimeRange(Long.MAX_VALUE), Integer.MAX_VALUE); } else { + TimeRange timeRange = new TimeRange(kv.getTimestamp(), kv.getTimestamp() + 1); range.setStartKey(ObRowKey.getInstance(CellUtil.cloneRow(kv), ObObj.getMin(), ObObj.getMin())); range.setEndKey(ObRowKey.getInstance(CellUtil.cloneRow(kv), ObObj.getMax(), ObObj.getMax())); if (!isTableGroup) { filter = buildObHTableFilter(null, - new TimeRange(0, kv.getTimestamp() + 1), + timeRange, Integer.MAX_VALUE); } else { filter = buildObHTableFilter(null, - new TimeRange(0, kv.getTimestamp() + 1), + timeRange, Integer.MAX_VALUE, CellUtil.cloneQualifier(kv)); } } @@ -2432,27 +2436,27 @@ public void refreshTableEntry(String familyString, boolean hasTestLoad) throws E } public byte[][] getStartKeys() throws IOException { - byte[][] startKeys = new byte[0][]; - try { - startKeys = obTableClient.getHBaseTableStartKeys(tableNameString); - } catch (Exception e) { - throw new IOException("Fail to get start keys of HBase Table: " + tableNameString, e); + if (regionLocator == null) { + OHRegionLocatorExecutor executor = new OHRegionLocatorExecutor(tableNameString, obTableClient); + regionLocator = executor.getRegionLocator(tableNameString); } - return startKeys; + return regionLocator.getStartKeys(); } public byte[][] getEndKeys() throws IOException { - byte[][] endKeys = new byte[0][]; - try { - endKeys = obTableClient.getHBaseTableEndKeys(tableNameString); - } catch (Exception e) { - throw new IOException("Fail to get start keys of HBase Table: " + tableNameString, e); + if (regionLocator == null) { + OHRegionLocatorExecutor executor = new OHRegionLocatorExecutor(tableNameString, obTableClient); + regionLocator = executor.getRegionLocator(tableNameString); } - return endKeys; + return regionLocator.getEndKeys(); } public Pair getStartEndKeys() throws IOException { - return new Pair<>(getStartKeys(), getEndKeys()); + if (regionLocator == null) { + OHRegionLocatorExecutor executor = new OHRegionLocatorExecutor(tableNameString, obTableClient); + regionLocator = executor.getRegionLocator(tableNameString); + } + return regionLocator.getStartEndKeys(); } private CompareFilter.CompareOp getCompareOp(CompareOperator cmpOp) { diff --git a/src/main/java/com/alipay/oceanbase/hbase/util/OHRegionLocatorExecutor.java b/src/main/java/com/alipay/oceanbase/hbase/util/OHRegionLocatorExecutor.java index c3e68fbf..a832adee 100644 --- a/src/main/java/com/alipay/oceanbase/hbase/util/OHRegionLocatorExecutor.java +++ b/src/main/java/com/alipay/oceanbase/hbase/util/OHRegionLocatorExecutor.java @@ -39,7 +39,7 @@ public class OHRegionLocatorExecutor extends AbstractObTableMetaExecutorAssert.assertEquals(6, result.size())); + // (ts1, ts3, ts4) * 3 + Result finalResult = result; + Assert(entry.getValue(), ()->Assert.assertEquals(3 * entry.getValue().size(), finalResult.size())); + + put = new Put(toBytes(key)); + delete = new Delete(toBytes(key)); + for (String tableName : entry.getValue()) { + String family = getColumnFamilyName(tableName); + Long ts = Long.MAX_VALUE; + put.addColumn(toBytes(family), toBytes(column + family), ts, toBytes(value + ts)); + delete.addFamilyVersion(family.getBytes(), Long.MAX_VALUE); // do nothing + } + hTable.put(put); + hTable.delete(delete); + result = hTable.get(get); + Result finalResult1 = result; + Assert(entry.getValue(), ()->Assert.assertEquals(4 * entry.getValue().size(), finalResult1.size())); hTable.close(); }