aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/init/postinit.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-07-31 17:19:22 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-07-31 17:19:22 +0000
commitd42cf5a42a42689f68bc1ee1200aca75f954b1fd (patch)
treeedce5e6641f56c2c7e836e52a8b6586d1ab45cb5 /src/backend/utils/init/postinit.c
parentb12587710701f63b4d8bac49f59901f210edf6b6 (diff)
downloadpostgresql-d42cf5a42a42689f68bc1ee1200aca75f954b1fd.tar.gz
postgresql-d42cf5a42a42689f68bc1ee1200aca75f954b1fd.zip
Add per-user and per-database connection limit options.
This patch also includes preliminary update of pg_dumpall for roles. Petr Jelinek, with review by Bruce Momjian and Tom Lane.
Diffstat (limited to 'src/backend/utils/init/postinit.c')
-rw-r--r--src/backend/utils/init/postinit.c47
1 files changed, 36 insertions, 11 deletions
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index b013eca86cf..d06fa5db369 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.154 2005/07/29 19:30:05 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.155 2005/07/31 17:19:19 tgl Exp $
*
*
*-------------------------------------------------------------------------
@@ -169,18 +169,43 @@ ReverifyMyDatabase(const char *name)
name, MyDatabaseId)));
}
+ dbform = (Form_pg_database) GETSTRUCT(tup);
+
/*
- * Also check that the database is currently allowing connections.
- * (We do not enforce this in standalone mode, however, so that there is
- * a way to recover from "UPDATE pg_database SET datallowconn = false;".
- * We do not enforce it for the autovacuum process either.)
+ * These next checks are not enforced when in standalone mode, so that
+ * there is a way to recover from disabling all access to all databases,
+ * for example "UPDATE pg_database SET datallowconn = false;".
+ *
+ * We do not enforce them for the autovacuum process either.
*/
- dbform = (Form_pg_database) GETSTRUCT(tup);
- if (IsUnderPostmaster && !IsAutoVacuumProcess() && !dbform->datallowconn)
- ereport(FATAL,
- (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
- errmsg("database \"%s\" is not currently accepting connections",
- name)));
+ if (IsUnderPostmaster && !IsAutoVacuumProcess())
+ {
+ /*
+ * Check that the database is currently allowing connections.
+ */
+ if (!dbform->datallowconn)
+ ereport(FATAL,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("database \"%s\" is not currently accepting connections",
+ name)));
+ /*
+ * Check connection limit for this database.
+ *
+ * There is a race condition here --- we create our PGPROC before
+ * checking for other PGPROCs. If two backends did this at about the
+ * same time, they might both think they were over the limit, while
+ * ideally one should succeed and one fail. Getting that to work
+ * exactly seems more trouble than it is worth, however; instead
+ * we just document that the connection limit is approximate.
+ */
+ if (dbform->datconnlimit >= 0 &&
+ !superuser() &&
+ CountDBBackends(MyDatabaseId) > dbform->datconnlimit)
+ ereport(FATAL,
+ (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
+ errmsg("too many connections for database \"%s\"",
+ name)));
+ }
/*
* OK, we're golden. Next to-do item is to save the encoding