From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id C69941F4B9 for ; Mon, 24 Jun 2019 02:56:50 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 33/57] nntp: simplify re-arming/requeue logic Date: Mon, 24 Jun 2019 02:52:34 +0000 Message-Id: <20190624025258.25592-34-e@80x24.org> In-Reply-To: <20190624025258.25592-1-e@80x24.org> References: <20190624025258.25592-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: We can be smarter about requeuing clients to run and avoid excessive epoll_ctl calls since we can trust event_step to do the right thing depending on the state of the client. --- lib/PublicInbox/NNTP.pm | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 42fbb255..468a22f5 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -58,6 +58,11 @@ sub next_tick () { } } +sub requeue ($) { + push @$nextq, $_[0]; + $nextt ||= PublicInbox::EvCleanup::asap(*next_tick); +} + sub update_idle_time ($) { my ($self) = @_; my $sock = $self->{sock} or return; @@ -633,7 +638,7 @@ sub long_response ($$) { } if ($self->{sock}) { update_idle_time($self); - check_read($self); + requeue($self); } else { out($self, " deferred[$fd] aborted - %0.6f", now() - $t0); @@ -642,14 +647,12 @@ sub long_response ($$) { # no recursion, schedule another call ASAP # but only after all pending writes are done update_idle_time($self); - - push @$nextq, $self; - $nextt ||= PublicInbox::EvCleanup::asap(*next_tick); + requeue($self); } else { # all done! delete $self->{long_res}; - check_read($self); res($self, '.'); out($self, " deferred[$fd] done - %0.6f", now() - $t0); + requeue($self); } }; $self->{long_res}->(); # kick off! @@ -930,6 +933,7 @@ sub out ($$;@) { printf { $self->{nntpd}->{out} } $fmt."\n", @args; } +# callback used by PublicInbox::DS for any (e)poll (in/out/hup/err) sub event_step { my ($self) = @_; @@ -965,24 +969,7 @@ sub event_step { # maybe there's more pipelined data, or we'll have # to register it for socket-readiness notifications - check_read($self) unless ($self->{long_res} || $self->{wbuf}); -} - -sub check_read { - my ($self) = @_; - if (index($self->{rbuf}, "\n") >= 0) { - # Force another read if there is a pipelined request. - # We don't know if the socket has anything for us to read, - # and we must double-check again by the time the timer fires - # in case we really did dispatch a read event and started - # another long response. - push @$nextq, $self; - $nextt ||= PublicInbox::EvCleanup::asap(*next_tick); - } else { - # no pipelined requests available, let the kernel know - # to wake us up if there's more - $self->watch_in1; # PublicInbox::DS::watch_in1 - } + requeue($self) unless ($self->{long_res} || $self->{wbuf}); } sub not_idle_long ($$) { -- EW