Thread: pgsql: Close stdin where it's not needed in TestLib.pm procedures

pgsql: Close stdin where it's not needed in TestLib.pm procedures

From
Andrew Dunstan
Date:
Close stdin where it's not needed in TestLib.pm procedures

Where possible, do this using a pseudoterminal, so that things like
openssl that want to open /dev/tty if stdin isn't a tty won't.
Elsewhere, i.e. Windows, just close by providing an empty string using
the standard IPC::Run pipe mechanism.

Patch by Andrew Dunstan, based on an idea from Craig Ringer.

Reviewed by Mark Dilger.

Discussion: https://postgr.es/m/873ebb57-fc98-340d-949d-691b1810bf66@2ndQuadrant.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/9af34f3c6b02779fac6dbb6cd4c5bb225a019f43

Modified Files
--------------
src/test/perl/TestLib.pm | 37 +++++++++++++++++++++++++++----------
1 file changed, 27 insertions(+), 10 deletions(-)


Re: pgsql: Close stdin where it's not needed in TestLib.pm procedures

From
Michael Paquier
Date:
Hi Andrew,

On Mon, Nov 25, 2019 at 09:01:46PM +0000, Andrew Dunstan wrote:
> Close stdin where it's not needed in TestLib.pm procedures
>
> Where possible, do this using a pseudoterminal, so that things like
> openssl that want to open /dev/tty if stdin isn't a tty won't.
> Elsewhere, i.e. Windows, just close by providing an empty string using
> the standard IPC::Run pipe mechanism.
>
> Patch by Andrew Dunstan, based on an idea from Craig Ringer.
>
> Reviewed by Mark Dilger.
>
> Discussion: https://postgr.es/m/873ebb57-fc98-340d-949d-691b1810bf66@2ndQuadrant.com

This one is causing failures with the TAP tests of initdb on all AIX
animals and prairiedog:
# Running: initdb --help
Can't locate IO/Pty.pm in @INC (@INC contains: ../../../src/test/perl/
. /usr/local/perl5.8.3/lib/5.8.3/darwin-2level
[...]
Unexpected SCALAR(0x1987690) in harness() parameter 7 at
../../../src/test/perl//TestLib.pm line 692
--
Michael

Attachment

Re: pgsql: Close stdin where it's not needed in TestLib.pm procedures

From
Tom Lane
Date:
Michael Paquier <michael@paquier.xyz> writes:
> On Mon, Nov 25, 2019 at 09:01:46PM +0000, Andrew Dunstan wrote:
>> Close stdin where it's not needed in TestLib.pm procedures
>> 
>> Where possible, do this using a pseudoterminal, so that things like
>> openssl that want to open /dev/tty if stdin isn't a tty won't.

> This one is causing failures with the TAP tests of initdb on all AIX
> animals and prairiedog:
> # Running: initdb --help
> Can't locate IO/Pty.pm in @INC (@INC contains: ../../../src/test/perl/
> . /usr/local/perl5.8.3/lib/5.8.3/darwin-2level

Perhaps the "where possible" caveat needs to include a test whether
IO::Pty is installed?  It's evidently not there by default everywhere.

It's possible that we should just move the goalposts and say IO::Pty
is required for TAP testing.  I can foresee that we'll have to do
that if we ever want automated tests of psql's tab completion,
for example.

            regards, tom lane



Re: pgsql: Close stdin where it's not needed in TestLib.pm procedures

From
Michael Paquier
Date:
On Tue, Nov 26, 2019 at 02:13:50AM -0500, Tom Lane wrote:
> Perhaps the "where possible" caveat needs to include a test whether
> IO::Pty is installed?  It's evidently not there by default everywhere.
>
> It's possible that we should just move the goalposts and say IO::Pty
> is required for TAP testing.  I can foresee that we'll have to do
> that if we ever want automated tests of psql's tab completion,
> for example.

Hmm.  I am not sure that we are at that point yet (in which case we'd
need to check after it in configure).  Any other modules we require to
be installed are directly imported to our code, but here we visibly
have a dependency forced by the loaded code.  My point is that it does
not impact platforms that do not need it, so it seems like a waste to
require for everybody something which is actually necessary only for a
portion of users running the TAP tests.
--
Michael

Attachment

Re: pgsql: Close stdin where it's not needed in TestLib.pm procedures

