Re: win32 performance - fsync question

"Magnus Hagander" <[email protected]>
Newsgroups gmane.comp.db.postgresql.devel.general,gmane.comp.db.postgresql.devel.win32
Message-ID <[email protected]>
> Magnus prepared a trivial patch which added the O_SYNC flag 
> for windows and mapped it to FILE_FLAG_WRITE_THROUGH in 
> win32_open.c. 

Attached is this trivial patch. As Merlin says, it needs some more
reliability testing. But the numbers are at least reasonable - it
*seems* like it's doing the right thing (as long as you turn off write
cache). And it's certainly a significant performance increase - it
brings the speed almost up to the same as linux.


//Magnus


---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend
o_sync.patch (application/octet-stream, 3.2 KB)
Index: include/port.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/port.h,v
retrieving revision 1.69
diff -c -r1.69 port.h
*** include/port.h	6 Jan 2005 00:59:25 -0000	1.69
--- include/port.h	17 Feb 2005 21:20:41 -0000
***************
*** 174,180 ****

  #if defined(WIN32) && !defined(__CYGWIN__)

! /* open() replacement to allow delete of held files */
  #ifndef WIN32_CLIENT_ONLY
  extern int	win32_open(const char *, int,...);

--- 174,181 ----

  #if defined(WIN32) && !defined(__CYGWIN__)

! /* open() replacement to allow delete of held files and passing
!  * of special options. */
  #ifndef WIN32_CLIENT_ONLY
  extern int	win32_open(const char *, int,...);

Index: include/port/win32.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/port/win32.h,v
retrieving revision 1.42
diff -c -r1.42 win32.h
*** include/port/win32.h	26 Dec 2004 19:20:33 -0000	1.42
--- include/port/win32.h	17 Feb 2005 21:19:31 -0000
***************
*** 184,189 ****
--- 184,197 ----
  #define lstat(path, sb)	stat((path), (sb))

  /*
+  * Supplement to <fcntl.h>.
+  * This is the same value as _O_NOINHERIT in the MS header file. This is
+  * to ensure that we don't collide with a future definition. It means
+  * we cannot use _O_NOINHERIT ourselves.
+  */
+ #define O_SYNC 0x0080
+
+ /*
   * Supplement to <errno.h>.
   */
  #undef EAGAIN
Index: port/open.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/port/open.c,v
retrieving revision 1.7
diff -c -r1.7 open.c
*** port/open.c	31 Dec 2004 22:03:53 -0000	1.7
--- port/open.c	17 Feb 2005 21:40:12 -0000
***************
*** 13,18 ****
--- 13,19 ----

  #ifdef WIN32

+ #include <postgres.h>
  #include <windows.h>
  #include <fcntl.h>
  #include <errno.h>
***************
*** 62,68 ****
  	/* Check that we can handle the request */
  	assert((fileFlags & ((O_RDONLY | O_WRONLY | O_RDWR) | O_APPEND |
  						 (O_RANDOM | O_SEQUENTIAL | O_TEMPORARY) |
! 						 _O_SHORT_LIVED |
  	  (O_CREAT | O_TRUNC | O_EXCL) | (O_TEXT | O_BINARY))) == fileFlags);

  	sa.nLength = sizeof(sa);
--- 63,69 ----
  	/* Check that we can handle the request */
  	assert((fileFlags & ((O_RDONLY | O_WRONLY | O_RDWR) | O_APPEND |
  						 (O_RANDOM | O_SEQUENTIAL | O_TEMPORARY) |
! 						 _O_SHORT_LIVED | O_SYNC |
  	  (O_CREAT | O_TRUNC | O_EXCL) | (O_TEXT | O_BINARY))) == fileFlags);

  	sa.nLength = sizeof(sa);
***************
*** 81,87 ****
  				 ((fileFlags & O_RANDOM) ? FILE_FLAG_RANDOM_ACCESS : 0) |
  		   ((fileFlags & O_SEQUENTIAL) ? FILE_FLAG_SEQUENTIAL_SCAN : 0) |
  		  ((fileFlags & _O_SHORT_LIVED) ? FILE_ATTRIBUTE_TEMPORARY : 0) |
! 			 ((fileFlags & O_TEMPORARY) ? FILE_FLAG_DELETE_ON_CLOSE : 0),
  						NULL)) == INVALID_HANDLE_VALUE)
  	{
  		switch (GetLastError())
--- 82,89 ----
  				 ((fileFlags & O_RANDOM) ? FILE_FLAG_RANDOM_ACCESS : 0) |
  		   ((fileFlags & O_SEQUENTIAL) ? FILE_FLAG_SEQUENTIAL_SCAN : 0) |
  		  ((fileFlags & _O_SHORT_LIVED) ? FILE_ATTRIBUTE_TEMPORARY : 0) |
! 			 ((fileFlags & O_TEMPORARY) ? FILE_FLAG_DELETE_ON_CLOSE : 0)|
! 					((fileFlags & O_SYNC) ? FILE_FLAG_WRITE_THROUGH : 0),
  						NULL)) == INVALID_HANDLE_VALUE)
  	{
  		switch (GetLastError())
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.