repNode.getVLSNFreezeLatch().awaitThaw();
repNode.getMasterStatus().assertSync();
}
repTxn.commit(syncPolicy,
new ReplicationContext(lastReplayedVLSN),
masterCommit.getMasterNodeId());
Timestamp commitTime = masterCommit.getTime();
lastReplayedTxn = new TxnInfo(lastReplayedVLSN,
commitTime.getTime());
/* Respond to the feeder. */
long commitNanos = System.nanoTime() -
messageProcessingStartTime;
updateCommitStats(needsAck, syncPolicy, commitNanos);
if (commitNanos > ackTimeoutLogThresholdInNanos &&
logger.isLoggable(Level.INFO)) {
LoggerUtils.info
(logger, repImpl,
"Replay commit time: " + (commitNanos / 1000000) +
" ms exceeded log threshold: " +
(ackTimeoutLogThresholdInNanos / 1000000));
}
if (needsAck) {
protocol.write(protocol.new Ack(repTxn.getId()),
namedChannel);
}
/*
* The group refresh and recalculation can be expensive, since
* it may require a database read. Do it after the ack.
*/
if (repTxn.getRepGroupDbChange() && canRefreshGroup(repTxn)) {
repNode.refreshCachedGroup();
repNode.recalculateGlobalCBVLSN();
}
nElapsedTxnTime.add(repTxn.elapsedTime());
} else if (LogEntryType.LOG_TXN_ABORT.equalsType(entryType)) {
nAborts.increment();
TxnAbort masterAbort = (TxnAbort) logEntry.getMainItem();
ReplicationContext abortContext =
new ReplicationContext(wireRecord.getVLSN());
if (logger.isLoggable(Level.FINEST)) {
LoggerUtils.finest(logger, repImpl,
"abort called for " + repTxn.getId() +
" masterId=" +
masterAbort.getMasterNodeId() +