&& segments.stream().mapToLong(Segment::count).sum() + segment.count() <= storage.maxEntriesPerSegment()) { segments.add(segment);
&& segments.stream().mapToLong(Segment::count).sum() + segment.count() <= storage.maxEntriesPerSegment()) { segments.add(segment);
&& segments.stream().mapToLong(Segment::count).sum() + segment.count() <= storage.maxEntriesPerSegment()) { segments.add(segment);
/** * Compacts a group. */ private Segment compactGroup(List<Segment> segments, List<OffsetPredicate> predicates) { // Get the first segment which contains the first index being compacted. The compact segment will be written // as a newer version of the earliest segment being rewritten. Segment firstSegment = segments.iterator().next(); // Create a compacted segment with a newer version to which to rewrite the segment entries. Segment compactSegment = manager.createSegment(SegmentDescriptor.builder() .withId(firstSegment.descriptor().id()) .withVersion(firstSegment.descriptor().version() + 1) .withIndex(firstSegment.descriptor().index()) .withMaxSegmentSize(Math.max(segments.stream().mapToLong(s -> s.descriptor().maxSegmentSize()).max().getAsLong(), manager.storage().maxSegmentSize())) .withMaxEntries(Math.max(segments.stream().mapToInt(s -> s.descriptor().maxEntries()).max().getAsInt(), manager.storage().maxEntriesPerSegment())) .build()); compactGroup(segments, predicates, compactSegment); // Replace the rewritten segments with the updated segment. manager.replaceSegments(segments, compactSegment); return compactSegment; }
/** * Compacts a group. */ private Segment compactGroup(List<Segment> segments, List<OffsetPredicate> predicates) { // Get the first segment which contains the first index being compacted. The compact segment will be written // as a newer version of the earliest segment being rewritten. Segment firstSegment = segments.iterator().next(); // Create a compacted segment with a newer version to which to rewrite the segment entries. Segment compactSegment = manager.createSegment(SegmentDescriptor.builder() .withId(firstSegment.descriptor().id()) .withVersion(firstSegment.descriptor().version() + 1) .withIndex(firstSegment.descriptor().index()) .withMaxSegmentSize(Math.max(segments.stream().mapToLong(s -> s.descriptor().maxSegmentSize()).max().getAsLong(), manager.storage().maxSegmentSize())) .withMaxEntries(Math.max(segments.stream().mapToInt(s -> s.descriptor().maxEntries()).max().getAsInt(), manager.storage().maxEntriesPerSegment())) .build()); compactGroup(segments, predicates, compactSegment); // Replace the rewritten segments with the updated segment. manager.replaceSegments(segments, compactSegment); return compactSegment; }
/** * Opens the segments. */ private void open() { // Load existing log segments from disk. for (Segment segment : loadSegments()) { segments.put(segment.descriptor().index(), segment); } // If a segment doesn't already exist, create an initial segment starting at index 1. if (!segments.isEmpty()) { currentSegment = segments.lastEntry().getValue(); } else { SegmentDescriptor descriptor = SegmentDescriptor.builder() .withId(1) .withVersion(1) .withIndex(1) .withMaxSegmentSize(storage.maxSegmentSize()) .withMaxEntries(storage.maxEntriesPerSegment()) .build(); descriptor.lock(); currentSegment = createSegment(descriptor); currentSegment.descriptor().update(System.currentTimeMillis()); currentSegment.descriptor().lock(); segments.put(1L, currentSegment); } }
/** * Opens the segments. */ private void open() { // Load existing log segments from disk. for (Segment segment : loadSegments()) { segments.put(segment.descriptor().index(), segment); } // If a segment doesn't already exist, create an initial segment starting at index 1. if (!segments.isEmpty()) { currentSegment = segments.lastEntry().getValue(); } else { SegmentDescriptor descriptor = SegmentDescriptor.builder() .withId(1) .withVersion(1) .withIndex(1) .withMaxSegmentSize(storage.maxSegmentSize()) .withMaxEntries(storage.maxEntriesPerSegment()) .build(); descriptor.lock(); currentSegment = createSegment(descriptor); currentSegment.descriptor().update(System.currentTimeMillis()); currentSegment.descriptor().lock(); segments.put(1L, currentSegment); } }
/** * Opens the segments. */ private void open() { // Load existing log segments from disk. for (Segment segment : loadSegments()) { segments.put(segment.descriptor().index(), segment); } // If a segment doesn't already exist, create an initial segment starting at index 1. if (!segments.isEmpty()) { currentSegment = segments.lastEntry().getValue(); } else { SegmentDescriptor descriptor = SegmentDescriptor.builder() .withId(1) .withVersion(1) .withIndex(1) .withMaxSegmentSize(storage.maxSegmentSize()) .withMaxEntries(storage.maxEntriesPerSegment()) .build(); descriptor.lock(); currentSegment = createSegment(descriptor); currentSegment.descriptor().update(System.currentTimeMillis()); currentSegment.descriptor().lock(); segments.put(1l, currentSegment); } }
/** * Resets the current segment, creating a new segment if necessary. */ private synchronized void resetCurrentSegment() { Segment lastSegment = lastSegment(); if (lastSegment != null) { currentSegment = lastSegment; } else { SegmentDescriptor descriptor = SegmentDescriptor.builder() .withId(1) .withVersion(1) .withIndex(1) .withMaxSegmentSize(storage.maxSegmentSize()) .withMaxEntries(storage.maxEntriesPerSegment()) .build(); descriptor.lock(); currentSegment = createSegment(descriptor); segments.put(1L, currentSegment); } }
/** * Resets the current segment, creating a new segment if necessary. */ private void resetCurrentSegment() { Segment lastSegment = lastSegment(); if (lastSegment != null) { currentSegment = lastSegment; } else { SegmentDescriptor descriptor = SegmentDescriptor.builder() .withId(1) .withVersion(1) .withIndex(1) .withMaxSegmentSize(storage.maxSegmentSize()) .withMaxEntries(storage.maxEntriesPerSegment()) .build(); descriptor.lock(); currentSegment = createSegment(descriptor); segments.put(1L, currentSegment); } }
/** * Resets the current segment, creating a new segment if necessary. */ private synchronized void resetCurrentSegment() { Segment lastSegment = lastSegment(); if (lastSegment != null) { currentSegment = lastSegment; } else { SegmentDescriptor descriptor = SegmentDescriptor.builder() .withId(1) .withVersion(1) .withIndex(1) .withMaxSegmentSize(storage.maxSegmentSize()) .withMaxEntries(storage.maxEntriesPerSegment()) .build(); descriptor.lock(); currentSegment = createSegment(descriptor); segments.put(1L, currentSegment); } }
/** * Creates and returns the next segment. * * @return The next segment. * @throws IllegalStateException if the segment manager is not open */ public Segment nextSegment() { assertOpen(); Segment lastSegment = lastSegment(); SegmentDescriptor descriptor = SegmentDescriptor.builder() .withId(lastSegment != null ? lastSegment.descriptor().id() + 1 : 1) .withVersion(1) .withIndex(currentSegment.lastIndex() + 1) .withMaxSegmentSize(storage.maxSegmentSize()) .withMaxEntries(storage.maxEntriesPerSegment()) .build(); descriptor.lock(); currentSegment = createSegment(descriptor); segments.put(descriptor.index(), currentSegment); return currentSegment; }
/** * Creates and returns the next segment. * * @return The next segment. * @throws IllegalStateException if the segment manager is not open */ public synchronized Segment nextSegment() { assertOpen(); Segment lastSegment = lastSegment(); SegmentDescriptor descriptor = SegmentDescriptor.builder() .withId(lastSegment != null ? lastSegment.descriptor().id() + 1 : 1) .withVersion(1) .withIndex(currentSegment.lastIndex() + 1) .withMaxSegmentSize(storage.maxSegmentSize()) .withMaxEntries(storage.maxEntriesPerSegment()) .build(); descriptor.lock(); currentSegment = createSegment(descriptor); segments.put(descriptor.index(), currentSegment); return currentSegment; }
/** * Creates and returns the next segment. * * @return The next segment. * @throws IllegalStateException if the segment manager is not open */ public synchronized Segment nextSegment() { assertOpen(); Segment lastSegment = lastSegment(); SegmentDescriptor descriptor = SegmentDescriptor.builder() .withId(lastSegment != null ? lastSegment.descriptor().id() + 1 : 1) .withVersion(1) .withIndex(currentSegment.lastIndex() + 1) .withMaxSegmentSize(storage.maxSegmentSize()) .withMaxEntries(storage.maxEntriesPerSegment()) .build(); descriptor.lock(); currentSegment = createSegment(descriptor); segments.put(descriptor.index(), currentSegment); return currentSegment; }