@Synchronized Set<String> getStreamNames() { Set<String> result = new HashSet<>(); for (Map<Segment, Long> segments : assignedSegments.values()) { for (Segment segment : segments.keySet()) { result.add(segment.getScopedStreamName()); } } for (Segment segment : unassignedSegments.keySet()) { result.add(segment.getScopedStreamName()); } return result; }
private void handleTruncation() { log.info(this + " Encountered truncation"); Revision revision = getRevisionToReadFrom(false); log.trace("Fetching updates after {} ", revision); boolean foundInit = false; val iter = client.readFrom(revision); while (!foundInit && iter.hasNext()) { Entry<Revision, UpdateOrInit<StateT>> entry = iter.next(); if (entry.getValue().isInit()) { log.trace("Found entry {} ", entry.getValue()); InitialUpdate<StateT> init = entry.getValue().getInit(); if (isNewer(entry.getKey())) { updateCurrentState(init.create(segment.getScopedStreamName(), entry.getKey())); foundInit = true; } } } if (!foundInit) { throw new IllegalStateException("Data was truncated but there is not init after the truncation point."); } fetchUpdates(); }
@Override public CompletableFuture<StreamSegmentsWithPredecessors> getSuccessors(Segment segment) { final Stream segmentStream = Stream.of(segment.getScopedStreamName()); final CompletableFuture<StreamSegmentsWithPredecessors> result = new CompletableFuture<>(); if (!createdStreams.containsKey(segmentStream)) { result.completeExceptionally(new RuntimeException("Stream is deleted")); } else { result.complete(new StreamSegmentsWithPredecessors(Collections.emptyMap(), "")); } return result; }
@Override public void fetchUpdates() { Revision revision = getRevisionToReadFrom(true); log.trace("Fetching updates after {} ", revision); try { val iter = client.readFrom(revision); while (iter.hasNext()) { Entry<Revision, UpdateOrInit<StateT>> entry = iter.next(); log.trace("Found entry {} ", entry.getValue()); if (entry.getValue().isInit()) { InitialUpdate<StateT> init = entry.getValue().getInit(); if (isNewer(entry.getKey())) { updateCurrentState(init.create(segment.getScopedStreamName(), entry.getKey())); } } else { applyUpdates(entry.getKey().asImpl(), entry.getValue().getUpdates()); } } } catch (TruncatedDataException e) { log.warn("{} encountered truncation on segment {}", this, segment); handleTruncation(); } }
@Override public void initialize(InitialUpdate<StateT> initial) { Revision result = client.writeConditionally(client.fetchOldestRevision(), new UpdateOrInit<>(initial)); if (result == null) { fetchUpdates(); } else { updateCurrentState(initial.create(segment.getScopedStreamName(), result)); } }
name.append("/"); name.append(stream); assertEquals(name.toString(), pointerRead.asImpl().getSegment().getScopedStreamName());