WAIT FOR WAIT FOR 7 SQL - Language Statements WAIT FOR wait for target LSN to be replayed, optionally with a timeout WAIT FOR LSN 'lsn' [ WITH ( option [, ...] ) ] where option can be: TIMEOUT 'timeout' NO_THROW Description Waits until recovery replays lsn. If no timeout is specified or it is set to zero, this command waits indefinitely for the lsn. On timeout, or if the server is promoted before lsn is reached, an error is emitted, unless NO_THROW is specified in the WITH clause. If NO_THROW is specified, then the command doesn't throw errors. The possible return values are success, timeout, and not in recovery. Parameters lsn Specifies the target LSN to wait for. WITH ( option [, ...] ) This clause specifies optional parameters for the wait operation. The following parameters are supported: TIMEOUT 'timeout' When specified and timeout is greater than zero, the command waits until lsn is reached or the specified timeout has elapsed. The timeout might be given as integer number of milliseconds. Also it might be given as string literal with integer number of milliseconds or a number with unit (see ). NO_THROW Specify to not throw an error in the case of timeout or running on the primary. In this case the result status can be get from the return value. Outputs success This return value denotes that we have successfully reached the target lsn. timeout This return value denotes that the timeout happened before reaching the target lsn. not in recovery This return value denotes that the database server is not in a recovery state. This might mean either the database server was not in recovery at the moment of receiving the command, or it was promoted before reaching the target lsn. Notes WAIT FOR command waits till lsn to be replayed on standby. That is, after this command execution, the value returned by pg_last_wal_replay_lsn should be greater or equal to the lsn value. This is useful to achieve read-your-writes-consistency, while using async replica for reads and primary for writes. In that case, the lsn of the last modification should be stored on the client application side or the connection pooler side. WAIT FOR command should be called on standby. If a user runs WAIT FOR on primary, it will error out unless NO_THROW is specified in the WITH clause. However, if WAIT FOR is called on primary promoted from standby and lsn was already replayed, then the WAIT FOR command just exits immediately. Examples You can use WAIT FOR command to wait for the pg_lsn value. For example, an application could update the movie table and get the lsn after changes just made. This example uses pg_current_wal_insert_lsn on primary server to get the lsn given that synchronous_commit could be set to off. postgres=# UPDATE movie SET genre = 'Dramatic' WHERE genre = 'Drama'; UPDATE 100 postgres=# SELECT pg_current_wal_insert_lsn(); pg_current_wal_insert_lsn -------------------- 0/306EE20 (1 row) Then an application could run WAIT FOR with the lsn obtained from primary. After that the changes made on primary should be guaranteed to be visible on replica. postgres=# WAIT FOR LSN '0/306EE20'; status -------- success (1 row) postgres=# SELECT * FROM movie WHERE genre = 'Drama'; genre ------- (0 rows) If the target LSN is not reached before the timeout, the error is thrown. postgres=# WAIT FOR LSN '0/306EE20' WITH (TIMEOUT '0.1s'); ERROR: timed out while waiting for target LSN 0/306EE20 to be replayed; current replay LSN 0/306EA60 The same example uses WAIT FOR with NO_THROW option. postgres=# WAIT FOR LSN '0/306EE20' WITH (TIMEOUT '100ms', NO_THROW); status -------- timeout (1 row)