]> Sergey Matveev's repositories - public-inbox.git/commitdiff
lei: fix output race in client/daemon mode
authorEric Wong <e@80x24.org>
Sun, 3 Jan 2021 11:24:51 +0000 (11:24 +0000)
committerEric Wong <e@80x24.org>
Sun, 3 Jan 2021 18:24:09 +0000 (18:24 +0000)
The daemon needs to flush stdout before disconnecting or killing
clients, otherwise they may reread empty data on redirected
outputs.  We also don't want to unbuffer stdout too early in
case we have lots of small chunks of data to output.

The received ($self->{2}) will always have autoflush, matching normal
STDERR behavior.

lib/PublicInbox/LEI.pm

index 3ad5e01a67fcd52ce6ea44d38d09504a6941c02c..6f21da352a257b4e8cb6a1b97fb8105cd69eebaf 100644 (file)
@@ -236,6 +236,7 @@ my %CONFIG_KEYS = (
 
 sub x_it ($$) { # pronounced "exit"
        my ($self, $code) = @_;
+       $self->{1}->autoflush(1); # make sure client sees stdout before exit
        if (my $sig = ($code & 127)) {
                kill($sig, $self->{pid} // $$);
        } else {
@@ -635,6 +636,7 @@ sub accept_dispatch { # Listener {post_accept} callback
                say $sock "timed out waiting to recv FDs";
                return;
        }
+       $self->{2}->autoflush(1); # keep stdout buffered until x_it|DESTROY
        # $ARGV_STR = join("]\0[", @ARGV);
        # $ENV_STR = join('', map { "$_=$ENV{$_}\0" } keys %ENV);
        # $line = "$$\0\0>$ARGV_STR\0\0>$ENV_STR\0\0";
@@ -773,4 +775,8 @@ sub oneshot {
        }, __PACKAGE__), @ARGV);
 }
 
+# ensures stdout hits the FS before sock disconnects so a client
+# can immediately reread it
+sub DESTROY { $_[0]->{1}->autoflush(1) }
+
 1;