Thread

  1. RE: [HACKERS] backend freezeing on win32 fixed (I hope ;-) )

    Horak Daniel <horak@mmp.plzen-city.cz> — 1999-08-17T12:06:26Z

    > In any case, when one backend quits and another one is 
    > started, the new
    > one will re-use the semaphore no longer used by the defunct backend.
    
    I have tested my solution a bit more and I have to say that reusing a
    semaphore by a new backend works OK. But it is not possible for a newly
    created backend to use a semaphore allocated by postmaster (it freezes on
    test if the semaphore with given key already exists - done with
    semId=semget(semKey, 0, 0) in function IpcSemaphoreCreate() in
    storage/ipc/ipc.c ). Why it is, I don't know, but it seems that my solution
    uses the ipc library in the right way. There are no longer any error
    messages from the ipc library when running the server. And I can't say that
    the ipc library is a 100% correct implementation of SysV IPC, it is probably
    (sure ;-) )caused by the Windows internals.
    
    			Dan
    
    
  2. Re: [HACKERS] backend freezeing on win32 fixed (I hope ;-) )

    Bruce Momjian <maillist@candle.pha.pa.us> — 1999-08-17T14:41:28Z

    [Charset iso-8859-1 unsupported, filtering to ASCII...]
    > > In any case, when one backend quits and another one is 
    > > started, the new
    > > one will re-use the semaphore no longer used by the defunct backend.
    > 
    > I have tested my solution a bit more and I have to say that reusing a
    > semaphore by a new backend works OK. But it is not possible for a newly
    > created backend to use a semaphore allocated by postmaster (it freezes on
    > test if the semaphore with given key already exists - done with
    > semId=semget(semKey, 0, 0) in function IpcSemaphoreCreate() in
    > storage/ipc/ipc.c ). Why it is, I don't know, but it seems that my solution
    > uses the ipc library in the right way. There are no longer any error
    > messages from the ipc library when running the server. And I can't say that
    > the ipc library is a 100% correct implementation of SysV IPC, it is probably
    > (sure ;-) )caused by the Windows internals.
    
    Seems we may have to use the patch, or make some other patch for NT-only
    that works around this NT bug.
    
    -- 
      Bruce Momjian                        |  http://www.op.net/~candle
      maillist@candle.pha.pa.us            |  (610) 853-3000
      +  If your life is a hard drive,     |  830 Blythe Avenue
      +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
    
    
  3. RE: [HACKERS] backend freezeing on win32 fixed (I hope ;-) )

    Hiroshi Inoue <inoue@tpf.co.jp> — 1999-08-17T23:45:28Z

    > -----Original Message-----
    > From: owner-pgsql-hackers@postgreSQL.org
    > [mailto:owner-pgsql-hackers@postgreSQL.org]On Behalf Of Horak Daniel
    > Sent: Tuesday, August 17, 1999 9:06 PM
    > To: 'Tom Lane'
    > Cc: 'pgsql-hackers@postgreSQL.org'
    > Subject: RE: [HACKERS] backend freezeing on win32 fixed (I hope ;-) )
    >
    >
    > > In any case, when one backend quits and another one is
    > > started, the new
    > > one will re-use the semaphore no longer used by the defunct backend.
    >
    > I have tested my solution a bit more and I have to say that reusing a
    > semaphore by a new backend works OK. But it is not possible for a newly
    > created backend to use a semaphore allocated by postmaster (it freezes on
    > test if the semaphore with given key already exists - done with
    > semId=semget(semKey, 0, 0) in function IpcSemaphoreCreate() in
    > storage/ipc/ipc.c ). Why it is, I don't know, but it seems that
    > my solution
    > uses the ipc library in the right way. There are no longer any error
    > messages from the ipc library when running the server. And I
    > can't say that
    > the ipc library is a 100% correct implementation of SysV IPC, it
    > is probably
    > (sure ;-) )caused by the Windows internals.
    >
    
    Yutaka Tanida [yutaka@marin.or.jp] and I have examined IPC
    library.
    
    We found that postmaster doesn't call exec() after fork() since v6.4.
    
    The value of static/extern variables which cygipc library holds may
    be different from their initial values when postmaster fork()s child
    backend processes.
    
    I made the following patch for cygipc library on trial.
    This patch was effective for Yutaka's test case.
    
    Regards.
    
    Hiroshi Inoue
    Inoue@tpf.co.jp
    
    *** sem.c.orig	Tue Dec 01 00:16:25 1998
    --- sem.c	Tue Aug 17 13:22:06 1999
    ***************
    *** 58,63 ****
    --- 58,78 ----
      static int		  GFirstSem	 = 0;		/*PCPC*/
      static int		  GFdSem	    ;		/*PCPC*/
    
    + static pid_t	GProcessId = 0;
    +
    + static void	init_globals(void)
    + {
    + 	pid_t pid;
    +
    + 	if (pid=getpid(), pid != GProcessId)
    + 	{
    + 		GFirstSem = 0;
    + 		used_sems = used_semids = max_semid = 0;
    + 		sem_seq = 0;
    + 		GProcessId = pid;
    + 	}
    + }
    +
      /************************************************************************/
      /* Demande d'acces a la zone partagee de gestion des semaphores		*/
      /************************************************************************/
    ***************
    *** 77,82 ****
    --- 92,98 ----
      {
          int LRet ;
    
    + 	init_globals();
          if( GFirstSem == 0 )
          {
      	if( IsGSemSemExist() )
    *** shm.c.orig	Tue Dec 01 01:04:57 1998
    --- shm.c	Tue Aug 17 13:22:27 1999
    ***************
    *** 59,64 ****
    --- 59,81 ----
      static int		  GFirstShm	 = 0;		/*PCPC*/
      static int		  GFdShm	    ;		/*PCPC*/
    
    + /*****************************************/
    + /*	Initialization of static variables   */
    + /*****************************************/
    + static pid_t GProcessId = 0;
    + static void init_globals(void)
    + {
    + 	pid_t pid;
    +
    + 	if (pid=getpid(), pid != GProcessId)
    + 	{
    + 		GFirstShm = 0;
    + 		shm_rss = shm_swp = max_shmid = 0;
    + 		shm_seq = 0;
    + 		GProcessId = pid;
    + 	}
    + }
    +
      /************************************************************************/
      /* Demande d'acces a la zone partagee de gestion des shm		*/
      /************************************************************************/
    ***************
    *** 82,87 ****
    --- 99,105 ----
      {
       int LRet ;
    
    +  init_globals();
       if( GFirstShm == 0 )
       {
        if( IsGSemShmExist() )
    *** msg.c.orig	Tue Dec 01 00:16:09 1998
    --- msg.c	Tue Aug 17 13:20:04 1999
    ***************
    *** 57,62 ****
    --- 57,77 ----
      static int		  GFirstMsg	 = 0;		/*PCPC*/
      static int		  GFdMsg	    ;		/*PCPC*/
    
    + /*****************************************/
    + /*	Initialization of static variables   */
    + /*****************************************/
    + static pid_t GProcessId = 0;
    + static void init_globals(void)
    + {
    + 	pid_t pid;
    +
    + 	if (pid=getpid(), pid != GProcessId)
    + 	{
    + 		GFirstMsg = 0;
    + 		msgbytes = msghdrs = msg_seq = used_queues = max_msqid = 0;
    + 		GProcessId = pid;
    + 	}
    + }
      /************************************************************************/
      /* Demande d'acces a la zone partagee de gestion des semaphores		*/
      /************************************************************************/
    ***************
    *** 79,84 ****
    --- 94,100 ----
      {
       int LRet ;
    
    +  init_globals();
       if( GFirstMsg == 0 )
       {
        if( IsGSemMsgExist() )
    
    
    
  4. Re: [HACKERS] backend freezeing on win32 fixed (I hope ;-) )

    Bruce Momjian <maillist@candle.pha.pa.us> — 1999-09-27T18:32:34Z

    I have added this to the end of the README.NT file.
    
    
    
    [Charset iso-8859-1 unsupported, filtering to ASCII...]
    > > -----Original Message-----
    > > From: owner-pgsql-hackers@postgreSQL.org
    > > [mailto:owner-pgsql-hackers@postgreSQL.org]On Behalf Of Horak Daniel
    > > Sent: Tuesday, August 17, 1999 9:06 PM
    > > To: 'Tom Lane'
    > > Cc: 'pgsql-hackers@postgreSQL.org'
    > > Subject: RE: [HACKERS] backend freezeing on win32 fixed (I hope ;-) )
    > >
    > >
    > > > In any case, when one backend quits and another one is
    > > > started, the new
    > > > one will re-use the semaphore no longer used by the defunct backend.
    > >
    > > I have tested my solution a bit more and I have to say that reusing a
    > > semaphore by a new backend works OK. But it is not possible for a newly
    > > created backend to use a semaphore allocated by postmaster (it freezes on
    > > test if the semaphore with given key already exists - done with
    > > semId=semget(semKey, 0, 0) in function IpcSemaphoreCreate() in
    > > storage/ipc/ipc.c ). Why it is, I don't know, but it seems that
    > > my solution
    > > uses the ipc library in the right way. There are no longer any error
    > > messages from the ipc library when running the server. And I
    > > can't say that
    > > the ipc library is a 100% correct implementation of SysV IPC, it
    > > is probably
    > > (sure ;-) )caused by the Windows internals.
    > >
    > 
    > Yutaka Tanida [yutaka@marin.or.jp] and I have examined IPC
    > library.
    > 
    > We found that postmaster doesn't call exec() after fork() since v6.4.
    > 
    > The value of static/extern variables which cygipc library holds may
    > be different from their initial values when postmaster fork()s child
    > backend processes.
    > 
    > I made the following patch for cygipc library on trial.
    > This patch was effective for Yutaka's test case.
    > 
    > Regards.
    > 
    > Hiroshi Inoue
    > Inoue@tpf.co.jp
    > 
    > *** sem.c.orig	Tue Dec 01 00:16:25 1998
    > --- sem.c	Tue Aug 17 13:22:06 1999
    > ***************
    > *** 58,63 ****
    > --- 58,78 ----
    >   static int		  GFirstSem	 = 0;		/*PCPC*/
    >   static int		  GFdSem	    ;		/*PCPC*/
    > 
    > + static pid_t	GProcessId = 0;
    > +
    > + static void	init_globals(void)
    > + {
    > + 	pid_t pid;
    > +
    > + 	if (pid=getpid(), pid != GProcessId)
    > + 	{
    > + 		GFirstSem = 0;
    > + 		used_sems = used_semids = max_semid = 0;
    > + 		sem_seq = 0;
    > + 		GProcessId = pid;
    > + 	}
    > + }
    > +
    >   /************************************************************************/
    >   /* Demande d'acces a la zone partagee de gestion des semaphores		*/
    >   /************************************************************************/
    > ***************
    > *** 77,82 ****
    > --- 92,98 ----
    >   {
    >       int LRet ;
    > 
    > + 	init_globals();
    >       if( GFirstSem == 0 )
    >       {
    >   	if( IsGSemSemExist() )
    > *** shm.c.orig	Tue Dec 01 01:04:57 1998
    > --- shm.c	Tue Aug 17 13:22:27 1999
    > ***************
    > *** 59,64 ****
    > --- 59,81 ----
    >   static int		  GFirstShm	 = 0;		/*PCPC*/
    >   static int		  GFdShm	    ;		/*PCPC*/
    > 
    > + /*****************************************/
    > + /*	Initialization of static variables   */
    > + /*****************************************/
    > + static pid_t GProcessId = 0;
    > + static void init_globals(void)
    > + {
    > + 	pid_t pid;
    > +
    > + 	if (pid=getpid(), pid != GProcessId)
    > + 	{
    > + 		GFirstShm = 0;
    > + 		shm_rss = shm_swp = max_shmid = 0;
    > + 		shm_seq = 0;
    > + 		GProcessId = pid;
    > + 	}
    > + }
    > +
    >   /************************************************************************/
    >   /* Demande d'acces a la zone partagee de gestion des shm		*/
    >   /************************************************************************/
    > ***************
    > *** 82,87 ****
    > --- 99,105 ----
    >   {
    >    int LRet ;
    > 
    > +  init_globals();
    >    if( GFirstShm == 0 )
    >    {
    >     if( IsGSemShmExist() )
    > *** msg.c.orig	Tue Dec 01 00:16:09 1998
    > --- msg.c	Tue Aug 17 13:20:04 1999
    > ***************
    > *** 57,62 ****
    > --- 57,77 ----
    >   static int		  GFirstMsg	 = 0;		/*PCPC*/
    >   static int		  GFdMsg	    ;		/*PCPC*/
    > 
    > + /*****************************************/
    > + /*	Initialization of static variables   */
    > + /*****************************************/
    > + static pid_t GProcessId = 0;
    > + static void init_globals(void)
    > + {
    > + 	pid_t pid;
    > +
    > + 	if (pid=getpid(), pid != GProcessId)
    > + 	{
    > + 		GFirstMsg = 0;
    > + 		msgbytes = msghdrs = msg_seq = used_queues = max_msqid = 0;
    > + 		GProcessId = pid;
    > + 	}
    > + }
    >   /************************************************************************/
    >   /* Demande d'acces a la zone partagee de gestion des semaphores		*/
    >   /************************************************************************/
    > ***************
    > *** 79,84 ****
    > --- 94,100 ----
    >   {
    >    int LRet ;
    > 
    > +  init_globals();
    >    if( GFirstMsg == 0 )
    >    {
    >     if( IsGSemMsgExist() )
    > 
    > 
    > 
    
    
    -- 
      Bruce Momjian                        |  http://www.op.net/~candle
      maillist@candle.pha.pa.us            |  (610) 853-3000
      +  If your life is a hard drive,     |  830 Blythe Avenue
      +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026