Re: [CYGWIN] ipc-daemon - Mailing list pgsql-hackers

From Tom Lane
Subject Re: [CYGWIN] ipc-daemon
Date
Msg-id 29845.1036438981@sss.pgh.pa.us
Whole thread Raw
In response to Re: [CYGWIN] ipc-daemon  (Peter Eisentraut <peter_e@gmx.net>)
Responses Re: [CYGWIN] ipc-daemon
Re: [CYGWIN] ipc-daemon
List pgsql-hackers
Peter Eisentraut <peter_e@gmx.net> writes:
> Jason Tishler writes:
>> 1. If ipc-daemon is not running, then cygipc's shmget() will return
>> EACCES.
>> 2. This causes PostgreSQL's InternalIpcMemoryCreate() to return
>> NULL.
>> 3. This causes PostgreSQL's PGSharedMemoryCreate() to spin looking
>> for accessible shared memory which it will never find.

> To me, this is a bug in PostgreSQL.

I disagree: just because cygipc returns error codes chosen at random
doesn't mean that we should neglect the clear meaning of an error code.
If a normal Unix system were to return EACCES here, the clear
implication would be that there is an existing segment that we do not
have permission to access.  I don't see how "cygipc isn't running"
can reasonably be translated into "permission denied".

>> After reading the shmget() man page, I choose to return ENOSPC.  Is
>> there a better choice?  Such as ENOMEM?

> My first thought was ENOSYS (system call not implemented -- what BSD
> kernels tend to return if you didn't compile them with SysV IPC support),
> but that isn't a clearly superior choice either.

If you can detect that cygipc is not running, then ENOSYS seems the
best choice for reporting that.  (ENOSPC would be misleading too.)

If it's impractical to fix cygipc then I'd grudgingly go along with

        if (errno == EEXIST
#ifndef __CYWGIN__                   /* cygipc is broken */
            || errno == EACCES
#endif
#ifdef EIDRM
            || errno == EIDRM
#endif
            )
            return NULL;


            regards, tom lane

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Is my Internet connection slow
Next
From: Alessio Bragadini
Date:
Subject: Re: Request for supported platforms