Re: Clog handling on exec'ed backend - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: Clog handling on exec'ed backend
Date
Msg-id 200305030359.h433xCm24624@candle.pha.pa.us
Whole thread Raw
In response to Clog handling on exec'ed backend  (Bruce Momjian <pgman@candle.pha.pa.us>)
List pgsql-patches
Committed --- I need to make more changes in this area in my next patch.

---------------------------------------------------------------------------

Bruce Momjian wrote:
> Here is a another patch on the way to exec'ed Unix and Win32.
>
> It basically makes one of the Clog data structures into a shared memory
> area when using exec (EXEC_BACKEND is defined).  It passes all the
> regression/initdb tests on Unix.
>
> --
>   Bruce Momjian                        |  http://candle.pha.pa.us
>   pgman@candle.pha.pa.us               |  (610) 359-1001
>   +  If your life is a hard drive,     |  13 Roberts Road
>   +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

> Index: src/backend/access/transam/clog.c
> ===================================================================
> RCS file: /cvsroot/pgsql-server/src/backend/access/transam/clog.c,v
> retrieving revision 1.14
> diff -c -c -r1.14 clog.c
> *** src/backend/access/transam/clog.c    2 May 2003 21:59:31 -0000    1.14
> --- src/backend/access/transam/clog.c    2 May 2003 22:09:26 -0000
> ***************
> *** 157,163 ****
>    * The value is automatically inherited by backends via fork, and
>    * doesn't need to be in shared memory.
>    */
> ! static LWLockId ClogBufferLocks[NUM_CLOG_BUFFERS];        /* Per-buffer I/O locks */
>
>   /*
>    * ClogDir is set during CLOGShmemInit and does not change thereafter.
> --- 157,163 ----
>    * The value is automatically inherited by backends via fork, and
>    * doesn't need to be in shared memory.
>    */
> ! static LWLockId *ClogBufferLocks;        /* Per-buffer I/O locks */
>
>   /*
>    * ClogDir is set during CLOGShmemInit and does not change thereafter.
> ***************
> *** 271,311 ****
>   /*
>    * Initialization of shared memory for CLOG
>    */
> -
>   int
>   CLOGShmemSize(void)
>   {
> !     return MAXALIGN(sizeof(ClogCtlData) + CLOG_BLCKSZ * NUM_CLOG_BUFFERS);
>   }
>
>   void
>   CLOGShmemInit(void)
>   {
>       bool        found;
> -     char       *bufptr;
>       int            slotno;
>
>       /* this must agree with space requested by CLOGShmemSize() */
> !     ClogCtl = (ClogCtlData *)
> !         ShmemInitStruct("CLOG Ctl",
> !                         MAXALIGN(sizeof(ClogCtlData) +
> !                                  CLOG_BLCKSZ * NUM_CLOG_BUFFERS),
> !                         &found);
> !     Assert(!found);
>
> !     memset(ClogCtl, 0, sizeof(ClogCtlData));
>
> !     bufptr = ((char *) ClogCtl) + sizeof(ClogCtlData);
>
> !     for (slotno = 0; slotno < NUM_CLOG_BUFFERS; slotno++)
> !     {
> !         ClogCtl->page_buffer[slotno] = bufptr;
> !         ClogCtl->page_status[slotno] = CLOG_PAGE_EMPTY;
> !         ClogBufferLocks[slotno] = LWLockAssign();
> !         bufptr += CLOG_BLCKSZ;
>       }
>
> !     /* ClogCtl->latest_page_number will be set later */
>
>       /* Init CLOG directory path */
>       snprintf(ClogDir, MAXPGPATH, "%s/pg_clog", DataDir);
> --- 271,337 ----
>   /*
>    * Initialization of shared memory for CLOG
>    */
>   int
>   CLOGShmemSize(void)
>   {
> !     return MAXALIGN(sizeof(ClogCtlData) + CLOG_BLCKSZ * NUM_CLOG_BUFFERS)
> ! #ifdef EXEC_BACKEND
> !             + MAXALIGN(NUM_CLOG_BUFFERS * sizeof(LWLockId))
> ! #endif
> !     ;
>   }
>
> +
>   void
>   CLOGShmemInit(void)
>   {
>       bool        found;
>       int            slotno;
>
> +     /* Handle ClogCtl */
> +
>       /* this must agree with space requested by CLOGShmemSize() */
> !     ClogCtl = (ClogCtlData *) ShmemInitStruct("CLOG Ctl",
> !                 MAXALIGN(sizeof(ClogCtlData) +
> !                 CLOG_BLCKSZ * NUM_CLOG_BUFFERS), &found);
> !
> !     if (!IsUnderPostmaster)
> !     /* Initialize ClogCtl shared memory area */
> !     {
> !         char       *bufptr;
>
> !         Assert(!found);
>
> !         memset(ClogCtl, 0, sizeof(ClogCtlData));
>
> !         bufptr = (char *)ClogCtl + sizeof(ClogCtlData);
> !
> !         for (slotno = 0; slotno < NUM_CLOG_BUFFERS; slotno++)
> !         {
> !             ClogCtl->page_buffer[slotno] = bufptr;
> !             ClogCtl->page_status[slotno] = CLOG_PAGE_EMPTY;
> !             bufptr += CLOG_BLCKSZ;
> !         }
> !
> !         /* ClogCtl->latest_page_number will be set later */
>       }
> +     else
> +         Assert(found);
>
> !     /* Handle ClogBufferLocks */
> !
> ! #ifdef EXEC_BACKEND
> !     ClogBufferLocks = (LWLockId *) ShmemInitStruct("CLOG Buffer Locks",
> !                         NUM_CLOG_BUFFERS * sizeof(LWLockId), &found);
> !     Assert((!found && !IsUnderPostmaster) || (found && IsUnderPostmaster));
> ! #else
> !     ClogBufferLocks = malloc(NUM_CLOG_BUFFERS * sizeof(LWLockId));
> !     Assert(ClogBufferLocks);
> ! #endif
> !
> !     if (!IsUnderPostmaster)
> !         for (slotno = 0; slotno < NUM_CLOG_BUFFERS; slotno++)
> !             ClogBufferLocks[slotno] = LWLockAssign();
>
>       /* Init CLOG directory path */
>       snprintf(ClogDir, MAXPGPATH, "%s/pg_clog", DataDir);
> Index: src/backend/bootstrap/bootstrap.c
> ===================================================================
> RCS file: /cvsroot/pgsql-server/src/backend/bootstrap/bootstrap.c,v
> retrieving revision 1.150
> diff -c -c -r1.150 bootstrap.c
> *** src/backend/bootstrap/bootstrap.c    2 May 2003 21:59:31 -0000    1.150
> --- src/backend/bootstrap/bootstrap.c    2 May 2003 22:09:28 -0000
> ***************
> *** 301,306 ****
> --- 301,311 ----
>
>       Assert(dbName);
>
> +     if (IsUnderPostmaster && ExecBackend && MyProc /* ordinary backend */)
> +     {
> +         AttachSharedMemoryAndSemaphores();
> +     }
> +
>       if (!IsUnderPostmaster)
>       {
>           if (!potential_DataDir)
> Index: src/backend/postmaster/postmaster.c
> ===================================================================
> RCS file: /cvsroot/pgsql-server/src/backend/postmaster/postmaster.c,v
> retrieving revision 1.319
> diff -c -c -r1.319 postmaster.c
> *** src/backend/postmaster/postmaster.c    2 May 2003 22:02:47 -0000    1.319
> --- src/backend/postmaster/postmaster.c    2 May 2003 22:09:30 -0000
> ***************
> *** 172,177 ****
> --- 172,184 ----
>   static int    ServerSock_UNIX = INVALID_SOCK;        /* stream socket server */
>   #endif
>
> + /* Used to reduce macros tests */
> + #ifdef EXEC_BACKEND
> + const bool ExecBackend = true;
> + #else
> + const bool ExecBackend = false;
> + #endif
> +
>   /*
>    * Set by the -o option
>    */
> ***************
> *** 1407,1413 ****
>           elog(DEBUG1, "processCancelRequest: CheckPointPID in cancel request for process %d", backendPID);
>           return;
>       }
> !
>       /* See if we have a matching backend */
>
>       for (curr = DLGetHead(BackendList); curr; curr = DLGetSucc(curr))
> --- 1414,1424 ----
>           elog(DEBUG1, "processCancelRequest: CheckPointPID in cancel request for process %d", backendPID);
>           return;
>       }
> !     else if (ExecBackend)
> !     {
> !         AttachSharedMemoryAndSemaphores();
> !     }
> !
>       /* See if we have a matching backend */
>
>       for (curr = DLGetHead(BackendList); curr; curr = DLGetSucc(curr))
> Index: src/backend/storage/ipc/ipci.c
> ===================================================================
> RCS file: /cvsroot/pgsql-server/src/backend/storage/ipc/ipci.c,v
> retrieving revision 1.51
> diff -c -c -r1.51 ipci.c
> *** src/backend/storage/ipc/ipci.c    2 May 2003 21:59:31 -0000    1.51
> --- src/backend/storage/ipc/ipci.c    2 May 2003 22:09:30 -0000
> ***************
> *** 134,136 ****
> --- 134,149 ----
>        */
>       PMSignalInit();
>   }
> +
> +
> + /*
> +  * AttachSharedMemoryAndSemaphores
> +  *        Attaches to the existing shared resources when exec()'d off
> +  *        by the postmaster.
> +  */
> + void
> + AttachSharedMemoryAndSemaphores(void)
> + {
> +     CLOGShmemInit();
> + }
> +
> Index: src/backend/tcop/postgres.c
> ===================================================================
> RCS file: /cvsroot/pgsql-server/src/backend/tcop/postgres.c,v
> retrieving revision 1.329
> diff -c -c -r1.329 postgres.c
> *** src/backend/tcop/postgres.c    2 May 2003 21:59:31 -0000    1.329
> --- src/backend/tcop/postgres.c    2 May 2003 22:09:32 -0000
> ***************
> *** 1453,1458 ****
> --- 1453,1459 ----
>                   break;
>           }
>
> +
>       /*
>        * -d is not the same as setting
>        * log_min_messages because it enables other
> ***************
> *** 1577,1582 ****
> --- 1578,1586 ----
>                                    * restart... */
>           }
>           BaseInit();
> + #ifdef EXECBACKEND
> +         AttachSharedMemoryAndSemaphores();
> + #endif
>       }
>       else
>       {
> Index: src/include/miscadmin.h
> ===================================================================
> RCS file: /cvsroot/pgsql-server/src/include/miscadmin.h,v
> retrieving revision 1.120
> diff -c -c -r1.120 miscadmin.h
> *** src/include/miscadmin.h    2 May 2003 21:59:31 -0000    1.120
> --- src/include/miscadmin.h    2 May 2003 22:09:33 -0000
> ***************
> *** 106,111 ****
> --- 106,112 ----
>    */
>   extern bool IsUnderPostmaster;
>   extern bool ClientAuthInProgress;
> + extern const bool ExecBackend;
>
>   extern int    PostmasterMain(int argc, char *argv[]);
>   extern void ClosePostmasterPorts(bool pgstat_too);
> Index: src/include/storage/ipc.h
> ===================================================================
> RCS file: /cvsroot/pgsql-server/src/include/storage/ipc.h,v
> retrieving revision 1.59
> diff -c -c -r1.59 ipc.h
> *** src/include/storage/ipc.h    2 May 2003 21:59:31 -0000    1.59
> --- src/include/storage/ipc.h    2 May 2003 22:09:33 -0000
> ***************
> *** 32,36 ****
> --- 32,37 ----
>   extern void CreateSharedMemoryAndSemaphores(bool makePrivate,
>                                   int maxBackends,
>                                   int port);
> + extern void AttachSharedMemoryAndSemaphores(void);
>
>   #endif   /* IPC_H */

>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/docs/faqs/FAQ.html

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073


pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Clog handling on exec'ed backend
Next
From: Bruce Momjian
Date:
Subject: Cleanup for Win32