@Override public String toString() { return "LSN{" + asString() + '}'; } }
/** * Formats a LSN long value as a String value which can be used for outputting user-friendly LSN values. * * @param lsn the LSN value * @return a String format of the value, never {@code null} */ static String format(long lsn) { return LogSequenceNumber.valueOf(lsn).asString(); }
/** * START_REPLICATION [SLOT slot_name] [PHYSICAL] XXX/XXX. */ private String createStartPhysicalQuery(PhysicalReplicationOptions options) { StringBuilder builder = new StringBuilder(); builder.append("START_REPLICATION"); if (options.getSlotName() != null) { builder.append(" SLOT ").append(options.getSlotName()); } builder.append(" PHYSICAL ").append(options.getStartLSNPosition().asString()); return builder.toString(); }
private ByteBuffer processXLogData(ByteBuffer buffer) { long startLsn = buffer.getLong(); lastServerLSN = LogSequenceNumber.valueOf(buffer.getLong()); long systemClock = buffer.getLong(); switch (replicationType) { case LOGICAL: lastReceiveLSN = LogSequenceNumber.valueOf(startLsn); break; case PHYSICAL: int payloadSize = buffer.limit() - buffer.position(); lastReceiveLSN = LogSequenceNumber.valueOf(startLsn + payloadSize); break; } if (LOGGER.isLoggable(Level.FINEST)) { LOGGER.log(Level.FINEST, " <=BE XLogData(currWal: {0}, lastServerWal: {1}, clock: {2})", new Object[]{lastReceiveLSN.asString(), lastServerLSN.asString(), systemClock}); } return buffer.slice(); }
private byte[] prepareUpdateStatus(LogSequenceNumber received, LogSequenceNumber flushed, LogSequenceNumber applied, boolean replyRequired) { ByteBuffer byteBuffer = ByteBuffer.allocate(1 + 8 + 8 + 8 + 8 + 1); long now = System.currentTimeMillis(); long systemClock = TimeUnit.MICROSECONDS.convert((now - POSTGRES_EPOCH_2000_01_01), TimeUnit.MICROSECONDS); if (LOGGER.isLoggable(Level.FINEST)) { LOGGER.log(Level.FINEST, " FE=> StandbyStatusUpdate(received: {0}, flushed: {1}, applied: {2}, clock: {3})", new Object[]{received.asString(), flushed.asString(), applied.asString(), new Date(now)}); } byteBuffer.put((byte) 'r'); byteBuffer.putLong(received.asLong()); byteBuffer.putLong(flushed.asLong()); byteBuffer.putLong(applied.asLong()); byteBuffer.putLong(systemClock); if (replyRequired) { byteBuffer.put((byte) 1); } else { byteBuffer.put(received == LogSequenceNumber.INVALID_LSN ? (byte) 1 : (byte) 0); } lastStatusUpdate = now; return byteBuffer.array(); }
private boolean processKeepAliveMessage(ByteBuffer buffer) { lastServerLSN = LogSequenceNumber.valueOf(buffer.getLong()); if (lastServerLSN.asLong() > lastReceiveLSN.asLong()) { lastReceiveLSN = lastServerLSN; } long lastServerClock = buffer.getLong(); boolean replyRequired = buffer.get() != 0; if (LOGGER.isLoggable(Level.FINEST)) { Date clockTime = new Date( TimeUnit.MILLISECONDS.convert(lastServerClock, TimeUnit.MICROSECONDS) + POSTGRES_EPOCH_2000_01_01); LOGGER.log(Level.FINEST, " <=BE Keepalive(lastServerWal: {0}, clock: {1} needReply: {2})", new Object[]{lastServerLSN.asString(), clockTime, replyRequired}); } return replyRequired; }
/** * START_REPLICATION SLOT slot_name LOGICAL XXX/XXX [ ( option_name [option_value] [, ... ] ) ] */ private String createStartLogicalQuery(LogicalReplicationOptions options) { StringBuilder builder = new StringBuilder(); builder.append("START_REPLICATION SLOT ") .append(options.getSlotName()) .append(" LOGICAL ") .append(options.getStartLSNPosition().asString()); Properties slotOptions = options.getSlotOptions(); if (slotOptions.isEmpty()) { return builder.toString(); } //todo replace on java 8 builder.append(" ("); boolean isFirst = true; for (String name : slotOptions.stringPropertyNames()) { if (isFirst) { isFirst = false; } else { builder.append(", "); } builder.append('\"').append(name).append('\"').append(" ") .append('\'').append(slotOptions.getProperty(name)).append('\''); } builder.append(")"); return builder.toString(); }
@Override public ReplicationStream startStreaming(Long offset) throws SQLException, InterruptedException { connect(); if (offset == null || offset <= 0) { offset = defaultStartingPos; } LogSequenceNumber lsn = LogSequenceNumber.valueOf(offset); LOGGER.debug("starting streaming from LSN '{}'", lsn.asString()); return createReplicationStream(lsn); }
/** * Formats a LSN long value as a String value which can be used for outputting user-friendly LSN values. * * @param lsn the LSN value * @return a String format of the value, never {@code null} */ static String format(long lsn) { return LogSequenceNumber.valueOf(lsn).asString(); }
@Override public ReplicationStream startStreaming(Long offset) throws SQLException, InterruptedException { connect(); if (offset == null || offset <= 0) { offset = defaultStartingPos; } LogSequenceNumber lsn = LogSequenceNumber.valueOf(offset); LOGGER.debug("starting streaming from LSN '{}'", lsn.asString()); return createReplicationStream(lsn); }