Skip to content

Commit f5983a7

Browse files
committed
Fix the error caused by putting a KeyValue with a delete type
1 parent 0a1f7c5 commit f5983a7

File tree

2 files changed

+85
-80
lines changed

2 files changed

+85
-80
lines changed

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

Lines changed: 39 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1939,24 +1939,23 @@ private ObTableQuery buildObTableQuery(final Get get, Collection<byte[]> columnQ
19391939
public static ObTableBatchOperation buildObTableBatchOperation(List<Mutation> rowList,
19401940
List<byte[]> qualifiers) {
19411941
ObTableBatchOperation batch = new ObTableBatchOperation();
1942-
OHOpType opType;
1942+
ObTableOperationType opType;
19431943
Map<String, Integer> indexMap = new HashMap<>();
19441944
for (Mutation row : rowList) {
19451945
if (row instanceof Put) {
1946-
opType = OHOpType.Put;
1946+
opType = INSERT_OR_UPDATE;
19471947
} else if (row instanceof Delete) {
1948-
opType = OHOpType.Delete;
1948+
opType = DEL;
19491949
} else if (row instanceof Increment) {
1950-
opType = OHOpType.Increment;
1950+
opType = INCREMENT;
19511951
} else if (row instanceof Append) {
1952-
opType = OHOpType.Append;
1952+
opType = APPEND;
19531953
} else {
19541954
throw new FeatureNotSupportedException("not supported other type");
19551955
}
19561956
Set<Map.Entry<byte[], List<Cell>>> familyCellMap = row.getFamilyCellMap().entrySet();
1957-
19581957
for (Map.Entry<byte[], List<Cell>> familyWithCells : familyCellMap) {
1959-
if (opType == OHOpType.Increment || opType == OHOpType.Append) {
1958+
if (opType == INCREMENT || opType == APPEND) {
19601959
indexMap.clear();
19611960
for (int i = 0; i < familyWithCells.getValue().size(); i++) {
19621961
Cell cell = familyWithCells.getValue().get(i);
@@ -1973,46 +1972,37 @@ public static ObTableBatchOperation buildObTableBatchOperation(List<Mutation> ro
19731972
}
19741973
}
19751974
}
1976-
19771975
}
19781976
batch.setSamePropertiesNames(true);
19791977
return batch;
19801978
}
19811979

19821980
private com.alipay.oceanbase.rpc.mutation.Mutation buildMutation(Cell kv,
1983-
OHOpType operationType,
1981+
ObTableOperationType operationType,
19841982
boolean isTableGroup,
19851983
byte[] family, Long TTL) {
19861984
Cell new_cell = kv;
19871985
if (isTableGroup && family != null) {
19881986
new_cell = modifyQualifier(kv, (Bytes.toString(family) + "." + Bytes.toString(CellUtil
19891987
.cloneQualifier(kv))).getBytes());
19901988
}
1991-
String[] property_columns = V_COLUMNS;
1992-
Object[] property = new Object[] { CellUtil.cloneValue(new_cell) };
1993-
if (TTL != Long.MAX_VALUE) {
1994-
property_columns = PROPERTY_COLUMNS;
1995-
property = new Object[] { CellUtil.cloneValue(new_cell), TTL };
1996-
}
1997-
switch (operationType) {
1989+
Cell.Type kvType = kv.getType();
1990+
switch (kvType) {
19981991
case Put:
1999-
return com.alipay.oceanbase.rpc.mutation.Mutation.getInstance(INSERT_OR_UPDATE,
2000-
ROW_KEY_COLUMNS,
2001-
new Object[] { CellUtil.cloneRow(new_cell), CellUtil.cloneQualifier(new_cell),
2002-
new_cell.getTimestamp() }, property_columns, property);
2003-
case Append:
2004-
return com.alipay.oceanbase.rpc.mutation.Mutation.getInstance(APPEND,
1992+
String[] property_columns = V_COLUMNS;
1993+
Object[] property = new Object[] { CellUtil.cloneValue(new_cell) };
1994+
if (TTL != Long.MAX_VALUE) {
1995+
property_columns = PROPERTY_COLUMNS;
1996+
property = new Object[] { CellUtil.cloneValue(new_cell), TTL };
1997+
}
1998+
return com.alipay.oceanbase.rpc.mutation.Mutation.getInstance(operationType,
20051999
ROW_KEY_COLUMNS,
20062000
new Object[] { CellUtil.cloneRow(new_cell), CellUtil.cloneQualifier(new_cell),
20072001
new_cell.getTimestamp() }, property_columns, property);
20082002
case Delete:
20092003
return com.alipay.oceanbase.rpc.mutation.Mutation.getInstance(DEL, ROW_KEY_COLUMNS,
20102004
new Object[] { CellUtil.cloneRow(new_cell), CellUtil.cloneQualifier(new_cell),
20112005
new_cell.getTimestamp() }, null, null);
2012-
case DeleteAll:
2013-
return com.alipay.oceanbase.rpc.mutation.Mutation.getInstance(DEL, ROW_KEY_COLUMNS,
2014-
new Object[] { CellUtil.cloneRow(new_cell), null, -new_cell.getTimestamp() },
2015-
null, null);
20162006
case DeleteColumn:
20172007
return com.alipay.oceanbase.rpc.mutation.Mutation.getInstance(DEL, ROW_KEY_COLUMNS,
20182008
new Object[] { CellUtil.cloneRow(new_cell), CellUtil.cloneQualifier(new_cell),
@@ -2109,7 +2099,7 @@ private BatchOperation buildBatchOperation(String tableName, List<? extends Row>
21092099
List<Cell> keyValueList = entry.getValue();
21102100
for (Cell kv : keyValueList) {
21112101
singleOpResultNum++;
2112-
batch.addOperation(buildMutation(kv, OHOpType.Put,
2102+
batch.addOperation(buildMutation(kv, INSERT_OR_UPDATE,
21132103
isTableGroup, family, put.getTTL()));
21142104
}
21152105
}
@@ -2118,15 +2108,16 @@ private BatchOperation buildBatchOperation(String tableName, List<? extends Row>
21182108
if (delete.isEmpty()) {
21192109
singleOpResultNum++;
21202110
KeyValue kv = new KeyValue(delete.getRow(), delete.getTimeStamp());
2121-
batch.addOperation(buildMutation(kv, OHOpType.DeleteAll, isTableGroup, null,
2122-
delete.getTTL()));
2111+
batch.addOperation(com.alipay.oceanbase.rpc.mutation.Mutation.getInstance(DEL, ROW_KEY_COLUMNS,
2112+
new Object[] { CellUtil.cloneRow(kv), null, -kv.getTimestamp() },
2113+
null, null));
21232114
} else {
21242115
for (Map.Entry<byte[], List<Cell>> entry : delete.getFamilyCellMap().entrySet()) {
21252116
byte[] family = entry.getKey();
21262117
List<Cell> keyValueList = entry.getValue();
21272118
for (Cell kv : keyValueList) {
21282119
singleOpResultNum++;
2129-
batch.addOperation(buildMutation(kv, getDeleteType(kv.getType()),
2120+
batch.addOperation(buildMutation(kv, DEL,
21302121
isTableGroup, family, delete.getTTL()));
21312122
}
21322123
}
@@ -2141,48 +2132,35 @@ private BatchOperation buildBatchOperation(String tableName, List<? extends Row>
21412132
return batch;
21422133
}
21432134

2144-
public static ObTableOperation buildObTableOperation(Cell kv, OHOpType operationType, Long TTL) {
2135+
public static ObTableOperation buildObTableOperation(Cell kv,
2136+
ObTableOperationType operationType,
2137+
Long TTL) {
2138+
Cell.Type kvType = kv.getType();
21452139
String[] property_columns = V_COLUMNS;
21462140
Object[] property = new Object[] { CellUtil.cloneValue(kv) };
21472141
if (TTL != Long.MAX_VALUE) {
21482142
property_columns = PROPERTY_COLUMNS;
21492143
property = new Object[] { CellUtil.cloneValue(kv), TTL };
21502144
}
2151-
switch (operationType) {
2145+
switch (kvType) {
21522146
case Put:
2153-
case Increment:
2154-
case Append:
2155-
ObTableOperationType type;
2156-
if (operationType == OHOpType.Put) {
2157-
type = INSERT_OR_UPDATE;
2158-
} else if (operationType == OHOpType.Increment) {
2159-
type = INCREMENT;
2160-
} else {
2161-
type = APPEND;
2162-
}
21632147
return getInstance(
2164-
type,
2148+
operationType,
21652149
new Object[] { CellUtil.cloneRow(kv), CellUtil.cloneQualifier(kv),
21662150
kv.getTimestamp() }, property_columns, property);
21672151
case Delete:
2168-
Cell.Type delType = kv.getType();
2169-
if (delType == Cell.Type.Delete) {
2170-
return getInstance(
2171-
DEL,
2172-
new Object[] { CellUtil.cloneRow(kv), CellUtil.cloneQualifier(kv),
2173-
kv.getTimestamp() }, null, null);
2174-
} else if (delType == Cell.Type.DeleteColumn) {
2175-
return getInstance(
2176-
DEL,
2177-
new Object[] { CellUtil.cloneRow(kv), CellUtil.cloneQualifier(kv),
2178-
-kv.getTimestamp() }, null, null);
2179-
} else if (delType == Cell.Type.DeleteFamily) {
2180-
return getInstance(DEL,
2181-
new Object[] { CellUtil.cloneRow(kv), null, -kv.getTimestamp() }, null,
2182-
null);
2183-
} else {
2184-
throw new IllegalArgumentException("illegal delete type " + operationType);
2185-
}
2152+
return getInstance(
2153+
DEL,
2154+
new Object[] { CellUtil.cloneRow(kv), CellUtil.cloneQualifier(kv),
2155+
kv.getTimestamp() }, null, null);
2156+
case DeleteColumn:
2157+
return getInstance(
2158+
DEL,
2159+
new Object[] { CellUtil.cloneRow(kv), CellUtil.cloneQualifier(kv),
2160+
-kv.getTimestamp() }, null, null);
2161+
case DeleteFamily:
2162+
return getInstance(DEL,
2163+
new Object[] { CellUtil.cloneRow(kv), null, -kv.getTimestamp() }, null, null);
21862164
default:
21872165
throw new IllegalArgumentException("illegal mutation type " + operationType);
21882166
}
@@ -2295,25 +2273,6 @@ public Pair<byte[][], byte[][]> getStartEndKeys() throws IOException {
22952273
return new Pair<>(getStartKeys(), getEndKeys());
22962274
}
22972275

2298-
public static enum OHOpType {
2299-
Put, Append, Delete, DeleteAll, DeleteColumn, DeleteFamily, DeleteFamilyVersion, Increment
2300-
}
2301-
2302-
public static OHOpType getDeleteType(Cell.Type type) {
2303-
switch (type) {
2304-
case Delete:
2305-
return OHOpType.Delete;
2306-
case DeleteColumn:
2307-
return OHOpType.DeleteColumn;
2308-
case DeleteFamily:
2309-
return OHOpType.DeleteFamily;
2310-
case DeleteFamilyVersion:
2311-
return OHOpType.DeleteFamilyVersion;
2312-
default:
2313-
throw new IllegalArgumentException("illegal mutation type " + type);
2314-
}
2315-
}
2316-
23172276
private CompareFilter.CompareOp getCompareOp(CompareOperator cmpOp) {
23182277
switch (cmpOp) {
23192278
case LESS:

src/test/java/com/alipay/oceanbase/hbase/HTableTestBase.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5618,6 +5618,52 @@ public void testAppend() throws IOException {
56185618
}
56195619
}
56205620

5621+
@Test
5622+
public void testHbasePutDeleteCell() throws Exception {
5623+
final byte[] rowKey = Bytes.toBytes("12345");
5624+
final byte[] family = Bytes.toBytes("family1");
5625+
5626+
Put put = new Put(rowKey);
5627+
put.addColumn(family, Bytes.toBytes("A"), Bytes.toBytes("a"));
5628+
put.addColumn(family, Bytes.toBytes("B"), Bytes.toBytes("b"));
5629+
put.addColumn(family, Bytes.toBytes("C"), Bytes.toBytes("c"));
5630+
put.addColumn(family, Bytes.toBytes("D"), Bytes.toBytes("d"));
5631+
hTable.put(put);
5632+
// get row back and assert the values
5633+
Get get = new Get(rowKey);
5634+
get.addFamily(family);
5635+
Result result = hTable.get(get);
5636+
assertTrue("Column A value should be a",
5637+
Bytes.toString(result.getValue(family, Bytes.toBytes("A"))).equals("a"));
5638+
assertTrue("Column B value should be b",
5639+
Bytes.toString(result.getValue(family, Bytes.toBytes("B"))).equals("b"));
5640+
assertTrue("Column C value should be c",
5641+
Bytes.toString(result.getValue(family, Bytes.toBytes("C"))).equals("c"));
5642+
assertTrue("Column D value should be d",
5643+
Bytes.toString(result.getValue(family, Bytes.toBytes("D"))).equals("d"));
5644+
// put the same row again with C column deleted
5645+
put = new Put(rowKey);
5646+
put.addColumn(family, Bytes.toBytes("A"), Bytes.toBytes("a1"));
5647+
put.addColumn(family, Bytes.toBytes("B"), Bytes.toBytes("b1"));
5648+
KeyValue marker = new KeyValue(rowKey, family, Bytes.toBytes("C"),
5649+
HConstants.LATEST_TIMESTAMP, KeyValue.Type.DeleteColumn);
5650+
put.addColumn(family, Bytes.toBytes("D"), Bytes.toBytes("d1"));
5651+
put.add(marker);
5652+
hTable.put(put);
5653+
// get row back and assert the values
5654+
get = new Get(rowKey);
5655+
get.addFamily(family);
5656+
result = hTable.get(get);
5657+
assertTrue("Column A value should be a1",
5658+
Bytes.toString(result.getValue(family, Bytes.toBytes("A"))).equals("a1"));
5659+
assertTrue("Column B value should be b1",
5660+
Bytes.toString(result.getValue(family, Bytes.toBytes("B"))).equals("b1"));
5661+
System.out.println(result.getValue(family, Bytes.toBytes("C")));
5662+
assertTrue("Column C should not exist", result.getValue(family, Bytes.toBytes("C")) == null);
5663+
assertTrue("Column D value should be d1",
5664+
Bytes.toString(result.getValue(family, Bytes.toBytes("D"))).equals("d1"));
5665+
}
5666+
56215667
@Test
56225668
public void testCellTTL() throws Exception {
56235669
String key1 = "key1";

0 commit comments

Comments
 (0)