Thread: tap tests remove working directories

tap tests remove working directories

From
Andrew Dunstan
Date:
One of the things that makes the TAP tests very difficult and annoying 
to debug is their insistence on removing their data directories. I'm not 
sure why they are doing that. We don't do that with pg_regress. Instead 
we have clean targets to remove them if necessary. I suggest that we 
either disable that altogether, and provide cleanup make targets, or at 
least make it optional, say by setting an environment variable, say 
TMP_CLEANUP or some such. There is probably a good case for defaulting 
that to off, but I could live with it being on.

Thoughts?

cheers

andrew



Re: tap tests remove working directories

From
Tom Lane
Date:
Andrew Dunstan <andrew@dunslane.net> writes:
> One of the things that makes the TAP tests very difficult and annoying 
> to debug is their insistence on removing their data directories. I'm not 
> sure why they are doing that. We don't do that with pg_regress. Instead 
> we have clean targets to remove them if necessary. I suggest that we 
> either disable that altogether, and provide cleanup make targets, or at 
> least make it optional, say by setting an environment variable, say 
> TMP_CLEANUP or some such. There is probably a good case for defaulting 
> that to off, but I could live with it being on.

I thought we'd decided awhile ago that best practice would be to
auto-remove temp directories only on success.  Is that a workable
behavior for you, or are you concerned about being able to poke
around even after the test thinks it succeeded?
        regards, tom lane



Re: tap tests remove working directories

From
Andrew Dunstan
Date:
On 08/07/2015 05:11 PM, Tom Lane wrote:
> Andrew Dunstan <andrew@dunslane.net> writes:
>> One of the things that makes the TAP tests very difficult and annoying
>> to debug is their insistence on removing their data directories. I'm not
>> sure why they are doing that. We don't do that with pg_regress. Instead
>> we have clean targets to remove them if necessary. I suggest that we
>> either disable that altogether, and provide cleanup make targets, or at
>> least make it optional, say by setting an environment variable, say
>> TMP_CLEANUP or some such. There is probably a good case for defaulting
>> that to off, but I could live with it being on.
> I thought we'd decided awhile ago that best practice would be to
> auto-remove temp directories only on success.  Is that a workable
> behavior for you, or are you concerned about being able to poke
> around even after the test thinks it succeeded?
>
>             

That certainly isn't what happens, and given the way this is done in 
TestLib.pm, using the CLEANUP parameter of File::Temp's tempdir() 
function, it's not clear how we could do that easily. The deletion 
behaviour is set when you create the directory, not afterwards. What I 
suggested could be done with a couple of lines of code.

I could probably live with your suggestion, especially if I could change 
the behaviour easily. But what we have now is quite frustrating. I have 
to hack the source just to be able to diagnose an error. That's really 
pretty unacceptable.

cheers

andrew



Re: tap tests remove working directories

From
Robert Haas
Date:
On Fri, Aug 7, 2015 at 7:17 PM, Andrew Dunstan <andrew@dunslane.net> wrote:
> That certainly isn't what happens, and given the way this is done in
> TestLib.pm, using the CLEANUP parameter of File::Temp's tempdir() function,
> it's not clear how we could do that easily.

<shot-in-the-dark>

Set cleanup to false and manually remove the directory later in the
code, so that stuff runs only if we haven't died sooner?

</shot-in-the-dark>

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company



Re: tap tests remove working directories

From
Andrew Dunstan
Date:
On 08/08/2015 09:31 AM, Robert Haas wrote:
> On Fri, Aug 7, 2015 at 7:17 PM, Andrew Dunstan <andrew@dunslane.net> wrote:
>> That certainly isn't what happens, and given the way this is done in
>> TestLib.pm, using the CLEANUP parameter of File::Temp's tempdir() function,
>> it's not clear how we could do that easily.
> <shot-in-the-dark>
>
> Set cleanup to false and manually remove the directory later in the
> code, so that stuff runs only if we haven't died sooner?
>
> </shot-in-the-dark>
>


Yeah, maybe. I'm thinking of trying to do it more globally, like in 
src/Makefile.global.in. That way we wouldn't have to add new code to 
every test file.

