mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Add test for connection limits
Reviewed-by: Andres Freund <andres@anarazel.de> Discussion: https://www.postgresql.org/message-id/a102f15f-eac4-4ff2-af02-f9ff209ec66f@iki.fi
This commit is contained in:
@ -12,7 +12,7 @@ subdir = src/test
|
|||||||
top_builddir = ../..
|
top_builddir = ../..
|
||||||
include $(top_builddir)/src/Makefile.global
|
include $(top_builddir)/src/Makefile.global
|
||||||
|
|
||||||
SUBDIRS = perl regress isolation modules authentication recovery subscription
|
SUBDIRS = perl postmaster regress isolation modules authentication recovery subscription
|
||||||
|
|
||||||
ifeq ($(with_icu),yes)
|
ifeq ($(with_icu),yes)
|
||||||
SUBDIRS += icu
|
SUBDIRS += icu
|
||||||
|
@ -4,6 +4,7 @@ subdir('regress')
|
|||||||
subdir('isolation')
|
subdir('isolation')
|
||||||
|
|
||||||
subdir('authentication')
|
subdir('authentication')
|
||||||
|
subdir('postmaster')
|
||||||
subdir('recovery')
|
subdir('recovery')
|
||||||
subdir('subscription')
|
subdir('subscription')
|
||||||
subdir('modules')
|
subdir('modules')
|
||||||
|
23
src/test/postmaster/Makefile
Normal file
23
src/test/postmaster/Makefile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Makefile for src/test/postmaster
|
||||||
|
#
|
||||||
|
# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
||||||
|
# Portions Copyright (c) 1994, Regents of the University of California
|
||||||
|
#
|
||||||
|
# src/test/postmaster/Makefile
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
subdir = src/test/postmaster
|
||||||
|
top_builddir = ../../..
|
||||||
|
include $(top_builddir)/src/Makefile.global
|
||||||
|
|
||||||
|
check:
|
||||||
|
$(prove_check)
|
||||||
|
|
||||||
|
installcheck:
|
||||||
|
$(prove_installcheck)
|
||||||
|
|
||||||
|
clean distclean:
|
||||||
|
rm -rf tmp_check
|
27
src/test/postmaster/README
Normal file
27
src/test/postmaster/README
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
src/test/postmaster/README
|
||||||
|
|
||||||
|
Regression tests for postmaster
|
||||||
|
===============================
|
||||||
|
|
||||||
|
This directory contains a test suite for postmaster's handling of
|
||||||
|
connections, connection limits, and startup/shutdown sequence.
|
||||||
|
|
||||||
|
|
||||||
|
Running the tests
|
||||||
|
=================
|
||||||
|
|
||||||
|
NOTE: You must have given the --enable-tap-tests argument to configure.
|
||||||
|
|
||||||
|
Run
|
||||||
|
make check
|
||||||
|
or
|
||||||
|
make installcheck
|
||||||
|
You can use "make installcheck" if you previously did "make install".
|
||||||
|
In that case, the code in the installation tree is tested. With
|
||||||
|
"make check", a temporary installation tree is built from the current
|
||||||
|
sources and then tested.
|
||||||
|
|
||||||
|
Either way, this test initializes, starts, and stops a test Postgres
|
||||||
|
cluster.
|
||||||
|
|
||||||
|
See src/test/perl/README for more info about running these tests.
|
12
src/test/postmaster/meson.build
Normal file
12
src/test/postmaster/meson.build
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Copyright (c) 2022-2024, PostgreSQL Global Development Group
|
||||||
|
|
||||||
|
tests += {
|
||||||
|
'name': 'postmaster',
|
||||||
|
'sd': meson.current_source_dir(),
|
||||||
|
'bd': meson.current_build_dir(),
|
||||||
|
'tap': {
|
||||||
|
'tests': [
|
||||||
|
't/001_connection_limits.pl',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
79
src/test/postmaster/t/001_connection_limits.pl
Normal file
79
src/test/postmaster/t/001_connection_limits.pl
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
|
||||||
|
# Copyright (c) 2021-2024, PostgreSQL Global Development Group
|
||||||
|
|
||||||
|
# Test connection limits, i.e. max_connections, reserved_connections
|
||||||
|
# and superuser_reserved_connections.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings FATAL => 'all';
|
||||||
|
use PostgreSQL::Test::Cluster;
|
||||||
|
use PostgreSQL::Test::Utils;
|
||||||
|
use Test::More;
|
||||||
|
|
||||||
|
# Initialize the server with specific low connection limits
|
||||||
|
my $node = PostgreSQL::Test::Cluster->new('primary');
|
||||||
|
$node->init;
|
||||||
|
$node->append_conf('postgresql.conf', "max_connections = 6");
|
||||||
|
$node->append_conf('postgresql.conf', "reserved_connections = 2");
|
||||||
|
$node->append_conf('postgresql.conf', "superuser_reserved_connections = 1");
|
||||||
|
$node->append_conf('postgresql.conf', "log_connections = on");
|
||||||
|
$node->start;
|
||||||
|
|
||||||
|
$node->safe_psql(
|
||||||
|
'postgres', qq{
|
||||||
|
CREATE USER regress_regular LOGIN;
|
||||||
|
CREATE USER regress_reserved LOGIN;
|
||||||
|
GRANT pg_use_reserved_connections TO regress_reserved;
|
||||||
|
CREATE USER regress_superuser LOGIN SUPERUSER;
|
||||||
|
});
|
||||||
|
|
||||||
|
# With the limits we set in postgresql.conf, we can establish:
|
||||||
|
# - 3 connections for any user with no special privileges
|
||||||
|
# - 2 more connections for users belonging to "pg_use_reserved_connections"
|
||||||
|
# - 1 more connection for superuser
|
||||||
|
|
||||||
|
sub background_psql_as_user
|
||||||
|
{
|
||||||
|
my $user = shift;
|
||||||
|
|
||||||
|
return $node->background_psql(
|
||||||
|
'postgres',
|
||||||
|
on_error_die => 1,
|
||||||
|
extra_params => [ '-U', $user ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
my @sessions = ();
|
||||||
|
|
||||||
|
push(@sessions, background_psql_as_user('regress_regular'));
|
||||||
|
push(@sessions, background_psql_as_user('regress_regular'));
|
||||||
|
push(@sessions, background_psql_as_user('regress_regular'));
|
||||||
|
$node->connect_fails(
|
||||||
|
"dbname=postgres user=regress_regular",
|
||||||
|
"reserved_connections limit",
|
||||||
|
expected_stderr =>
|
||||||
|
qr/FATAL: remaining connection slots are reserved for roles with privileges of the "pg_use_reserved_connections" role/
|
||||||
|
);
|
||||||
|
|
||||||
|
push(@sessions, background_psql_as_user('regress_reserved'));
|
||||||
|
push(@sessions, background_psql_as_user('regress_reserved'));
|
||||||
|
$node->connect_fails(
|
||||||
|
"dbname=postgres user=regress_regular",
|
||||||
|
"reserved_connections limit",
|
||||||
|
expected_stderr =>
|
||||||
|
qr/FATAL: remaining connection slots are reserved for roles with the SUPERUSER attribute/
|
||||||
|
);
|
||||||
|
|
||||||
|
push(@sessions, background_psql_as_user('regress_superuser'));
|
||||||
|
$node->connect_fails(
|
||||||
|
"dbname=postgres user=regress_superuser",
|
||||||
|
"superuser_reserved_connections limit",
|
||||||
|
expected_stderr => qr/FATAL: sorry, too many clients already/);
|
||||||
|
|
||||||
|
# TODO: test that query cancellation is still possible
|
||||||
|
|
||||||
|
foreach my $session (@sessions)
|
||||||
|
{
|
||||||
|
$session->quit;
|
||||||
|
}
|
||||||
|
|
||||||
|
done_testing();
|
Reference in New Issue
Block a user