apache/hadoop · error
threadJoin: WaitForSingleObject failed with error %d
Error message
threadJoin: WaitForSingleObject failed with error %d
What it means
Windows threadJoin: WaitForSingleObject on the thread HANDLE returned WAIT_FAILED and GetLastError gives the reason — most commonly ERROR_INVALID_HANDLE (6): the handle was closed elsewhere, double-joined, or never valid. Note this wrapper does not close the handle on success either, so ownership bugs surface exactly here.
Source
Thrown at hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfs/os/windows/thread.c:57
HANDLE h;
h = CreateThread(NULL, 0, runThread, t, 0, NULL);
if (h) {
t->id = h;
} else {
ret = GetLastError();
fprintf(stderr, "threadCreate: CreateThread failed with error %d\n", ret);
}
return ret;
}
int threadJoin(const thread *t) {
DWORD ret = WaitForSingleObject(t->id, INFINITE);
switch (ret) {
case WAIT_OBJECT_0:
break;
case WAIT_FAILED:
ret = GetLastError();
fprintf(stderr, "threadJoin: WaitForSingleObject failed with error %d\n",
ret);
break;
default:
fprintf(stderr, "threadJoin: WaitForSingleObject unexpected error %d\n",
ret);
break;
}
return ret;
}
View on GitHub (pinned to 2add963021)
Solutions
- For code 6, audit every CloseHandle call and every join path for double-close/double-join
- Assign exactly one owner per thread handle: it joins, then closes
- Zero-initialize thread structs and mark them invalid after join
Defensive patterns
Strategy: validation
Validate before calling
/* Track handle validity so joins never see a stale handle */
typedef struct { HANDLE h; int valid; } thr_slot;
/* set valid=0 immediately after WaitForSingleObject succeeds or the handle is closed */ Try / catch
if (threadJoin(&t) != 0) {
/* WAIT_FAILED code printed; do not close or join again blindly */
log_error("join failed");
} Prevention
- One owner per thread handle: join then close, exactly once
- Never CloseHandle before the matching join
- Zero thread structs and mark them invalid after use
When it happens
Trigger: Joining a thread whose HANDLE was already closed by other cleanup code; double join on the same thread struct; passing an uninitialized thread struct.
Common situations: Refactors that add CloseHandle in a cleanup path; racing shutdown sequences closing handles before joins.
Related errors
- threadJoin: WaitForSingleObject unexpected error %d
- threadCreate: CreateThread failed with error %d
- UNKNOWN
- threadJoin: pthread_join failed with error %d
- detachCurrentThreadFromJvm: GetJavaVM failed with error %d
AI-assisted analysis of apache/hadoop@2add963021 (2026-08-22).
Data as JSON: /api/errors/6295cf20321887b5.
Report an issue: GitHub.