From 7f70eff949ccafad2992f04af9364663cb8ae7cc Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 14 Oct 2020 13:24:41 +0800 Subject: [PATCH] [td-1716] enable repeatably close connection to avoid close the connection twice in c# driver #3737 --- src/client/src/tscSql.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c index acc38ac8ed..c5a46e2185 100644 --- a/src/client/src/tscSql.c +++ b/src/client/src/tscSql.c @@ -27,6 +27,7 @@ #include "ttokendef.h" #include "tutil.h" #include "tscProfile.h" +#include "ttimer.h" static bool validImpl(const char* str, size_t maxsize) { if (str == NULL) { @@ -256,10 +257,21 @@ TAOS *taos_connect_a(char *ip, char *user, char *pass, char *db, uint16_t port, void taos_close(TAOS *taos) { STscObj *pObj = (STscObj *)taos; - if (pObj == NULL || pObj->signature != pObj) { + if (pObj == NULL) { + tscDebug("(null) try to free tscObj and close dnodeConn"); return; } + tscDebug("%p try to free tscObj and close dnodeConn:%p", pObj, pObj->pDnodeConn); + if (pObj->signature != pObj) { + tscDebug("%p already closed or invalid tscObj", pObj); + return; + } + + // make sure that the close connection can only be executed once. + pObj->signature = NULL; + taosTmrStopA(&(pObj->pTimer)); + SSqlObj* pHb = pObj->pHb; if (pHb != NULL && atomic_val_compare_exchange_ptr(&pObj->pHb, pHb, 0) == pHb) { if (pHb->pRpcCtx != NULL) { // wait for rsp from dnode