cheers

andrew





Re: tap tests remove working directories

From
Michael Paquier
Date:
On Sun, Aug 9, 2015 at 1:40 AM, Andrew Dunstan <andrew@dunslane.net> wrote:
>
> On 08/08/2015 09:31 AM, Robert Haas wrote:
>>
>> On Fri, Aug 7, 2015 at 7:17 PM, Andrew Dunstan <andrew@dunslane.net>
>> wrote:
>>>
>>> That certainly isn't what happens, and given the way this is done in
>>> TestLib.pm, using the CLEANUP parameter of File::Temp's tempdir()
>>> function,
>>> it's not clear how we could do that easily.
>>
>> <shot-in-the-dark>
>>
>> Set cleanup to false and manually remove the directory later in the
>> code, so that stuff runs only if we haven't died sooner?
>>
>> </shot-in-the-dark>
>>
> Yeah, maybe. I'm thinking of trying to do it more globally, like in
> src/Makefile.global.in. That way we wouldn't have to add new code to every
> test file.

If we rely on END to clean up the temporary data folder, there is no
need to impact each test file, just the test functions called in
TestLib.pm that could switch a flag to not perform any cleanup at the
end of the run should an unexpected result be found. Now I am as well
curious to see what you have in mind with manipulating
Makefile.global.
-- 
Michael



Re: tap tests remove working directories

From
Andrew Dunstan
Date:

On 08/09/2015 08:41 AM, Michael Paquier wrote:
> On Sun, Aug 9, 2015 at 1:40 AM, Andrew Dunstan <andrew@dunslane.net> wrote:
>> On 08/08/2015 09:31 AM, Robert Haas wrote:
>>> On Fri, Aug 7, 2015 at 7:17 PM, Andrew Dunstan <andrew@dunslane.net>
>>> wrote:
>>>> That certainly isn't what happens, and given the way this is done in
>>>> TestLib.pm, using the CLEANUP parameter of File::Temp's tempdir()
>>>> function,
>>>> it's not clear how we could do that easily.
>>> <shot-in-the-dark>
>>>
>>> Set cleanup to false and manually remove the directory later in the
>>> code, so that stuff runs only if we haven't died sooner?
>>>
>>> </shot-in-the-dark>
>>>
>> Yeah, maybe. I'm thinking of trying to do it more globally, like in
>> src/Makefile.global.in. That way we wouldn't have to add new code to every
>> test file.
> If we rely on END to clean up the temporary data folder, there is no
> need to impact each test file, just the test functions called in
> TestLib.pm that could switch a flag to not perform any cleanup at the
> end of the run should an unexpected result be found. Now I am as well
> curious to see what you have in mind with manipulating
> Makefile.global.


See attached. If you have a better idea please post your patch.

cheers

andrew

Attachment

Re: tap tests remove working directories

From
Michael Paquier
Date:
On Sun, Aug 9, 2015 at 11:19 PM, Andrew Dunstan <andrew@dunslane.net> wrote:
>
>
> On 08/09/2015 08:41 AM, Michael Paquier wrote:
>>
>> On Sun, Aug 9, 2015 at 1:40 AM, Andrew Dunstan <andrew@dunslane.net>
>> wrote:
>>>
>>> On 08/08/2015 09:31 AM, Robert Haas wrote:
>>>>
>>>> On Fri, Aug 7, 2015 at 7:17 PM, Andrew Dunstan <andrew@dunslane.net>
>>>> wrote:
>>>>>
>>>>> That certainly isn't what happens, and given the way this is done in
>>>>> TestLib.pm, using the CLEANUP parameter of File::Temp's tempdir()
>>>>> function,
>>>>> it's not clear how we could do that easily.
>>>>
>>>> <shot-in-the-dark>
>>>>
>>>> Set cleanup to false and manually remove the directory later in the
>>>> code, so that stuff runs only if we haven't died sooner?
>>>>
>>>> </shot-in-the-dark>
>>>>
>>> Yeah, maybe. I'm thinking of trying to do it more globally, like in
>>> src/Makefile.global.in. That way we wouldn't have to add new code to
>>> every
>>> test file.
>>
>> If we rely on END to clean up the temporary data folder, there is no
>> need to impact each test file, just the test functions called in
>> TestLib.pm that could switch a flag to not perform any cleanup at the
>> end of the run should an unexpected result be found. Now I am as well
>> curious to see what you have in mind with manipulating
>> Makefile.global.
>
> See attached. If you have a better idea please post your patch.

