/** * Indicates whether this segment can be merged with the given {@code other} segment. * <p> * Two segments can be merged when their mask is identical, and the only difference in SegmentID is in the first * 1-bit of their mask. * * @param other the Segment to verify mergeability for * @return {@code true} if the segments can be merged, otherwise {@code false} */ public boolean isMergeableWith(Segment other) { return this.mask == other.mask && mergeableSegmentId() == other.getSegmentId(); }
@Override public String toString() { return String.format("Segment[%d/%s]", getSegmentId(), getMask()); }
private static boolean computeSegments(Segment segment, List<Integer> segments, Set<Segment> applicableSegments) { final Segment[] splitSegment = segment.split(); // As the first segmentId mask, keeps the original segmentId, we only check the 2nd segmentId mask being a know. if (segments.contains(splitSegment[1].getSegmentId())) { for (Segment segmentSplit : splitSegment) { if (!computeSegments(segmentSplit, segments, applicableSegments)) { applicableSegments.add(segmentSplit); } } } else { applicableSegments.add(segment); } return true; }
private void checkSegmentCaughtUp(Segment segment, BlockingStream<TrackedEventMessage<?>> eventStream) { if (!eventStream.hasNextAvailable()) { activeSegments.computeIfPresent(segment.getSegmentId(), (k, v) -> v.caughtUp()); } }
@Override public void run() { try { processingLoop(segment); } catch (Throwable e) { logger.error("Processing loop ended due to uncaught exception. Pausing processor in Error State.", e); state.set(State.PAUSED_ERROR); } finally { activeSegments.remove(segment.getSegmentId()); if (availableThreads.getAndIncrement() == 0 && getState().isRunning()) { logger.info("No Worker Launcher active. Using current thread to assign segments."); new WorkerLauncher().run(); } } }
private void releaseToken(Segment segment) { try { transactionManager.executeInTransaction(() -> tokenStore.releaseClaim(getName(), segment.getSegmentId())); } catch (Exception e) { // Ignore exception } }
private BlockingStream<TrackedEventMessage<?>> ensureEventStreamOpened( BlockingStream<TrackedEventMessage<?>> eventStreamIn, Segment segment) { BlockingStream<TrackedEventMessage<?>> eventStream = eventStreamIn; if (eventStream == null && state.get().isRunning()) { final TrackingToken trackingToken = transactionManager.fetchInTransaction( () -> tokenStore.fetchToken(getName(), segment.getSegmentId()) ); logger.info("Fetched token: {} for segment: {}", trackingToken, segment); eventStream = transactionManager.fetchInTransaction( () -> doOpenStream(trackingToken)); } return eventStream; }
Segment segment = segments[i]; if (!activeSegments.containsKey(segment.getSegmentId()) && canClaimSegment(segment.getSegmentId())) { try { transactionManager.executeInTransaction(() -> { TrackingToken token = tokenStore.fetchToken(processorName, segment.getSegmentId()); activeSegments.putIfAbsent(segment.getSegmentId(), new TrackerStatus(segment, token)); }); } catch (UnableToClaimTokenException ucte) { segment.getSegmentId()); activeSegments.remove(segment.getSegmentId()); continue; } catch (Exception e) { activeSegments.remove(segment.getSegmentId()); if (AxonNonTransientException.isCauseOf(e)) { logger.error( "An unrecoverable error has occurred wile attempting to claim a token " + "for segment: {}. Shutting down processor [{}].", segment.getSegmentId(), getName(), "An error occurred while attempting to claim a token for segment: {}. " + "Will retry later...", segment.getSegmentId(),
long errorWaitTime = 1; try { while (state.get().isRunning() && canClaimSegment(segment.getSegmentId())) { try { eventStream = ensureEventStreamOpened(eventStream, segment); } catch (UnableToClaimTokenException e) { logger.info("Segment is owned by another node. Releasing thread to process another segment..."); releaseSegment(segment.getSegmentId()); } catch (Exception e) {
TrackingToken finalLastToken = lastToken; transactionManager.executeInTransaction( () -> tokenStore.storeToken(finalLastToken, getName(), segment.getSegmentId()) ); activeSegments.computeIfPresent(segment.getSegmentId(), (k, v) -> v.advancedTo(finalLastToken)); return; () -> tokenStore.extendClaim(getName(), segment.getSegmentId()) ); return; unitOfWork.resources().put(segmentIdResourceKey, segment.getSegmentId()); unitOfWork.resources().put(lastTokenResourceKey, finalLastToken); processInUnitOfWork(batch, unitOfWork, segment); activeSegments.computeIfPresent(segment.getSegmentId(), (k, v) -> v.advancedTo(finalLastToken)); } catch (InterruptedException e) { logger.error(String.format("Event processor [%s] was interrupted. Shutting down.", getName()), e);
/** * Indicates whether this segment can be merged with the given {@code other} segment. * <p> * Two segments can be merged when their mask is identical, and the only difference in SegmentID is in the first * 1-bit of their mask. * * @param other the Segment to verify mergeability for * @return {@code true} if the segments can be merged, otherwise {@code false} */ public boolean isMergeableWith(Segment other) { return this.mask == other.mask && mergeableSegmentId() == other.getSegmentId(); }
/** * Indicates whether this segment can be merged with the given {@code other} segment. * <p> * Two segments can be merged when their mask is identical, and the only difference in SegmentID is in the first * 1-bit of their mask. * * @param other the Segment to verify mergeability for * @return {@code true} if the segments can be merged, otherwise {@code false} */ public boolean isMergeableWith(Segment other) { return this.mask == other.mask && mergeableSegmentId() == other.getSegmentId(); }
@Override public String toString() { return String.format("Segment[%d/%s]", getSegmentId(), getMask()); }
@Override public String toString() { return String.format("Segment[%d/%s]", getSegmentId(), getMask()); }
private void checkSegmentCaughtUp(Segment segment, MessageStream<TrackedEventMessage<?>> eventStream) { if (!eventStream.hasNextAvailable()) { activeSegments.computeIfPresent(segment.getSegmentId(), (k, v) -> v.caughtUp()); } }
private void checkSegmentCaughtUp(Segment segment, BlockingStream<TrackedEventMessage<?>> eventStream) { if (!eventStream.hasNextAvailable()) { activeSegments.computeIfPresent(segment.getSegmentId(), (k, v) -> v.caughtUp()); } }
private void releaseToken(Segment segment) { try { transactionManager.executeInTransaction(() -> tokenStore.releaseClaim(getName(), segment.getSegmentId())); } catch (Exception e) { // whatever. } }
private void releaseToken(Segment segment) { try { transactionManager.executeInTransaction(() -> tokenStore.releaseClaim(getName(), segment.getSegmentId())); } catch (Exception e) { // Ignore exception } }
private MessageStream<TrackedEventMessage<?>> ensureEventStreamOpened( MessageStream<TrackedEventMessage<?>> eventStreamIn, Segment segment) { MessageStream<TrackedEventMessage<?>> eventStream = eventStreamIn; if (eventStream == null && state.get().isRunning()) { final TrackingToken trackingToken = transactionManager.fetchInTransaction(() -> tokenStore.fetchToken(getName(), segment.getSegmentId())); logger.info("Fetched token: {} for segment: {}", trackingToken, segment); eventStream = transactionManager.fetchInTransaction( () -> doOpenStream(trackingToken)); } return eventStream; }
private BlockingStream<TrackedEventMessage<?>> ensureEventStreamOpened( BlockingStream<TrackedEventMessage<?>> eventStreamIn, Segment segment) { BlockingStream<TrackedEventMessage<?>> eventStream = eventStreamIn; if (eventStream == null && state.get().isRunning()) { final TrackingToken trackingToken = transactionManager.fetchInTransaction( () -> tokenStore.fetchToken(getName(), segment.getSegmentId()) ); logger.info("Fetched token: {} for segment: {}", trackingToken, segment); eventStream = transactionManager.fetchInTransaction( () -> doOpenStream(trackingToken)); } return eventStream; }