diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-12-08 19:19:22 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-12-08 19:19:22 +0000 |
commit | aaa3dfd26c22be1848c1f613171aca4e588e431c (patch) | |
tree | b5660740508afb1853a3cc5354764c7b1b1b137e /src/backend/postmaster | |
parent | 96e1fbe39670d3bc1a893b98072ef32118c2660f (diff) |
Fix bgwriter's failure to release buffer pins and open files after an
error. This probably explains bug #2099 and could also account for
mysterious VACUUM hangups.
Diffstat (limited to 'src/backend/postmaster')
-rw-r--r-- | src/backend/postmaster/bgwriter.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c index 78fecf4dd6e..c9a8baf25af 100644 --- a/src/backend/postmaster/bgwriter.c +++ b/src/backend/postmaster/bgwriter.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/postmaster/bgwriter.c,v 1.21 2005/10/15 02:49:23 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/bgwriter.c,v 1.22 2005/12/08 19:19:22 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -51,6 +51,7 @@ #include "miscadmin.h" #include "postmaster/bgwriter.h" #include "storage/bufmgr.h" +#include "storage/fd.h" #include "storage/freespace.h" #include "storage/ipc.h" #include "storage/pmsignal.h" @@ -58,6 +59,7 @@ #include "tcop/tcopprot.h" #include "utils/guc.h" #include "utils/memutils.h" +#include "utils/resowner.h" /*---------- @@ -209,6 +211,12 @@ BackgroundWriterMain(void) last_checkpoint_time = time(NULL); /* + * Create a resource owner to keep track of our resources (currently + * only buffer pins). + */ + CurrentResourceOwner = ResourceOwnerCreate(NULL, "Background Writer"); + + /* * Create a memory context that we will do all our work in. We do this so * that we can reset the context during error recovery and thereby avoid * possible memory leaks. Formerly this code just ran in @@ -240,11 +248,18 @@ BackgroundWriterMain(void) /* * These operations are really just a minimal subset of * AbortTransaction(). We don't have very many resources to worry - * about in bgwriter, but we do have LWLocks and buffers. + * about in bgwriter, but we do have LWLocks, buffers, and temp files. */ LWLockReleaseAll(); AbortBufferIO(); UnlockBuffers(); + /* buffer pins are released here: */ + ResourceOwnerRelease(CurrentResourceOwner, + RESOURCE_RELEASE_BEFORE_LOCKS, + false, true); + /* we needn't bother with the other ResourceOwnerRelease phases */ + AtEOXact_Buffers(false); + AtEOXact_Files(); /* Warn any waiting backends that the checkpoint failed. */ if (ckpt_active) |