提交 6c61b0d9 编写于 作者: T Tom Lane

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.
上级 5ddeffb6
...@@ -24,17 +24,6 @@ SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, ...@@ -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; ...@@ -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, ...@@ -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 @@ ...@@ -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 () ...@@ -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 @@ ...@@ -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 () ...@@ -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'';';
......
/* /*
* $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); ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册