diff options
| author | Thomas Munro <tmunro@postgresql.org> | 2022-02-12 10:21:23 +1300 |
|---|---|---|
| committer | Thomas Munro <tmunro@postgresql.org> | 2022-02-12 10:21:23 +1300 |
| commit | 4eb2176318d0561846c1f9fb3c68bede799d640f (patch) | |
| tree | ae824847ecc96384f9fbcd7010a854cf50ec3e8c /src/include | |
| parent | e5691cc9170bcd6c684715c2755d919c5a16fea2 (diff) | |
Fix DROP {DATABASE,TABLESPACE} on Windows.
Previously, it was possible for DROP DATABASE, DROP TABLESPACE and ALTER
DATABASE SET TABLESPACE to fail because other backends still had file
handles open for dropped tables. Windows won't allow a directory
containing unlinked-but-still-open files to be unlinked. Tackle this
problem by forcing all backends to close all smgr fds. No change for
Unix systems, which don't suffer from the problem, but the new code path
can be tested by Unix-based developers by defining
USE_BARRIER_SMGRRELEASE explicitly.
It's possible that PROCSIGNAL_BARRIER_SMGRRELEASE will have more
bug-fixing applications soon (under discussion). Note that this is the
first user of the ProcSignalBarrier mechanism from commit 16a4e4aec. It
could in principle be back-patched as far as 14, but since field
complaints are rare and ProcSignalBarrier hasn't been battle-tested,
that seems like a bad idea. Fix in master only, where these failures
have started to show up in automated testing due to new tests.
Suggested-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Discussion: https://postgr.es/m/CA+hUKGLdemy2gBm80kz20GTe6hNVwoErE8KwcJk6-U56oStjtg@mail.gmail.com
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/pg_config_manual.h | 11 | ||||
| -rw-r--r-- | src/include/storage/md.h | 1 | ||||
| -rw-r--r-- | src/include/storage/procsignal.h | 7 | ||||
| -rw-r--r-- | src/include/storage/smgr.h | 1 |
4 files changed, 14 insertions, 6 deletions
diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h index 8d2e3e3a57d..84ce5a4a5d7 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -153,6 +153,17 @@ #endif /* + * If USE_BARRIER_SMGRRELEASE is defined, certain code paths that unlink + * directories will ask other backends to close all smgr file descriptors. + * This is enabled on Windows, because otherwise unlinked but still open files + * can prevent rmdir(containing_directory) from succeeding. On other + * platforms, it can be defined to exercise those code paths. + */ +#if defined(WIN32) +#define USE_BARRIER_SMGRRELEASE +#endif + +/* * Define this if your operating system supports link() */ #if !defined(WIN32) && !defined(__CYGWIN__) diff --git a/src/include/storage/md.h b/src/include/storage/md.h index ffffa40db71..6e46d8d96a7 100644 --- a/src/include/storage/md.h +++ b/src/include/storage/md.h @@ -23,6 +23,7 @@ extern void mdinit(void); extern void mdopen(SMgrRelation reln); extern void mdclose(SMgrRelation reln, ForkNumber forknum); +extern void mdrelease(void); extern void mdcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo); extern bool mdexists(SMgrRelation reln, ForkNumber forknum); extern void mdunlink(RelFileNodeBackend rnode, ForkNumber forknum, bool isRedo); diff --git a/src/include/storage/procsignal.h b/src/include/storage/procsignal.h index a121e650665..ee636900f33 100644 --- a/src/include/storage/procsignal.h +++ b/src/include/storage/procsignal.h @@ -49,12 +49,7 @@ typedef enum typedef enum { - /* - * XXX. PROCSIGNAL_BARRIER_PLACEHOLDER should be replaced when the first - * real user of the ProcSignalBarrier mechanism is added. It's just here - * for now because we can't have an empty enum. - */ - PROCSIGNAL_BARRIER_PLACEHOLDER = 0 + PROCSIGNAL_BARRIER_SMGRRELEASE /* ask smgr to close files */ } ProcSignalBarrierType; /* diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h index 052e0b8426a..8e3ef92cda1 100644 --- a/src/include/storage/smgr.h +++ b/src/include/storage/smgr.h @@ -104,5 +104,6 @@ extern void smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, BlockNumber *nblocks); extern void smgrimmedsync(SMgrRelation reln, ForkNumber forknum); extern void AtEOXact_SMgr(void); +extern bool ProcessBarrierSmgrRelease(void); #endif /* SMGR_H */ |
