On Wed, Dec 14, 2022 at 10:40:47AM +0100, Claudio Jeker wrote:
> rpki-client IO buffers start with a small header (the size of the full
> message) followed by the payload. io_buf_read() currently does this in
> two steps. Because of this simple messages require two calls through the
> event loop and poll(2) for one message.
> 
> By retrying the read after parsing the header this double loop can be
> skipped if the full message was present in the socketbuffer.

Nice. I see about the same improvement as you in my testing.

ok

> 
> The result is a minor reduction in processing time.
> Before:
> Processing time 192 seconds (175 seconds user, 30 seconds system)
> After:
> Processing time 182 seconds (165 seconds user, 28 seconds system)
> 
> -- 
> :wq Claudio
> 
> Index: io.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/io.c,v
> retrieving revision 1.21
> diff -u -p -r1.21 io.c
> --- io.c      29 Nov 2022 20:26:22 -0000      1.21
> +++ io.c      11 Dec 2022 10:33:04 -0000
> @@ -189,10 +189,13 @@ io_buf_read(int fd, struct ibuf **ib)
>               *ib = b;
>       }
>  
> + again:
>       /* read some data */
>       while ((n = read(fd, b->buf + b->wpos, b->size - b->wpos)) == -1) {
>               if (errno == EINTR)
>                       continue;
> +             if (errno == EAGAIN)
> +                     return NULL;
>               err(1, "read");
>       }
>  
> @@ -209,7 +212,7 @@ io_buf_read(int fd, struct ibuf **ib)
>                               errx(1, "bad internal framing, bad size");
>                       if (ibuf_realloc(b, sz) == -1)
>                               err(1, "ibuf_realloc");
> -                     return NULL;
> +                     goto again;
>               }
>  
>               /* skip over initial size header */
> 

Reply via email to