Thread
Commits
-
Always skip recovery SysV shared memory tests on Windows
- ef52d39bdf62 9.6.16 landed
- d0a98e1ae26c 10.11 landed
- b97a345d9691 11.6 landed
- 7d49803259de 12.0 landed
- 8e5ce1c3f837 13.0 landed
-
Use data directory inode number, not port, to select SysV resource keys.
- 7de19fbc0b1a 13.0 cited
-
pgsql: Use data directory inode number, not port, to select SysV resour
Tom Lane <tgl@sss.pgh.pa.us> — 2019-09-05T17:32:04Z
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(-)
-
Re: pgsql: Use data directory inode number, not port, to select SysV resour
Andrew Dunstan <andrew.dunstan@2ndquadrant.com> — 2019-09-06T15:09:02Z
On 9/5/19 1:32 PM, Tom Lane wrote: > 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 > This has caused the 017_shm.pl tests to be skipped on jacana and bowerbird, and to fail completely on my msys2 test system where the Perl has the relevant IPC:: modules, unlike the buildfarm animals. Maybe we need to fall back on the older code on Windows? cheers andrew -- Andrew Dunstan https://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
-
Re: pgsql: Use data directory inode number, not port, to select SysV resour
Tom Lane <tgl@sss.pgh.pa.us> — 2019-09-06T15:35:13Z
Andrew Dunstan <andrew.dunstan@2ndquadrant.com> writes: > On 9/5/19 1:32 PM, Tom Lane wrote: >> Use data directory inode number, not port, to select SysV resource keys. > This has caused the 017_shm.pl tests to be skipped on jacana and > bowerbird, and to fail completely on my msys2 test system where the Perl > has the relevant IPC:: modules, unlike the buildfarm animals. I intended 017_shm.pl to be skipped on Windows builds; it's not apparent to me that that script tests anything useful when we're not using SysV shared memory. I don't quite understand what the msys2 platform might be doing with these IPC modules. Do they actually do anything, or just fail at runtime? If the latter, maybe we can add something to the eval{} block to check for present-but-doesnt-work? regards, tom lane -
Re: pgsql: Use data directory inode number, not port, to select SysV resour
Andrew Dunstan <andrew.dunstan@2ndquadrant.com> — 2019-09-06T18:26:13Z
On 9/6/19 11:35 AM, Tom Lane wrote: > Andrew Dunstan <andrew.dunstan@2ndquadrant.com> writes: >> On 9/5/19 1:32 PM, Tom Lane wrote: >>> Use data directory inode number, not port, to select SysV resource keys. >> This has caused the 017_shm.pl tests to be skipped on jacana and >> bowerbird, and to fail completely on my msys2 test system where the Perl >> has the relevant IPC:: modules, unlike the buildfarm animals. > I intended 017_shm.pl to be skipped on Windows builds; it's not apparent > to me that that script tests anything useful when we're not using SysV > shared memory. > > I don't quite understand what the msys2 platform might be doing with > these IPC modules. Do they actually do anything, or just fail at > runtime? If the latter, maybe we can add something to the eval{} > block to check for present-but-doesnt-work? Given your stated intention, I think the simplest way to get it is just this, without worrying about what the perl modules might do: diff --git a/src/test/recovery/t/017_shm.pl b/src/test/recovery/t/017_shm.pl index a29ef78855..dc0dcd3ca2 100644 --- a/src/test/recovery/t/017_shm.pl +++ b/src/test/recovery/t/017_shm.pl @@ -18,7 +18,7 @@ eval { require IPC::SysV; IPC::SysV->import(qw(IPC_CREAT IPC_EXCL S_IRUSR S_IWUSR)); }; -if ($@) +if ($@ || $windows_os) { plan skip_all => 'SysV shared memory not supported by this platform'; } cheers andrew -- Andrew Dunstan https://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services -
Re: pgsql: Use data directory inode number, not port, to select SysV resour
Tom Lane <tgl@sss.pgh.pa.us> — 2019-09-06T18:42:06Z
Andrew Dunstan <andrew.dunstan@2ndquadrant.com> writes: > Given your stated intention, I think the simplest way to get it is just > this, without worrying about what the perl modules might do: > -if ($@) > +if ($@ || $windows_os) WFM, do you want to push that? regards, tom lane
-
Re: pgsql: Use data directory inode number, not port, to select SysV resour
Andrew Dunstan <andrew.dunstan@2ndquadrant.com> — 2019-09-06T19:51:54Z
On 9/6/19 2:42 PM, Tom Lane wrote: > Andrew Dunstan <andrew.dunstan@2ndquadrant.com> writes: >> Given your stated intention, I think the simplest way to get it is just >> this, without worrying about what the perl modules might do: >> -if ($@) >> +if ($@ || $windows_os) > WFM, do you want to push that? > > done. cheers andrew -- Andrew Dunstan https://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
-
Re: pgsql: Use data directory inode number, not port, to select SysV resour
Andrew Dunstan <andrew.dunstan@2ndquadrant.com> — 2019-09-08T21:54:12Z
On 9/6/19 3:51 PM, Andrew Dunstan wrote: > On 9/6/19 2:42 PM, Tom Lane wrote: >> Andrew Dunstan <andrew.dunstan@2ndquadrant.com> writes: >>> Given your stated intention, I think the simplest way to get it is just >>> this, without worrying about what the perl modules might do: >>> -if ($@) >>> +if ($@ || $windows_os) >> WFM, do you want to push that? >> >> > > done. > > [redirected to -hackers] I'm going to disable this test (src/test/recovery/t/017_shm.pl) on Windows on the back branches too unless there's a violent objection. The reason is that the script runs "postgres --single" and that fails on Windows when run by an administrative account. We've carefully enabled postgres and its tests to run safely under an admin account. I discovered this as part of my myss2 testing. cheers andrew
-
Re: pgsql: Use data directory inode number, not port, to select SysV resour
Tom Lane <tgl@sss.pgh.pa.us> — 2019-09-08T22:00:29Z
Andrew Dunstan <andrew.dunstan@2ndquadrant.com> writes: > I'm going to disable this test (src/test/recovery/t/017_shm.pl) on > Windows on the back branches too unless there's a violent objection. As I said before, I think that test does nothing useful unless SysV shmem is in use, so I see no reason not to disable it on Windows. regards, tom lane
-
Re: pgsql: Use data directory inode number, not port, to select SysV resour
Noah Misch <noah@leadboat.com> — 2019-09-13T06:20:28Z
On Sun, Sep 08, 2019 at 05:54:12PM -0400, Andrew Dunstan wrote: > I'm going to disable this test (src/test/recovery/t/017_shm.pl) on > Windows on the back branches too unless there's a violent objection. The > reason is that the script runs "postgres --single" and that fails on > Windows when run by an administrative account. We've carefully enabled > postgres and its tests to run safely under an admin account. I > discovered this as part of my myss2 testing. I'm reading that the test falsified this assertion that we've enabled postgres to run safely under an admin account. Enabling safe use of admin accounts entails fixing single-user mode. (Alternately, one could replace the "vacuum that database in single-user mode" errhint with a reference to some not-yet-built alternative. That sounds harder.)