Skip site navigation (1) Skip section navigation (2)

Re: FATAL: semctl(1672698088, 12, SETVAL, 0) failed

From: "Qingqing Zhou" <zhouqq(at)cs(dot)toronto(dot)edu>
To: pgsql-bugs(at)postgresql(dot)org
Subject: Re: FATAL: semctl(1672698088, 12, SETVAL, 0) failed
Date: 2006-03-01 02:08:58
Message-ID: du2vtq$eu3$1@news.hub.org (view raw or flat)
Thread:
Lists: pgsql-bugs
"Bruce Momjian" <pgman(at)candle(dot)pha(dot)pa(dot)us> wrote
> > In port/win32.h, we have
> >
> > #undef EAGAIN
> > #undef EINTR
> > #define EINTR WSAEINTR
> > #define EAGAIN WSAEWOULDBLOCK
> >
> > What's the rationale of doing so?
>
> We did this so that our code could refer to EINTR/EAGAIN without
> port-specific tests.
>

AFAICS, by doing so, the EINTR/EAGAIN will be translated into
WSAINTR/WSAEWOULDBLOCK through *all* the backend code. That's seems not
appropriate for the code not involving any socket stuff ... I think we need
a fix here.

> > (2) What's happened here?
> > It may come from PGSemaphoreReset(), and win32 semop() looks like this:
> >
> >   ret = WaitForMultipleObjectsEx(2, wh, FALSE, (sops[0].sem_flg &
> > IPC_NOWAIT) ? 0 : INFINITE, TRUE);
> >   ...
> >   else if (ret == WAIT_OBJECT_0 + 1 || ret == WAIT_IO_COMPLETION)
> >   {
> >    pgwin32_dispatch_queued_signals();
> >    errno = EINTR;
> >   }
> >   else if (ret == WAIT_TIMEOUT)
> >    errno = EAGAIN;
> >
> > So it seems the EINTR is caused by an incoming signal, the EAGAIN is
caused
> > by a TIMEOUT ... any ideas?
>
> I looked at the documentation for the function:
>
>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitformultipleobjectsex.asp
>
> and it isn't clear what return failure values it has.  We certainly
> could loop on WSAEINTR.  Can you test it?
>

Yeah, looking at other code of using semop(), we could plug in a loop in the
win32 semctl():

   /* Quickly lock/unlock the semaphore (if we can) */
+ do
+ {
+    errStatus = semop(semId, &sops, 1);
+ } while (errStatus < 0 && errno == EINTR);

   if (semop(semId, &sops, 1) < 0)
    return -1;

But:
(1) The EINTR problem happens rather rare, so testing it is difficult;
(2)  I would rather not doing the above changes before we understand what's
happened here, especially when we have seen a EAGAIN reported here.

Regards,
Qingqing



In response to

Responses

pgsql-bugs by date

Next:From: Bruce MomjianDate: 2006-03-01 03:08:37
Subject: Re: FATAL: semctl(1672698088, 12, SETVAL, 0) failed
Previous:From: Bruce MomjianDate: 2006-02-28 19:05:02
Subject: Re: FATAL: semctl(1672698088, 12, SETVAL, 0) failed

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group