From ae3c550b4abbffbf5556e9cfcaa3ad540d7deecd Mon Sep 17 00:00:00 2001 From: Ziyu Shi <57038180+JackShi148@users.noreply.github.com> Date: Fri, 15 Aug 2025 15:31:23 +0800 Subject: [PATCH 1/5] replace Fastjson with Jackson (#370) --- pom.xml | 13 +++++-- .../alipay/oceanbase/rpc/ObTableClient.java | 35 ++++++++++++------ .../rpc/bolt/transport/ObTableConnection.java | 7 ++-- .../oceanbase/rpc/location/LocationUtil.java | 37 +++++++++++-------- .../rpc/location/model/OcpResponse.java | 10 +++++ .../rpc/location/model/OcpResponseData.java | 6 +++ .../location/model/OcpResponseDataIDC.java | 4 ++ .../rpc/location/model/OcpResponseDataRs.java | 5 +++ .../oceanbase/rpc/util/MonitorUtil.java | 30 ++++++++------- .../oceanbase/rpc/ObTableClientInfoTest.java | 6 ++- 10 files changed, 103 insertions(+), 50 deletions(-) diff --git a/pom.xml b/pom.xml index 6167fc42..cac4d1f4 100644 --- a/pom.xml +++ b/pom.xml @@ -112,9 +112,9 @@ - com.alibaba - fastjson - 1.2.83 + com.fasterxml.jackson.core + jackson-databind + 2.19.0 @@ -164,6 +164,10 @@ visible-assertions org.rnorth.visible-assertions + + jackson-annotations + com.fasterxml.jackson.core + @@ -388,7 +392,7 @@ maven-shade-plugin - 3.2.4 + 3.6.0 package @@ -396,6 +400,7 @@ shade + false true shade diff --git a/src/main/java/com/alipay/oceanbase/rpc/ObTableClient.java b/src/main/java/com/alipay/oceanbase/rpc/ObTableClient.java index 805eaf39..e0f1e714 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/ObTableClient.java +++ b/src/main/java/com/alipay/oceanbase/rpc/ObTableClient.java @@ -17,7 +17,6 @@ package com.alipay.oceanbase.rpc; -import com.alibaba.fastjson.JSON; import com.alipay.oceanbase.rpc.checkandmutate.CheckAndInsUp; import com.alipay.oceanbase.rpc.constant.Constants; import com.alipay.oceanbase.rpc.exception.*; @@ -46,6 +45,9 @@ import com.alipay.oceanbase.rpc.threadlocal.ThreadLocalMap; import com.alipay.oceanbase.rpc.util.*; import com.alipay.remoting.util.StringUtils; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import org.slf4j.Logger; import java.util.*; @@ -69,6 +71,15 @@ public class ObTableClient extends AbstractObTableClient implements Lifecycle { private static final Logger logger = getLogger(ObTableClient.class); + private static final ObjectMapper objectMapper = new ObjectMapper(); + + static { + // FAIL_ON_EMPTY_BEANS means that whether throwing exception if there is no any serializable member with getter or setter in an object + // considering partitionElements in range partDesc is a list of Comparable interface and Comparable has no getter and setter + // we have to set this configuration as false because tableEntry may be serialized in debug log + objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + } + private static final String usernameSeparators = ":;-;."; private AtomicInteger tableEntryRefreshContinuousFailureCount = new AtomicInteger( @@ -456,19 +467,19 @@ private void initMetadata() throws Exception { List rsList = ocpModel.getObServerAddrs(); BOOT.info("{} success to get rsList, paramURL: {}, rsList: {},idc2Region: {}", - this.database, paramURL, JSON.toJSON(rsList), JSON.toJSON(ocpModel.getIdc2Region())); + this.database, paramURL, objectMapper.writeValueAsString(rsList), objectMapper.writeValueAsString(ocpModel.getIdc2Region())); TableEntry tableEntry = loadTableEntryRandomly(rsList,// rootServerKey,// tableEntryAcquireConnectTimeout,// tableEntryAcquireSocketTimeout, sysUA, initialized); BOOT.info("{} success to get tableEntry with rootServerKey all_dummy_tables {}", - this.database, JSON.toJSON(tableEntry)); + this.database, objectMapper.writeValueAsString(tableEntry)); List replicaLocations = tableEntry.getTableLocation() .getReplicaLocations(); BOOT.info("{} success to get replicaLocation {}", this.database, - JSON.toJSON(replicaLocations)); + objectMapper.writeValueAsString(replicaLocations)); for (ReplicaLocation replicaLocation : replicaLocations) { ObServerInfo info = replicaLocation.getInfo(); @@ -500,11 +511,11 @@ private void initMetadata() throws Exception { } if (servers.isEmpty()) { BOOT.error("{} failed to connect any replicaLocation server: {}", this.database, - JSON.toJSON(replicaLocations)); + objectMapper.writeValueAsString(replicaLocations)); throw new Exception("failed to connect any replicaLocation server"); } - BOOT.info("{} success to build server connection {}", this.database, JSON.toJSON(servers)); + BOOT.info("{} success to build server connection {}", this.database, objectMapper.writeValueAsString(servers)); this.tableRoster = tableRoster; this.serverRoster.reset(servers); @@ -525,7 +536,7 @@ private void initMetadata() throws Exception { if (BOOT.isInfoEnabled()) { BOOT.info("{} finish refresh serverRoster: {}", this.database, - JSON.toJSON(serverRoster)); + objectMapper.writeValueAsString(serverRoster)); BOOT.info("finish initMetadata for all tables for database {}", this.database); } @@ -1031,7 +1042,7 @@ public void syncRefreshMetadata(boolean forceRenew) throws Exception { currentIDC, regionFromOcp)); if (logger.isInfoEnabled()) { - logger.info("finish refresh serverRoster: {}", JSON.toJSON(serverRoster)); + logger.info("finish refresh serverRoster: {}", objectMapper.writeValueAsString(serverRoster)); } this.lastRefreshMetadataTimestamp = System.currentTimeMillis(); } finally { @@ -1365,7 +1376,8 @@ public TableEntry getOrRefreshTableEntry(final String tableName, final boolean r * @throws ObTableEntryRefreshException */ private TableEntry refreshTableEntry(TableEntry tableEntry, String tableName) - throws ObTableEntryRefreshException { + throws ObTableEntryRefreshException, + JsonProcessingException { return refreshTableEntry(tableEntry, tableName, false); } @@ -1476,7 +1488,8 @@ public TableEntry refreshTableLocationByTabletId(TableEntry tableEntry, String t * @throws ObTableEntryRefreshException */ private TableEntry refreshTableEntry(TableEntry tableEntry, String tableName, boolean fetchAll) - throws ObTableEntryRefreshException { + throws ObTableEntryRefreshException, + JsonProcessingException { TableEntryKey tableEntryKey = new TableEntryKey(clusterName, tenantName, database, tableName); try { @@ -1552,7 +1565,7 @@ private TableEntry refreshTableEntry(TableEntry tableEntry, String tableName, bo if (logger.isDebugEnabled()) { logger.debug( "refresh table entry, dataSource: {}, tableName: {}, refresh: {} key:{} entry:{} ", - dataSourceName, tableName, true, tableEntryKey, JSON.toJSON(tableEntry)); + dataSourceName, tableName, true, tableEntryKey, objectMapper.writeValueAsString(tableEntry)); } return tableEntry; } diff --git a/src/main/java/com/alipay/oceanbase/rpc/bolt/transport/ObTableConnection.java b/src/main/java/com/alipay/oceanbase/rpc/bolt/transport/ObTableConnection.java index eed5e608..79bf74d6 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/bolt/transport/ObTableConnection.java +++ b/src/main/java/com/alipay/oceanbase/rpc/bolt/transport/ObTableConnection.java @@ -17,7 +17,6 @@ package com.alipay.oceanbase.rpc.bolt.transport; -import com.alibaba.fastjson.JSONObject; import com.alipay.oceanbase.rpc.ObGlobal; import com.alipay.oceanbase.rpc.exception.*; import com.alipay.oceanbase.rpc.location.LocationUtil; @@ -26,6 +25,7 @@ import com.alipay.oceanbase.rpc.table.ObTable; import com.alipay.oceanbase.rpc.util.*; import com.alipay.remoting.Connection; +import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import java.net.ConnectException; @@ -40,6 +40,7 @@ public class ObTableConnection { private static final Logger LOGGER = TableClientLoggerFactory .getLogger(ObTableConnection.class); + private static ObjectMapper objectMapper = new ObjectMapper(); private ObBytesString credential; private long tenantId = 1; //默认值切勿不要随意改动 private Connection connection; @@ -153,8 +154,8 @@ private void login() throws Exception { // When the caller doesn't provide any parameters, configsMap is empty. // In this case, we don't generate any JSON to avoid creating an empty object. if (loginWithConfigs && !obTable.getConfigs().isEmpty()) { - JSONObject json = new JSONObject(obTable.getConfigs()); - request.setConfigsStr(json.toJSONString()); + String configStr = objectMapper.writeValueAsString(obTable.getConfigs()); + request.setConfigsStr(configStr); loginWithConfigs = false; } generatePassSecret(request); diff --git a/src/main/java/com/alipay/oceanbase/rpc/location/LocationUtil.java b/src/main/java/com/alipay/oceanbase/rpc/location/LocationUtil.java index 05707387..57cdad23 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/location/LocationUtil.java +++ b/src/main/java/com/alipay/oceanbase/rpc/location/LocationUtil.java @@ -17,10 +17,10 @@ package com.alipay.oceanbase.rpc.location; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONException; -import com.alibaba.fastjson.JSONObject; -import com.alibaba.fastjson.parser.ParserConfig; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import com.alipay.oceanbase.rpc.ObGlobal; import com.alipay.oceanbase.rpc.constant.Constants; import com.alipay.oceanbase.rpc.exception.*; @@ -58,8 +58,13 @@ public class LocationUtil { private static final Logger logger = TableClientLoggerFactory .getLogger(LocationUtil.class); + + private static final ObjectMapper objectMapper = new ObjectMapper(); + static { - ParserConfig.getGlobalInstance().setSafeMode(true); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) + .enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); loadJdbcDriver(); } @@ -774,7 +779,7 @@ private static TableEntry getTableEntryFromRemote(Connection connection, TableEn if (!initialized) { if (BOOT.isInfoEnabled()) { - BOOT.info("get table entry from remote, entry={}", JSON.toJSON(tableEntry)); + BOOT.info("get table entry from remote, entry={}", objectMapper.writeValueAsString(tableEntry)); } } else { if (logger.isInfoEnabled()) { @@ -793,7 +798,7 @@ private static TableEntry getTableEntryFromRemote(Connection connection, TableEn } catch (Exception e) { RUNTIME.error(LCD.convert("01-00009"), key, e); if (e instanceof ObTableEntryRefreshException) { - throw e; + throw (ObTableEntryRefreshException) e; } throw new ObTableEntryRefreshException(format( "fail to get table entry from remote, key=%s", key), e); @@ -1113,7 +1118,7 @@ private static void fetchFirstPart(Connection connection, TableEntry tableEntry, if (logger.isInfoEnabled()) { logger.info(format("uuid:%s, get first ranges from remote for %s, bounds=%s", - uuid, tableName, JSON.toJSON(bounds))); + uuid, tableName, objectMapper.writeValueAsString(bounds))); } } else if (obPartFuncType.isListPart()) { @@ -1121,7 +1126,7 @@ private static void fetchFirstPart(Connection connection, TableEntry tableEntry, ((ObListPartDesc) tableEntry.getPartitionInfo().getFirstPartDesc()).setSets(sets); if (logger.isInfoEnabled()) { logger.info(format("uuid:%s, get first list sets from remote for %s, sets=%s", - uuid, tableName, JSON.toJSON(sets))); + uuid, tableName, objectMapper.writeValueAsString(sets))); } } else if (ObGlobal.obVsnMajor() >= 4 && (obPartFuncType.isKeyPart() || obPartFuncType.isHashPart())) { @@ -1186,14 +1191,14 @@ private static void fetchSubPart(Connection connection, TableEntry tableEntry, .setHighBoundValues(highBoundVals); if (logger.isInfoEnabled()) { logger.info(format("uuid:%s, get sub ranges from remote for %s, bounds=%s", - uuid, tableName, JSON.toJSON(bounds))); + uuid, tableName, objectMapper.writeValueAsString(bounds))); } } else if (subPartFuncType.isListPart()) { Map sets = parseSubPartSets(rs, tableEntry); ((ObListPartDesc) tableEntry.getPartitionInfo().getSubPartDesc()).setSets(sets); if (logger.isInfoEnabled()) { logger.info(format("uuid:%s, get sub list sets from remote, sets=%s", uuid, - JSON.toJSON(sets))); + objectMapper.writeValueAsString(sets))); } } else if (ObGlobal.obVsnMajor() >= 4 && (subPartFuncType.isKeyPart() || subPartFuncType.isHashPart())) { @@ -1499,7 +1504,7 @@ private static void fetchPartitionInfo(Connection connection, TableEntry tableEn info = parsePartitionInfo(rs); if (logger.isInfoEnabled()) { - logger.info("get part info from remote info:{}", JSON.toJSON(info)); + logger.info("get part info from remote info:{}", objectMapper.writeValueAsString(info)); } tableEntry.setPartitionInfo(info); } catch (SQLException e) { @@ -2085,7 +2090,7 @@ private static OcpResponse getRemoteOcpResponseOrNull(String paramURL, String da for (; tries < tryTimes; tries++) { try { content = loadStringFromUrl(paramURL, connectTimeout, readTimeout); - ocpResponse = JSONObject.parseObject(content, OcpResponse.class); + ocpResponse = objectMapper.readValue(content, OcpResponse.class); if (ocpResponse != null && ocpResponse.validate()) { if (dataSourceName != null && !dataSourceName.isEmpty()) { saveLocalContent(dataSourceName, content); @@ -2132,7 +2137,7 @@ private static OcpResponse getRemoteOcpIdcRegionOrNull(String paramURL, int conn for (; tries < tryTimes; tries++) { try { content = loadStringFromUrl(paramURL, connectTimeout, readTimeout); - ocpResponse = JSONObject.parseObject(content, OcpResponse.class); + ocpResponse = objectMapper.readValue(content, OcpResponse.class); if (ocpResponse != null) { return ocpResponse; } @@ -2150,8 +2155,8 @@ private static OcpResponse getRemoteOcpIdcRegionOrNull(String paramURL, int conn return null; } - private static OcpResponse parseOcpResponse(String content) throws JSONException { - return JSONObject.parseObject(content, OcpResponse.class); + private static OcpResponse parseOcpResponse(String content) throws JsonProcessingException { + return objectMapper.readValue(content, OcpResponse.class); } private static OcpResponse getLocalOcpResponseOrNull(String fileName) { diff --git a/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponse.java b/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponse.java index fa20c1ba..ce0b8d20 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponse.java +++ b/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponse.java @@ -17,6 +17,8 @@ package com.alipay.oceanbase.rpc.location.model; +import com.fasterxml.jackson.annotation.JsonProperty; + public class OcpResponse { private int Code; private String Message; @@ -26,6 +28,7 @@ public class OcpResponse { /* * Get code. */ + @JsonProperty("Code") public int getCode() { return Code; } @@ -40,6 +43,7 @@ public void setCode(int code) { /* * Get message. */ + @JsonProperty("Message") public String getMessage() { return Message; } @@ -58,6 +62,11 @@ public boolean isSuccess() { return Success; } + @JsonProperty("Success") + public boolean getSuccess() { + return Success; + } + /* * Set success. */ @@ -68,6 +77,7 @@ public void setSuccess(boolean success) { /* * Get data. */ + @JsonProperty("Data") public OcpResponseData getData() { return Data; } diff --git a/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseData.java b/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseData.java index e647b998..34d767c6 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseData.java +++ b/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseData.java @@ -17,6 +17,8 @@ package com.alipay.oceanbase.rpc.location.model; +import com.fasterxml.jackson.annotation.JsonProperty; + import java.util.List; public class OcpResponseData { @@ -28,6 +30,7 @@ public class OcpResponseData { /* * Get ob region. */ + @JsonProperty("ObRegion") public String getObRegion() { return ObRegion; } @@ -42,6 +45,7 @@ public void setObRegion(String obRegion) { /* * Get ob region id. */ + @JsonProperty("ObRegionId") public long getObRegionId() { return ObRegionId; } @@ -56,6 +60,7 @@ public void setObRegionId(long obRegionId) { /* * Get rs list. */ + @JsonProperty("RsList") public List getRsList() { return RsList; } @@ -70,6 +75,7 @@ public void setRsList(List rsList) { /* * Get IDC list. */ + @JsonProperty("IDCList") public List getIDCList() { return IDCList; } diff --git a/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseDataIDC.java b/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseDataIDC.java index bba403cc..ab51ec3b 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseDataIDC.java +++ b/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseDataIDC.java @@ -17,6 +17,8 @@ package com.alipay.oceanbase.rpc.location.model; +import com.fasterxml.jackson.annotation.JsonProperty; + /* * Idc->Region mapping defined in OCP. * @@ -29,6 +31,7 @@ public class OcpResponseDataIDC { /* * Get idc. */ + @JsonProperty("idc") public String getIdc() { return idc; } @@ -43,6 +46,7 @@ public void setIdc(String idc) { /* * Get region. */ + @JsonProperty("region") public String getRegion() { return region; } diff --git a/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseDataRs.java b/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseDataRs.java index 43d8bf00..691a90e8 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseDataRs.java +++ b/src/main/java/com/alipay/oceanbase/rpc/location/model/OcpResponseDataRs.java @@ -17,6 +17,8 @@ package com.alipay.oceanbase.rpc.location.model; +import com.fasterxml.jackson.annotation.JsonProperty; + public class OcpResponseDataRs { private String address; private String role; @@ -25,6 +27,7 @@ public class OcpResponseDataRs { /* * Get address. */ + @JsonProperty("address") public String getAddress() { return address; } @@ -39,6 +42,7 @@ public void setAddress(String address) { /* * Get role. */ + @JsonProperty("role") public String getRole() { return role; } @@ -53,6 +57,7 @@ public void setRole(String role) { /* * Get sql_port. */ + @JsonProperty("sql_port") public int getSql_port() { return sql_port; } diff --git a/src/main/java/com/alipay/oceanbase/rpc/util/MonitorUtil.java b/src/main/java/com/alipay/oceanbase/rpc/util/MonitorUtil.java index a0a01692..8e806306 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/util/MonitorUtil.java +++ b/src/main/java/com/alipay/oceanbase/rpc/util/MonitorUtil.java @@ -17,7 +17,6 @@ package com.alipay.oceanbase.rpc.util; -import com.alibaba.fastjson.JSON; import com.alipay.oceanbase.rpc.protocol.payload.ResultCodes; import com.alipay.oceanbase.rpc.protocol.payload.impl.ObObj; import com.alipay.oceanbase.rpc.protocol.payload.impl.ObRowKey; @@ -29,6 +28,8 @@ import com.alipay.oceanbase.rpc.protocol.payload.impl.execute.query.ObTableQuery; import com.alipay.oceanbase.rpc.stream.ObTableClientQueryStreamResult; import com.alipay.oceanbase.rpc.table.AbstractTableQuery; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.Arrays; @@ -38,10 +39,11 @@ import static com.alipay.oceanbase.rpc.util.TraceUtil.formatTraceMessage; public class MonitorUtil { - private static String buildParamsString(List rowKeys) { + private static String buildParamsString(List rowKeys) throws JsonProcessingException { if (rowKeys == null) { return ""; } + ObjectMapper objectMapper = new ObjectMapper(); StringBuilder stringBuilder = new StringBuilder(); for (Object value : rowKeys) { if (value instanceof byte[]) { @@ -52,7 +54,7 @@ private static String buildParamsString(List rowKeys) { } StringBuilder sb = new StringBuilder(); - String str = sb.append(JSON.toJSON(value)).toString(); + String str = sb.append(objectMapper.writeValueAsString(value)).toString(); if (str.length() > 10) { str = str.substring(0, 10); } @@ -68,7 +70,7 @@ private static String buildParamsString(List rowKeys) { private static String logMessage(String traceId, String database, String tableName, String methodName, String type, String endpoint, List params, ObTableQueryAndMutateResult result, - long routeTableTime, long executeTime) { + long routeTableTime, long executeTime) throws JsonProcessingException { if (org.apache.commons.lang.StringUtils.isNotBlank(endpoint)) { endpoint = endpoint.replaceAll(",", "#"); } @@ -90,7 +92,7 @@ private static String logMessage(String traceId, String database, String tableNa public static void info(final ObPayload payload, String database, String tableName, String methodName, String type, String endpoint, ObTableQueryAndMutateResult result, ObTableQuery tableQuery, - long routeTableTime, long executeTime, long slowQueryMonitorThreshold) { + long routeTableTime, long executeTime, long slowQueryMonitorThreshold) throws JsonProcessingException { if (slowQueryMonitorThreshold >= 0 && routeTableTime + executeTime >= slowQueryMonitorThreshold) { List params = new ArrayList<>(); for (ObNewRange rang : tableQuery.getKeyRanges()) { @@ -117,7 +119,7 @@ public static void info(final ObPayload payload, String database, String tableNa private static String logMessage(String traceId, String database, String tableName, String methodName, String endpoint, Object[] rowKeys, ObTableOperationResult result, long routeTableTime, - long executeTime) { + long executeTime) throws JsonProcessingException { if (org.apache.commons.lang.StringUtils.isNotBlank(endpoint)) { endpoint = endpoint.replaceAll(",", "#"); } @@ -155,7 +157,7 @@ private static String logMessage(String traceId, String database, String tableNa public static void info(final ObPayload payload, String database, String tableName, String methodName, String endpoint, Object[] rowKeys, ObTableOperationResult result, long routeTableTime, long executeTime, - long slowQueryMonitorThreshold) { + long slowQueryMonitorThreshold) throws JsonProcessingException { if (slowQueryMonitorThreshold > 0 && (routeTableTime + executeTime >= slowQueryMonitorThreshold)) { MONITOR.info(logMessage(formatTraceMessage(payload), database, tableName, methodName, @@ -168,7 +170,7 @@ public static void info(final ObPayload payload, String database, String tableNa */ private static String logMessage(String traceId, String database, String tableName, String methodName, String endpoint, List rowKeys, - int resultSize, long executeTime) { + int resultSize, long executeTime) throws JsonProcessingException { if (org.apache.commons.lang.StringUtils.isNotBlank(endpoint)) { endpoint = endpoint.replaceAll(",", "#"); } @@ -186,7 +188,7 @@ private static String logMessage(String traceId, String database, String tableNa // for each sub batch opreation private static void logMessage0(final ObPayload payload, String database, String tableName, String methodName, String endpoint, ObTableBatchOperation subOperations, - long partId, int resultSize, long executeTime, long slowQueryMonitorThreshold) { + long partId, int resultSize, long executeTime, long slowQueryMonitorThreshold) throws JsonProcessingException { if (slowQueryMonitorThreshold < 0 || executeTime < slowQueryMonitorThreshold) { return; } @@ -231,7 +233,7 @@ private static String logMessage(String traceId, String database, String tableNa public static void info(final ObPayload payload, String database, String tableName, String methodName, String endpoint, ObTableBatchOperation subOperations, long partId, int resultSize, - long executeTime, long slowQueryMonitorThreshold) { + long executeTime, long slowQueryMonitorThreshold) throws JsonProcessingException { logMessage0(payload, database, tableName, methodName, endpoint, subOperations, partId, resultSize, executeTime, slowQueryMonitorThreshold); } @@ -252,7 +254,7 @@ public static void info(final ObPayload payload, String database, String tableNa private static String logMessage(String traceId, String database, String tableName, String methodName, String endpoint, List params, AbstractQueryStreamResult result, long routeTableTime, - long executeTime) { + long executeTime) throws JsonProcessingException { if (org.apache.commons.lang.StringUtils.isNotBlank(endpoint)) { endpoint = endpoint.replaceAll(",", "#"); } @@ -272,7 +274,7 @@ private static String logMessage(String traceId, String database, String tableNa public static void info(final ObPayload payload, String database, String tableName, String methodName, String endpoint, ObTableQuery tableQuery, AbstractQueryStreamResult result, long routeTableTime, - long executeTime, long slowQueryMonitorThreshold) { + long executeTime, long slowQueryMonitorThreshold) throws JsonProcessingException { if (slowQueryMonitorThreshold >= 0 && routeTableTime + executeTime >= slowQueryMonitorThreshold) { List params = new ArrayList<>(); for (ObNewRange rang : tableQuery.getKeyRanges()) { @@ -300,7 +302,7 @@ public static void info(final ObPayload payload, String database, String tableNa private static void logLsOpMessage(final ObPayload payload, String database, String tableName, String methodName, String endpoint, ObTableLSOperation lsOperation, int resultSize, - long executeTime, long slowQueryMonitorThreshold) { + long executeTime, long slowQueryMonitorThreshold) throws JsonProcessingException { if (slowQueryMonitorThreshold < 0 || executeTime < slowQueryMonitorThreshold) { return; } @@ -311,7 +313,7 @@ private static void logLsOpMessage(final ObPayload payload, String database, Str public static void info(final ObPayload payload, String database, String tableName, String methodName, String endpoint, ObTableLSOperation lsOperation, - int resultSize, long executeTime, long slowQueryMonitorThreshold) { + int resultSize, long executeTime, long slowQueryMonitorThreshold) throws JsonProcessingException { logLsOpMessage(payload, database, tableName, methodName, endpoint, lsOperation, resultSize, executeTime, slowQueryMonitorThreshold); } diff --git a/src/test/java/com/alipay/oceanbase/rpc/ObTableClientInfoTest.java b/src/test/java/com/alipay/oceanbase/rpc/ObTableClientInfoTest.java index 39cc0dab..53cc92e7 100644 --- a/src/test/java/com/alipay/oceanbase/rpc/ObTableClientInfoTest.java +++ b/src/test/java/com/alipay/oceanbase/rpc/ObTableClientInfoTest.java @@ -17,9 +17,10 @@ package com.alipay.oceanbase.rpc; -import com.alibaba.fastjson.JSON; import com.alipay.oceanbase.rpc.property.Property; import com.alipay.oceanbase.rpc.util.ObTableClientTestUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -131,7 +132,8 @@ private void checkGvClientInfo(Connection conn, String tenantName, String userNa for (int i = 0; i < clientCnt; i++) { String json_config_str = resultMap.get(clients[i].getClientId()); Assert.assertTrue(json_config_str != null); - Map config_map = JSON.parseObject(json_config_str); + ObjectMapper objectMapper = new ObjectMapper(); + Map config_map = objectMapper.readValue(json_config_str, new TypeReference>() {}); Long srcClientId = (Long) clients[i].getTableConfigs().get("client_id"); Long dstClientId = (Long) config_map.get("client_id"); Assert.assertEquals(srcClientId, dstClientId); From 00a074f3182c72a51178cde2dc3d058cd6f14910 Mon Sep 17 00:00:00 2001 From: WeiXinChan Date: Tue, 15 Jul 2025 17:12:12 +0800 Subject: [PATCH 2/5] fix IndexOutOfBoundsException when two same Get are in BatchOperation --- .../impl/execute/ObTableSingleOpEntity.java | 2 +- .../alipay/oceanbase/rpc/ObTableGetTest.java | 39 ++++++++++++++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableSingleOpEntity.java b/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableSingleOpEntity.java index 37e98e38..b190803e 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableSingleOpEntity.java +++ b/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableSingleOpEntity.java @@ -373,7 +373,7 @@ public void setAggPropertiesNames(List columnNames) { public Map getSimpleProperties() { Map values = new HashMap((int) propertiesValues.size()); - for (int i = 0; i < propertiesValues.size(); i++) { + for (int i = 0; i < propertiesNames.size(); i++) { values.put(propertiesNames.get(i), propertiesValues.get(i).getValue()); } return values; diff --git a/src/test/java/com/alipay/oceanbase/rpc/ObTableGetTest.java b/src/test/java/com/alipay/oceanbase/rpc/ObTableGetTest.java index d79c5cd5..476b139e 100644 --- a/src/test/java/com/alipay/oceanbase/rpc/ObTableGetTest.java +++ b/src/test/java/com/alipay/oceanbase/rpc/ObTableGetTest.java @@ -2,6 +2,7 @@ import com.alipay.oceanbase.rpc.exception.ObTableException; import com.alipay.oceanbase.rpc.get.Get; +import com.alipay.oceanbase.rpc.get.result.GetResult; import com.alipay.oceanbase.rpc.mutation.BatchOperation; import com.alipay.oceanbase.rpc.mutation.result.BatchOperationResult; import com.alipay.oceanbase.rpc.util.ObTableClientTestUtil; @@ -9,12 +10,13 @@ import org.junit.Before; import org.junit.Test; +import java.util.List; import java.util.Map; import static com.alipay.oceanbase.rpc.mutation.MutationFactory.colVal; import static com.alipay.oceanbase.rpc.mutation.MutationFactory.row; -import static org.junit.Assert.assertThrows; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; /* CREATE TABLE IF NOT EXISTS `test_get` ( @@ -259,4 +261,37 @@ public void testBatchGet5() { System.out.println(thrown.getMessage()); assertTrue(thrown.getMessage().contains("[-4007][OB_NOT_SUPPORTED][operation is not supported to partially fill rowkey columns not supported]")); } + + /* test same Get */ + @Test + public void testBatchGet6() throws Exception { + try { + // insert + client.insertOrUpdate(tableName) + .setRowKey(row(colVal("c1", "c1_val"), colVal("c2", "c2_val"))) + .addMutateColVal(colVal("c3", "c3_val")).execute(); + + // select c1,c2 + BatchOperation batch = client.batchOperation(tableName); + Get get1 = client.get(tableName) + .setRowKey(row(colVal("c1", "c1_val"), colVal("c2", "c2_val"))).select("c1", "c2", "c3"); + Get get2 = client.get(tableName) + .setRowKey(row(colVal("c1", "c1_val"), colVal("c2", "c2_val"))).select("c1", "c2", "c3"); + batch.addOperation(get1, get2); + BatchOperationResult res = batch.execute(); + Assert.assertNotNull(res); + List getResults = res.getResults(); + assertEquals(2, getResults.size()); + for (Object result : getResults) { + GetResult getResult = (GetResult) result; + Map row = getResult.getOperationRow().getMap(); + assertEquals("c1_val", row.get("c1")); + assertEquals("c2_val", row.get("c2")); + assertEquals("c3_val", row.get("c3")); + } + } finally { + client.delete(tableName).setRowKey(row(colVal("c1", "c1_val"), colVal("c2", "c2_val"))) + .execute(); + } + } } From 085a18f62a2a3d18209685284e43211d027be959 Mon Sep 17 00:00:00 2001 From: JackShi148 Date: Mon, 18 Aug 2025 14:14:02 +0800 Subject: [PATCH 3/5] fix get out of index --- .../protocol/payload/impl/execute/ObTableSingleOpEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableSingleOpEntity.java b/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableSingleOpEntity.java index b190803e..a3eecd99 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableSingleOpEntity.java +++ b/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableSingleOpEntity.java @@ -373,7 +373,7 @@ public void setAggPropertiesNames(List columnNames) { public Map getSimpleProperties() { Map values = new HashMap((int) propertiesValues.size()); - for (int i = 0; i < propertiesNames.size(); i++) { + for (int i = 0; i < propertiesNames.size() && i < propertiesValues.size(); i++) { values.put(propertiesNames.get(i), propertiesValues.get(i).getValue()); } return values; From 2a2a040388bbdf668b3f7becfd29d17b95c55a44 Mon Sep 17 00:00:00 2001 From: fan <37357096+wyfanxiao@users.noreply.github.com> Date: Tue, 19 Aug 2025 16:50:54 +0800 Subject: [PATCH 4/5] Update pom.xml --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index cac4d1f4..8f5179a1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.oceanbase obkv-table-client - 1.4.2 + 1.4.3-SNAPSHOT ${project.groupId}:${project.artifactId} OceanBase JavaClient for TableApi @@ -27,7 +27,7 @@ scm:git:https://github.com/oceanbase/obkv-table-client-java.git - obkv-table-client-1.4.2 + HEAD https://github.com/oceanbase/obkv-table-client-java From 8c16a04ac063c241bd4634e45b78c12c45e0b569 Mon Sep 17 00:00:00 2001 From: junye Date: Tue, 19 Aug 2025 16:54:29 +0800 Subject: [PATCH 5/5] [maven-release-plugin] prepare release obkv-table-client-1.4.3 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8f5179a1..511e5918 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.oceanbase obkv-table-client - 1.4.3-SNAPSHOT + 1.4.3 ${project.groupId}:${project.artifactId} OceanBase JavaClient for TableApi @@ -27,7 +27,7 @@ scm:git:https://github.com/oceanbase/obkv-table-client-java.git - HEAD + obkv-table-client-1.4.3 https://github.com/oceanbase/obkv-table-client-java