dsm: allow use in single user mode.
authorAndres Freund <andres@anarazel.de>
Wed, 6 Apr 2022 19:40:04 +0000 (12:40 -0700)
committerAndres Freund <andres@anarazel.de>
Wed, 6 Apr 2022 19:40:04 +0000 (12:40 -0700)
It might seem pointless to allow use of dsm in single user mode, but otherwise
subsystems might need dedicated single user mode code paths.

Besides changing the assert, all that's needed is to make some windows code
assuming the presence of postmaster conditional.

Author: Andres Freund <andres@anarazel.de>
Reviewed-By: Thomas Munro <thomas.munro@gmail.com>
Discussion: https://postgr.es/m/CA+hUKGL9hY_VY=+oUK+Gc1iSRx-Ls5qeYJ6q=dQVZnT3R63Taw@mail.gmail.com

src/backend/storage/ipc/dsm.c
src/backend/storage/ipc/dsm_impl.c

index e9e9fae3eb9c65990197357ebfcf8b9c6b9bfdd9..ce6f07d4c58de546c5917da56f7aedebbe7a2f0b 100644 (file)
@@ -397,6 +397,7 @@ static void
 dsm_backend_startup(void)
 {
 #ifdef EXEC_BACKEND
+   if (IsUnderPostmaster)
    {
        void       *control_address = NULL;
 
@@ -496,8 +497,12 @@ dsm_create(Size size, int flags)
    FreePageManager *dsm_main_space_fpm = dsm_main_space_begin;
    bool        using_main_dsm_region = false;
 
-   /* Unsafe in postmaster (and pointless in a stand-alone backend). */
-   Assert(IsUnderPostmaster);
+   /*
+    * Unsafe in postmaster. It might seem pointless to allow use of dsm in
+    * single user mode, but otherwise some subsystems will need dedicated
+    * single user mode code paths.
+    */
+   Assert(IsUnderPostmaster || !IsPostmasterEnvironment);
 
    if (!dsm_init_done)
        dsm_backend_startup();
index 49f4c98620c849180833afa4ea601cb033cb48fa..873867e856889bfa908416aced0dec601b3a8ad2 100644 (file)
@@ -959,6 +959,7 @@ dsm_impl_pin_segment(dsm_handle handle, void *impl_private,
    {
 #ifdef USE_DSM_WINDOWS
        case DSM_IMPL_WINDOWS:
+           if (IsUnderPostmaster)
            {
                HANDLE      hmap;
 
@@ -984,8 +985,8 @@ dsm_impl_pin_segment(dsm_handle handle, void *impl_private,
                 * is unpinned, dsm_impl_unpin_segment can close it.
                 */
                *impl_private_pm_handle = hmap;
-               break;
            }
+           break;
 #endif
        default:
            break;
@@ -1008,6 +1009,7 @@ dsm_impl_unpin_segment(dsm_handle handle, void **impl_private)
    {
 #ifdef USE_DSM_WINDOWS
        case DSM_IMPL_WINDOWS:
+           if (IsUnderPostmaster)
            {
                if (*impl_private &&
                    !DuplicateHandle(PostmasterHandle, *impl_private,
@@ -1025,8 +1027,8 @@ dsm_impl_unpin_segment(dsm_handle handle, void **impl_private)
                }
 
                *impl_private = NULL;
-               break;
            }
+           break;
 #endif
        default:
            break;