drogonframework / drogonframework/drogon
Potential race condition between sendRequest timeout and app.quit()
- Dominant language
- C++
- Stars
- 14.3k
- Forks
- 1.4k
- Avg merge
- 1d 12h
- Merged PRs (30d)
- 15
Description
**Describe the bug**
Through some testing, it seems that if you have a request that is sent via sendRequest, and app.quit() is called prior to a timeout or response from that request--the process that is sending the request ends up getting stuck indefinitely.
When inspecting the hung process in `gdb` I find the following:
```
Id Target Id Frame
* 1 Thread 0x7f40bc1b3280 (LWP 1459854) "ServiceA" __futex_abstimed_wait_common64 (private=128, cancel=true, abstime=0x0, op=265, expected=1459859, futex_word=0x7f40b8dfe910) at ./nptl/futex-internal.c:57
2 Thread 0x7f40b95ff640 (LWP 1459857) "ServiceA" 0x00005596c0d1bcce in __sanitizer::internal_usleep(unsigned long long) ()
3 Thread 0x7f40b8dfe640 (LWP 1459859) "ServiceA" syscall () at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38
4 Thread 0x7f40b85fd640 (LWP 1459861) "DrogonIoLoop" syscall () at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38
5 Thread 0x7f40b7dfc640 (LWP 1459868) "Dns Queue0" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde74 ) at ./nptl/futex-internal.c:57
6 Thread 0x7f40b75fb640 (LWP 1459869) "Dns Queue1" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
7 Thread 0x7f40b6dfa640 (LWP 1459870) "Dns Queue2" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
8 Thread 0x7f40b65f9640 (LWP 1459871) "Dns Queue3" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
9 Thread 0x7f40b5df8640 (LWP 1459872) "Dns Queue4" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
10 Thread 0x7f40b5565640 (LWP 1459873) "Dns Queue5" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
11 Thread 0x7f40b4b7f640 (LWP 1459874) "Dns Queue6" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
12 Thread 0x7f40b42be640 (LWP 1459875) "Dns Queue7" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
13 Thread 0x7f40b39eb640 (LWP 1459876) "Dns Queue8" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
14 Thread 0x7f40b312a640 (LWP 1459877) "Dns Queue9" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
15 Thread 0x7f40b2857640 (LWP 1459878) "Dns Queue10" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
16 Thread 0x7f40b1f84640 (LWP 1459879) "Dns Queue11" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
17 Thread 0x7f40b16b1640 (LWP 1459880) "Dns Queue12" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
18 Thread 0x7f40b0dde640 (LWP 1459881) "Dns Queue13" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
19 Thread 0x7f40b04f9640 (LWP 1459882) "Dns Queue14" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
20 Thread 0x7f40afaff640 (LWP 1459883) "Dns Queue15" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
21 Thread 0x7f40af23e640 (LWP 1459884) "Dns Queue16" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
22 Thread 0x7f40ae97d640 (LWP 1459885) "Dns Queue17" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
23 Thread 0x7f40ae0bc640 (LWP 1459886) "Dns Queue18" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
24 Thread 0x7f40ad7e9640 (LWP 1459887) "Dns Queue19" __futex_abstimed_wait_common64 (private=0, cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x5596c26fde70 ) at ./nptl/futex-internal.c:57
```
In all the times I've debugged a Drogon-based application I don't ever remember seeing threads titled this way (Dns QueueXX). Help?
**To Reproduce**
Steps to reproduce the behavior:
1. Use setup from https://gist.github.com/engineerjames/54f779ae4135ac87b9b990b3f5677d72
2. Execute run.sh
3. You'll see that the process hosting WebAPI_A hangs indefinitely
**Expected behavior**
The request should be interrupted and allow the application to exit as expected.
**Desktop (please complete the following information):**
- OS: Ubuntu 22.04
Contributor guide
Assessment
This issue has not been assessed yet.