@Override
public void truncate(SegmentHandle handle, long truncationOffset) throws StreamSegmentException {
RollingSegmentHandle h = asReadableHandle(handle);
ensureNotDeleted(h);
Preconditions.checkArgument(h.isSealed() || !h.isReadOnly(), "Can only truncate with a read-only handle if the Segment is Sealed.");
if (h.getHeaderHandle() == null) {
return;
}
long traceId = LoggerHelpers.traceEnter(log, "truncate", h, truncationOffset);
Preconditions.checkArgument(truncationOffset >= 0 && truncationOffset <= h.length(),
"truncationOffset must be non-negative and at most the length of the Segment.");
val last = h.lastChunk();
if (last != null && canTruncate(last, truncationOffset) && !h.isSealed()) {
rollover(h);
deleteChunks(h, s -> canTruncate(s, truncationOffset));
} else {
deleteChunks(h, s -> canTruncate(s, truncationOffset) && s.getLastOffset() < h.length());
}
LoggerHelpers.traceLeave(log, "truncate", traceId, h, truncationOffset);
}