Merge pull request #4227 from taosdata/hotfix/TD-1785
[TD-1785]<fix>: taos_close may fail
This commit is contained in:
commit
9711afc539
|
@ -37,7 +37,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef TAOS_OS_DEF_EPOLL
|
#ifndef TAOS_OS_DEF_EPOLL
|
||||||
#define TAOS_EPOLL_WAIT_TIME -1
|
#define TAOS_EPOLL_WAIT_TIME 500
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TAOS_RANDOM_NETWORK_FAIL
|
#ifdef TAOS_RANDOM_NETWORK_FAIL
|
||||||
|
|
|
@ -171,40 +171,17 @@ void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThread
|
||||||
}
|
}
|
||||||
|
|
||||||
static void taosStopTcpThread(SThreadObj* pThreadObj) {
|
static void taosStopTcpThread(SThreadObj* pThreadObj) {
|
||||||
pThreadObj->stop = true;
|
// save thread into local variable and signal thread to stop
|
||||||
eventfd_t fd = -1;
|
|
||||||
|
|
||||||
// save thread into local variable since pThreadObj is freed when thread exits
|
|
||||||
pthread_t thread = pThreadObj->thread;
|
pthread_t thread = pThreadObj->thread;
|
||||||
|
if (!taosCheckPthreadValid(thread)) {
|
||||||
if (taosComparePthread(pThreadObj->thread, pthread_self())) {
|
return;
|
||||||
|
}
|
||||||
|
pThreadObj->stop = true;
|
||||||
|
if (taosComparePthread(thread, pthread_self())) {
|
||||||
pthread_detach(pthread_self());
|
pthread_detach(pthread_self());
|
||||||
return;
|
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);
|
pthread_join(thread, NULL);
|
||||||
}
|
|
||||||
|
|
||||||
if (fd != -1) taosCloseSocket(fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosStopTcpServer(void *handle) {
|
void taosStopTcpServer(void *handle) {
|
||||||
|
|
|
@ -301,31 +301,14 @@ static SThreadObj *taosGetTcpThread(SPoolObj *pPool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void taosStopPoolThread(SThreadObj *pThread) {
|
static void taosStopPoolThread(SThreadObj *pThread) {
|
||||||
|
pthread_t thread = pThread->thread;
|
||||||
|
if (!taosCheckPthreadValid(thread)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
pThread->stop = true;
|
pThread->stop = true;
|
||||||
|
if (taosComparePthread(thread, pthread_self())) {
|
||||||
if (pThread->thread == pthread_self()) {
|
|
||||||
pthread_detach(pthread_self());
|
pthread_detach(pthread_self());
|
||||||
return;
|
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_join(thread, NULL);
|
pthread_join(thread, NULL);
|
||||||
taosClose(fd);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue