ibessonov commented on code in PR #6723:
URL: https://github.com/apache/ignite-3/pull/6723#discussion_r2416554531
##########
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?
If so, can this file be closed before someone attempts to read from the log
entry?
If so, how can it be safe?
--
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]