public int getPartitionId() { return logStream.getPartitionId(); }
@Override public void stop(ServiceStopContext stopContext) { stopContext.async(logStream.closeAppender()); }
private void commitPositionOnSingleNode() { final long commitPosition = logStream.getLogStorageAppender().getCurrentAppenderPosition() - 1; if (initialEventPosition >= 0 && commitPosition >= initialEventPosition && logStream.getCommitPosition() < commitPosition) { logStream.setCommitPosition(commitPosition); } }
public void wrap(LogStream logStream) { this.logStream = logStream; this.blockIndex = logStream.getLogBlockIndex(); this.logStorage = logStream.getLogStorage(); clear(); }
@Override public void wrap(final LogStream logStream) { this.logStream = logStream; this.logWriteBuffer = logStream.getWriteBuffer(); this.logId = logStream.getPartitionId(); reset(); }
/** * Truncates events with getPosition greater than the argument. Includes committed events. Resets * commit getPosition to the argument getPosition. * * @param position exclusive (unlike {@link LogStream#truncate(long)}!) */ public void truncate(final String stream, final long position) { final LogStream logStream = getLogStream(stream); try (final LogStreamReader reader = new BufferedLogStreamReader(logStream)) { logStream.closeAppender().get(); reader.seek(position + 1); logStream.setCommitPosition(position); if (reader.hasNext()) { logStream.truncate(reader.next().getPosition()); } logStream.setCommitPosition(Long.MAX_VALUE); logStream.openAppender().get(); } catch (final Exception e) { throw new RuntimeException("Could not truncate log stream " + stream, e); } }
@Override protected void onActorStarting() { final LogStream logStream = streamProcessorContext.getLogStream(); final MetricsManager metricsManager = actorScheduler.getMetricsManager(); final String partitionId = String.valueOf(logStream.getPartitionId()); final String processorName = getName(); metrics = new StreamProcessorMetrics(metricsManager, processorName, partitionId); logStreamReader.wrap(logStream); logStreamWriter.wrap(logStream); try { snapshotPosition = recoverFromSnapshot(logStream.getCommitPosition(), logStream.getTerm()); lastSourceEventPosition = seekFromSnapshotPositionToLastSourceEvent(); final ZeebeDb zeebeDb = snapshotController.openDb(); streamProcessor = streamProcessorFactory.createProcessor(zeebeDb); streamProcessor.onOpen(streamProcessorContext); } catch (final Exception e) { onFailure(); LangUtil.rethrowUnchecked(e); } }
public AppendRequest setRaft(final Raft raft) { final LogStream logStream = raft.getLogStream(); partitionId = logStream.getPartitionId(); term = raft.getTerm(); commitPosition = logStream.getCommitPosition(); nodeId = raft.getNodeId(); return this; }
public void appendEvent() { actor.runUntilDone( () -> { final long position = raftEvent.tryWrite(raft); if (position >= 0) { actor.done(); this.position = position; final LogStream logStream = this.raft.getLogStream(); logStream.registerOnCommitPositionUpdatedCondition(actorCondition); this.appendRetry = actor.runDelayed( COMMIT_TIMEOUT, () -> { logStream.removeOnCommitPositionUpdatedCondition(actorCondition); actor.submit(this::appendEvent); }); } else { actor.yield(); } }); }
@Override protected void onActorClosing() { member.setReplicationController(null); raft.getLogStream().removeOnCommitPositionUpdatedCondition(appenderCondition); }
@Override protected void onActorStarting() { final ActorCondition condition = actor.onCondition( "on-append", () -> logStream.setCommitPosition(Long.MAX_VALUE)); logStream.registerOnAppendCondition(condition); } })
protected void acceptAppendRequest(long position, long commitPosition, int nodeId) { final long currentCommitPosition = logStream.getCommitPosition(); final long nextCommitPosition = Math.min(position, commitPosition); if (nextCommitPosition >= 0 && nextCommitPosition > currentCommitPosition) { logStream.setCommitPosition(nextCommitPosition); } appendResponse.reset().setRaft(raft).setPreviousEventPosition(position).setSucceeded(true); raft.sendMessage(nodeId, appendResponse); }
@Before public void setup() { MockitoAnnotations.initMocks(this); serverOutput = new BufferingServerOutput(); logStream = LogStreams.createFsLogStream(LOG_STREAM_PARTITION_ID) .logRootPath(tempFolder.getRoot().getAbsolutePath()) .serviceContainer(serviceContainerRule.get()) .logName("Test") .build() .join(); logStream.openAppender().join(); messageHandler = new ClientApiMessageHandler(mockControlMessageDispatcher); final Partition partition = new Partition(new PartitionInfo(LOG_STREAM_PARTITION_ID, 1), RaftState.LEADER) { @Override public LogStream getLogStream() { return logStream; } }; messageHandler.addPartition(partition); logStream.setTerm(RAFT_TERM); }
public void truncateLog(final AppendRequest appendRequest, final LoggedEventImpl event) { deferredAck.reset(); final long currentCommit = logStream.getCommitPosition(); } else { logStream.truncate(nextEventPosition);
@Override public String toString() { return "raft-" + logStream.getLogName() + "-" + nodeId; }
private long getCommitPosition() { return logStream.getCommitPosition(); }
private void createOnAppendCondition() { if (appendCondition == null) { appendCondition = raftActor.onCondition("append-condition", this::commitPositionOnSingleNode); logStream.registerOnAppendCondition(appendCondition); } }
@Override public void start(ServiceStartContext startContext) { startContext.async(logStream.openAppender()); }
private void onRecovered() { phase = Phase.PROCESSING; onCommitPositionUpdatedCondition = actor.onCondition(getName() + "-on-commit-position-updated", readNextEvent); streamProcessorContext.logStream.registerOnCommitPositionUpdatedCondition( onCommitPositionUpdatedCondition); actor.runAtFixedRate(snapshotPeriod, this::createSnapshot); // start reading streamProcessor.onRecovered(); actor.submit(readNextEvent); }
public boolean flushBufferedEvents() { if (offset > 0) { final ByteBuffer byteBuffer = buffer.byteBuffer(); byteBuffer.position(0); byteBuffer.limit(offset); final long address = logStream.getLogStorage().append(byteBuffer); if (address >= 0) { lastWrittenPosition = lastBufferedPosition; lastWrittenTerm = lastBufferedTerm; discardBufferedEvents(); return true; } else { byteBuffer.clear(); return false; } } return true; }