Re: [HACKERS] Vacuum analyze bug CAUGHT - Mailing list pgsql-hackers
| From | Tom Lane |
|---|---|
| Subject | Re: [HACKERS] Vacuum analyze bug CAUGHT |
| Date | |
| Msg-id | 8284.936895019@sss.pgh.pa.us Whole thread Raw |
| In response to | Re: [HACKERS] Vacuum analyze bug CAUGHT (Tom Lane <tgl@sss.pgh.pa.us>) |
| List | pgsql-hackers |
I wrote:
> appears to be the same bug I alluded to before: memory allocation isn't
> cleaned up properly if elog(ERROR) is executed outside a transaction.
> I know how to fix this, and will do so before 6.5.2, but fixing it will
> just prevent a coredump after an error has already occurred.
Here is the patch to fix that problem; line numbers are for current,
but it should apply to 6.5.1 with small offsets.
Also: have you applied the vc_abort patch discussed a month ago (see
my post in pgsql-patches, 11 Aug)? If not, that could well be the
source of your troubles. You might want to just grab the 6.5.2-beta
tarball and apply this patch, or even better pull the current state
of the REL6_5_PATCHES branch from the CVS server.
regards, tom lane
*** src/include/utils/portal.h.orig Thu Jul 15 21:11:26 1999
--- src/include/utils/portal.h Thu Sep 9 11:59:00 1999
***************
*** 75,80 ****
--- 75,81 ---- extern void PortalDestroy(Portal *portalP); extern void StartPortalAllocMode(AllocMode mode, Size
limit);extern void EndPortalAllocMode(void);
+ extern void PortalResetHeapMemory(Portal portal); extern PortalVariableMemory PortalGetVariableMemory(Portal portal);
externPortalHeapMemory PortalGetHeapMemory(Portal portal);
*** src/backend/utils/mmgr/portalmem.c.orig Sat Jul 17 23:20:03 1999
--- src/backend/utils/mmgr/portalmem.c Thu Sep 9 11:59:36 1999
***************
*** 83,89 **** static void CollectNamedPortals(Portal *portalP, int destroy); static Portal
PortalHeapMemoryGetPortal(PortalHeapMemorycontext); static PortalVariableMemory
PortalHeapMemoryGetVariableMemory(PortalHeapMemorycontext);
- static void PortalResetHeapMemory(Portal portal); static Portal PortalVariableMemoryGetPortal(PortalVariableMemory
context); /* ----------------
--- 83,88 ----
***************
*** 838,844 **** * BadArg if mode is invalid. * ---------------- */
! static void PortalResetHeapMemory(Portal portal) { PortalHeapMemory context;
--- 837,843 ---- * BadArg if mode is invalid. * ---------------- */
! void PortalResetHeapMemory(Portal portal) { PortalHeapMemory context;
*** src/backend/access/transam/xact.c.orig Sun Sep 5 13:12:34 1999
--- src/backend/access/transam/xact.c Thu Sep 9 12:00:23 1999
***************
*** 694,712 **** AtCommit_Memory() { Portal portal;
- MemoryContext portalContext; /* ----------------
! * Release memory in the blank portal.
! * Since EndPortalAllocMode implicitly works on the current context,
! * first make real sure that the blank portal is the selected context.
! * (This is probably not necessary, but seems like a good idea...) * ---------------- */ portal
=GetPortalByName(NULL);
! portalContext = (MemoryContext) PortalGetHeapMemory(portal);
! MemoryContextSwitchTo(portalContext);
! EndPortalAllocMode(); /* ---------------- * Now that we're "out" of a transaction, have the
--- 694,706 ---- AtCommit_Memory() { Portal portal; /* ----------------
! * Release all heap memory in the blank portal. * ---------------- */ portal =
GetPortalByName(NULL);
! PortalResetHeapMemory(portal); /* ---------------- * Now that we're "out" of a transaction, have
the
***************
*** 784,802 **** AtAbort_Memory() { Portal portal;
- MemoryContext portalContext; /* ----------------
! * Release memory in the blank portal.
! * Since EndPortalAllocMode implicitly works on the current context,
! * first make real sure that the blank portal is the selected context.
! * (This is ESSENTIAL in case we aborted from someplace where it wasn't.) * ---------------- */
portal= GetPortalByName(NULL);
! portalContext = (MemoryContext) PortalGetHeapMemory(portal);
! MemoryContextSwitchTo(portalContext);
! EndPortalAllocMode(); /* ---------------- * Now that we're "out" of a transaction, have the
--- 778,790 ---- AtAbort_Memory() { Portal portal; /* ----------------
! * Release all heap memory in the blank portal. * ---------------- */ portal =
GetPortalByName(NULL);
! PortalResetHeapMemory(portal); /* ---------------- * Now that we're "out" of a transaction, have
the
pgsql-hackers by date: