From fcd9b33db774bf5dc2f7ba84ab02e531e8a8f8c2 Mon Sep 17 00:00:00 2001 From: zjw Date: Wed, 30 Apr 2025 17:05:00 +0800 Subject: [PATCH 1/2] fix [multi cf] get/put/delete random binary column, qualifier unexpectedly expands its original size && rename variables --- .../com/alipay/oceanbase/hbase/OHTable.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java index ee08ec17..ae0d4400 100644 --- a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java +++ b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java @@ -908,15 +908,20 @@ private String getTargetTableName(String tableNameString) { private void processColumnFilters(NavigableSet columnFilters, Map> familyMap) { for (Map.Entry> entry : familyMap.entrySet()) { + byte[] family = entry.getKey(); if (entry.getValue() != null) { for (byte[] columnName : entry.getValue()) { - String columnNameStr = Bytes.toString(columnName); - columnNameStr = Bytes.toString(entry.getKey()) + "." + columnNameStr; - columnFilters.add(columnNameStr.getBytes()); + byte[] newQualifier = new byte[family.length + 1/* length of "." */ + columnName.length]; + System.arraycopy(family, 0, newQualifier, 0, family.length); + newQualifier[family.length] = 0x2E; // 0x2E in utf-8 is "." + System.arraycopy(columnName, 0, newQualifier, family.length + 1, columnName.length); + columnFilters.add(newQualifier); } } else { - String columnNameStr = Bytes.toString(entry.getKey()) + "."; - columnFilters.add(columnNameStr.getBytes()); + byte[] newQualifier = new byte[family.length + 1/* length of "."*/]; + System.arraycopy(family, 0, newQualifier, 0, family.length); + newQualifier[family.length] = 0x2E; // 0x2E in utf-8 is "." + columnFilters.add(newQualifier); } } } @@ -1874,7 +1879,7 @@ private ObHTableFilter buildObHTableFilter(byte[] filterString, TimeRange timeRa if (columnQualifier == null) { obHTableFilter.addSelectColumnQualifier(new byte[0]); } else { - obHTableFilter.addSelectColumnQualifier(columnQualifier); + obHTableFilter.addSelectColumnQualifier(columnQualifier); } } } @@ -2012,6 +2017,14 @@ private QueryAndMutate buildDeleteQueryAndMutate(KeyValue kv, KeyValue.Type kvType = KeyValue.Type.codeToType(kv.getType().getCode()); com.alipay.oceanbase.rpc.mutation.Mutation tableMutation = buildMutation(kv, operationType, isTableGroup, family, TTL); + // construct new_kv otherwise filter will fail to match targeted columns + byte[] oldQualifier = CellUtil.cloneQualifier(kv); + byte[] newQualifier = new byte[family.length + 1/* length of "." */ + oldQualifier.length]; + System.arraycopy(family, 0, newQualifier, 0, family.length); + newQualifier[family.length] = 0x2E; // 0x2E in utf-8 is "." + System.arraycopy(oldQualifier, 0, newQualifier, family.length + 1, oldQualifier.length); + kv = modifyQualifier(kv, newQualifier); + ObNewRange range = new ObNewRange(); ObTableQuery tableQuery = new ObTableQuery(); tableQuery.setObKVParams(buildOBKVParams((Scan) null)); @@ -2270,8 +2283,9 @@ private BatchOperation buildBatchOperation(String tableName, List List keyValueList = entry.getValue(); for (Cell kv : keyValueList) { singleOpResultNum++; + if (disExec) { - batch.addOperation(buildDeleteQueryAndMutate((KeyValue) kv, DEL, false, family, Long.MAX_VALUE)); + batch.addOperation(buildDeleteQueryAndMutate((KeyValue) kv, DEL, isTableGroup, family, Long.MAX_VALUE)); } else { batch.addOperation(buildMutation(kv, DEL, isTableGroup, family, Long.MAX_VALUE)); } From 9c12314cf165fa6711383b6b469d6b2131ba9adc Mon Sep 17 00:00:00 2001 From: zjw Date: Wed, 30 Apr 2025 17:37:05 +0800 Subject: [PATCH 2/2] add constructing new_kv if-clause --- .../com/alipay/oceanbase/hbase/OHTable.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java index ae0d4400..bfb8c864 100644 --- a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java +++ b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java @@ -2017,14 +2017,15 @@ private QueryAndMutate buildDeleteQueryAndMutate(KeyValue kv, KeyValue.Type kvType = KeyValue.Type.codeToType(kv.getType().getCode()); com.alipay.oceanbase.rpc.mutation.Mutation tableMutation = buildMutation(kv, operationType, isTableGroup, family, TTL); - // construct new_kv otherwise filter will fail to match targeted columns - byte[] oldQualifier = CellUtil.cloneQualifier(kv); - byte[] newQualifier = new byte[family.length + 1/* length of "." */ + oldQualifier.length]; - System.arraycopy(family, 0, newQualifier, 0, family.length); - newQualifier[family.length] = 0x2E; // 0x2E in utf-8 is "." - System.arraycopy(oldQualifier, 0, newQualifier, family.length + 1, oldQualifier.length); - kv = modifyQualifier(kv, newQualifier); - + if(isTableGroup) { + // construct new_kv otherwise filter will fail to match targeted columns + byte[] oldQualifier = CellUtil.cloneQualifier(kv); + byte[] newQualifier = new byte[family.length + 1/* length of "." */ + oldQualifier.length]; + System.arraycopy(family, 0, newQualifier, 0, family.length); + newQualifier[family.length] = 0x2E; // 0x2E in utf-8 is "." + System.arraycopy(oldQualifier, 0, newQualifier, family.length + 1, oldQualifier.length); + kv = modifyQualifier(kv, newQualifier); + } ObNewRange range = new ObNewRange(); ObTableQuery tableQuery = new ObTableQuery(); tableQuery.setObKVParams(buildOBKVParams((Scan) null));