From 590682391bff7efa520e4ba63983f6ffcf0f081a Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Sat, 14 Nov 2020 16:05:46 +0000 Subject: [PATCH 1/4] [TD-1785]: taos_close may fail --- src/os/inc/osSocket.h | 2 +- src/rpc/src/rpcTcp.c | 28 +++------------------------- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/os/inc/osSocket.h b/src/os/inc/osSocket.h index cbfdedef48..baf7687dd0 100644 --- a/src/os/inc/osSocket.h +++ b/src/os/inc/osSocket.h @@ -37,7 +37,7 @@ extern "C" { #endif #ifndef TAOS_OS_DEF_EPOLL - #define TAOS_EPOLL_WAIT_TIME -1 + #define TAOS_EPOLL_WAIT_TIME 500 #endif #ifdef TAOS_RANDOM_NETWORK_FAIL diff --git a/src/rpc/src/rpcTcp.c b/src/rpc/src/rpcTcp.c index bbabb5d47b..17314cb591 100644 --- a/src/rpc/src/rpcTcp.c +++ b/src/rpc/src/rpcTcp.c @@ -171,40 +171,18 @@ void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThread } static void taosStopTcpThread(SThreadObj* pThreadObj) { - pThreadObj->stop = true; - eventfd_t fd = -1; - - // save thread into local variable since pThreadObj is freed when thread exits + // save thread into local variable and signal thread to stop pthread_t thread = pThreadObj->thread; + pThreadObj->stop = true; - if (taosComparePthread(pThreadObj->thread, pthread_self())) { + if (taosComparePthread(thread, pthread_self())) { pthread_detach(pthread_self()); return; } - - if (taosCheckPthreadValid(pThreadObj->thread)) { - // signal the thread to stop, try graceful method first, - // and use pthread_cancel when failed - struct epoll_event event = { .events = EPOLLIN }; - fd = eventfd(1, 0); - if (fd == -1) { - // failed to create eventfd, call pthread_cancel instead, which may result in data corruption: - tError("%s, failed to create eventfd(%s)", pThreadObj->label, strerror(errno)); - pThreadObj->stop = true; - pthread_cancel(pThreadObj->thread); - } else if (epoll_ctl(pThreadObj->pollFd, EPOLL_CTL_ADD, fd, &event) < 0) { - // failed to call epoll_ctl, call pthread_cancel instead, which may result in data corruption: - tError("%s, failed to call epoll_ctl(%s)", pThreadObj->label, strerror(errno)); - pthread_cancel(pThreadObj->thread); - } - } - // at this step, pThreadObj has already been released if (taosCheckPthreadValid(thread)) { pthread_join(thread, NULL); } - - if (fd != -1) taosCloseSocket(fd); } void taosStopTcpServer(void *handle) { From db1ae558609129ee4ed178e596053d5b99d42501 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Sat, 14 Nov 2020 16:20:00 +0000 Subject: [PATCH 2/4] [TD-1785]: taos_close may fail --- src/rpc/src/rpcTcp.c | 8 ++------ src/sync/src/taosTcpPool.c | 26 +++----------------------- 2 files changed, 5 insertions(+), 29 deletions(-) diff --git a/src/rpc/src/rpcTcp.c b/src/rpc/src/rpcTcp.c index 17314cb591..5758a7c226 100644 --- a/src/rpc/src/rpcTcp.c +++ b/src/rpc/src/rpcTcp.c @@ -173,16 +173,12 @@ void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThread static void taosStopTcpThread(SThreadObj* pThreadObj) { // save thread into local variable and signal thread to stop pthread_t thread = pThreadObj->thread; - pThreadObj->stop = true; - if (taosComparePthread(thread, pthread_self())) { pthread_detach(pthread_self()); return; } - // at this step, pThreadObj has already been released - if (taosCheckPthreadValid(thread)) { - pthread_join(thread, NULL); - } + pThreadObj->stop = true; + pthread_join(thread, NULL); } void taosStopTcpServer(void *handle) { diff --git a/src/sync/src/taosTcpPool.c b/src/sync/src/taosTcpPool.c index 3024d7d4e3..1784dc60b7 100644 --- a/src/sync/src/taosTcpPool.c +++ b/src/sync/src/taosTcpPool.c @@ -301,31 +301,11 @@ static SThreadObj *taosGetTcpThread(SPoolObj *pPool) { } static void taosStopPoolThread(SThreadObj *pThread) { - pThread->stop = true; - - if (pThread->thread == pthread_self()) { + pthread_t thread = pThread->thread; + if (taosComparePthread(thread, pthread_self())) { pthread_detach(pthread_self()); return; } - - // save thread ID into a local variable, since pThread is freed when the thread exits - pthread_t thread = pThread->thread; - - // signal the thread to stop, try graceful method first, - // and use pthread_cancel when failed - struct epoll_event event = {.events = EPOLLIN}; - eventfd_t fd = eventfd(1, 0); - if (fd == -1) { - // failed to create eventfd, call pthread_cancel instead, which may result in data corruption - sError("failed to create eventfd since %s", strerror(errno)); - pthread_cancel(pThread->thread); - pThread->stop = true; - } else if (epoll_ctl(pThread->pollFd, EPOLL_CTL_ADD, fd, &event) < 0) { - // failed to call epoll_ctl, call pthread_cancel instead, which may result in data corruption - sError("failed to call epoll_ctl since %s", strerror(errno)); - pthread_cancel(pThread->thread); - } - + pThread->stop = true; pthread_join(thread, NULL); - if (fd >= 0) taosClose(fd); } From a8b7c1e512ead98df83c3180f829d368f93e5609 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Sat, 14 Nov 2020 16:35:23 +0000 Subject: [PATCH 3/4] [TD-1785]: taos_close may fail --- src/rpc/src/rpcTcp.c | 2 +- src/sync/src/taosTcpPool.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpc/src/rpcTcp.c b/src/rpc/src/rpcTcp.c index 5758a7c226..affddf0520 100644 --- a/src/rpc/src/rpcTcp.c +++ b/src/rpc/src/rpcTcp.c @@ -173,11 +173,11 @@ void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThread static void taosStopTcpThread(SThreadObj* pThreadObj) { // save thread into local variable and signal thread to stop pthread_t thread = pThreadObj->thread; + pThreadObj->stop = true; if (taosComparePthread(thread, pthread_self())) { pthread_detach(pthread_self()); return; } - pThreadObj->stop = true; pthread_join(thread, NULL); } diff --git a/src/sync/src/taosTcpPool.c b/src/sync/src/taosTcpPool.c index 1784dc60b7..3be2989342 100644 --- a/src/sync/src/taosTcpPool.c +++ b/src/sync/src/taosTcpPool.c @@ -302,10 +302,10 @@ static SThreadObj *taosGetTcpThread(SPoolObj *pPool) { static void taosStopPoolThread(SThreadObj *pThread) { pthread_t thread = pThread->thread; + pThread->stop = true; if (taosComparePthread(thread, pthread_self())) { pthread_detach(pthread_self()); return; } - pThread->stop = true; pthread_join(thread, NULL); } From 08e6c5ecf66caf0b4f5c54e8b3f0ae66561d7949 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Mon, 16 Nov 2020 10:27:16 +0000 Subject: [PATCH 4/4] [TD-1786]: failure of taos_clos may cause core --- src/rpc/src/rpcTcp.c | 3 +++ src/sync/src/taosTcpPool.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/rpc/src/rpcTcp.c b/src/rpc/src/rpcTcp.c index affddf0520..7b8cf3cda2 100644 --- a/src/rpc/src/rpcTcp.c +++ b/src/rpc/src/rpcTcp.c @@ -173,6 +173,9 @@ void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThread static void taosStopTcpThread(SThreadObj* pThreadObj) { // save thread into local variable and signal thread to stop pthread_t thread = pThreadObj->thread; + if (!taosCheckPthreadValid(thread)) { + return; + } pThreadObj->stop = true; if (taosComparePthread(thread, pthread_self())) { pthread_detach(pthread_self()); diff --git a/src/sync/src/taosTcpPool.c b/src/sync/src/taosTcpPool.c index 3be2989342..875528e66b 100644 --- a/src/sync/src/taosTcpPool.c +++ b/src/sync/src/taosTcpPool.c @@ -302,6 +302,9 @@ static SThreadObj *taosGetTcpThread(SPoolObj *pPool) { static void taosStopPoolThread(SThreadObj *pThread) { pthread_t thread = pThread->thread; + if (!taosCheckPthreadValid(thread)) { + return; + } pThread->stop = true; if (taosComparePthread(thread, pthread_self())) { pthread_detach(pthread_self());