From d7f4bd6e3a1f4576d660847896da3122b06a92a4 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Tue, 19 Nov 2024 14:38:18 +0800 Subject: [PATCH 01/10] fix(contrib/test): not build az test without s3 --- contrib/test/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contrib/test/CMakeLists.txt b/contrib/test/CMakeLists.txt index f544baafde..5d613dfed2 100644 --- a/contrib/test/CMakeLists.txt +++ b/contrib/test/CMakeLists.txt @@ -28,6 +28,9 @@ if(${BUILD_WITH_TRAFT}) # add_subdirectory(traft) endif(${BUILD_WITH_TRAFT}) -add_subdirectory(azure) +if(${BUILD_S3}) + add_subdirectory(azure) +endif() + add_subdirectory(tdev) add_subdirectory(lz4) From 7a38182a4fa0b9fec01852d1c33f361b7d548e48 Mon Sep 17 00:00:00 2001 From: dmchen Date: Mon, 25 Nov 2024 18:32:18 +0800 Subject: [PATCH 02/10] fix/skip-sync-reset-timer --- source/libs/sync/src/syncMain.c | 35 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 3d37cdb560..269d134930 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -980,8 +980,9 @@ static int32_t syncHbTimerStart(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer) { sTrace("vgId:%d, start hb timer, rid:%" PRId64 " addr:%" PRId64 " at %d", pSyncNode->vgId, pData->rid, pData->destId.addr, pSyncTimer->timerMS); - TAOS_CHECK_RETURN(taosTmrReset(pSyncTimer->timerCb, pSyncTimer->timerMS, (void*)(pData->rid), - syncEnv()->pTimerManager, &pSyncTimer->pTimer)); + bool stopped = taosTmrReset(pSyncTimer->timerCb, pSyncTimer->timerMS, (void*)(pData->rid), syncEnv()->pTimerManager, + &pSyncTimer->pTimer); + if (stopped) sError("vgId:%d, failed to reset hb timer success", pSyncNode->vgId); } else { code = TSDB_CODE_SYN_INTERNAL_ERROR; sError("vgId:%d, start ctrl hb timer error, sync env is stop", pSyncNode->vgId); @@ -1624,8 +1625,9 @@ ESyncStrategy syncNodeStrategy(SSyncNode* pSyncNode) { return pSyncNode->raftCfg int32_t syncNodeStartPingTimer(SSyncNode* pSyncNode) { int32_t code = 0; if (syncIsInit()) { - TAOS_CHECK_RETURN(taosTmrReset(pSyncNode->FpPingTimerCB, pSyncNode->pingTimerMS, (void*)pSyncNode->rid, - syncEnv()->pTimerManager, &pSyncNode->pPingTimer)); + bool stopped = taosTmrReset(pSyncNode->FpPingTimerCB, pSyncNode->pingTimerMS, (void*)pSyncNode->rid, + syncEnv()->pTimerManager, &pSyncNode->pPingTimer); + if (stopped) sError("vgId:%d, failed to reset ping timer, ms:%d", pSyncNode->vgId, pSyncNode->pingTimerMS); atomic_store_64(&pSyncNode->pingTimerLogicClock, pSyncNode->pingTimerLogicClockUser); } else { sError("vgId:%d, start ping timer error, sync env is stop", pSyncNode->vgId); @@ -1653,8 +1655,9 @@ int32_t syncNodeStartElectTimer(SSyncNode* pSyncNode, int32_t ms) { pSyncNode->electTimerParam.pSyncNode = pSyncNode; pSyncNode->electTimerParam.pData = NULL; - TAOS_CHECK_RETURN(taosTmrReset(pSyncNode->FpElectTimerCB, pSyncNode->electTimerMS, (void*)(pSyncNode->rid), - syncEnv()->pTimerManager, &pSyncNode->pElectTimer)); + bool stopped = taosTmrReset(pSyncNode->FpElectTimerCB, pSyncNode->electTimerMS, (void*)(pSyncNode->rid), + syncEnv()->pTimerManager, &pSyncNode->pElectTimer); + if (stopped) sError("vgId:%d, failed to reset elect timer, ms:%d", pSyncNode->vgId, ms); } else { sError("vgId:%d, start elect timer error, sync env is stop", pSyncNode->vgId); } @@ -1690,7 +1693,7 @@ void syncNodeResetElectTimer(SSyncNode* pSyncNode) { // TODO check return value if ((code = syncNodeRestartElectTimer(pSyncNode, electMS)) != 0) { - sError("vgId:%d, failed to restart elect timer since %s", pSyncNode->vgId, terrstr()); + sError("vgId:%d, failed to restart elect timer since %s", pSyncNode->vgId, tstrerror(code)); return; }; @@ -2586,10 +2589,9 @@ static void syncNodeEqPingTimer(void* param, void* tmrId) { } _out: - if ((code = taosTmrReset(syncNodeEqPingTimer, pNode->pingTimerMS, (void*)pNode->rid, syncEnv()->pTimerManager, - &pNode->pPingTimer)) != 0) { - sError("failed to reset ping timer since %s", tstrerror(code)); - }; + bool stopped = taosTmrReset(syncNodeEqPingTimer, pNode->pingTimerMS, (void*)pNode->rid, syncEnv()->pTimerManager, + &pNode->pPingTimer); + if (stopped) sError("failed to reset ping timer"); } syncNodeRelease(pNode); } @@ -2759,13 +2761,10 @@ static void syncNodeEqPeerHeartbeatTimer(void* param, void* tmrId) { if (syncIsInit()) { sTrace("vgId:%d, reset peer hb timer at %d", pSyncNode->vgId, pSyncTimer->timerMS); - if ((code = taosTmrReset(syncNodeEqPeerHeartbeatTimer, pSyncTimer->timerMS, (void*)hbDataRid, - syncEnv()->pTimerManager, &pSyncTimer->pTimer)) != 0) { - sError("vgId:%d, reset peer hb timer error, %s", pSyncNode->vgId, tstrerror(code)); - syncNodeRelease(pSyncNode); - syncHbTimerDataRelease(pData); - return; - } + bool stopped = taosTmrReset(syncNodeEqPeerHeartbeatTimer, pSyncTimer->timerMS, (void*)hbDataRid, + syncEnv()->pTimerManager, &pSyncTimer->pTimer); + if (stopped) sError("vgId:%d, reset peer hb timer error, %s", pSyncNode->vgId, tstrerror(code)); + } else { sError("sync env is stop, reset peer hb timer error"); } From 5516657020ce4ee0eac06e3ffb66bfeb20fc8aad Mon Sep 17 00:00:00 2001 From: sheyanjie-qq <249478495@qq.com> Date: Mon, 25 Nov 2024 19:07:11 +0800 Subject: [PATCH 03/10] update jdbc demo, and version history --- docs/en/08-develop/01-connect/index.md | 2 +- .../en/14-reference/05-connectors/14-java.mdx | 3 + docs/examples/JDBC/mybatisplus-demo/pom.xml | 2 +- .../mybatisplusdemo/domain/Meters.java | 16 +++ .../mybatisplusdemo/mapper/MetersMapper.java | 31 +++++ .../src/main/resources/application.yml | 4 +- .../mapper/MetersMapperTest.java | 112 ++++++++++++++++++ docs/examples/JDBC/springbootdemo/pom.xml | 2 +- docs/zh/07-develop/01-connect/index.md | 2 +- docs/zh/14-reference/05-connector/14-java.mdx | 1 + 10 files changed, 169 insertions(+), 6 deletions(-) create mode 100644 docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Meters.java create mode 100644 docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/MetersMapper.java create mode 100644 docs/examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/MetersMapperTest.java diff --git a/docs/en/08-develop/01-connect/index.md b/docs/en/08-develop/01-connect/index.md index f4dbccba24..5f0a462ec2 100644 --- a/docs/en/08-develop/01-connect/index.md +++ b/docs/en/08-develop/01-connect/index.md @@ -90,7 +90,7 @@ If `maven` is used to manage the projects, what needs to be done is only adding com.taosdata.jdbc taos-jdbcdriver - 3.3.3 + 3.4.0 ``` diff --git a/docs/en/14-reference/05-connectors/14-java.mdx b/docs/en/14-reference/05-connectors/14-java.mdx index 1f4cf9895f..d064f37aeb 100644 --- a/docs/en/14-reference/05-connectors/14-java.mdx +++ b/docs/en/14-reference/05-connectors/14-java.mdx @@ -42,6 +42,9 @@ REST connection supports all platforms that can run Java. | taos-jdbcdriver version | major changes | TDengine version | | :---------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------: | +| 3.4.0 | 1. Replace the fastjson library with the Jackson library; 2. WebSocket connection protocal uses independent identification; 3. Optimize the use of backend pull threads to avoid user misuse leading to timeouts.| - | +| 3.3.4 | 1. Fixed getInt error when data type is float| - | +| 3.3.3 | 1. Fixed the memory leak caused by WebSocket statement| - | | 3.3.2 | 1. Optimized websocket prepareStatement performance; 2. Improved mybatis support| - | | 3.3.0 | 1. Optimized data transmission performance under Websocket connection; 2. SSL validation skipping is supported but disabled by default| 3.3.2.0 or later | | 3.2.11 | Fixed the result set closing bug when using a native connection.| - | diff --git a/docs/examples/JDBC/mybatisplus-demo/pom.xml b/docs/examples/JDBC/mybatisplus-demo/pom.xml index f792946c96..2077e31d8d 100644 --- a/docs/examples/JDBC/mybatisplus-demo/pom.xml +++ b/docs/examples/JDBC/mybatisplus-demo/pom.xml @@ -47,7 +47,7 @@ com.taosdata.jdbc taos-jdbcdriver - 3.2.4 + 3.4.0 diff --git a/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Meters.java b/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Meters.java new file mode 100644 index 0000000000..e886e56269 --- /dev/null +++ b/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Meters.java @@ -0,0 +1,16 @@ +package com.taosdata.example.mybatisplusdemo.domain; + +import lombok.Data; + +import java.sql.Timestamp; + +@Data +public class Meters { + private String tbname; + private Timestamp ts; + private float current; + private int voltage; + private float phase; + private int groupid; + private byte[] location; +} diff --git a/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/MetersMapper.java b/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/MetersMapper.java new file mode 100644 index 0000000000..441c340886 --- /dev/null +++ b/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/MetersMapper.java @@ -0,0 +1,31 @@ +package com.taosdata.example.mybatisplusdemo.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.taosdata.example.mybatisplusdemo.domain.Meters; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +public interface MetersMapper extends BaseMapper { + + @Update("CREATE STABLE IF NOT EXISTS meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (groupId INT, location BINARY(24))") + int createTable(); + + @Insert("insert into meters (tbname, ts, groupid, location, current, voltage, phase) values(#{tbname}, #{ts}, #{groupid}, #{location}, #{current}, #{voltage}, #{phase})") + int insertOne(Meters one); + + @Insert({ + "" + }) + int insertBatch(@Param("list") List metersList); + + @Update("drop stable if exists meters") + void dropTable(); +} diff --git a/docs/examples/JDBC/mybatisplus-demo/src/main/resources/application.yml b/docs/examples/JDBC/mybatisplus-demo/src/main/resources/application.yml index 985ed1675e..e9855bf011 100644 --- a/docs/examples/JDBC/mybatisplus-demo/src/main/resources/application.yml +++ b/docs/examples/JDBC/mybatisplus-demo/src/main/resources/application.yml @@ -1,7 +1,7 @@ spring: datasource: - driver-class-name: com.taosdata.jdbc.TSDBDriver - url: jdbc:TAOS://localhost:6030/mp_test?charset=UTF-8&locale=en_US.UTF-8&timezone=UTC-8 + driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver + url: jdbc:TAOS-WS://localhost:6041/mp_test?charset=UTF-8&locale=en_US.UTF-8&timezone=UTC-8 username: root password: taosdata diff --git a/docs/examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/MetersMapperTest.java b/docs/examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/MetersMapperTest.java new file mode 100644 index 0000000000..2d8458e9d9 --- /dev/null +++ b/docs/examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/MetersMapperTest.java @@ -0,0 +1,112 @@ +package com.taosdata.example.mybatisplusdemo.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.taosdata.example.mybatisplusdemo.domain.Meters; +import com.taosdata.example.mybatisplusdemo.domain.Weather; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.sql.Timestamp; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest +public class MetersMapperTest { + + private static Random random = new Random(System.currentTimeMillis()); + + @Autowired + private MetersMapper mapper; + + @Before + public void createTable(){ + mapper.dropTable(); + mapper.createTable(); + Meters one = new Meters(); + one.setTbname("test_10001"); + one.setGroupid(10001); + one.setCurrent(random.nextFloat()); + one.setPhase(random.nextFloat()); + one.setCurrent(12345); + one.setTs(new Timestamp(1605024000000l)); + one.setLocation("望京".getBytes()); + mapper.insertOne(one); + } + + @Test + public void testSelectList() { + List meters = mapper.selectList(null); + meters.forEach(System.out::println); + } + + @Test + public void testInsertBatch() { + List metersList = new LinkedList<>(); + for (int i = 0; i < 100; i++){ + Meters one = new Meters(); + one.setTbname("tb_" + i); + one.setGroupid(i); + one.setCurrent(random.nextFloat()); + one.setPhase(random.nextFloat()); + one.setCurrent(random.nextInt()); + one.setTs(new Timestamp(1605024000000l + i)); + one.setLocation(("望京" + i).getBytes()); + metersList.add(one); + + } + int affectRows = mapper.insertBatch(metersList); + Assert.assertEquals(100, affectRows); + } + + @Test + public void testSelectOne() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("location", "望京".getBytes()); + Meters one = mapper.selectOne(wrapper); + System.out.println(one); + Assert.assertEquals(12345, one.getCurrent(), 0.00f); + Assert.assertArrayEquals("望京".getBytes(), one.getLocation()); + } + + // @Test + // public void testSelectByMap() { + // Map map = new HashMap<>(); + // map.put("location", "beijing"); + // List weathers = mapper.selectByMap(map); + // Assert.assertEquals(1, weathers.size()); + // } + + @Test + public void testSelectObjs() { + List ts = mapper.selectObjs(null); + System.out.println(ts); + } + + @Test + public void testSelectCount() { + int count = mapper.selectCount(null); +// Assert.assertEquals(5, count); + System.out.println(count); + } + + @Test + public void testSelectPage() { + IPage page = new Page(1, 2); + IPage metersIPage = mapper.selectPage(page, null); + System.out.println("total : " + metersIPage.getTotal()); + System.out.println("pages : " + metersIPage.getPages()); + for (Meters meters : metersIPage.getRecords()) { + System.out.println(meters); + } + } + +} \ No newline at end of file diff --git a/docs/examples/JDBC/springbootdemo/pom.xml b/docs/examples/JDBC/springbootdemo/pom.xml index ba75cdcec3..df8a3f5d61 100644 --- a/docs/examples/JDBC/springbootdemo/pom.xml +++ b/docs/examples/JDBC/springbootdemo/pom.xml @@ -70,7 +70,7 @@ com.taosdata.jdbc taos-jdbcdriver - 3.0.0 + 3.4.0 diff --git a/docs/zh/07-develop/01-connect/index.md b/docs/zh/07-develop/01-connect/index.md index bd26bea46d..94f55967ec 100644 --- a/docs/zh/07-develop/01-connect/index.md +++ b/docs/zh/07-develop/01-connect/index.md @@ -89,7 +89,7 @@ TDengine 提供了丰富的应用程序开发接口,为了便于用户快速 com.taosdata.jdbc taos-jdbcdriver - 3.3.3 + 3.4.0 ``` diff --git a/docs/zh/14-reference/05-connector/14-java.mdx b/docs/zh/14-reference/05-connector/14-java.mdx index 0a167dd5ee..e8554ae668 100644 --- a/docs/zh/14-reference/05-connector/14-java.mdx +++ b/docs/zh/14-reference/05-connector/14-java.mdx @@ -34,6 +34,7 @@ REST 连接支持所有能运行 Java 的平台。 | taos-jdbcdriver 版本 | 主要变化 | TDengine 版本 | | :------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------: | | 3.4.0 | 1. 使用 jackson 库替换 fastjson 库;2. WebSocket 采用独立协议标识;3. 优化后台拉取线程使用,避免用户误用导致超时。 | - | +| 3.3.4 | 1. 解决了 getInt 在数据类型为 float 报错 | - | | 3.3.3 | 1. 解决了 WebSocket statement 关闭导致的内存泄漏 | - | | 3.3.2 | 1. 优化 WebSocket 连接下的参数绑定性能;2. 优化了对 mybatis 的支持 | - | | 3.3.0 | 1. 优化 WebSocket 连接下的数据传输性能;2. 支持跳过 SSL 验证,默认关闭 | 3.3.2.0 及更高版本 | From ca8b25472b1fea3a5affbd0dd87190d152168059 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 26 Nov 2024 11:53:16 +0800 Subject: [PATCH 04/10] fix transCli crash --- source/libs/transport/src/transCli.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 8377a1456d..6c82bcdc8b 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -2927,6 +2927,7 @@ bool cliMayRetry(SCliConn* pConn, SCliReq* pReq, STransMsg* pResp) { transFreeMsg(pResp->pCont); } pResp->pCont = NULL; + pResp->info.hasEpSet = 0; if (code != TSDB_CODE_RPC_BROKEN_LINK && code != TSDB_CODE_RPC_NETWORK_UNAVAIL && code != TSDB_CODE_SUCCESS) { // save one internal code pCtx->retryCode = code; From 9a217a7593333b4f8687a6c5e5d17b5f9d757ffd Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 26 Nov 2024 13:09:18 +0800 Subject: [PATCH 05/10] fix/skip-sync-reset-timer-fix-compile --- source/libs/sync/src/syncMain.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 269d134930..c803b5413c 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -2589,9 +2589,9 @@ static void syncNodeEqPingTimer(void* param, void* tmrId) { } _out: - bool stopped = taosTmrReset(syncNodeEqPingTimer, pNode->pingTimerMS, (void*)pNode->rid, syncEnv()->pTimerManager, - &pNode->pPingTimer); - if (stopped) sError("failed to reset ping timer"); + if (taosTmrReset(syncNodeEqPingTimer, pNode->pingTimerMS, (void*)pNode->rid, syncEnv()->pTimerManager, + &pNode->pPingTimer)) + sError("failed to reset ping timer"); } syncNodeRelease(pNode); } From 6789e2e58db356a8c5efc80f29cef0dd66fb4a02 Mon Sep 17 00:00:00 2001 From: dmchen Date: Tue, 26 Nov 2024 15:54:31 +0800 Subject: [PATCH 06/10] fix/skip-sync-reset-timer-keep-return-error --- source/libs/sync/src/syncMain.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index c803b5413c..5bdac16f42 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -982,7 +982,10 @@ static int32_t syncHbTimerStart(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer) { bool stopped = taosTmrReset(pSyncTimer->timerCb, pSyncTimer->timerMS, (void*)(pData->rid), syncEnv()->pTimerManager, &pSyncTimer->pTimer); - if (stopped) sError("vgId:%d, failed to reset hb timer success", pSyncNode->vgId); + if (stopped) { + sError("vgId:%d, failed to reset hb timer success", pSyncNode->vgId); + return TSDB_CODE_SYN_INTERNAL_ERROR; + } } else { code = TSDB_CODE_SYN_INTERNAL_ERROR; sError("vgId:%d, start ctrl hb timer error, sync env is stop", pSyncNode->vgId); @@ -1627,7 +1630,10 @@ int32_t syncNodeStartPingTimer(SSyncNode* pSyncNode) { if (syncIsInit()) { bool stopped = taosTmrReset(pSyncNode->FpPingTimerCB, pSyncNode->pingTimerMS, (void*)pSyncNode->rid, syncEnv()->pTimerManager, &pSyncNode->pPingTimer); - if (stopped) sError("vgId:%d, failed to reset ping timer, ms:%d", pSyncNode->vgId, pSyncNode->pingTimerMS); + if (stopped) { + sError("vgId:%d, failed to reset ping timer, ms:%d", pSyncNode->vgId, pSyncNode->pingTimerMS); + return TSDB_CODE_SYN_INTERNAL_ERROR; + } atomic_store_64(&pSyncNode->pingTimerLogicClock, pSyncNode->pingTimerLogicClockUser); } else { sError("vgId:%d, start ping timer error, sync env is stop", pSyncNode->vgId); From 76f982e937d4a2a31c9fc96efd139258ea667beb Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 26 Nov 2024 17:57:10 +0800 Subject: [PATCH 07/10] handle random memory failure --- source/client/src/clientImpl.c | 11 +++++------ source/libs/transport/src/transCli.c | 4 +++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 94d06166f2..2c98ecac1b 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -1816,7 +1816,7 @@ int32_t doProcessMsgFromServerImpl(SRpcMsg* pMsg, SEpSet* pEpSet) { .handleRefId = pMsg->info.refId, .pEpSet = pEpSet}; - if (pMsg->contLen > 0) { + if (pMsg->code != TSDB_CODE_OUT_OF_MEMORY && pMsg->contLen > 0) { buf.pData = taosMemoryCalloc(1, pMsg->contLen); if (buf.pData == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -2211,7 +2211,7 @@ static int32_t estimateJsonLen(SReqResultInfo* pResultInfo) { static int32_t doConvertJson(SReqResultInfo* pResultInfo) { int32_t numOfRows = pResultInfo->numOfRows; int32_t numOfCols = pResultInfo->numOfCols; - bool needConvert = false; + bool needConvert = false; for (int32_t i = 0; i < numOfCols; ++i) { if (pResultInfo->fields[i].type == TSDB_DATA_TYPE_JSON) { needConvert = true; @@ -2400,8 +2400,8 @@ int32_t setResultDataPtr(SReqResultInfo* pResultInfo, bool convertUcs4) { p += sizeof(int32_t); if (rows != pResultInfo->numOfRows || cols != pResultInfo->numOfCols) { - tscError("setResultDataPtr paras error:rows;%d numOfRows:%" PRId64 " cols:%d numOfCols:%d", rows, pResultInfo->numOfRows, cols, - pResultInfo->numOfCols); + tscError("setResultDataPtr paras error:rows;%d numOfRows:%" PRId64 " cols:%d numOfCols:%d", rows, + pResultInfo->numOfRows, cols, pResultInfo->numOfCols); return TSDB_CODE_TSC_INTERNAL_ERROR; } @@ -2577,8 +2577,7 @@ int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableR // TODO handle the compressed case pResultInfo->totalRows += pResultInfo->numOfRows; - int32_t code = - setResultDataPtr(pResultInfo, convertUcs4); + int32_t code = setResultDataPtr(pResultInfo, convertUcs4); return code; } diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 6c82bcdc8b..2e6cb0b909 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -2017,7 +2017,9 @@ void cliHandleBatchReq(SCliThrd* pThrd, SCliReq* pReq) { tWarn("%s conn %p failed to added to heap cache since %s", pInst->label, pConn, tstrerror(code)); } } else { - // TAOS_CHECK_GOTO(code, &lino, _exception); + if (code == TSDB_CODE_OUT_OF_MEMORY && pConn == NULL) { + TAOS_CHECK_GOTO(code, &lino, _exception); + } return; } } From 2e56479f8a5d768cf5b16d25b0aaed7d3e6db19c Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 26 Nov 2024 19:00:06 +0800 Subject: [PATCH 08/10] handle random memory failure --- source/libs/transport/src/transSvr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c index d02bfb8281..e6ddd588e1 100644 --- a/source/libs/transport/src/transSvr.c +++ b/source/libs/transport/src/transSvr.c @@ -1378,7 +1378,7 @@ _end: taosMemoryFree(pConn); pConn = NULL; } - tError("%s failed to create conn since %s" PRId64, transLabel(pInst), tstrerror(code)); + tError("%s failed to create conn since %s", transLabel(pInst), tstrerror(code)); return NULL; } From 3843fa6de8572c24c5927c96b91ad87e54c273dd Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 26 Nov 2024 19:45:00 +0800 Subject: [PATCH 09/10] fix invalid free --- source/libs/transport/src/transCli.c | 7 +++---- source/libs/transport/src/transSvr.c | 3 +++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 2e6cb0b909..c62b8d21c9 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -2498,10 +2498,6 @@ static int32_t createThrdObj(void* trans, SCliThrd** ppThrd) { _end: if (pThrd) { TAOS_UNUSED(taosThreadMutexDestroy(&pThrd->msgMtx)); - - TAOS_UNUSED(uv_loop_close(pThrd->loop)); - taosMemoryFree(pThrd->loop); - TAOS_UNUSED((taosThreadMutexDestroy(&pThrd->msgMtx))); transAsyncPoolDestroy(pThrd->asyncPool); for (int i = 0; i < taosArrayGetSize(pThrd->timerList); i++) { uv_timer_t* timer = taosArrayGetP(pThrd->timerList, i); @@ -2511,6 +2507,9 @@ _end: taosArrayDestroy(pThrd->timerList); TAOS_UNUSED(destroyConnPool(pThrd)); + TAOS_UNUSED(uv_loop_close(pThrd->loop)); + taosMemoryFree(pThrd->loop); + transDQDestroy(pThrd->delayQueue, NULL); transDQDestroy(pThrd->timeoutQueue, NULL); transDQDestroy(pThrd->waitConnQueue, NULL); diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c index e6ddd588e1..b1a5463309 100644 --- a/source/libs/transport/src/transSvr.c +++ b/source/libs/transport/src/transSvr.c @@ -1379,6 +1379,9 @@ _end: pConn = NULL; } tError("%s failed to create conn since %s", transLabel(pInst), tstrerror(code)); + return NULL; +_end2: + return NULL; } From dc63ec194d328c26fc5afd6f8e5e72c25ce69ac2 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 26 Nov 2024 19:50:26 +0800 Subject: [PATCH 10/10] fix invalid free --- source/libs/transport/src/transSvr.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c index b1a5463309..ecbdd0db84 100644 --- a/source/libs/transport/src/transSvr.c +++ b/source/libs/transport/src/transSvr.c @@ -1320,8 +1320,6 @@ static FORCE_INLINE SSvrConn* createConn(void* hThrd) { TAOS_CHECK_GOTO(TSDB_CODE_REF_INVALID_ID, &lino, _end); } - QUEUE_INIT(&exh->q); - SExHandle* pSelf = transAcquireExHandle(uvGetConnRefOfThrd(pThrd), exh->refId); if (pSelf != exh) { TAOS_CHECK_GOTO(TSDB_CODE_REF_INVALID_ID, NULL, _end); @@ -1369,6 +1367,12 @@ static FORCE_INLINE SSvrConn* createConn(void* hThrd) { return pConn; _end: if (pConn) { + if (pConn->refId > 0) { + transReleaseExHandle(uvGetConnRefOfThrd(pThrd), pConn->refId); + transRemoveExHandle(uvGetConnRefOfThrd(pThrd), pConn->refId); + pConn->refId = -1; + } + transQueueDestroy(&pConn->resps); transDestroyBuffer(&pConn->readBuf); taosHashCleanup(pConn->pQTable); @@ -1379,9 +1383,6 @@ _end: pConn = NULL; } tError("%s failed to create conn since %s", transLabel(pInst), tstrerror(code)); - return NULL; -_end2: - return NULL; }