On Thu, Aug 24, 2017 at 12:44:27PM +0000, Rivo Nurges wrote:
> This will fix my problem and regress still passes.

Yes this also works for me.

I think the variable name "dst" is not good.  Normally it refers
to someting on the cre->dst side.  As the buffer is on our side, I
think EVBUFFER_LENGTH(EVBUFFER_OUTPUT(bev)) is better.

I was also wondering whether it is correct to skip the
bufferevent_enable(cre->dst->bev, EV_READ) further down.  Would
your current diff create pumped dataflow behavior as the output
buffer must be completely empty before new data is read?

The relay_splice() checks for the buffer length itself and disables
reading if the buffers are not empty.  This does not work due to
the bufferevent_enable(cre->dst->bev, EV_READ) which was added
later.

So I think the logic should look like this.  Does this work
for you?

bluhm

Index: usr.sbin/relayd/relay.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/relayd/relay.c,v
retrieving revision 1.225
diff -u -p -r1.225 relay.c
--- usr.sbin/relayd/relay.c     9 Aug 2017 21:29:17 -0000       1.225
+++ usr.sbin/relayd/relay.c     24 Aug 2017 14:02:38 -0000
@@ -791,12 +791,12 @@ relay_write(struct bufferevent *bev, voi
 
        getmonotime(&con->se_tv_last);
 
-       if (con->se_done)
+       if (con->se_done && EVBUFFER_LENGTH(EVBUFFER_OUTPUT(bev)) == 0)
                goto done;
-       if (relay_splice(cre->dst) == -1)
-               goto fail;
        if (cre->dst->bev)
                bufferevent_enable(cre->dst->bev, EV_READ);
+       if (relay_splice(cre->dst) == -1)
+               goto fail;
 
        return;
  done:

Reply via email to