Thread: Using PQsocketPoll() for PIPELINE mode

Using PQsocketPoll() for PIPELINE mode

From
Dominique Devienne
Date:
Hi. I've now used successfully the new PQsocketPoll() API
in the context of waiting for notifications, using beta2 and 3.

But now I'm looking into using it in the context of PIPELINE mode.
Where I suppose both forRead and forWrite are 1, but the return
code only indicates whether the condition is met. The doc says nothing
about OR or AND semantic, when both forRead and forWrite are true.

Perhaps it's deemed obvious from the use of select() or poll()?
Or is one supposed to call it once with forRead=forWrite=1 and
a timeout, then call it again twice with just one forFlag set and
a 0 timeout, to know the "details" about which "side" is ready?

Or hasn't this use case been considered for PQsocketPoll(),
and thus the current return code isn't has precise as it could be?

Thanks for any precisions, --DD



Re: Using PQsocketPoll() for PIPELINE mode

From
Dominique Devienne
Date:
On Wed, Aug 14, 2024 at 2:50 PM Dominique Devienne <ddevienne@gmail.com> wrote:
> Hi. I've now used successfully the new PQsocketPoll() API
> in the context of waiting for notifications, using beta2 and 3.
>
> But now I'm looking into using it in the context of PIPELINE mode.
> Where I suppose both forRead and forWrite are 1, but the return
> code only indicates whether the condition is met. The doc says nothing
> about OR or AND semantic, when both forRead and forWrite are true.
>
> Perhaps it's deemed obvious from the use of select() or poll()?
> Or is one supposed to call it once with forRead=forWrite=1 and
> a timeout, then call it again twice with just one forFlag set and
> a 0 timeout, to know the "details" about which "side" is ready?
>
> Or hasn't this use case been considered for PQsocketPoll(),
> and thus the current return code isn't has precise as it could be?
>
> Thanks for any precisions, --DD

Hi. No answers. Was it wrong timing (vacations) or
is something wrong with my questions? Thanks, --DD



Re: Using PQsocketPoll() for PIPELINE mode

From
Dominique Devienne
Date:
On Tue, Aug 27, 2024 at 12:23 PM Dominique Devienne <ddevienne@gmail.com> wrote:
> On Wed, Aug 14, 2024 at 2:50 PM Dominique Devienne <ddevienne@gmail.com> wrote:
> > Hi. I've now used successfully the new PQsocketPoll() API
> > in the context of waiting for notifications, using beta2 and 3.
> >
> > But now I'm looking into using it in the context of PIPELINE mode.
> > Where I suppose both forRead and forWrite are 1, but the return
> > code only indicates whether the condition is met. The doc says nothing
> > about OR or AND semantic, when both forRead and forWrite are true.
> >
> > Perhaps it's deemed obvious from the use of select() or poll()?
> > Or is one supposed to call it once with forRead=forWrite=1 and
> > a timeout, then call it again twice with just one forFlag set and
> > a 0 timeout, to know the "details" about which "side" is ready?
> >
> > Or hasn't this use case been considered for PQsocketPoll(),
> > and thus the current return code isn't has precise as it could be?
> >
> > Thanks for any precisions, --DD
>
> Hi. No answers. Was it wrong timing (vacations) or
> is something wrong with my questions? Thanks, --DD

Looking at https://doxygen.postgresql.org/libpq__pipeline_8c_source.html,
it does indeed seem like `select()` can inform about ready forRead and forWrite
independently, and thus that the current signature of PQsocketPoll()
is not ideal
to be used in the context of pipeline mode, which would be a pity, for
a new API.

I get that the original thinking about PQsocketPoll() was neither for
notifications,
not for pipeline mode, but shouldn't it be? That same example should ideally be
writable in terms of PQsocketPoll(), using a few syscalls, no?

Once again, this is late, although my original questions are now 2 weeks old.
After all, PQsocketPoll() has not been released yet officially. Thanks, --DD

```
fd_set input_mask;
fd_set output_mask;
int sock = PQsocket(conn); [...]
if (select(sock + 1, &input_mask, &output_mask, NULL, NULL) < 0) { error }
// Process any results, so we keep the server's output buffer free
// flowing and it can continue to process input
if (FD_ISSET(sock, &input_mask)) {
    PQconsumeInput(conn); [...]
}
// Write more rows and/or the end pipeline message, if needed
if (FD_ISSET(sock, &output_mask)) {
    PQflush(conn); [...]
}
```



Re: Using PQsocketPoll() for PIPELINE mode

From
Greg Sabino Mullane
Date:
On Tue, Aug 27, 2024 at 9:20 AM Dominique Devienne <ddevienne@gmail.com> wrote:
Once again, this is late, although my original questions are now 2 weeks old.
After all, PQsocketPoll() has not been released yet officially. Thanks, --DD

As this is so new, you might have better luck on -hackers than here. I've not poked at it enough to give an answer yet.

Cheers,
Greg