From 2746e5f21d4dce07ee55c58b2035ff631470577f Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Sat, 11 Sep 2010 15:48:04 +0000 Subject: Introduce latches. A latch is a boolean variable, with the capability to wait until it is set. Latches can be used to reliably wait until a signal arrives, which is hard otherwise because signals don't interrupt select() on some platforms, and even when they do, there's race conditions. On Unix, latches use the so called self-pipe trick under the covers to implement the sleep until the latch is set, without race conditions. On Windows, Windows events are used. Use the new latch abstraction to sleep in walsender, so that as soon as a transaction finishes, walsender is woken up to immediately send the WAL to the standby. This reduces the latency between master and standby, which is good. Preliminary work by Fujii Masao. The latch implementation is by me, with helpful comments from many people. --- src/include/replication/walsender.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/include/replication') diff --git a/src/include/replication/walsender.h b/src/include/replication/walsender.h index 891fea57bc..87e01207c1 100644 --- a/src/include/replication/walsender.h +++ b/src/include/replication/walsender.h @@ -5,7 +5,7 @@ * * Portions Copyright (c) 2010-2010, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/include/replication/walsender.h,v 1.4 2010/06/17 00:06:34 itagaki Exp $ + * $PostgreSQL: pgsql/src/include/replication/walsender.h,v 1.5 2010/09/11 15:48:04 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -13,6 +13,7 @@ #define _WALSENDER_H #include "access/xlog.h" +#include "storage/latch.h" #include "storage/spin.h" /* @@ -24,6 +25,12 @@ typedef struct WalSnd XLogRecPtr sentPtr; /* WAL has been sent up to this point */ slock_t mutex; /* locks shared variables shown above */ + + /* + * Latch used by backends to wake up this walsender when it has work + * to do. + */ + Latch latch; } WalSnd; /* There is one WalSndCtl struct for the whole database cluster */ @@ -45,5 +52,6 @@ extern int WalSenderMain(void); extern void WalSndSignals(void); extern Size WalSndShmemSize(void); extern void WalSndShmemInit(void); +extern void WalSndWakeup(void); #endif /* _WALSENDER_H */ -- cgit v1.2.1