From
Peter Eisentraut
Date:
On 2019-11-26 05:43, Michael Paquier wrote:
> This one is causing failures with the TAP tests of initdb on all AIX
> animals and prairiedog:
> # Running: initdb --help
> Can't locate IO/Pty.pm in @INC (@INC contains: ../../../src/test/perl/
> . /usr/local/perl5.8.3/lib/5.8.3/darwin-2level
> [...]
> Unexpected SCALAR(0x1987690) in harness() parameter 7 at
> ../../../src/test/perl//TestLib.pm line 692

I'm also seeing this problem on macOS in 
src/test/recovery/t/016_min_consistency.pl .

-- 
Peter Eisentraut              http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services



Re: pgsql: Close stdin where it's not needed in TestLib.pm procedures

From
Andrew Dunstan
Date:
On 11/26/19 3:47 AM, Michael Paquier wrote:
> On Tue, Nov 26, 2019 at 02:13:50AM -0500, Tom Lane wrote:
>> Perhaps the "where possible" caveat needs to include a test whether
>> IO::Pty is installed?  It's evidently not there by default everywhere.
>>
>> It's possible that we should just move the goalposts and say IO::Pty
>> is required for TAP testing.  I can foresee that we'll have to do
>> that if we ever want automated tests of psql's tab completion,
>> for example.
> Hmm.  I am not sure that we are at that point yet (in which case we'd
> need to check after it in configure).  Any other modules we require to
> be installed are directly imported to our code, but here we visibly
> have a dependency forced by the loaded code.  My point is that it does
> not impact platforms that do not need it, so it seems like a waste to
> require for everybody something which is actually necessary only for a
> portion of users running the TAP tests.



Yeah, I don't want to go that far at this stage at least.


here's my proposed fix.


I will adjust the code that wants to use it to have a block containing
the tests that need the pty code something like this:


SKIP:
{
  skip 3, "no Pty support" unless $have_io_pty;
  ...
}


cheers


andrew


-- 
Andrew Dunstan                https://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services


Attachment

Re: pgsql: Close stdin where it's not needed in TestLib.pm procedures

From
Tom Lane
Date:
Andrew Dunstan <andrew.dunstan@2ndquadrant.com> writes:
> here's my proposed fix.

Looks sane by eyeball (didn't test it).

            regards, tom lane



Re: pgsql: Close stdin where it's not needed in TestLib.pm procedures

From
Tom Lane
Date:
Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:
> On 2019-11-26 05:43, Michael Paquier wrote:
>> This one is causing failures with the TAP tests of initdb on all AIX
>> animals and prairiedog:
>> # Running: initdb --help
>> Can't locate IO/Pty.pm in @INC (@INC contains: ../../../src/test/perl/
>> . /usr/local/perl5.8.3/lib/5.8.3/darwin-2level
>> [...]
>> Unexpected SCALAR(0x1987690) in harness() parameter 7 at
>> ../../../src/test/perl//TestLib.pm line 692

> I'm also seeing this problem on macOS in 
> src/test/recovery/t/016_min_consistency.pl .

I just noticed that my buildfarm animal longfin has been stuck for
the past 24 hours in t/001_initdb.pl, and I can replicate that
in a manual build.  ktrace says it's in some sort of loop.

Apparently, macOS has got IO::Pty but it doesn't actually work
the way this patch expects.  Therefore, the proposed patch will
leave things still broken for macOS :-(

I tried this:

diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm
index 18b4ce35c2..d67ffc4368 100644
--- a/src/test/perl/TestLib.pm
+++ b/src/test/perl/TestLib.pm
@@ -192,8 +192,7 @@ INIT
    }
    else
    {
-       use charnames ':full';
-       @no_stdin = ('<pty<', \"\N{END OF TRANSMISSION}");
+       @no_stdin = ('<pty<', \"");
    }
 }

and that seems to fix it.  I wonder what's the point of sending
a nonempty string to the pty, exactly?

            regards, tom lane



Re: pgsql: Close stdin where it's not needed in TestLib.pm procedures

