On Tue, Feb 14, 2012 at 08:23:10PM -0500, Bruce Momjian wrote:
> On Wed, Feb 15, 2012 at 01:35:05AM +0200, Marko Kreen wrote:
> > On Tue, Feb 14, 2012 at 05:59:06PM -0500, Tom Lane wrote:
> > > Bruce Momjian <br...@momjian.us> writes:
> > > > On Mon, Feb 13, 2012 at 08:28:03PM -0500, Tom Lane wrote:
> > > >> +1, I was about to suggest the same thing.  Running any of these tests
> > > >> for a fixed number of iterations will result in drastic degradation of
> > > >> accuracy as soon as the machine's behavior changes noticeably from what
> > > >> you were expecting.  Run them for a fixed time period instead.  Or 
> > > >> maybe
> > > >> do a few, then check elapsed time and estimate a number of iterations 
> > > >> to
> > > >> use, if you're worried about the cost of doing gettimeofday after each
> > > >> write.
> > > 
> > > > Good idea, and it worked out very well.  I changed the -o loops
> > > > parameter to -s seconds which calls alarm() after (default) 2 seconds,
> > > > and then once the operation completes, computes a duration per
> > > > operation.
> > > 
> > > I was kind of wondering how portable alarm() is, and the answer
> > > according to the buildfarm is that it isn't.
> > 
> > I'm using following simplistic alarm() implementation for win32:
> > 
> >   https://github.com/markokr/libusual/blob/master/usual/signal.c#L21
> > 
> > this works with fake sigaction()/SIGALARM hack below - to remember
> > function to call.
> > 
> > Good enough for simple stats printing, and avoids win32-specific
> > code spreading around.
> 
> Wow, I wasn't even aware this compiled in Win32;  I thought it was
> ifdef'ed out.  Anyway, I am looking at SetTimer as a way of making this
> work.  (Me wonders if the GoGrid Windows images have compilers.)
> 
> I see backend/port/win32/timer.c so I might go with a simple "create a
> thread, sleep(2), set flag, exit" solution.

Yeah, two Windows buildfarm machines have now successfully compiled my
patches, so I guess I fixed it;  patch attached.

The fix was surprisingly easy given the use of threads;  scheduling the
timeout in the operating system was just too invasive.

I would like to eventually know if this fix actually produces the right
output.  How would I test that?  Are the buildfarm output binaries
available somewhere?  Should I add this as a 9.2 TODO item?

-- 
  Bruce Momjian  <br...@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/contrib/pg_test_fsync/pg_test_fsync.c b/contrib/pg_test_fsync/pg_test_fsync.c
new file mode 100644
index 02a9e21..7f92bc8
*** a/contrib/pg_test_fsync/pg_test_fsync.c
--- b/contrib/pg_test_fsync/pg_test_fsync.c
***************
*** 28,39 ****
--- 28,54 ----
  #define OPS_FORMAT			"%9.3f ops/sec"
  
  /* These are macros to avoid timing the function call overhead. */
+ #ifndef WIN32
  #define START_TIMER	\
  do { \
  	alarm_triggered = false; \
  	alarm(secs_per_test); \
  	gettimeofday(&start_t, NULL); \
  } while (0)
+ #else
+ /* WIN32 doesn't support alarm, so we create a thread and sleep there */
+ #define START_TIMER	\
+ do { \
+ 	alarm_triggered = false; \
+ 	if (CreateThread(NULL, 0, process_alarm, NULL, 0, NULL) == \
+ 		INVALID_HANDLE_VALUE) \
+ 	{ \
+ 		fprintf(stderr, "Cannot create thread for alarm\n"); \
+ 		exit(1); \
+ 	} \
+ 	gettimeofday(&start_t, NULL); \
+ } while (0)
+ #endif
  
  #define STOP_TIMER	\
  do { \
*************** static void test_sync(int writes_per_op)
*** 62,68 ****
--- 77,87 ----
  static void test_open_syncs(void);
  static void test_open_sync(const char *msg, int writes_size);
  static void test_file_descriptor_sync(void);
+ #ifndef WIN32
  static void process_alarm(int sig);
+ #else
+ static DWORD WINAPI process_alarm(LPVOID param);
+ #endif
  static void signal_cleanup(int sig);
  
  #ifdef HAVE_FSYNC_WRITETHROUGH
*************** main(int argc, char *argv[])
*** 82,88 ****
--- 101,109 ----
  	/* Prevent leaving behind the test file */
  	signal(SIGINT, signal_cleanup);
  	signal(SIGTERM, signal_cleanup);
+ #ifndef WIN32
  	signal(SIGALRM, process_alarm);
+ #endif
  #ifdef SIGHUP
  	/* Not defined on win32 */
  	signal(SIGHUP, signal_cleanup);
*************** print_elapse(struct timeval start_t, str
*** 550,560 ****
--- 571,592 ----
  	printf(OPS_FORMAT "\n", per_second);
  }
  
+ #ifndef WIN32
  static void
  process_alarm(int sig)
  {
  	alarm_triggered = true;
  }
+ #else
+ static DWORD WINAPI
+ process_alarm(LPVOID param)
+ {
+ 	/* WIN32 doesn't support alarm, so we create a thread and sleep here */
+ 	Sleep(secs_per_test * 1000);
+ 	alarm_triggered = true;
+ 	ExitThread(0);
+ }
+ #endif
  
  static void
  die(const char *str)
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to