private SegmentWithRange findReplacedSegment(Segment segment) { return segments.values() .stream() .filter(withRange -> withRange.getSegment().equals(segment)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("Segment to be replaced should be present in the segment list")); }
/** * This combines consecutive entries in the map that refer to the same segment. * This happens following a merge because the preceeding segments are replaced one at a time. */ private void removeDuplicates(NavigableMap<Double, SegmentWithRange> result) { Segment last = null; for (Iterator<SegmentWithRange> iterator = result.descendingMap().values().iterator(); iterator.hasNext();) { SegmentWithRange current = iterator.next(); if (current.getSegment().equals(last)) { iterator.remove(); } last = current.getSegment(); } }
@Override public int compareTo(Revision o) { Preconditions.checkArgument(segment.equals(o.asImpl().getSegment())); int result = Long.compare(offsetInSegment, o.asImpl().offsetInSegment); return result != 0 ? result : Integer.compare(eventAtOffset, o.asImpl().eventAtOffset); }
@GuardedBy("readers") private void releaseSegmentsIfNeeded() throws ReaderNotInReaderGroupException { Segment segment = groupState.findSegmentToReleaseIfRequired(); if (segment != null) { log.info("{} releasing segment {}", this, segment); EventSegmentReader reader = readers.stream().filter(r -> r.getSegmentId().equals(segment)).findAny().orElse(null); if (reader != null) { if (groupState.releaseSegment(segment, reader.getOffset(), getLag())) { readers.remove(reader); reader.close(); } } } }