Fix: Handle ERROR_PIPE_CONNECTED error from ConnectNamedPipe in syelogd

Fixes #241

Co-authored-by: fishjam <fish.jam@navercorp.com>
This commit is contained in:
fishjam
2022-06-30 08:19:42 +08:00
committed by GitHub
parent 61c652325c
commit a1dd93fddf

View File

@@ -50,6 +50,7 @@ LONGLONG s_llStartTime = 0;
LONGLONG s_llLastTime = 0;
BOOL LogMessageV(BYTE nSeverity, PCHAR pszMsg, ...);
VOID AcceptAndCreatePipeConnection(PCLIENT pClient, HANDLE hCompletionPort);
//////////////////////////////////////////////////////////////////////////////
//
@@ -181,8 +182,14 @@ PCLIENT CreatePipeConnection(HANDLE hCompletionPort)
}
if (!ConnectNamedPipe(hPipe, pClient)) {
if (GetLastError() != ERROR_IO_PENDING &&
GetLastError() != ERROR_PIPE_LISTENING) {
DWORD dwLastErr = GetLastError();
//Handle race between multiple client connections
//example: multi thread or client request at alomst same time.
if (ERROR_PIPE_CONNECTED == dwLastErr)
{
AcceptAndCreatePipeConnection(pClient, hCompletionPort);
} else if ( dwLastErr != ERROR_IO_PENDING &&
dwLastErr != ERROR_PIPE_LISTENING) {
MyErrExit("ConnectNamedPipe");
}
}
@@ -193,6 +200,25 @@ PCLIENT CreatePipeConnection(HANDLE hCompletionPort)
return pClient;
}
VOID AcceptAndCreatePipeConnection(PCLIENT pClient, HANDLE hCompletionPort) {
DWORD nBytes = 0;
InterlockedIncrement(&s_nActiveClients);
pClient->fAwaitingAccept = FALSE;
BOOL b = ReadFile(pClient->hPipe,
&pClient->Message,
sizeof(pClient->Message),
&nBytes,
pClient);
if (!b) {
if (GetLastError() != ERROR_IO_PENDING) {
LogMessageV(SYELOG_SEVERITY_ERROR,
"ReadFile failed %d.", GetLastError());
}
}
CreatePipeConnection(hCompletionPort);
}
BOOL LogMessageV(BYTE nSeverity, PCHAR pszMsg, ...)
{
FILETIME ftOccurance;
@@ -352,22 +378,7 @@ DWORD WINAPI WorkerThread(LPVOID pvVoid)
}
if (pClient->fAwaitingAccept) {
InterlockedIncrement(&s_nActiveClients);
pClient->fAwaitingAccept = FALSE;
b = ReadFile(pClient->hPipe,
&pClient->Message,
sizeof(pClient->Message),
&nBytes,
pClient);
if (!b) {
if (GetLastError() != ERROR_IO_PENDING) {
LogMessageV(SYELOG_SEVERITY_ERROR,
"ReadFile failed %d.", GetLastError());
continue;
}
}
CreatePipeConnection(hCompletionPort);
AcceptAndCreatePipeConnection(pClient, hCompletionPort);
}
else {
if (nBytes < offsetof(SYELOG_MESSAGE, szMessage)) {