Sure. Attached is what I have in mind. Contrary to your version we
keep around temp paths should a run succeed after one that has failed
when running make check multiple times in a row. Perhaps it does not
matter much in practice as log files get removed at each new run but I
think that this allows a finer control in case of failure. Feel free
to have a look.
--
Michael

Attachment

Re: tap tests remove working directories

From
Andrew Dunstan
Date:

On 08/09/2015 08:58 PM, Michael Paquier wrote:
> On Sun, Aug 9, 2015 at 11:19 PM, Andrew Dunstan <andrew@dunslane.net> wrote:
>>
>> On 08/09/2015 08:41 AM, Michael Paquier wrote:
>>> On Sun, Aug 9, 2015 at 1:40 AM, Andrew Dunstan <andrew@dunslane.net>
>>> wrote:
>>>> On 08/08/2015 09:31 AM, Robert Haas wrote:
>>>>> On Fri, Aug 7, 2015 at 7:17 PM, Andrew Dunstan <andrew@dunslane.net>
>>>>> wrote:
>>>>>> That certainly isn't what happens, and given the way this is done in
>>>>>> TestLib.pm, using the CLEANUP parameter of File::Temp's tempdir()
>>>>>> function,
>>>>>> it's not clear how we could do that easily.
>>>>> <shot-in-the-dark>
>>>>>
>>>>> Set cleanup to false and manually remove the directory later in the
>>>>> code, so that stuff runs only if we haven't died sooner?
>>>>>
>>>>> </shot-in-the-dark>
>>>>>
>>>> Yeah, maybe. I'm thinking of trying to do it more globally, like in
>>>> src/Makefile.global.in. That way we wouldn't have to add new code to
>>>> every
>>>> test file.
>>> If we rely on END to clean up the temporary data folder, there is no
>>> need to impact each test file, just the test functions called in
>>> TestLib.pm that could switch a flag to not perform any cleanup at the
>>> end of the run should an unexpected result be found. Now I am as well
>>> curious to see what you have in mind with manipulating
>>> Makefile.global.
>> See attached. If you have a better idea please post your patch.
> Sure. Attached is what I have in mind. Contrary to your version we
> keep around temp paths should a run succeed after one that has failed
> when running make check multiple times in a row. Perhaps it does not
> matter much in practice as log files get removed at each new run but I
> think that this allows a finer control in case of failure. Feel free
> to have a look.


Actually, I don't think this is a very good idea. You could end up with 
a whole series of opaquely named directories from a series of failing 
runs. If you want to keep the directory after a failure, and want to do 
another run, then rename the directory. That's what you have to do with 
the main regression tests, too. My version also has the benefit of 
changing exactly 3 lines in the source :-)

cheers

andrew



Re: tap tests remove working directories

From
Tom Lane
Date:
Andrew Dunstan <andrew@dunslane.net> writes:
> On 08/09/2015 08:58 PM, Michael Paquier wrote:
>> Sure. Attached is what I have in mind. Contrary to your version we
>> keep around temp paths should a run succeed after one that has failed
>> when running make check multiple times in a row. Perhaps it does not
>> matter much in practice as log files get removed at each new run but I
>> think that this allows a finer control in case of failure. Feel free
>> to have a look.

> Actually, I don't think this is a very good idea. You could end up with 
> a whole series of opaquely named directories from a series of failing 
> runs. If you want to keep the directory after a failure, and want to do 
> another run, then rename the directory. That's what you have to do with 
> the main regression tests, too. My version also has the benefit of 
> changing exactly 3 lines in the source :-)

FWIW, I think we should keep the behavior of the TAP tests as close as
possible to the established behavior of the main regression tests.

