Thread: tap tests remove working directories
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
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
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
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
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
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
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
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
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
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
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
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