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