Обсуждение: psql & regress tests
Okay, here is my semiofficial take on the situation:
* Use the psql from the 6.5.* distro to do regression tests until further
notice.
* Although the output format in the current psql is not under intensive
development anymore, I am not sure if I can guarantee a "freeze" soon.
Once in a while I find some sort of flaw in really strange query results;
the aim of the output is to be visually pleasing, not to provide an exact
match so something. Having said that, I do not expect any major changes to
take place anymore though.
* The other problem is *what* is actually printed, as opposed to the
peculiarities of the table format. This is still somewhat confusing even
to me and I am still fixing things so they make sense at the end.
Example:
***OLD
QUERY: CREATE TABLE BOOLTBL1 (f1 bool);
QUERY: INSERT INTO BOOLTBL1 (f1) VALUES ('t'::bool);
QUERY: INSERT INTO BOOLTBL1 (f1) VALUES ('True'::bool);
QUERY: INSERT INTO BOOLTBL1 (f1) VALUES ('true'::bool);
QUERY: SELECT '' AS t_3, BOOLTBL1.*;
t_3|f1
---+-- |t |t |t
(3 rows)
***CURRENT
CREATE TABLE BOOLTBL1 (f1 bool);
INSERT INTO BOOLTBL1 (f1) VALUES ('t'::bool);
INSERT INTO BOOLTBL1 (f1) VALUES ('True'::bool);
INSERT INTO BOOLTBL1 (f1) VALUES ('true'::bool);
-- BOOLTBL1 should be full of true's at this point
SELECT '' AS t_3, BOOLTBL1.*;t_3 | f1
-----+---- | t | t | t
(3 rows)
(In fact, it's so current, it's not even in CVS yet, thanks to some
problems pointed out by Jan.)
Yes, there actually is a reasoning behind all of this, I'm just not sure
right now what it was ;). If someone is interested, I can bore you with
the details.
* Since no one has picked up on my idea to run the tests directly on the
backend, I will keep reiterating this idea until someone shuts me up
:*) The idea would be to have a target "check" in the top level makefile
like this (conceptually):
check: allmkdir ./regressinitdb -l . -d ./regressfor i in test1 test2 test3 ...; do postgres -D ./regress -E
template1\ < $(srcdir)/test/regress/sql/$i.sql \ >& output-$i.outdonefor i in test1 test2 test3 ...; do
cmpoutput-$i.out expected-$i.out if [ $? == 1]; then echo "Test $i failed." else echo "Test $i
passed." rm -f output-$i.out fidonerm -rf ./regress
Then you can do
./configure
make
make check
make install
Or am I missing something here? Of course this change would require some
work, but I'm just getting at the concept here.
Finally, I'd like to apologize for the extra trouble some must have had. I
can only offer to cooperate on anything that needs to be done.
-Peter
--
Peter Eisentraut Sernanders väg 10:115
peter_e@gmx.net 75262 Uppsala
http://yi.org/peter-e/ Sweden
> * Since no one has picked up on my idea to run the tests directly on the > backend, I will keep reiterating this idea until someone shuts me up > :*) The idea would be to have a target "check" in the top level makefile > like this (conceptually): Running the backend standalone does not use locking with other backends, so it is dangerous. -- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
On Thu, Nov 18, 1999 at 05:41:36PM -0500, Bruce Momjian wrote: > > * Since no one has picked up on my idea to run the tests directly on the > > backend, I will keep reiterating this idea until someone shuts me up > > :*) The idea would be to have a target "check" in the top level makefile > > like this (conceptually): > > Running the backend standalone does not use locking with other backends, > so it is dangerous. Bruce, how dos this apply to Peter's suggestion? We're talking about _regression_ tests. Things to do after changing the code. Do you often recompile, and run regression tests against a db with a (now out of date) postmaster running against it? Do other developers? I'd have thought a complete shutdown/restart is part of the cycle anyway. has to be if an initdb is in there of course. Checking to make sure a postmaster isn't running could be added to Peter's script, just to be sure. Ross -- Ross J. Reedstrom, Ph.D., <reedstrm@rice.edu> NSBRI Research Scientist/Programmer Computer and Information Technology Institute Rice University, 6100 S. Main St., Houston, TX 77005
> On Thu, Nov 18, 1999 at 05:41:36PM -0500, Bruce Momjian wrote: > > > * Since no one has picked up on my idea to run the tests directly on the > > > backend, I will keep reiterating this idea until someone shuts me up > > > :*) The idea would be to have a target "check" in the top level makefile > > > like this (conceptually): > > > > Running the backend standalone does not use locking with other backends, > > so it is dangerous. > > Bruce, how dos this apply to Peter's suggestion? We're talking about > _regression_ tests. Things to do after changing the code. Do you often > recompile, and run regression tests against a db with a (now out of date) > postmaster running against it? Do other developers? I'd have thought a > complete shutdown/restart is part of the cycle anyway. has to be if an > initdb is in there of course. Checking to make sure a postmaster isn't > running could be added to Peter's script, just to be sure. Regression tests are often run by end-users as part of the install. I can imagine someone seeing a problem and running the regression tests while having running backends to see if everything is still working. -- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
>
> On Thu, Nov 18, 1999 at 05:41:36PM -0500, Bruce Momjian wrote:
> > > * Since no one has picked up on my idea to run the tests directly on the
> > > backend, I will keep reiterating this idea until someone shuts me up
> > > :*) The idea would be to have a target "check" in the top level makefile
> > > like this (conceptually):
> >
> > Running the backend standalone does not use locking with other backends,
> > so it is dangerous.
>
> Bruce, how dos this apply to Peter's suggestion? We're talking about
> _regression_ tests. Things to do after changing the code. Do you often
> recompile, and run regression tests against a db with a (now out of date)
> postmaster running against it? Do other developers? I'd have thought a
> complete shutdown/restart is part of the cycle anyway. has to be if an
> initdb is in there of course. Checking to make sure a postmaster isn't
> running could be added to Peter's script, just to be sure.
I'm actually doing some tests if the 'make check' would be
possible. I.e. doing a complete install with POSTGRESDIR
below the regress dir, running initdb with the libdir and
datadir pointing into there too, then starting new postmaster
on a different port in background etc., etc., etc..
That would make it possible to do a complete check without
doing a regular install at all.
Will give some results soon.
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#========================================= wieck@debis.com (Jan Wieck) #
Bruce Momjian <pgman@candle.pha.pa.us> writes:
>> * Since no one has picked up on my idea to run the tests directly on the
>> backend, I will keep reiterating this idea until someone shuts me up
> Running the backend standalone does not use locking with other backends,
> so it is dangerous.
It wouldn't be particularly "dangerous" if we assume that no one else is
accessing the regression database. What it *would* be is less useful at
catching problems. Standalone mode wouldn't test the cross-backend
interlocking code at all.
Admittedly, running a bunch of tests serially isn't a strong stress test
of cross-backend behavior, but it's not as content-free a check as you
might think. On my machine, at least, the old backend is still around
doing shutdown for the first half-second or so while the next one is
running.
What I'd really like to see is some deliberate parallelism in some of
the regress tests...
regards, tom lane
> Bruce Momjian <pgman@candle.pha.pa.us> writes: > >> * Since no one has picked up on my idea to run the tests directly on the > >> backend, I will keep reiterating this idea until someone shuts me up > > > Running the backend standalone does not use locking with other backends, > > so it is dangerous. > > It wouldn't be particularly "dangerous" if we assume that no one else is > accessing the regression database. What it *would* be is less useful at > catching problems. Standalone mode wouldn't test the cross-backend > interlocking code at all. Any modifications to shared pg_ tables would be a problem. Also, pg_log and pg_variable locking is not happening in there either, is it? -- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
Tom Lane wrote:
> Admittedly, running a bunch of tests serially isn't a strong stress test
> of cross-backend behavior, but it's not as content-free a check as you
> might think. On my machine, at least, the old backend is still around
> doing shutdown for the first half-second or so while the next one is
> running.
>
> What I'd really like to see is some deliberate parallelism in some of
> the regress tests...
It's amusing how often we two have the same wishes or ideas.
The run_check.sh script, I'm actually hacking on, would be a
replacement for the regress.sh, started off from the 'make
check'. And from the first try I added syntax to the
sql/tests file to run either groups of tests parallel
intermixed with single tests sequentially.
The new syntax will look like this:
parallel group1
test boolean
test char
test name
endparallel
test varchar
test text
test strings
parallel group2
test int2
test int4
test int8
endparallel
.
.
.
The above will run boolean, char and name parallel. After all
three terminated, it will check their output and continue to
run varchar, text and strings sequentially, followed by the
next parallel group.
To test real concurrency we might need to split up some or
create new tests, where the same tables are accessed
concurrently. But that wouldn't be hard to do I think.
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#========================================= wieck@debis.com (Jan Wieck) #
Bruce Momjian <pgman@candle.pha.pa.us> writes:
>> It wouldn't be particularly "dangerous" if we assume that no one else is
>> accessing the regression database. What it *would* be is less useful at
>> catching problems. Standalone mode wouldn't test the cross-backend
>> interlocking code at all.
> Any modifications to shared pg_ tables would be a problem. Also, pg_log
> and pg_variable locking is not happening in there either, is it?
Good point --- it wouldn't be just that database, but the whole
installation (data directory) that would have to be unused. You really
wouldn't dare even have a postmaster running, at least not in the same
data directory. But that could be made safe by using a nonstandard
location for the data directory for regression.
However, this is all beside the main point: we want the regress tests
to run in an environment as close as possible to the way Postgres is
normally used. The more we hack up a special regress-test environment,
the less the tests reflect reality.
Aside from the cross-backend synchronization issue, I forgot to point
out a really obvious benefit: doing it the current way allows the regress
tests to help check the backend's frontend communication code, and
libpq, and psql itself. We'd need some other way of testing all that
code if we switched to a standalone-backend regression test set.
What I *would* like to see is more support for running regress tests on
a not-yet-installed build, so people can test a fresh build before they
blow away their working installation. This requires doing an initdb
into a temporary directory, starting a postmaster therein (using a
nonstandard port number), and running the tests there. This is doable
by hand, of course, but it's tedious and error-prone even for an expert;
I think it's out of the question for a novice installer. We ought to
offer a canned script to do it that way.
regards, tom lane
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
>
> > Any modifications to shared pg_ tables would be a problem. Also, pg_log
> > and pg_variable locking is not happening in there either, is it?
>
> Good point --- it wouldn't be just that database, but the whole
> installation (data directory) that would have to be unused. You really
> wouldn't dare even have a postmaster running, at least not in the same
> data directory. But that could be made safe by using a nonstandard
> location for the data directory for regression.
>
> However, this is all beside the main point: we want the regress tests
> to run in an environment as close as possible to the way Postgres is
> normally used. The more we hack up a special regress-test environment,
> the less the tests reflect reality.
My new script actually does a
make POSTGRESDIR=somewhere_else install
PATH="somewhere_else/bin:$PATH"
Then it initializes a database below there and starts a
postmaster with the resulting data directory, listening on
port 65432.
So I think it's very close to a real live setup, while
another "production" running installation isn't affected at
all.
> Aside from the cross-backend synchronization issue, I forgot to point
> out a really obvious benefit: doing it the current way allows the regress
> tests to help check the backend's frontend communication code, and
> libpq, and psql itself. We'd need some other way of testing all that
> code if we switched to a standalone-backend regression test set.
>
> What I *would* like to see is more support for running regress tests on
> a not-yet-installed build, so people can test a fresh build before they
> blow away their working installation. This requires doing an initdb
> into a temporary directory, starting a postmaster therein (using a
> nonstandard port number), and running the tests there. This is doable
> by hand, of course, but it's tedious and error-prone even for an expert;
> I think it's out of the question for a novice installer. We ought to
> offer a canned script to do it that way.
Right, right, right - I'm on it.
The ugly detail, I'm currently running into, is that there
already seems to be a concurrency problem I discovered with
my testing. Occationally I get this into the postmaster log
for parallel executing tests:
ERROR: Bad boolean external representation 'XXX'
FATAL 1: SearchSysCache: recursive use of cache 10
FATAL 2: elog: error in postmaster or backend startup, giving up!
pq_flush: send() failed: Broken pipe
Server process (pid 9791) exited with status 512 at Fri Nov 19 03:17:09 1999
Terminating any active server processes...
It happens during the first parallel group of 11 tests. Not
allways, so it's timing critical. Outch.
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#========================================= wieck@debis.com (Jan Wieck) #
> ERROR: Bad boolean external representation 'XXX' > FATAL 1: SearchSysCache: recursive use of cache 10 > FATAL 2: elog: error in postmaster or backend startup, giving up! > pq_flush: send() failed: Broken pipe > Server process (pid 9791) exited with status 512 at Fri Nov 19 03:17:09 1999 > Terminating any active server processes... > > It happens during the first parallel group of 11 tests. Not > allways, so it's timing critical. Outch. > Now that we know numeric is working, can we make the test run faster in the default mode? -- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
wieck@debis.com (Jan Wieck) writes:
> I'm actually doing some tests if the 'make check' would be
> possible. I.e. doing a complete install with POSTGRESDIR
> below the regress dir, running initdb with the libdir and
> datadir pointing into there too, then starting new postmaster
> on a different port in background etc., etc., etc..
> That would make it possible to do a complete check without
> doing a regular install at all.
Sounds great! I was just griping elsewhere in this thread that we
needed that.
> It's amusing how often we two have the same wishes or ideas.
Well, they're so obviously the Right Thing ;-)
regards, tom lane
Bruce Momjian wrote:
> > ERROR: Bad boolean external representation 'XXX'
> > FATAL 1: SearchSysCache: recursive use of cache 10
> > FATAL 2: elog: error in postmaster or backend startup, giving up!
> > pq_flush: send() failed: Broken pipe
> > Server process (pid 9791) exited with status 512 at Fri Nov 19 03:17:09 1999
> > Terminating any active server processes...
> >
> > It happens during the first parallel group of 11 tests. Not
> > allways, so it's timing critical. Outch.
Hmmm,
the first FATAL is emitted from catcache.c in line 988. I
think that the cache->busy lives in shared memory and isn't
protected against concurrent usage, as it should be. Cache
#10 is RELNAME. That really makes sense, because most of the
tests I'm running parallel now issue CREATE TABLE commands
first.
> Now that we know numeric is working, can we make the test run faster in
> the default mode?
It is already down to 100 digits after the decimal point. I
don't want to lower it too much, but maybe 30 or 50 are
enough too - no?
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#========================================= wieck@debis.com (Jan Wieck) #
> > Now that we know numeric is working, can we make the test run faster in > > the default mode? > > It is already down to 100 digits after the decimal point. I > don't want to lower it too much, but maybe 30 or 50 are > enough too - no? It is just taking longer than most other tests. Seems 30 would be fine. They can always run the bigtest. -- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
wieck@debis.com (Jan Wieck) writes:
> The ugly detail, I'm currently running into, is that there
> already seems to be a concurrency problem I discovered with
> my testing. Occationally I get this into the postmaster log
> for parallel executing tests:
> ERROR: Bad boolean external representation 'XXX'
> FATAL 1: SearchSysCache: recursive use of cache 10
> FATAL 2: elog: error in postmaster or backend startup, giving up!
> pq_flush: send() failed: Broken pipe
> Server process (pid 9791) exited with status 512 at Fri Nov 19 03:17:09 1999
> Terminating any active server processes...
> It happens during the first parallel group of 11 tests. Not
> allways, so it's timing critical. Outch.
In other words, you've already exposed a bug! Right on!
Commit the thing, so more eyes can look for the problem. I expect
you have found a pre-existing backend bug, not a problem in your
new regress test scaffold.
regards, tom lane
wieck@debis.com (Jan Wieck) writes:
> Bruce Momjian wrote:
>> Now that we know numeric is working, can we make the test run faster in
>> the default mode?
> It is already down to 100 digits after the decimal point. I
> don't want to lower it too much, but maybe 30 or 50 are
> enough too - no?
Since multiply and so on are presumably O(N^2), cutting the precision
to 30 might cut the runtime by almost a factor of 10.
Jan probably has a better idea than the rest of us whether a test of
100, or 30, or 10 digits is likely to expose bugs that would not be
exposed by a test with less precision --- that depends on whether the
code has any internal behavioral dependence on the length of numeric
values. The numeric test certainly is a lot slower than the others, so
I think it would be a good idea to trim the precision as much as we can.
Anyone who's actually touching the numeric code could and should run
the "bigtest", but the rest of us just want to know whether we've got
porting problems. Seems like it shouldn't take 100-digit tests to
expose porting problems.
regards, tom lane
Tom Lane wrote:
> wieck@debis.com (Jan Wieck) writes:
> > Bruce Momjian wrote:
> >> Now that we know numeric is working, can we make the test run faster in
> >> the default mode?
>
> > It is already down to 100 digits after the decimal point. I
> > don't want to lower it too much, but maybe 30 or 50 are
> > enough too - no?
>
> Since multiply and so on are presumably O(N^2), cutting the precision
> to 30 might cut the runtime by almost a factor of 10.
>
> Jan probably has a better idea than the rest of us whether a test of
> 100, or 30, or 10 digits is likely to expose bugs that would not be
> exposed by a test with less precision --- that depends on whether the
I created a new default numeric test using numbers of range
10,10 as input only. It doesn't save that much of time as you
expect, but you're right anyways.
Will commit it later, together with the new parallel test
suite.
BTW: The parallel problems I encountered aren't anything.
Starting the postmaster with -D... isn't the same as setting
PGDATA environment - as it IMHO should be. It happened that I
killed the test-install postmaster, started with -D pointing
into my temp dirs, with SIGKILL. It corrupted the pg_control
file of my default installation :-}
And if you do not have an initialized data directory at the
compiled in default location, postmaster doesn't startup with
-D at all.
Vadim, could you take a look at it?
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#========================================= wieck@debis.com (Jan Wieck) #
On 1999-11-19, Jan Wieck mentioned: > I'm actually doing some tests if the 'make check' would be > possible. I.e. doing a complete install with POSTGRESDIR > below the regress dir, running initdb with the libdir and > datadir pointing into there too, then starting new postmaster > on a different port in background etc., etc., etc.. > > That would make it possible to do a complete check without > doing a regular install at all. Wasn't that exactly what my conceptual script intended to do? Great to see some other people thinking in the same direction. The main point is to have the tests run before any installation is done. Sounds like we're on track . . . -- Peter Eisentraut Sernanders väg 10:115 peter_e@gmx.net 75262 Uppsala http://yi.org/peter-e/ Sweden