Re: [HACKERS] rmtree() failure on Windows - Mailing list pgsql-patches
From | Andrew Dunstan |
---|---|
Subject | Re: [HACKERS] rmtree() failure on Windows |
Date | |
Msg-id | 41803BE7.6060407@dunslane.net Whole thread Raw |
Responses |
Re: [HACKERS] rmtree() failure on Windows
|
List | pgsql-patches |
Tom Lane wrote: > > >Try putting "RequestCheckpoint(true)" in dbcommands.c just before >remove_dbtablespaces (about line 630). > >It looks like the bgwriter is not quite up-to-speed for this, either; >you should rearrange things near line 350 of bgwriter.c so that >smgrcloseall is performed before marking the checkpoint done in shmem. >Else RequestCheckpoint could come back before the files are all closed. > > seems to do the trick. patch attached. > > >>I did wonder if there should be a call that instead of forcing a flush >>could tell bgwriter just to forget about the file(s) because we're >>discarding them. But that was just idle speculation - I haven't looked >>at bgwriter at all. >> >> > >Not necessary, as long as you put the checkpoint after the DropBuffers >call in dbcommands.c. The bgwriter won't find anything to write. > > > > What about other databases? Or won't the forced checkpoint affect them? cheers andrew Index: src/backend/commands/dbcommands.c =================================================================== RCS file: /home/cvsmirror/pgsql/src/backend/commands/dbcommands.c,v retrieving revision 1.145 diff -c -r1.145 dbcommands.c *** src/backend/commands/dbcommands.c 17 Oct 2004 20:47:20 -0000 1.145 --- src/backend/commands/dbcommands.c 27 Oct 2004 23:48:10 -0000 *************** *** 32,37 **** --- 32,38 ---- #include "commands/tablespace.h" #include "mb/pg_wchar.h" #include "miscadmin.h" + #include "postmaster/bgwriter.h" #include "storage/fd.h" #include "storage/freespace.h" #include "storage/sinval.h" *************** *** 625,630 **** --- 626,639 ---- FreeSpaceMapForgetDatabase(db_id); /* + * On Windows, force a checkpoint so that the bgwriter doesn't hold any + * open files, which would cause rmdir() to fail. + */ + #ifdef WIN32 + RequestCheckpoint(true); + #endif + + /* * Remove all tablespace subdirs belonging to the database. */ remove_dbtablespaces(db_id); Index: src/backend/postmaster/bgwriter.c =================================================================== RCS file: /home/cvsmirror/pgsql/src/backend/postmaster/bgwriter.c,v retrieving revision 1.9 diff -c -r1.9 bgwriter.c *** src/backend/postmaster/bgwriter.c 12 Oct 2004 21:54:40 -0000 1.9 --- src/backend/postmaster/bgwriter.c 27 Oct 2004 23:05:10 -0000 *************** *** 347,352 **** --- 347,361 ---- CreateCheckPoint(false, force_checkpoint); /* + * After any checkpoint, close all smgr files. This is so we + * won't hang onto smgr references to deleted files + * indefinitely. (It is safe to do this because this process + * does not have a relcache, and so no dangling references + * could remain.) + */ + smgrcloseall(); + + /* * Indicate checkpoint completion to any waiting backends. */ BgWriterShmem->ckpt_done = BgWriterShmem->ckpt_started; *************** *** 359,373 **** */ last_checkpoint_time = now; - /* - * After any checkpoint, close all smgr files. This is so we - * won't hang onto smgr references to deleted files - * indefinitely. (It is safe to do this because this process - * does not have a relcache, and so no dangling references - * could remain.) - */ - smgrcloseall(); - /* Nap for configured time before rechecking */ n = 1; } --- 368,373 ----
pgsql-patches by date: