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

Attachment: v10-0001-common-jsonapi-support-FRONTEND-clients.patch.gz
Description: application/gzip

Attachment: v10-0003-backend-add-OAUTHBEARER-SASL-mechanism.patch.gz
Description: application/gzip

Attachment: v10-0002-libpq-add-OAUTHBEARER-SASL-mechanism.patch.gz
Description: application/gzip

Attachment: v10-0004-Add-pytest-suite-for-OAuth.patch.gz
Description: application/gzip

Attachment: v10-0005-squash-Add-pytest-suite-for-OAuth.patch.gz
Description: application/gzip

Attachment: v10-0006-XXX-work-around-psycopg2-build-failures.patch.gz
Description: application/gzip

Reply via email to