From
Andrew Dunstan
Date:
On 11/26/19 3:30 PM, Tom Lane wrote:
> Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:
>> On 2019-11-26 05:43, Michael Paquier wrote:
>>> This one is causing failures with the TAP tests of initdb on all AIX
>>> animals and prairiedog:
>>> # Running: initdb --help
>>> Can't locate IO/Pty.pm in @INC (@INC contains: ../../../src/test/perl/
>>> . /usr/local/perl5.8.3/lib/5.8.3/darwin-2level
>>> [...]
>>> Unexpected SCALAR(0x1987690) in harness() parameter 7 at
>>> ../../../src/test/perl//TestLib.pm line 692
>> I'm also seeing this problem on macOS in 
>> src/test/recovery/t/016_min_consistency.pl .
> I just noticed that my buildfarm animal longfin has been stuck for
> the past 24 hours in t/001_initdb.pl, and I can replicate that
> in a manual build.  ktrace says it's in some sort of loop.
>
> Apparently, macOS has got IO::Pty but it doesn't actually work
> the way this patch expects.  Therefore, the proposed patch will
> leave things still broken for macOS :-(
>
> I tried this:
>
> diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm
> index 18b4ce35c2..d67ffc4368 100644
> --- a/src/test/perl/TestLib.pm
> +++ b/src/test/perl/TestLib.pm
> @@ -192,8 +192,7 @@ INIT
>     }
>     else
>     {
> -       use charnames ':full';
> -       @no_stdin = ('<pty<', \"\N{END OF TRANSMISSION}");
> +       @no_stdin = ('<pty<', \"");
>     }
>  }
>
> and that seems to fix it.  I wonder what's the point of sending
> a nonempty string to the pty, exactly?
>
>             



Oh, I missed seeing this.


The short answer is I didn't question it because it worked for me. I'll
test out your change on Linux with my test case.


cheers


andrew

-- 
Andrew Dunstan                https://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services




Re: pgsql: Close stdin where it's not needed in TestLib.pm procedures

From
Andrew Dunstan
Date:
On 11/26/19 5:08 PM, Andrew Dunstan wrote:
> On 11/26/19 3:30 PM, Tom Lane wrote:
>> Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:
>>> On 2019-11-26 05:43, Michael Paquier wrote:
>>>> This one is causing failures with the TAP tests of initdb on all AIX
>>>> animals and prairiedog:
>>>> # Running: initdb --help
>>>> Can't locate IO/Pty.pm in @INC (@INC contains: ../../../src/test/perl/
>>>> . /usr/local/perl5.8.3/lib/5.8.3/darwin-2level
>>>> [...]
>>>> Unexpected SCALAR(0x1987690) in harness() parameter 7 at
>>>> ../../../src/test/perl//TestLib.pm line 692
>>> I'm also seeing this problem on macOS in 
>>> src/test/recovery/t/016_min_consistency.pl .
>> I just noticed that my buildfarm animal longfin has been stuck for
>> the past 24 hours in t/001_initdb.pl, and I can replicate that
>> in a manual build.  ktrace says it's in some sort of loop.
>>
>> Apparently, macOS has got IO::Pty but it doesn't actually work
>> the way this patch expects.  Therefore, the proposed patch will
>> leave things still broken for macOS :-(
>>
>> I tried this:
>>
>> diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm
>> index 18b4ce35c2..d67ffc4368 100644
>> --- a/src/test/perl/TestLib.pm
>> +++ b/src/test/perl/TestLib.pm
>> @@ -192,8 +192,7 @@ INIT
>>     }
>>     else
>>     {
>> -       use charnames ':full';
>> -       @no_stdin = ('<pty<', \"\N{END OF TRANSMISSION}");
>> +       @no_stdin = ('<pty<', \"");
>>     }
>>  }
>>
>> and that seems to fix it.  I wonder what's the point of sending
>> a nonempty string to the pty, exactly?
>>
>>             
>
>
> Oh, I missed seeing this.
>
>
> The short answer is I didn't question it because it worked for me. I'll
> test out your change on Linux with my test case.
>
>

This causes some of the new tests I want to run to hang on Linux,
presumably waiting for the pty to close :-(


So I'm a bit stuck. Probably the best thing to do for now is revert the
patch and mark the tests that need it in the libpq-sslpassword patch as
TODO (with todo_skip). If somebody whose perl-fu is greater than mine
can disentangle this mess that would be nice :-)


Thoughts?


cheers


andrew


-- 
Andrew Dunstan                https://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services




Re: pgsql: Close stdin where it's not needed in TestLib.pm procedures

From
Michael Paquier
Date:
On Tue, Nov 26, 2019 at 09:36:50PM -0500, Andrew Dunstan wrote:
> So I'm a bit stuck. Probably the best thing to do for now is revert the
> patch and mark the tests that need it in the libpq-sslpassword patch as
> TODO (with todo_skip). If somebody whose perl-fu is greater than mine
> can disentangle this mess that would be nice :-)

A revert sounds fine to me at this point.  Some buildfarm animals are
not reporting back :(
--
Michael

Attachment