mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
In the stats test, delay for the stats collector to catch up using a
function that actually sleeps, instead of busy-waiting. Perhaps this will resolve some of the intermittent stats failures we keep seeing.
This commit is contained in:
@ -24,17 +24,6 @@ SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
|
|||||||
-- enable statistics
|
-- enable statistics
|
||||||
SET stats_block_level = on;
|
SET stats_block_level = on;
|
||||||
SET stats_row_level = on;
|
SET stats_row_level = on;
|
||||||
-- helper function
|
|
||||||
CREATE FUNCTION sleep(interval) RETURNS integer AS '
|
|
||||||
DECLARE
|
|
||||||
endtime timestamp;
|
|
||||||
BEGIN
|
|
||||||
endtime := timeofday()::timestamp + $1;
|
|
||||||
WHILE timeofday()::timestamp < endtime LOOP
|
|
||||||
END LOOP;
|
|
||||||
RETURN 0;
|
|
||||||
END;
|
|
||||||
' LANGUAGE 'plpgsql';
|
|
||||||
-- do something
|
-- do something
|
||||||
SELECT count(*) FROM tenk2;
|
SELECT count(*) FROM tenk2;
|
||||||
count
|
count
|
||||||
@ -49,10 +38,10 @@ SELECT count(*) FROM tenk2 WHERE unique1 = 1;
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- let stats collector catch up
|
-- let stats collector catch up
|
||||||
SELECT sleep('0:0:2'::interval);
|
SELECT do_sleep(2);
|
||||||
sleep
|
do_sleep
|
||||||
-------
|
----------
|
||||||
0
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- check effects
|
-- check effects
|
||||||
@ -76,6 +65,4 @@ SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages,
|
|||||||
t | t
|
t | t
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- clean up
|
|
||||||
DROP FUNCTION sleep(interval);
|
|
||||||
-- End of Stats Test
|
-- End of Stats Test
|
||||||
|
@ -5,22 +5,22 @@
|
|||||||
CREATE FUNCTION widget_in(cstring)
|
CREATE FUNCTION widget_in(cstring)
|
||||||
RETURNS widget
|
RETURNS widget
|
||||||
AS '@abs_builddir@/regress@DLSUFFIX@'
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
LANGUAGE 'c';
|
LANGUAGE 'C' STRICT;
|
||||||
|
|
||||||
CREATE FUNCTION widget_out(widget)
|
CREATE FUNCTION widget_out(widget)
|
||||||
RETURNS cstring
|
RETURNS cstring
|
||||||
AS '@abs_builddir@/regress@DLSUFFIX@'
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
LANGUAGE 'c';
|
LANGUAGE 'C' STRICT;
|
||||||
|
|
||||||
CREATE FUNCTION int44in(cstring)
|
CREATE FUNCTION int44in(cstring)
|
||||||
RETURNS city_budget
|
RETURNS city_budget
|
||||||
AS '@abs_builddir@/regress@DLSUFFIX@'
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
LANGUAGE 'c';
|
LANGUAGE 'C' STRICT;
|
||||||
|
|
||||||
CREATE FUNCTION int44out(city_budget)
|
CREATE FUNCTION int44out(city_budget)
|
||||||
RETURNS cstring
|
RETURNS cstring
|
||||||
AS '@abs_builddir@/regress@DLSUFFIX@'
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
LANGUAGE 'c';
|
LANGUAGE 'C' STRICT;
|
||||||
|
|
||||||
CREATE FUNCTION check_primary_key ()
|
CREATE FUNCTION check_primary_key ()
|
||||||
RETURNS trigger
|
RETURNS trigger
|
||||||
@ -50,7 +50,12 @@ CREATE FUNCTION ttdummy ()
|
|||||||
CREATE FUNCTION set_ttdummy (int4)
|
CREATE FUNCTION set_ttdummy (int4)
|
||||||
RETURNS int4
|
RETURNS int4
|
||||||
AS '@abs_builddir@/regress@DLSUFFIX@'
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
LANGUAGE 'C';
|
LANGUAGE 'C' STRICT;
|
||||||
|
|
||||||
|
CREATE FUNCTION do_sleep (int4)
|
||||||
|
RETURNS void
|
||||||
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
|
LANGUAGE 'C' STRICT;
|
||||||
|
|
||||||
-- Things that shouldn't work:
|
-- Things that shouldn't work:
|
||||||
|
|
||||||
|
@ -4,24 +4,24 @@
|
|||||||
CREATE FUNCTION widget_in(cstring)
|
CREATE FUNCTION widget_in(cstring)
|
||||||
RETURNS widget
|
RETURNS widget
|
||||||
AS '@abs_builddir@/regress@DLSUFFIX@'
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
LANGUAGE 'c';
|
LANGUAGE 'C' STRICT;
|
||||||
NOTICE: type "widget" is not yet defined
|
NOTICE: type "widget" is not yet defined
|
||||||
DETAIL: Creating a shell type definition.
|
DETAIL: Creating a shell type definition.
|
||||||
CREATE FUNCTION widget_out(widget)
|
CREATE FUNCTION widget_out(widget)
|
||||||
RETURNS cstring
|
RETURNS cstring
|
||||||
AS '@abs_builddir@/regress@DLSUFFIX@'
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
LANGUAGE 'c';
|
LANGUAGE 'C' STRICT;
|
||||||
NOTICE: argument type widget is only a shell
|
NOTICE: argument type widget is only a shell
|
||||||
CREATE FUNCTION int44in(cstring)
|
CREATE FUNCTION int44in(cstring)
|
||||||
RETURNS city_budget
|
RETURNS city_budget
|
||||||
AS '@abs_builddir@/regress@DLSUFFIX@'
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
LANGUAGE 'c';
|
LANGUAGE 'C' STRICT;
|
||||||
NOTICE: type "city_budget" is not yet defined
|
NOTICE: type "city_budget" is not yet defined
|
||||||
DETAIL: Creating a shell type definition.
|
DETAIL: Creating a shell type definition.
|
||||||
CREATE FUNCTION int44out(city_budget)
|
CREATE FUNCTION int44out(city_budget)
|
||||||
RETURNS cstring
|
RETURNS cstring
|
||||||
AS '@abs_builddir@/regress@DLSUFFIX@'
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
LANGUAGE 'c';
|
LANGUAGE 'C' STRICT;
|
||||||
NOTICE: argument type city_budget is only a shell
|
NOTICE: argument type city_budget is only a shell
|
||||||
CREATE FUNCTION check_primary_key ()
|
CREATE FUNCTION check_primary_key ()
|
||||||
RETURNS trigger
|
RETURNS trigger
|
||||||
@ -46,7 +46,11 @@ CREATE FUNCTION ttdummy ()
|
|||||||
CREATE FUNCTION set_ttdummy (int4)
|
CREATE FUNCTION set_ttdummy (int4)
|
||||||
RETURNS int4
|
RETURNS int4
|
||||||
AS '@abs_builddir@/regress@DLSUFFIX@'
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
LANGUAGE 'C';
|
LANGUAGE 'C' STRICT;
|
||||||
|
CREATE FUNCTION do_sleep (int4)
|
||||||
|
RETURNS void
|
||||||
|
AS '@abs_builddir@/regress@DLSUFFIX@'
|
||||||
|
LANGUAGE 'C' STRICT;
|
||||||
-- Things that shouldn't work:
|
-- Things that shouldn't work:
|
||||||
CREATE FUNCTION test1 (int) RETURNS int LANGUAGE sql
|
CREATE FUNCTION test1 (int) RETURNS int LANGUAGE sql
|
||||||
AS 'SELECT ''not an integer'';';
|
AS 'SELECT ''not an integer'';';
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $PostgreSQL: pgsql/src/test/regress/regress.c,v 1.62 2004/10/21 19:28:36 tgl Exp $
|
* $PostgreSQL: pgsql/src/test/regress/regress.c,v 1.63 2005/07/23 14:18:56 tgl Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
@ -26,6 +26,8 @@ extern char *reverse_name(char *string);
|
|||||||
extern int oldstyle_length(int n, text *t);
|
extern int oldstyle_length(int n, text *t);
|
||||||
extern Datum int44in(PG_FUNCTION_ARGS);
|
extern Datum int44in(PG_FUNCTION_ARGS);
|
||||||
extern Datum int44out(PG_FUNCTION_ARGS);
|
extern Datum int44out(PG_FUNCTION_ARGS);
|
||||||
|
extern Datum do_sleep(PG_FUNCTION_ARGS);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Distance from a point to a path
|
* Distance from a point to a path
|
||||||
@ -733,3 +735,18 @@ int44out(PG_FUNCTION_ARGS)
|
|||||||
*--walk = '\0';
|
*--walk = '\0';
|
||||||
PG_RETURN_CSTRING(result);
|
PG_RETURN_CSTRING(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* do_sleep - delay for N seconds
|
||||||
|
*/
|
||||||
|
PG_FUNCTION_INFO_V1(do_sleep);
|
||||||
|
|
||||||
|
Datum
|
||||||
|
do_sleep(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
int32 secs = PG_GETARG_INT32(0);
|
||||||
|
|
||||||
|
pg_usleep(secs * 1000000L);
|
||||||
|
|
||||||
|
PG_RETURN_VOID();
|
||||||
|
}
|
||||||
|
@ -24,24 +24,12 @@ SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
|
|||||||
SET stats_block_level = on;
|
SET stats_block_level = on;
|
||||||
SET stats_row_level = on;
|
SET stats_row_level = on;
|
||||||
|
|
||||||
-- helper function
|
|
||||||
CREATE FUNCTION sleep(interval) RETURNS integer AS '
|
|
||||||
DECLARE
|
|
||||||
endtime timestamp;
|
|
||||||
BEGIN
|
|
||||||
endtime := timeofday()::timestamp + $1;
|
|
||||||
WHILE timeofday()::timestamp < endtime LOOP
|
|
||||||
END LOOP;
|
|
||||||
RETURN 0;
|
|
||||||
END;
|
|
||||||
' LANGUAGE 'plpgsql';
|
|
||||||
|
|
||||||
-- do something
|
-- do something
|
||||||
SELECT count(*) FROM tenk2;
|
SELECT count(*) FROM tenk2;
|
||||||
SELECT count(*) FROM tenk2 WHERE unique1 = 1;
|
SELECT count(*) FROM tenk2 WHERE unique1 = 1;
|
||||||
|
|
||||||
-- let stats collector catch up
|
-- let stats collector catch up
|
||||||
SELECT sleep('0:0:2'::interval);
|
SELECT do_sleep(2);
|
||||||
|
|
||||||
-- check effects
|
-- check effects
|
||||||
SELECT st.seq_scan >= pr.seq_scan + 1,
|
SELECT st.seq_scan >= pr.seq_scan + 1,
|
||||||
@ -55,7 +43,4 @@ SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages,
|
|||||||
FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr
|
FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr
|
||||||
WHERE st.relname='tenk2' AND cl.relname='tenk2';
|
WHERE st.relname='tenk2' AND cl.relname='tenk2';
|
||||||
|
|
||||||
-- clean up
|
|
||||||
DROP FUNCTION sleep(interval);
|
|
||||||
|
|
||||||
-- End of Stats Test
|
-- End of Stats Test
|
||||||
|
Reference in New Issue
Block a user