It's certainly possible that there's room for improvement in that
benchmark behavior.  But let's first converge the test behaviors,
and then have a discussion about whether we want changes, and if
so change all the tests at the same time.
        regards, tom lane



Re: tap tests remove working directories

From
Andrew Dunstan
Date:

On 08/10/2015 09:55 AM, Tom Lane wrote:
> Andrew Dunstan <andrew@dunslane.net> writes:
>> On 08/09/2015 08:58 PM, Michael Paquier wrote:
>>> Sure. Attached is what I have in mind. Contrary to your version we
>>> keep around temp paths should a run succeed after one that has failed
>>> when running make check multiple times in a row. Perhaps it does not
>>> matter much in practice as log files get removed at each new run but I
>>> think that this allows a finer control in case of failure. Feel free
>>> to have a look.
>> Actually, I don't think this is a very good idea. You could end up with
>> a whole series of opaquely named directories from a series of failing
>> runs. If you want to keep the directory after a failure, and want to do
>> another run, then rename the directory. That's what you have to do with
>> the main regression tests, too. My version also has the benefit of
>> changing exactly 3 lines in the source :-)
> FWIW, I think we should keep the behavior of the TAP tests as close as
> possible to the established behavior of the main regression tests.
>
> It's certainly possible that there's room for improvement in that
> benchmark behavior.  But let's first converge the test behaviors,
> and then have a discussion about whether we want changes, and if
> so change all the tests at the same time.


Yeah. To do that we should probably stop using File::Temp to make the 
directory, and just use a hardcoded name given to File::Path::mkpath. If 
the directory exists, we'd just remove it first.

That won't be a very big change - probably just a handful of lines.

cheers

andrew



Re: tap tests remove working directories

From
Andrew Dunstan
Date:

On 08/10/2015 10:32 AM, Andrew Dunstan wrote:
>
>
> On 08/10/2015 09:55 AM, Tom Lane wrote:
>> Andrew Dunstan <andrew@dunslane.net> writes:
>>> On 08/09/2015 08:58 PM, Michael Paquier wrote:
>>>> Sure. Attached is what I have in mind. Contrary to your version we
>>>> keep around temp paths should a run succeed after one that has failed
>>>> when running make check multiple times in a row. Perhaps it does not
>>>> matter much in practice as log files get removed at each new run but I
>>>> think that this allows a finer control in case of failure. Feel free
>>>> to have a look.
>>> Actually, I don't think this is a very good idea. You could end up with
>>> a whole series of opaquely named directories from a series of failing
>>> runs. If you want to keep the directory after a failure, and want to do
>>> another run, then rename the directory. That's what you have to do with
>>> the main regression tests, too. My version also has the benefit of
>>> changing exactly 3 lines in the source :-)
>> FWIW, I think we should keep the behavior of the TAP tests as close as
>> possible to the established behavior of the main regression tests.
>>
>> It's certainly possible that there's room for improvement in that
>> benchmark behavior.  But let's first converge the test behaviors,
>> and then have a discussion about whether we want changes, and if
>> so change all the tests at the same time.
>
>
> Yeah. To do that we should probably stop using File::Temp to make the 
> directory, and just use a hardcoded name given to File::Path::mkpath. 
> If the directory exists, we'd just remove it first.
>
> That won't be a very big change - probably just a handful of lines.
>
>

Unfortunately, it's rather more complicated. These tests are extremely 
profligate with space and time, creating not less than 29 data 
directories in 19 temporary directories, including 14 temp directories 
in scripts alone, and not counting those in pg_rewind which puts two 
more data directories in a place which is different from all the others. 
And of course, in those directories (scripts and pg_ctl) that have 
multiple temp directories, we have no idea which one goes with which set 
of tests.

It's no wonder that these tests take an inordinate amount of time to run 
- on crake, where it takes 23 seconds for "make installcheck" to run, it 
takes 176 seconds for "make -C src/bin installcheck" to run. My bet is 
all those initdb calls account for a substantial amount of that time.

I think this needs a significant bit of reworking.

cheers

andrew