agora inbox for [email protected]help / color / mirror / Atom feed
[PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails 399+ messages / 2 participants [nested] [flat]
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-06 15:38 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-06 15:38 UTC (permalink / raw) Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --ds7cemehex757p34 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v1-0003-tests-Try-to-fix-race-condition-in-postmaster-002.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails @ 2025-03-07 14:44 Andres Freund <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw) If wait_connect() failed due to psql exiting, all that we'd see is a "process ended prematurely" error thrown by IPC::Run, without ever seeing psql's error message. Address that by wrapping the pump() call in eval and taking note of stdout & stderr in case of failure. We might want to do that in pump_until() as well, but that seems to require API changes, so let's do the easily achievable bit first. Reviewed-by: Heikki Linnakangas <[email protected]> Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw --- .../perl/PostgreSQL/Test/BackgroundPsql.pm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index c611a61cf4e..1deb410c133 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -154,10 +154,28 @@ sub wait_connect my $banner = "background_psql: ready"; my $banner_match = qr/(^|\n)$banner\r?\n/; $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; - $self->{run}->pump() - until ($self->{stdout} =~ /$banner_match/ - && $self->{stderr} =~ /$banner\r?\n/) - || $self->{timeout}->is_expired; + + # IPC::Run throws in case psql exits while we're pumping. To make it + # easier to diagnose that, catch the error, report stdout/stderr at time + # of death and reraise. + eval { + $self->{run}->pump() + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + }; + if ($@) + { + chomp(my $stdout = $self->{stdout}); + chomp(my $stderr = $self->{stderr}); + chomp(my $err = $@); + diag qq(psql died while connecting: + stdout: $stdout + stderr: $stderr + perl error: $err +); + die "psql died while connecting"; + } note "connect output:\n", explain { -- 2.48.1.76.g4e746b1a31.dirty --q4d36jgrlhdhudrc Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
* [PATCH 2/4] Use double quotes in message @ 2026-05-26 07:17 Kyotaro Horiguchi <[email protected]> 0 siblings, 0 replies; 399+ messages in thread From: Kyotaro Horiguchi @ 2026-05-26 07:17 UTC (permalink / raw) Replace backquotes around a symbol name in a user-facing message with double quotes for consistency with other messages. --- src/interfaces/libpq/fe-protocol3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c index 840e018cd18..4efa8a16ab1 100644 --- a/src/interfaces/libpq/fe-protocol3.c +++ b/src/interfaces/libpq/fe-protocol3.c @@ -1560,7 +1560,7 @@ pqGetNegotiateProtocolVersion3(PGconn *conn) */ if (expect_test_protocol_negotiation && !found_test_protocol_negotiation) { - libpq_append_conn_error(conn, "server did not report the unsupported `_pq_.test_protocol_negotiation` parameter in its protocol negotiation message"); + libpq_append_conn_error(conn, "server did not report the unsupported \"_pq_.test_protocol_negotiation\" parameter in its protocol negotiation message"); goto failure; } -- 2.47.3 ----Next_Part(Thu_May_28_12_16_22_2026_214)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0003-Add-missing-period-to-HINT-message.patch" ^ permalink raw reply [nested|flat] 399+ messages in thread
end of thread, other threads:[~2026-05-26 07:17 UTC | newest] Thread overview: 399+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-06 15:38 [PATCH v1 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]> 2026-05-26 07:17 [PATCH 2/4] Use double quotes in message Kyotaro Horiguchi <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox