[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#6300) Add kqueue support to slapd



On Nov 22, 2009, at 6:43 PM, Howard Chu wrote:

> bduncan@apple.com wrote:
>> On Sep 22, 2009, at 1:02 PM, Quanah Gibson-Mount wrote:
>>=20
>>> --On Tuesday, September 22, 2009 7:23 PM +0000 bduncan@apple.com
>>> wrote:
>>>=20
>>>> Subject should have been: "PATCH - Added kqueue support to slapd" =
to
>>>> make clear this ITS tracks a patch that has been submitted.
>>>=20
>>> What OS(es) has this kqueue support been tested with?  For example,
>>> the last time I looked at kqueue on OSX 10.5, it was very marginal,
>>> and missing most of the important pieces, which meant it wouldn't
>>> work for OpenLDAP or Postfix, etc.
>>=20
>> It was tested on OS X 10.6.  Should work on all BSDs; nothing OSX-
>> specific about the kqueue usage in the patch.  As far as kqueue
>> support in OS X 10.5, from what I see, most everything is there.
>> Certainly all of the kqueue features in this patch are supported in =
OS
>> X 10.5.
>=20
> To expand on this: there are a lot of comments around the web that =
kqueue was fairly broken at least up to 10.5. E.g. this:
>=20
> http://lists.schmorp.de/pipermail/libev/2008q4/000523.html

Perhaps I missed something in that thread, but the only specific =
complaint was regarding kqueue and stdin.  And it's true that OS X's =
kqueue didn't support EVFILT_{READ|WRITE} on *devices* (stdin, tty's, =
/dev/* ) until 10.6.  I don't believe OpenLDAP actually needs that =
feature, though.

>=20
> Since we also use a pipe for the wake_sds[] in our event loop, if =
kqueue only supports sockets, then it cannot be used reliably in slapd.

The OS X kqueue has *always* supported EVFILT_{READ|WRITE} on sockets, =
pipes, fifos, files.  Same for kqueue in the BSDs.  (FWIW, I believe the =
BSDs have always supported devices in kqueue.)

I think everything OpenLDAP needs from kqueue has been, and is, =
supported by OS X and the BSDs.  If there is a specific kqueue filter or =
fd type that OpenLDAP needs and isn't supported, please let me know.

Although I don't think it's necessary, you could add a test to the =
configure script to ensure kqueue supports the types of fd's OpenLDAP =
needs by doing something like this:

    int fd; /* or int fds[2]; */
    /* do something to create an fd here:  open(2), pipe(2), socket(2), =
etc. */
    struct kevent ev;
    EV_SET(&ev, fd, EVFILT_READ, EV_ADD, 0, 0, 0);
    int kq =3D kqueue();
    if (kq < 0) {
        ac_have_kqueue =3D false;
    } else {
        struct timespec to =3D {0,1};  /* anything so that kevent will =
return */
        int ret =3D kevent(kq, &ev, 1, &ev, 1, &to);
        close(kq);
        ac_have_kqueue =3D (ret >=3D 0);
    }

If the fd isn't supported 'ret' should be -1 and errno should be =
ENOTSUP.

-- Bryan Duncan