Cause stats processes to detach from shared memory when started, so that
authorTom Lane
Fri, 7 Nov 2003 21:55:50 +0000 (21:55 +0000)
committerTom Lane
Fri, 7 Nov 2003 21:55:50 +0000 (21:55 +0000)
they do not prevent the postmaster from deleting the shmem segment during
a post-backend-crash restart cycle.  Per recent discussion.

src/backend/port/sysv_shmem.c
src/backend/postmaster/pgstat.c
src/include/storage/pg_shmem.h

index fc3cf7c419e628aed8342b06fd7e1f2ad0818233..a45c0a143d14fd796d5ead2f0220068a7fb16c3a 100644 (file)
@@ -10,7 +10,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/port/sysv_shmem.c,v 1.24 2003/10/27 18:30:07 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/port/sysv_shmem.c,v 1.25 2003/11/07 21:55:49 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -134,7 +134,7 @@ InternalIpcMemoryCreate(IpcMemoryKey memKey, uint32 size)
 
    /* OK, should be able to attach to the segment */
 #ifdef SHM_SHARE_MMU
-   /* use intimate shared memory on SPARC Solaris */
+   /* use intimate shared memory on Solaris */
    memAddress = shmat(shmid, 0, SHM_SHARE_MMU);
 #else
    memAddress = shmat(shmid, 0, 0);
@@ -244,7 +244,7 @@ PGSharedMemoryCreate(uint32 size, bool makePrivate, int port)
    /* Room for a header? */
    Assert(size > MAXALIGN(sizeof(PGShmemHeader)));
 
-   /* Just attach and return the pointer */
+   /* If Exec case, just attach and return the pointer */
    if (ExecBackend && UsedShmemSegAddr != NULL && !makePrivate)
    {
        if ((hdr = PGSharedMemoryAttach(UsedShmemSegID, &shmid)) == NULL)
@@ -253,6 +253,9 @@ PGSharedMemoryCreate(uint32 size, bool makePrivate, int port)
        return hdr;
    }
 
+   /* Make sure PGSharedMemoryAttach doesn't fail without need */
+   UsedShmemSegAddr = NULL;
+
    /* Loop till we find a free IPC key */
    NextShmemSegID = port * 1000;
 
@@ -326,16 +329,32 @@ PGSharedMemoryCreate(uint32 size, bool makePrivate, int port)
    hdr->totalsize = size;
    hdr->freeoffset = MAXALIGN(sizeof(PGShmemHeader));
 
-
-   if (ExecBackend && UsedShmemSegAddr == NULL && !makePrivate)
-   {
-       UsedShmemSegAddr = memAddress;
-       UsedShmemSegID = NextShmemSegID;
-   }
+   /* Save info for possible future use */
+   UsedShmemSegAddr = memAddress;
+   UsedShmemSegID = NextShmemSegID;
 
    return hdr;
 }
 
+/*
+ * PGSharedMemoryDetach
+ *
+ * Detach from the shared memory segment, if still attached.  This is not
+ * intended for use by the process that originally created the segment
+ * (it will have an on_shmem_exit callback registered to do that).  Rather,
+ * this is for subprocesses that have inherited an attachment and want to
+ * get rid of it.
+ */
+void
+PGSharedMemoryDetach(void)
+{
+   if (UsedShmemSegAddr != NULL)
+   {
+       if (shmdt(UsedShmemSegAddr) < 0)
+           elog(LOG, "shmdt(%p) failed: %m", UsedShmemSegAddr);
+       UsedShmemSegAddr = NULL;
+   }
+}
 
 /*
  * Attach to shared memory and make sure it has a Postgres header
index 3808402cc6c1f34f554628df0d92e2bc4b843438..2539c32d6542fb6a3a4904ca185115ef38a88b86 100644 (file)
@@ -13,7 +13,7 @@
  *
  * Copyright (c) 2001-2003, PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.45 2003/09/25 06:58:01 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.46 2003/11/07 21:55:50 tgl Exp $
  * ----------
  */
 #include "postgres.h"
@@ -44,6 +44,7 @@
 #include "utils/memutils.h"
 #include "storage/backendid.h"
 #include "storage/ipc.h"
+#include "storage/pg_shmem.h"
 #include "utils/rel.h"
 #include "utils/hsearch.h"
 #include "utils/ps_status.h"
@@ -400,6 +401,9 @@ pgstat_start(void)
    /* Close the postmaster's sockets, except for pgstat link */
    ClosePostmasterPorts(false);
 
+   /* Drop our connection to postmaster's shared memory, as well */
+   PGSharedMemoryDetach();
+
    pgstat_main();
 
    exit(0);
index 7f96a150df7ac0ffb3f11e0305288d904f413397..3ac79a3dac8b521cff2ed806aa2f93b0953569f6 100644 (file)
@@ -17,7 +17,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_shmem.h,v 1.7 2003/08/04 02:40:15 momjian Exp $
+ * $Id: pg_shmem.h,v 1.8 2003/11/07 21:55:50 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -44,5 +44,6 @@ extern void *UsedShmemSegAddr;
 extern PGShmemHeader *PGSharedMemoryCreate(uint32 size, bool makePrivate,
                     int port);
 extern bool PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2);
+extern void PGSharedMemoryDetach(void);
 
 #endif   /* PG_SHMEM_H */