Merge branch '3.0' of https://github.com/taosdata/TDengine into feat/TS-4994-3.0
This commit is contained in:
commit
09b0fb20ca
|
@ -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)
|
||||
|
|
|
@ -90,7 +90,7 @@ If `maven` is used to manage the projects, what needs to be done is only adding
|
|||
<dependency>
|
||||
<groupId>com.taosdata.jdbc</groupId>
|
||||
<artifactId>taos-jdbcdriver</artifactId>
|
||||
<version>3.3.3</version>
|
||||
<version>3.4.0</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
|
|
|
@ -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.| - |
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
<dependency>
|
||||
<groupId>com.taosdata.jdbc</groupId>
|
||||
<artifactId>taos-jdbcdriver</artifactId>
|
||||
<version>3.2.4</version>
|
||||
<version>3.4.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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<Meters> {
|
||||
|
||||
@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({
|
||||
"<script>",
|
||||
"insert into meters (tbname, ts, groupid, location, current, voltage, phase) values ",
|
||||
"<foreach collection='list' item='item' index='index' separator=','>",
|
||||
"(#{item.tbname}, #{item.ts}, #{item.groupid}, #{item.location}, #{item.current}, #{item.voltage}, #{item.phase})",
|
||||
"</foreach>",
|
||||
"</script>"
|
||||
})
|
||||
int insertBatch(@Param("list") List<Meters> metersList);
|
||||
|
||||
@Update("drop stable if exists meters")
|
||||
void dropTable();
|
||||
}
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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> meters = mapper.selectList(null);
|
||||
meters.forEach(System.out::println);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInsertBatch() {
|
||||
List<Meters> 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<Meters> 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<String, Object> map = new HashMap<>();
|
||||
// map.put("location", "beijing");
|
||||
// List<Weather> weathers = mapper.selectByMap(map);
|
||||
// Assert.assertEquals(1, weathers.size());
|
||||
// }
|
||||
|
||||
@Test
|
||||
public void testSelectObjs() {
|
||||
List<Object> 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<Meters> 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -70,7 +70,7 @@
|
|||
<dependency>
|
||||
<groupId>com.taosdata.jdbc</groupId>
|
||||
<artifactId>taos-jdbcdriver</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<version>3.4.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
|
|
@ -89,7 +89,7 @@ TDengine 提供了丰富的应用程序开发接口,为了便于用户快速
|
|||
<dependency>
|
||||
<groupId>com.taosdata.jdbc</groupId>
|
||||
<artifactId>taos-jdbcdriver</artifactId>
|
||||
<version>3.3.3</version>
|
||||
<version>3.4.0</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
|
|
|
@ -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 及更高版本 |
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -980,8 +980,12 @@ 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);
|
||||
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);
|
||||
|
@ -1624,8 +1628,12 @@ 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);
|
||||
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);
|
||||
|
@ -1653,8 +1661,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 +1699,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 +2595,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));
|
||||
};
|
||||
if (taosTmrReset(syncNodeEqPingTimer, pNode->pingTimerMS, (void*)pNode->rid, syncEnv()->pTimerManager,
|
||||
&pNode->pPingTimer))
|
||||
sError("failed to reset ping timer");
|
||||
}
|
||||
syncNodeRelease(pNode);
|
||||
}
|
||||
|
@ -2759,13 +2767,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");
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -2496,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);
|
||||
|
@ -2509,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);
|
||||
|
@ -2927,6 +2928,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;
|
||||
|
|
|
@ -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);
|
||||
|
@ -1378,7 +1382,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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue