On Tue, Jul 18, 2023 at 4:04 PM Thomas Munro <thomas.mu...@gmail.com> wrote: > On Tue, Jul 18, 2023 at 11:55 AM Jacob Champion <jchamp...@timescale.com> > wrote: > +1 for EV_RECEIPT ("just tell me about errors, don't drain any > events").
Sounds good. > While comparing the cousin OSs' man pages just now, I noticed that > it's not only macOS that lacks NOTE_MSECONDS, it's also OpenBSD and > NetBSD < 10. Maybe just delete that cruft ^^^ and use literal 0 in > fflags directly. So I don't lose track of it, here's a v10 with those two changes. Thanks! --Jacob
1: 9c6a340119 = 1: 0278c7ba90 common/jsonapi: support FRONTEND clients 2: 8072d0416e ! 2: bb3ce4b6a9 libpq: add OAUTHBEARER SASL mechanism @@ src/interfaces/libpq/fe-auth-oauth-curl.c (new) +#include "libpq-int.h" +#include "mb/pg_wchar.h" + -+#ifdef HAVE_SYS_EVENT_H -+/* macOS doesn't define the time unit macros, but uses milliseconds by default. */ -+#ifndef NOTE_MSECONDS -+#define NOTE_MSECONDS 0 -+#endif -+#endif -+ +/* + * Parsed JSON Representations + * @@ src/interfaces/libpq/fe-auth-oauth-curl.c (new) + switch (what) + { + case CURL_POLL_IN: -+ EV_SET(&ev[nev], socket, EVFILT_READ, EV_ADD, 0, 0, 0); ++ EV_SET(&ev[nev], socket, EVFILT_READ, EV_ADD | EV_RECEIPT, 0, 0, 0); + nev++; + break; + + case CURL_POLL_OUT: -+ EV_SET(&ev[nev], socket, EVFILT_WRITE, EV_ADD, 0, 0, 0); ++ EV_SET(&ev[nev], socket, EVFILT_WRITE, EV_ADD | EV_RECEIPT, 0, 0, 0); + nev++; + break; + + case CURL_POLL_INOUT: -+ EV_SET(&ev[nev], socket, EVFILT_READ, EV_ADD, 0, 0, 0); ++ EV_SET(&ev[nev], socket, EVFILT_READ, EV_ADD | EV_RECEIPT, 0, 0, 0); + nev++; -+ EV_SET(&ev[nev], socket, EVFILT_WRITE, EV_ADD, 0, 0, 0); ++ EV_SET(&ev[nev], socket, EVFILT_WRITE, EV_ADD | EV_RECEIPT, 0, 0, 0); + nev++; + break; + @@ src/interfaces/libpq/fe-auth-oauth-curl.c (new) + * both, so we try to remove both. This means we need to tolerate + * ENOENT below. + */ -+ EV_SET(&ev[nev], socket, EVFILT_READ, EV_DELETE, 0, 0, 0); ++ EV_SET(&ev[nev], socket, EVFILT_READ, EV_DELETE | EV_RECEIPT, 0, 0, 0); + nev++; -+ EV_SET(&ev[nev], socket, EVFILT_WRITE, EV_DELETE, 0, 0, 0); ++ EV_SET(&ev[nev], socket, EVFILT_WRITE, EV_DELETE | EV_RECEIPT, 0, 0, 0); + nev++; + break; + @@ src/interfaces/libpq/fe-auth-oauth-curl.c (new) + */ + for (int i = 0; i < res; ++i) + { -+ if (ev_out[i].flags & EV_ERROR && ev_out[i].data != ENOENT) ++ /* ++ * EV_RECEIPT should guarantee one EV_ERROR result for every change, ++ * whether successful or not. Failed entries contain a non-zero errno in ++ * the `data` field. ++ */ ++ Assert(ev_out[i].flags & EV_ERROR); ++ ++ errno = ev_out[i].data; ++ if (errno && errno != ENOENT) + { -+ errno = ev_out[i].data; + switch (what) + { + case CURL_POLL_REMOVE: @@ src/interfaces/libpq/fe-auth-oauth-curl.c (new) + struct kevent ev; + + EV_SET(&ev, 1, EVFILT_TIMER, timeout < 0 ? EV_DELETE : EV_ADD, -+ NOTE_MSECONDS, timeout, 0); ++ 0, timeout, 0); + if (kevent(actx->mux, &ev, 1, NULL, 0, NULL) < 0 && errno != ENOENT) + { + actx_error(actx, "setting kqueue timer to %ld: %m", timeout); @@ src/interfaces/libpq/fe-auth-oauth-curl.c (new) +#endif +#ifdef HAVE_SYS_EVENT_H + // XXX: I guess this wants to be hidden in a routine -+ EV_SET(&ev, 1, EVFILT_TIMER, EV_ADD, NOTE_MSECONDS, ++ EV_SET(&ev, 1, EVFILT_TIMER, EV_ADD, 0, + actx->authz.interval * 1000, 0); + if (kevent(actx->mux, &ev, 1, NULL, 0, NULL) < 0) + { 3: 07be9375aa = 3: 20b7522228 backend: add OAUTHBEARER SASL mechanism 4: 71cedc6ff5 = 4: f3cec068f9 Add pytest suite for OAuth 5: 9b02e14829 = 5: da1933ac1d squash! Add pytest suite for OAuth 6: 7d179f7e53 = 6: 8f36b5c124 XXX work around psycopg2 build failures
v10-0001-common-jsonapi-support-FRONTEND-clients.patch.gz
Description: application/gzip
v10-0003-backend-add-OAUTHBEARER-SASL-mechanism.patch.gz
Description: application/gzip
v10-0002-libpq-add-OAUTHBEARER-SASL-mechanism.patch.gz
Description: application/gzip
v10-0004-Add-pytest-suite-for-OAuth.patch.gz
Description: application/gzip
v10-0005-squash-Add-pytest-suite-for-OAuth.patch.gz
Description: application/gzip
v10-0006-XXX-work-around-psycopg2-build-failures.patch.gz
Description: application/gzip