pgsql: Use data directory inode number, not port, to select SysV resour

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Use data directory inode number, not port, to select SysV resour
Date: 2019-09-05 17:32:04
Message-ID: E1i5vc4-0004Lg-4U@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers pgsql-hackers

Use data directory inode number, not port, to select SysV resource keys.

This approach provides a much tighter binding between a data directory
and the associated SysV shared memory block (and SysV or named-POSIX
semaphores, if we're using those). Key collisions are still possible,
but only between data directories stored on different filesystems,
so the situation should be negligible in practice. More importantly,
restarting the postmaster with a different port number no longer
risks failing to identify a relevant shared memory block, even when
postmaster.pid has been removed. A standalone backend is likewise
much more certain to detect conflicting leftover backends.

(In the longer term, we might now think about deprecating the port as
a cluster-wide value, so that one postmaster could support sockets
with varying port numbers. But that's for another day.)

The hazards fixed here apply only on Unix systems; our Windows code
paths already use identifiers derived from the data directory path
name rather than the port.

src/test/recovery/t/017_shm.pl, which intends to test key-collision
cases, has been substantially rewritten since it can no longer use
two postmasters with identical port numbers to trigger the case.
Instead, use Perl's IPC::SharedMem module to create a conflicting
shmem segment directly. The test script will be skipped if that
module is not available. (This means that some older buildfarm
members won't run it, but I don't think that that results in any
meaningful coverage loss.)

Patch by me; thanks to Noah Misch and Peter Eisentraut for discussion
and review.

Discussion: https://postgr.es/m/16908.1557521200@sss.pgh.pa.us

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/7de19fbc0b1a9172d0907017302b32846b2887b9

Modified Files
--------------
src/backend/port/posix_sema.c | 23 ++++--
src/backend/port/sysv_sema.c | 23 ++++--
src/backend/port/sysv_shmem.c | 38 +++++----
src/backend/port/win32_sema.c | 2 +-
src/backend/port/win32_shmem.c | 2 +-
src/backend/postmaster/postmaster.c | 25 +++---
src/backend/storage/ipc/ipci.c | 6 +-
src/backend/utils/init/postinit.c | 8 +-
src/include/storage/ipc.h | 2 +-
src/include/storage/pg_sema.h | 2 +-
src/include/storage/pg_shmem.h | 2 +-
src/test/recovery/t/017_shm.pl | 150 +++++++++++++++++++-----------------
12 files changed, 159 insertions(+), 124 deletions(-)

Responses

Browse pgsql-committers by date

  From Date Subject
Next Message Michael Paquier 2019-09-06 05:01:26 pgsql: Make use of generic logging in vacuumlo and oid2name
Previous Message Robert Haas 2019-09-05 17:19:48 pgsql: Split tuptoaster.c into three separate files.

Browse pgsql-hackers by date

  From Date Subject
Next Message Rodrigo Ramírez Norambuena 2019-09-05 17:38:57 Re: [PATCH] Connection time for \conninfo
Previous Message Jeff Davis 2019-09-05 17:15:43 Re: range_agg