sashapolo commented on code in PR #6723:
URL: https://github.com/apache/ignite-3/pull/6723#discussion_r2416783091
##########
modules/raft/src/main/java/org/apache/ignite/raft/jraft/entity/codec/v1/V1Decoder.java:
##########
@@ -53,130 +62,92 @@ public LogEntry decode(final byte[] content) {
}
// Refactored to look closer to Ignites code style.
- private void decode(final LogEntry log, final byte[] content) {
- var reader = new Reader(content);
- reader.pos = LogEntryV1CodecFactory.PAYLOAD_OFFSET;
-
- int typeNumber = (int)reader.readLong();
+ private void decode(final LogEntry log, final ByteBuffer content) {
+ int typeNumber = (int)readLong(content);
EnumOutter.EntryType type =
Objects.requireNonNull(EnumOutter.EntryType.forNumber(typeNumber));
log.setType(type);
- long index = reader.readLong();
- long term = reader.readLong();
+ long index = readLong(content);
+ long term = readLong(content);
log.setId(new LogId(index, term));
- long checksum = Bits.getLongLittleEndian(content, reader.pos);
+ long checksum = content.getLong();
log.setChecksum(checksum);
- int pos = reader.pos + Long.BYTES;
-
// Peers and learners.
if (type != EnumOutter.EntryType.ENTRY_TYPE_DATA) {
- reader.pos = pos;
- int peerCount = (int)reader.readLong();
- pos = reader.pos;
+ int peerCount = (int)readLong(content);
if (peerCount > 0) {
List<PeerId> peers = new ArrayList<>(peerCount);
- pos = readNodesList(reader, pos, content, peerCount, peers);
+ readNodesList(content, peerCount, peers);
log.setPeers(peers);
}
- reader.pos = pos;
- int oldPeerCount = (int)reader.readLong();
- pos = reader.pos;
+ int oldPeerCount = (int)readLong(content);
if (oldPeerCount > 0) {
List<PeerId> oldPeers = new ArrayList<>(oldPeerCount);
- pos = readNodesList(reader, pos, content, oldPeerCount,
oldPeers);
+ readNodesList(content, oldPeerCount, oldPeers);
log.setOldPeers(oldPeers);
}
- reader.pos = pos;
- int learnersCount = (int)reader.readLong();
- pos = reader.pos;
+ int learnersCount = (int)readLong(content);
if (learnersCount > 0) {
List<PeerId> learners = new ArrayList<>(learnersCount);
- pos = readNodesList(reader, pos, content, learnersCount,
learners);
+ readNodesList(content, learnersCount, learners);
log.setLearners(learners);
}
- reader.pos = pos;
- int oldLearnersCount = (int)reader.readLong();
- pos = reader.pos;
+ int oldLearnersCount = (int)readLong(content);
if (oldLearnersCount > 0) {
List<PeerId> oldLearners = new ArrayList<>(oldLearnersCount);
- pos = readNodesList(reader, pos, content, oldLearnersCount,
oldLearners);
+ readNodesList(content, oldLearnersCount, oldLearners);
log.setOldLearners(oldLearners);
}
}
// Data.
if (type != EnumOutter.EntryType.ENTRY_TYPE_CONFIGURATION) {
- if (content.length > pos) {
- int len = content.length - pos;
-
- ByteBuffer data = ByteBuffer.wrap(content, pos, len).slice();
-
- log.setData(data);
+ if (content.remaining() > 0) {
+ log.setData(content.slice());
Review Comment:
> Can content be a direct buffer mapped to a file?
Yes
> If so, can this file be closed before someone attempts to read from the
log entry?
Yes
> If so, how can it be safe?
The byte buffer is not tied to the underlying file in Java, so if the file
is closed, it continues working. However, I guess you are talking about
"logical" closing of the file, like in Ignite 2, where we use reflection to
dispose of the buffer. In this case it will not be safe, so let me run some
benchmarks and think
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]