From: Tom Lane Date: Sat, 6 Nov 2010 20:50:18 +0000 (-0400) Subject: Make get_stack_depth_rlimit() handle RLIM_INFINITY more sanely. X-Git-Tag: REL9_1_ALPHA3~207 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dd1c781903811416db4e03383a4cb0bfc8cfac40;p=postgresql Make get_stack_depth_rlimit() handle RLIM_INFINITY more sanely. Rather than considering this result as meaning "unknown", report LONG_MAX. This won't change what superusers can set max_stack_depth to, but it will cause InitializeGUCOptions() to set the built-in default to 2MB not 100kB. The latter seems like a fairly unreasonable interpretation of "infinity". Per my investigation of odd buildfarm results as well as an old complaint from Heikki. Since this should persuade all the buildfarm animals to use a reasonable stack depth setting during "make check", revert previous patch that dumbed down a recursive regression test to only 5 levels. --- diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index edf18fd0f2..60f3c7c63d 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -19,10 +19,11 @@ #include "postgres.h" +#include +#include +#include #include #include -#include -#include #include #ifdef HAVE_SYS_SELECT_H #include @@ -4107,7 +4108,7 @@ PostgresMain(int argc, char *argv[], const char *username) /* * Obtain platform stack depth limit (in bytes) * - * Return -1 if unlimited or not known + * Return -1 if unknown */ long get_stack_depth_rlimit(void) @@ -4123,7 +4124,10 @@ get_stack_depth_rlimit(void) if (getrlimit(RLIMIT_STACK, &rlim) < 0) val = -1; else if (rlim.rlim_cur == RLIM_INFINITY) - val = -1; + val = LONG_MAX; + /* rlim_cur is probably of an unsigned type, so check for overflow */ + else if (rlim.rlim_cur >= LONG_MAX) + val = LONG_MAX; else val = rlim.rlim_cur; } diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index b5dfa2287b..09beb5f398 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -3485,14 +3485,14 @@ InitializeGUCOptions(void) stack_rlimit = get_stack_depth_rlimit(); if (stack_rlimit > 0) { - int new_limit = (stack_rlimit - STACK_DEPTH_SLOP) / 1024L; + long new_limit = (stack_rlimit - STACK_DEPTH_SLOP) / 1024L; if (new_limit > 100) { char limbuf[16]; new_limit = Min(new_limit, 2048); - sprintf(limbuf, "%d", new_limit); + sprintf(limbuf, "%ld", new_limit); SetConfigOption("max_stack_depth", limbuf, PGC_POSTMASTER, PGC_S_ENV_VAR); } diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out index cd503c0ec2..a02da98011 100644 --- a/src/test/regress/expected/plpgsql.out +++ b/src/test/regress/expected/plpgsql.out @@ -4006,7 +4006,7 @@ $$ language plpgsql; -- "limit" is to prevent this from being inlined create function sql_recurse(float8) returns float8 as $$ select recurse($1) limit 1; $$ language sql; -select recurse(5); +select recurse(10); recurse --------- 0 diff --git a/src/test/regress/sql/plpgsql.sql b/src/test/regress/sql/plpgsql.sql index 14294b6dc4..015fbd6317 100644 --- a/src/test/regress/sql/plpgsql.sql +++ b/src/test/regress/sql/plpgsql.sql @@ -3211,7 +3211,7 @@ $$ language plpgsql; create function sql_recurse(float8) returns float8 as $$ select recurse($1) limit 1; $$ language sql; -select recurse(5); +select recurse(10); create function error1(text) returns text language sql as $$ SELECT relname::text FROM pg_class c WHERE c.oid = $1::regclass $$;