use of org.apache.ratis.util.AutoCloseableLock in project incubator-ratis by apache.
the class MemoryRaftLog method append.
@Override
public long append(long term, RaftConfiguration newConf) {
checkLogState();
try (AutoCloseableLock writeLock = writeLock()) {
final long nextIndex = getNextIndex();
final LogEntryProto e = ServerProtoUtils.toLogEntryProto(newConf, term, nextIndex);
entries.add(e);
return nextIndex;
}
}
use of org.apache.ratis.util.AutoCloseableLock in project incubator-ratis by apache.
the class RaftLog method append.
/**
* Generate a log entry for the given term and message, and append the entry.
* Used by the leader.
* @return the index of the new log entry.
*/
public long append(long term, TransactionContext operation, ClientId clientId, long callId) throws StateMachineException {
checkLogState();
try (AutoCloseableLock writeLock = writeLock()) {
final long nextIndex = getNextIndex();
// the SM wants to attach a logic depending on ordered execution in the log commit order.
try {
operation = operation.preAppendTransaction();
} catch (IOException e) {
throw new StateMachineException(selfId, e);
}
// build the log entry after calling the StateMachine
final LogEntryProto e = ProtoUtils.toLogEntryProto(operation.getSMLogEntry(), term, nextIndex, clientId, callId);
int entrySize = e.getSerializedSize();
if (entrySize > maxBufferSize) {
throw new StateMachineException(selfId, new RaftLogIOException("Log entry size " + entrySize + " exceeds the max buffer limit of " + maxBufferSize));
}
appendEntry(e);
operation.setLogEntry(e);
return nextIndex;
}
}
use of org.apache.ratis.util.AutoCloseableLock in project incubator-ratis by apache.
the class RaftLog method append.
/**
* Generate a log entry for the given term and configurations,
* and append the entry. Used by the leader.
* @return the index of the new log entry.
*/
public long append(long term, RaftConfiguration newConf) {
checkLogState();
try (AutoCloseableLock writeLock = writeLock()) {
final long nextIndex = getNextIndex();
final LogEntryProto e = ServerProtoUtils.toLogEntryProto(newConf, term, nextIndex);
appendEntry(e);
return nextIndex;
}
}
use of org.apache.ratis.util.AutoCloseableLock in project incubator-ratis by apache.
the class SegmentedRaftLog method close.
@Override
public void close() throws IOException {
try (AutoCloseableLock writeLock = writeLock()) {
super.close();
cache.clear();
}
fileLogWorker.close();
storage.close();
}
use of org.apache.ratis.util.AutoCloseableLock in project incubator-ratis by apache.
the class SegmentedRaftLog method loadLogSegments.
private void loadLogSegments(long lastIndexInSnapshot, Consumer<LogEntryProto> logConsumer) throws IOException {
try (AutoCloseableLock writeLock = writeLock()) {
List<LogPathAndIndex> paths = storage.getStorageDir().getLogSegmentFiles();
int i = 0;
for (LogPathAndIndex pi : paths) {
boolean isOpen = pi.endIndex == RaftServerConstants.INVALID_LOG_INDEX;
// During the initial loading, we can only confirm the committed
// index based on the snapshot. This means if a log segment is not kept
// in cache after the initial loading, later we have to load its content
// again for updating the state machine.
// TODO we should let raft peer persist its committed index periodically
// so that during the initial loading we can apply part of the log
// entries to the state machine
boolean keepEntryInCache = (paths.size() - i++) <= cache.getMaxCachedSegments();
cache.loadSegment(pi, isOpen, keepEntryInCache, logConsumer);
}
// committing the log and taking snapshot)
if (!cache.isEmpty() && cache.getEndIndex() < lastIndexInSnapshot) {
LOG.warn("End log index {} is smaller than last index in snapshot {}", cache.getEndIndex(), lastIndexInSnapshot);
cache.clear();
// TODO purge all segment files
}
}
}
Aggregations