diff options
Diffstat (limited to 'src/backend/storage')
| -rw-r--r-- | src/backend/storage/ipc/ipci.c | 8 | ||||
| -rw-r--r-- | src/backend/storage/ipc/pmsignal.c | 41 | ||||
| -rw-r--r-- | src/backend/storage/lmgr/proc.c | 10 |
3 files changed, 54 insertions, 5 deletions
diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index 134521c91cd..01a9fabc8c9 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/ipc/ipci.c,v 1.102 2010/01/02 16:57:51 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/storage/ipc/ipci.c,v 1.103 2010/01/15 09:19:03 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -25,6 +25,8 @@ #include "postmaster/autovacuum.h" #include "postmaster/bgwriter.h" #include "postmaster/postmaster.h" +#include "replication/walreceiver.h" +#include "replication/walsender.h" #include "storage/bufmgr.h" #include "storage/ipc.h" #include "storage/pg_shmem.h" @@ -116,6 +118,8 @@ CreateSharedMemoryAndSemaphores(bool makePrivate, int port) size = add_size(size, ProcSignalShmemSize()); size = add_size(size, BgWriterShmemSize()); size = add_size(size, AutoVacuumShmemSize()); + size = add_size(size, WalSndShmemSize()); + size = add_size(size, WalRcvShmemSize()); size = add_size(size, BTreeShmemSize()); size = add_size(size, SyncScanShmemSize()); #ifdef EXEC_BACKEND @@ -213,6 +217,8 @@ CreateSharedMemoryAndSemaphores(bool makePrivate, int port) ProcSignalShmemInit(); BgWriterShmemInit(); AutoVacuumShmemInit(); + WalSndShmemInit(); + WalRcvShmemInit(); /* * Set up other modules that need some shared memory space diff --git a/src/backend/storage/ipc/pmsignal.c b/src/backend/storage/ipc/pmsignal.c index 0199c8b577c..2a414a0c2f3 100644 --- a/src/backend/storage/ipc/pmsignal.c +++ b/src/backend/storage/ipc/pmsignal.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/ipc/pmsignal.c,v 1.29 2010/01/02 16:57:51 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/storage/ipc/pmsignal.c,v 1.30 2010/01/15 09:19:03 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -45,11 +45,15 @@ * process is actively using shared memory. The slots are assigned to * child processes at random, and postmaster.c is responsible for tracking * which one goes with which PID. + * + * The fourth state, WALSENDER, is just like ACTIVE, but carries the extra + * information that the child is a WAL sender. */ #define PM_CHILD_UNUSED 0 /* these values must fit in sig_atomic_t */ #define PM_CHILD_ASSIGNED 1 #define PM_CHILD_ACTIVE 2 +#define PM_CHILD_WALSENDER 3 /* "typedef struct PMSignalData PMSignalData" appears in pmsignal.h */ struct PMSignalData @@ -193,6 +197,22 @@ ReleasePostmasterChildSlot(int slot) } /* + * IsPostmasterChildWalSender - check if given slot is in use by a + * walsender process. + */ +bool +IsPostmasterChildWalSender(int slot) +{ + Assert(slot > 0 && slot <= PMSignalState->num_child_flags); + slot--; + + if (PMSignalState->PMChildFlags[slot] == PM_CHILD_WALSENDER) + return true; + else + return false; +} + +/* * MarkPostmasterChildActive - mark a postmaster child as about to begin * actively using shared memory. This is called in the child process. */ @@ -208,6 +228,22 @@ MarkPostmasterChildActive(void) } /* + * MarkPostmasterChildWalSender - like MarkPostmasterChildActive(), but + * marks the postmaster child as a WAL sender instead of a regular backend. + * This is called in the child process. + */ +void +MarkPostmasterChildWalSender(void) +{ + int slot = MyPMChildSlot; + + Assert(slot > 0 && slot <= PMSignalState->num_child_flags); + slot--; + Assert(PMSignalState->PMChildFlags[slot] == PM_CHILD_ASSIGNED); + PMSignalState->PMChildFlags[slot] = PM_CHILD_WALSENDER; +} + +/* * MarkPostmasterChildInactive - mark a postmaster child as done using * shared memory. This is called in the child process. */ @@ -218,7 +254,8 @@ MarkPostmasterChildInactive(void) Assert(slot > 0 && slot <= PMSignalState->num_child_flags); slot--; - Assert(PMSignalState->PMChildFlags[slot] == PM_CHILD_ACTIVE); + Assert(PMSignalState->PMChildFlags[slot] == PM_CHILD_ACTIVE || + PMSignalState->PMChildFlags[slot] == PM_CHILD_WALSENDER); PMSignalState->PMChildFlags[slot] = PM_CHILD_ASSIGNED; } diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index ca7a19e4f4c..91065b368cd 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.211 2010/01/02 16:57:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.212 2010/01/15 09:19:03 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -39,6 +39,7 @@ #include "access/xact.h" #include "miscadmin.h" #include "postmaster/autovacuum.h" +#include "replication/walsender.h" #include "storage/ipc.h" #include "storage/lmgr.h" #include "storage/pmsignal.h" @@ -290,7 +291,12 @@ InitProcess(void) * this; it probably should.) */ if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess()) - MarkPostmasterChildActive(); + { + if (am_walsender) + MarkPostmasterChildWalSender(); + else + MarkPostmasterChildActive(); + } /* * Initialize all fields of MyProc, except for the semaphore which was |
