1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-24 00:23:06 +03:00

Back-patch fix to cause stats processes to detach from shared memory,

so that they do not prevent the postmaster from deleting the shmem segment
during crash recovery.
This commit is contained in:
Tom Lane
2003-11-30 21:56:36 +00:00
parent 8582f21afd
commit a0547f6ea2
3 changed files with 35 additions and 3 deletions

View File

@@ -10,7 +10,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/port/sysv_shmem.c,v 1.4 2002/09/04 20:31:24 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/port/sysv_shmem.c,v 1.4.2.1 2003/11/30 21:56:36 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@@ -41,6 +41,9 @@ typedef int IpcMemoryId; /* shared memory ID returned by shmget(2) */
#define IPCProtection (0600) /* access/modify by user only */ #define IPCProtection (0600) /* access/modify by user only */
static IpcMemoryKey UsedShmemSegID = 0;
static void *UsedShmemSegAddr = NULL;
static void *InternalIpcMemoryCreate(IpcMemoryKey memKey, uint32 size); static void *InternalIpcMemoryCreate(IpcMemoryKey memKey, uint32 size);
static void IpcMemoryDetach(int status, Datum shmaddr); static void IpcMemoryDetach(int status, Datum shmaddr);
static void IpcMemoryDelete(int status, Datum shmId); static void IpcMemoryDelete(int status, Datum shmId);
@@ -395,5 +398,29 @@ PGSharedMemoryCreate(uint32 size, bool makePrivate, int port)
hdr->totalsize = size; hdr->totalsize = size;
hdr->freeoffset = MAXALIGN(sizeof(PGShmemHeader)); hdr->freeoffset = MAXALIGN(sizeof(PGShmemHeader));
/* Save info for possible future use */
UsedShmemSegAddr = memAddress;
UsedShmemSegID = NextShmemSegID;
return hdr; 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;
}
}

View File

@@ -16,7 +16,7 @@
* *
* Copyright (c) 2001, PostgreSQL Global Development Group * Copyright (c) 2001, PostgreSQL Global Development Group
* *
* $Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.31.2.2 2003/07/22 19:13:25 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.31.2.3 2003/11/30 21:56:36 tgl Exp $
* ---------- * ----------
*/ */
#include "postgres.h" #include "postgres.h"
@@ -42,6 +42,7 @@
#include "utils/memutils.h" #include "utils/memutils.h"
#include "storage/backendid.h" #include "storage/backendid.h"
#include "storage/ipc.h" #include "storage/ipc.h"
#include "storage/pg_shmem.h"
#include "utils/rel.h" #include "utils/rel.h"
#include "utils/hsearch.h" #include "utils/hsearch.h"
#include "utils/ps_status.h" #include "utils/ps_status.h"
@@ -324,6 +325,9 @@ pgstat_start(void)
/* Close the postmaster's sockets, except for pgstat link */ /* Close the postmaster's sockets, except for pgstat link */
ClosePostmasterPorts(false); ClosePostmasterPorts(false);
/* Drop our connection to postmaster's shared memory, as well */
PGSharedMemoryDetach();
pgstat_main(); pgstat_main();
exit(0); exit(0);

View File

@@ -17,7 +17,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: pg_shmem.h,v 1.4 2002/09/04 20:31:45 momjian Exp $ * $Id: pg_shmem.h,v 1.4.2.1 2003/11/30 21:56:36 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@@ -37,5 +37,6 @@ typedef struct PGShmemHeader /* standard header for all Postgres shmem */
extern PGShmemHeader *PGSharedMemoryCreate(uint32 size, bool makePrivate, extern PGShmemHeader *PGSharedMemoryCreate(uint32 size, bool makePrivate,
int port); int port);
extern bool PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2); extern bool PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2);
extern void PGSharedMemoryDetach(void);
#endif /* PG_SHMEM_H */ #endif /* PG_SHMEM_H */