mirror of https://github.com/postgres/postgres
Reviewed-by: Andres Freund <andres@anarazel.de> Discussion: https://www.postgresql.org/message-id/a102f15f-eac4-4ff2-af02-f9ff209ec66f@iki.fipull/182/head
parent
5b7da5c261
commit
6a1d0d470e
@ -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
|
||||||
@ -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. |
||||||
@ -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', |
||||||
|
], |
||||||
|
}, |
||||||
|
} |
||||||
@ -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(); |
||||||
Loading…
Reference in new issue