Re: [PATCHES] [HACKERS] rmtree() failure on Windows

2004-10-27 Thread Tom Lane
Andrew Dunstan <[EMAIL PROTECTED]> writes:
> Tom Lane wrote:
>> Try putting "RequestCheckpoint(true)" in dbcommands.c just before
>> remove_dbtablespaces (about line 630).

> seems to do the trick. patch attached.

Patch applied.

>> 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?

For them, it's just an ordinary checkpoint.  It's kind of a brute-force
solution, but I'm disinclined to worry about optimizing DROP DATABASE ...

regards, tom lane

---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])


Re: [PATCHES] [HACKERS] rmtree() failure on Windows

2004-10-27 Thread Andrew Dunstan

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 -	1.145
--- src/backend/commands/dbcommands.c	27 Oct 2004 23:48:10 -
***
*** 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 -	1.9
--- src/backend/postmaster/bgwriter.c	27 Oct 2004 23:05:10 -
***
*** 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 

---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]