sashapolo commented on code in PR #7101:
URL: https://github.com/apache/ignite-3/pull/7101#discussion_r2598776410
##########
modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/segstore/SegmentInfo.java:
##########
@@ -168,29 +201,74 @@ int size() {
void saveOffsetsTo(ByteBuffer buffer) {
ArrayWithSize offsets = segmentFileOffsets;
+ assert offsets.size() > 0 : "Offsets array must not be empty";
+
buffer.asIntBuffer().put(offsets.array, 0, offsets.size);
}
/**
* Removes all data which log indices are strictly greater than {@code
lastLogIndexKept}.
*/
- void truncateSuffix(long lastLogIndexKept) {
+ SegmentInfo truncateSuffix(long lastLogIndexKept) {
assert lastLogIndexKept >= logIndexBase :
String.format("logIndexBase=%d, lastLogIndexKept=%d", logIndexBase,
lastLogIndexKept);
ArrayWithSize segmentFileOffsets = this.segmentFileOffsets;
- long newSize = lastLogIndexKept - logIndexBase + 1;
+ long lastLogIndexExclusive = logIndexBase + segmentFileOffsets.size();
- // Not using an assertion here, because this value comes doesn't come
from the storage code.
- if (newSize > segmentFileOffsets.size()) {
+ // Not using an assertion here, because this value doesn't come from
the storage code.
+ if (lastLogIndexKept >= lastLogIndexExclusive) {
throw new IllegalArgumentException(String.format(
"lastLogIndexKept is too large. Last index in memtable:
%d, lastLogIndexKept: %d",
- logIndexBase + segmentFileOffsets.size() - 1,
lastLogIndexKept
+ lastLogIndexExclusive - 1, lastLogIndexKept
));
}
- ArrayWithSize newSegmentFileOffsets =
segmentFileOffsets.truncate((int) newSize);
+ int newSize = toIntExact(lastLogIndexKept - logIndexBase + 1);
+
+ setSegmentFileOffsets(segmentFileOffsets,
segmentFileOffsets.truncateSuffix(newSize));
+
+ // This could have been a "void" method, but this way it looks
consistent with "truncatePrefix".
+ return this;
Review Comment:
> could you please explain in a comment why exactly one of the methods could
be void, while the other can't?
Isn't it obvious from the code? There's an immutable part and a mutable part
of an object. If you need to change the immutable part, you need to create a
new object.
--
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]