use of org.zalando.nakadi.exceptions.NakadiException in project nakadi by zalando.
the class StreamingState method reconfigureKafkaConsumer.
private void reconfigureKafkaConsumer(final boolean forceSeek) {
if (eventConsumer == null) {
throw new IllegalStateException("kafkaConsumer should not be null when calling reconfigureKafkaConsumer method");
}
final Set<EventTypePartition> newAssignment = offsets.keySet().stream().filter(o -> !this.releasingPartitions.containsKey(o)).collect(Collectors.toSet());
if (forceSeek) {
// removing all the current assignments for real consumer.
try {
eventConsumer.reassign(Collections.emptyList());
} catch (final NakadiException | InvalidCursorException ex) {
throw new NakadiRuntimeException(ex);
}
}
final Set<EventTypePartition> currentAssignment = eventConsumer.getAssignment();
getLog().info("Changing kafka assignment from {} to {}", Arrays.deepToString(currentAssignment.toArray()), Arrays.deepToString(newAssignment.toArray()));
if (!currentAssignment.equals(newAssignment)) {
try {
final Map<EventTypePartition, NakadiCursor> beforeFirst = getBeforeFirstCursors(newAssignment);
final List<NakadiCursor> cursors = newAssignment.stream().map(pk -> {
final NakadiCursor beforeFirstAvailable = beforeFirst.get(pk);
// Checks that current cursor is still available in storage
offsets.get(pk).ensureDataAvailable(beforeFirstAvailable);
return offsets.get(pk).getSentOffset();
}).collect(Collectors.toList());
eventConsumer.reassign(cursors);
} catch (NakadiException | InvalidCursorException ex) {
throw new NakadiRuntimeException(ex);
}
}
}
use of org.zalando.nakadi.exceptions.NakadiException in project nakadi by zalando.
the class TimelineService method getActiveTimeline.
public Timeline getActiveTimeline(final String eventTypeName) throws TimelineException {
try {
final List<Timeline> timelines = eventTypeCache.getTimelinesOrdered(eventTypeName);
final ListIterator<Timeline> rIterator = timelines.listIterator(timelines.size());
while (rIterator.hasPrevious()) {
final Timeline toCheck = rIterator.previous();
if (toCheck.getSwitchedAt() != null) {
return toCheck;
}
}
throw new TimelineException(String.format("No timelines for event type %s", eventTypeName));
} catch (final NakadiException e) {
LOG.error("Failed to get timeline for event type {}", eventTypeName, e);
throw new TimelineException("Failed to get timeline", e);
}
}
use of org.zalando.nakadi.exceptions.NakadiException in project nakadi by zalando.
the class StartingState method onEnter.
@Override
public void onEnter() {
// 1. Check authorization
getContext().registerForAuthorizationUpdates();
try {
getContext().checkAccessAuthorized();
} catch (final AccessDeniedException e) {
switchState(new CleanupState(new NakadiException(e.explain()) {
@Override
protected Response.StatusType getStatus() {
return Response.Status.FORBIDDEN;
}
}));
return;
}
getZk().runLocked(this::initializeStream);
}
use of org.zalando.nakadi.exceptions.NakadiException in project nakadi by zalando.
the class CursorOperationsService method cursorsLag.
public List<NakadiCursorLag> cursorsLag(final String eventTypeName, final List<NakadiCursor> cursors) throws InvalidCursorOperation {
try {
final List<Timeline> timelines = timelineService.getActiveTimelinesOrdered(eventTypeName);
// Next 2 calls could be optimized to 1 storage call, instead of possible 2 calls.
// But it is simpler not to do anything, cause timelines are not switched every day and almost all the time
// (except retention time after switch) there will be only 1 active timeline, and this option is covered.
final List<PartitionStatistics> oldestStats = getStatsForTimeline(timelines.get(0));
final List<PartitionStatistics> newestStats = timelines.size() == 1 ? oldestStats : getStatsForTimeline(timelines.get(timelines.size() - 1));
return cursors.stream().map(c -> {
final PartitionStatistics oldestStat = oldestStats.stream().filter(item -> item.getPartition().equalsIgnoreCase(c.getPartition())).findAny().orElseThrow(() -> new InvalidCursorOperation(PARTITION_NOT_FOUND));
NakadiCursor newestPosition = newestStats.stream().filter(item -> item.getPartition().equalsIgnoreCase(c.getPartition())).map(PartitionEndStatistics::getLast).findAny().orElseThrow(() -> new InvalidCursorOperation(PARTITION_NOT_FOUND));
// it
while (numberOfEventsBeforeCursor(newestPosition) == -1) {
final int prevOrder = newestPosition.getTimeline().getOrder() - 1;
final Timeline prevTimeline = timelines.stream().filter(t -> t.getOrder() == prevOrder).findAny().orElse(null);
if (null == prevTimeline) {
break;
}
// We moved back, so timeline definitely have latest position set
newestPosition = prevTimeline.getLatestPosition().toNakadiCursor(prevTimeline, newestPosition.getPartition());
}
// calls (in case of kafka)
return new NakadiCursorLag(oldestStat.getFirst(), newestPosition, calculateDistance(c, newestPosition));
}).collect(Collectors.toList());
} catch (final NakadiException e) {
throw new MyNakadiRuntimeException1("error", e);
}
}
use of org.zalando.nakadi.exceptions.NakadiException in project nakadi by zalando.
the class MultiTimelineEventConsumer method readEvents.
@Override
public List<ConsumedEvent> readEvents() {
if (timelinesChanged.compareAndSet(true, false)) {
try {
onTimelinesChanged();
} catch (final NakadiException | InvalidCursorException ex) {
throw new NakadiRuntimeException(ex);
}
}
final List<ConsumedEvent> result = poll();
for (final ConsumedEvent event : result) {
final EventTypePartition etp = event.getPosition().getEventTypePartition();
latestOffsets.put(etp, event.getPosition());
final String border = borderOffsets.get(etp);
final boolean timelineBorderReached = null != border && border.compareTo(event.getPosition().getOffset()) <= 0;
if (timelineBorderReached) {
timelinesChanged.set(true);
}
}
return result;
}
Aggregations