Search Postgresql Archives

Re: Autovacuum daemon terminated by signal 11

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Alvaro Herrera <alvherre@xxxxxxxxxxxxxxxxx> writes:
> Hmm, in retrospect this is pretty obviously buggy.  I can't say that
> it's that easy for me to reproduce it though; I definitely can't make it
> crash.  Maybe by sheer luck, the new TopTransactionContext pointer
> points to the same memory area that the old was stored in.

Yeah, there could be some platform dependency involved.  I'm guessing
different structs that happen to fall into the same palloc size category
on one platform but not another.

Anyway, it happens consistently on my HP box.  I find that your proposed
patch fixes it, but makes the "normal" path crash :-( --- the loop in
do_autovacuum has to be executed in AutovacMemCxt, because it creates an
Oid List that gets passed to vacuum() and had better not be in a
transaction-lifetime context.  The attached modified patch works for me.

			regards, tom lane

Index: autovacuum.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/postmaster/autovacuum.c,v
retrieving revision 1.5.2.8
diff -c -r1.5.2.8 autovacuum.c
*** autovacuum.c	17 Jan 2008 23:47:07 -0000	1.5.2.8
--- autovacuum.c	17 Jan 2009 15:31:05 -0000
***************
*** 925,937 ****
  						  bool freeze)
  {
  	VacuumStmt *vacstmt;
- 	MemoryContext old_cxt;
  
  	/*
  	 * The node must survive transaction boundaries, so make sure we create it
  	 * in a long-lived context
  	 */
! 	old_cxt = MemoryContextSwitchTo(AutovacMemCxt);
  
  	vacstmt = makeNode(VacuumStmt);
  
--- 925,936 ----
  						  bool freeze)
  {
  	VacuumStmt *vacstmt;
  
  	/*
  	 * The node must survive transaction boundaries, so make sure we create it
  	 * in a long-lived context
  	 */
! 	MemoryContextSwitchTo(AutovacMemCxt);
  
  	vacstmt = makeNode(VacuumStmt);
  
***************
*** 957,963 ****
  	vacuum(vacstmt, relids);
  
  	pfree(vacstmt);
! 	MemoryContextSwitchTo(old_cxt);
  }
  
  /*
--- 956,964 ----
  	vacuum(vacstmt, relids);
  
  	pfree(vacstmt);
! 
! 	/* Make sure we end up pointing to the long-lived context at exit */
! 	MemoryContextSwitchTo(AutovacMemCxt);
  }
  
  /*
-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux