public class V3PGReplicationStream extends Object implements PGReplicationStream
Modifier and Type | Field and Description |
---|---|
static long |
POSTGRES_EPOCH_2000_01_01 |
Constructor and Description |
---|
V3PGReplicationStream(CopyDual copyDual,
LogSequenceNumber startLSN,
long updateIntervalMs,
ReplicationType replicationType) |
Modifier and Type | Method and Description |
---|---|
void |
close()
Stop replication changes from server and free resources.
|
void |
forceUpdateStatus()
Force send last received, flushed and applied LSN status to backend.
|
LogSequenceNumber |
getLastAppliedLSN()
Last applied lsn sent in update message to backed.
|
LogSequenceNumber |
getLastFlushedLSN()
Last flushed LSN sent in update message to backend.
|
LogSequenceNumber |
getLastReceiveLSN()
Parameter updates by execute
PGReplicationStream.read() method. |
boolean |
isClosed() |
@Nullable ByteBuffer |
read()
Read next wal record from backend.
|
@Nullable ByteBuffer |
readPending()
Read next WAL record from backend.
|
void |
setAppliedLSN(LogSequenceNumber applied)
Inform backend which LSN has been applied on standby.
|
void |
setFlushedLSN(LogSequenceNumber flushed)
Set flushed LSN.
|
public static final long POSTGRES_EPOCH_2000_01_01
public V3PGReplicationStream(CopyDual copyDual, LogSequenceNumber startLSN, long updateIntervalMs, ReplicationType replicationType)
copyDual
- bidirectional copy protocolstartLSN
- the position in the WAL that we want to initiate replication from
usually the currentLSN returned by calling pg_current_wal_lsn()for v10
above or pg_current_xlog_location() depending on the version of the
serverupdateIntervalMs
- the number of millisecond between status packets sent back to the
server. A value of zero disables the periodic status updates
completely, although an update will still be sent when requested by the
server, to avoid timeout disconnect.replicationType
- LOGICAL or PHYSICALpublic @Nullable ByteBuffer read() throws SQLException
PGReplicationStream
Read next wal record from backend. It method can be block until new message will not get from server.
A single WAL record is never split across two XLogData messages. When a WAL record crosses a WAL page boundary, and is therefore already split using continuation records, it can be split at the page boundary. In other words, the first main WAL record and its continuation records can be sent in different XLogData messages.
read
in interface PGReplicationStream
ByteBuffer.array()
carefullySQLException
- when some internal exception occurs during read from streampublic @Nullable ByteBuffer readPending() throws SQLException
PGReplicationStream
Read next WAL record from backend. This method does not block and in contrast to PGReplicationStream.read()
. If message from backend absent return null. It allow periodically
check message in stream and if they absent sleep some time, but it time should be less than
CommonOptions.getStatusInterval()
to avoid disconnect from the server.
A single WAL record is never split across two XLogData messages. When a WAL record crosses a WAL page boundary, and is therefore already split using continuation records, it can be split at the page boundary. In other words, the first main WAL record and its continuation records can be sent in different XLogData messages.
readPending
in interface PGReplicationStream
ByteBuffer.array()
carefully.SQLException
- when some internal exception occurs during read from streampublic LogSequenceNumber getLastReceiveLSN()
PGReplicationStream
Parameter updates by execute PGReplicationStream.read()
method.
It is safe to call this method in a thread different than the main thread. However, usually this
method is called in the main thread after a successful PGReplicationStream.read()
or
PGReplicationStream.readPending()
, to get the LSN corresponding to the received record.
getLastReceiveLSN
in interface PGReplicationStream
PGReplicationStream.read()
methodpublic LogSequenceNumber getLastFlushedLSN()
PGReplicationStream
Last flushed LSN sent in update message to backend. Parameter updates only via PGReplicationStream.setFlushedLSN(LogSequenceNumber)
It is safe to call this method in a thread different than the main thread.
getLastFlushedLSN
in interface PGReplicationStream
public LogSequenceNumber getLastAppliedLSN()
PGReplicationStream
Last applied lsn sent in update message to backed. Parameter updates only via PGReplicationStream.setAppliedLSN(LogSequenceNumber)
It is safe to call this method in a thread different than the main thread.
getLastAppliedLSN
in interface PGReplicationStream
public void setFlushedLSN(LogSequenceNumber flushed)
PGReplicationStream
Set flushed LSN. This parameter will be sent to backend on next update status iteration. Flushed LSN position help backend define which WAL can be recycled.
It is safe to call this method in a thread different than the main thread. The updated value will be sent to the backend in the next status update run.
setFlushedLSN
in interface PGReplicationStream
flushed
- NOT NULL location of the last WAL flushed to disk in the standby.PGReplicationStream.forceUpdateStatus()
public void setAppliedLSN(LogSequenceNumber applied)
PGReplicationStream
Inform backend which LSN has been applied on standby. Feedback will send to backend on next update status iteration.
It is safe to call this method in a thread different than the main thread. The updated value will be sent to the backend in the next status update run.
setAppliedLSN
in interface PGReplicationStream
applied
- NOT NULL location of the last WAL applied in the standby.PGReplicationStream.forceUpdateStatus()
public void forceUpdateStatus() throws SQLException
PGReplicationStream
PGReplicationStream
sends the status to backend periodically by
configured interval via CommonOptions.getStatusInterval()
forceUpdateStatus
in interface PGReplicationStream
SQLException
- when some internal exception occurs during read from streamCommonOptions.getStatusInterval()
public boolean isClosed()
isClosed
in interface PGReplicationStream
true
if replication stream was already close, otherwise return false
public void close() throws SQLException
PGReplicationStream
Stop replication changes from server and free resources. After that connection can be reuse to another queries. Also after close current stream they cannot be used anymore.
Note: This method can spend much time for logical replication stream on postgresql version 9.6 and lower, because postgresql have bug - during decode big transaction to logical form and during wait new changes postgresql ignore messages from client. As workaround you can close replication connection instead of close replication stream. For more information about it problem see mailing list thread Stopping logical replication protocol
close
in interface AutoCloseable
close
in interface PGReplicationStream
SQLException
- when some internal exception occurs during end streamingCopyright © 1997-2020 PostgreSQL Global Development Group. All Rights Reserved.