trait RichSequencerClient extends SequencerClient
- Alphabetic
- By Inheritance
- RichSequencerClient
- SequencerClient
- FlagCloseable
- PerformUnlessClosing
- HasSynchronizeWithReaders
- OnShutdownRunner
- HasRunOnClosing
- HasUnlessClosing
- AutoCloseable
- SequencerClientSend
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Abstract Value Members
- abstract def acknowledgeSigned(timestamp: CantonTimestamp)(implicit traceContext: TraceContext): EitherT[FutureUnlessShutdown, String, Boolean]
Acknowledge that we have successfully processed all events up to and including the given timestamp.
Acknowledge that we have successfully processed all events up to and including the given timestamp. The client should then never subscribe for events from before this point.
- Definition Classes
- SequencerClient
- abstract def changeTransport(sequencerTransports: SequencerTransports[_])(implicit traceContext: TraceContext): FutureUnlessShutdown[Unit]
- abstract def completion: FutureUnlessShutdown[CloseReason]
Future which is completed when the client is not functional any more and is ready to be closed.
Future which is completed when the client is not functional any more and is ready to be closed. The value with which the future is completed will indicate the reason for completion.
- abstract def downloadTopologyStateForInit(maxRetries: Int, retryLogLevel: Option[Level])(implicit traceContext: TraceContext): EitherT[FutureUnlessShutdown, String, GenericStoredTopologyTransactions]
Download the topology state for initializing the member
Download the topology state for initializing the member
- Definition Classes
- SequencerClient
- implicit abstract def executionContext: ExecutionContext
- Attributes
- protected
- Definition Classes
- SequencerClientSend
- abstract def flush(): FutureUnlessShutdown[Unit]
Returns a future that completes after asynchronous processing has completed for all events whose synchronous processing has been completed prior to this call.
Returns a future that completes after asynchronous processing has completed for all events whose synchronous processing has been completed prior to this call. May complete earlier if event processing has failed.
- Annotations
- @VisibleForTesting()
- abstract def generateMaxSequencingTime: CantonTimestamp
Provides a value for max-sequencing-time to use for
sendAsync
if no better application provided timeout is available.Provides a value for max-sequencing-time to use for
sendAsync
if no better application provided timeout is available. Is currently a configurable offset from our clock.- Definition Classes
- SequencerClientSend
- abstract def healthComponent: CloseableHealthComponent
- abstract def logger: TracedLogger
- Attributes
- protected[this]
- Definition Classes
- HasSynchronizeWithReaders
- abstract def logout()(implicit traceContext: TraceContext): EitherT[FutureUnlessShutdown, Status, Unit]
Provides an entry point to revoke all the authentication tokens for a member on a given sequencer, and close the connection to that sequencer.
Provides an entry point to revoke all the authentication tokens for a member on a given sequencer, and close the connection to that sequencer.
- Definition Classes
- SequencerClient
- abstract def protocolVersion: ProtocolVersion
- Definition Classes
- SequencerClient
- abstract def sendAsync(batch: Batch[DefaultOpenEnvelope], topologyTimestamp: Option[CantonTimestamp] = None, maxSequencingTime: CantonTimestamp = generateMaxSequencingTime, messageId: MessageId = generateMessageId, aggregationRule: Option[AggregationRule] = None, callback: SendCallback = SendCallback.empty, amplify: Boolean = false)(implicit traceContext: TraceContext, metricsContext: MetricsContext): SendAsyncResult
Sends a request to sequence a deliver event to the sequencer.
Sends a request to sequence a deliver event to the sequencer. If we fail to make the request to the sequencer and are certain that it was not received by the sequencer an error is returned. In this circumstance it is safe for the caller to retry the request without causing a duplicate request. A successful response however does not mean that the request will be successfully sequenced. Instead the caller must subscribe to the sequencer and can observe one of the following outcomes:
- A deliver event is sequenced with a messageId matching this send.
- A deliver error is sequenced with a messageId matching this send.
- The sequencing time progresses beyond the provided max-sequencing-time. The caller can
assume that the send will now never be sequenced. Callers should be aware that a
message-id can be reused once one of these outcomes is observed so cannot assume that an
event with a matching message-id at any point in the future matches their send. Use the
sendTracker
to aid tracking timeouts for events (if useful this could be enriched in the future to provide send completion callbacks alongside the existing timeout notifications). For convenience callers can provide a callback that the SendTracker will invoke when the outcome of the send is known. However this convenience comes with significant limitations that a caller must understand:- the callback has no ability to be persisted so will be lost after a restart or recreation of the SequencerClient
- the callback is called by the send tracker while handling an event from a SequencerSubscription. If the callback returns an error this will be returned to the underlying subscription handler and shutdown the sequencer client. If handlers do not want to halt the sequencer subscription errors should be appropriately handled (particularly logged) and a successful value returned from the callback.
- If witnessing an event causes many prior sends to timeout there is no guaranteed order in which the callbacks of these sends will be notified.
- If replay is enabled, the callback will be called immediately with a fake
SendResult
. - When the send tracker is closed, the callback will be called immediately with AbortedDueToShutdown.
- the closing of objects should not synchronize with the completion of the callback via performUnlessClosing unless the synchronized object is responsible for closing the sequencer client itself (possibly transitively). Otherwise shutdown deadlocks are to be expected between the synchronized object and the send tracker or sequencer client. For more robust send result tracking callers should persist metadata about the send they will make and monitor the sequenced events when read, so actions can be taken even if in-memory state is lost.
- amplify
Amplification sends the submission request to multiple sequencers according to the com.digitalasset.canton.sequencing.SubmissionRequestAmplification configured in the com.digitalasset.canton.sequencing.SequencerConnections. If the sequencer client plans to send the submission request to multiple sequencers, it adds a suitable com.digitalasset.canton.sequencing.protocol.AggregationRule to the request for deduplication, unless one is already present. False disables amplificaton for this request independent of the configuration.
- Definition Classes
- SequencerClientSend
- abstract def subscribeAfter(priorTimestamp: CantonTimestamp, cleanPreheadTsO: Option[CantonTimestamp], eventHandler: PossiblyIgnoredApplicationHandler[ClosedEnvelope], timeTracker: SynchronizerTimeTracker, fetchCleanTimestamp: FetchCleanTimestamp)(implicit traceContext: TraceContext): FutureUnlessShutdown[Unit]
Create a subscription for sequenced events for this member, starting after the last event in the com.digitalasset.canton.store.SequencedEventStore up to
priorTimestamp
.Create a subscription for sequenced events for this member, starting after the last event in the com.digitalasset.canton.store.SequencedEventStore up to
priorTimestamp
. A sequencer client can only have a single subscription - additional subscription attempts will throw an exception. When an event is received, we will check the pending sends and invoke the provided call-backs with the send result (which can be deliver or timeout) before invoking theeventHandler
.If the com.digitalasset.canton.store.SequencedEventStore contains events after
priorTimestamp
, the handler is first fed with these events before the subscription is established, starting at the last event found in the com.digitalasset.canton.store.SequencedEventStore.- priorTimestamp
The timestamp of the event prior to where the event processing starts. If scala.None$, the subscription starts at the beginning.
- cleanPreheadTsO
The timestamp of the clean prehead sequencer counter, if known.
- eventHandler
A function handling the events.
- timeTracker
Tracker for operations requiring the current synchronizer time. Only updated with received events and not previously stored events.
- fetchCleanTimestamp
A function for retrieving the latest clean timestamp to use for periodic acknowledgements
- returns
The future completes after the subscription has been established or when an error occurs before that. In particular, synchronous processing of events from the com.digitalasset.canton.store.SequencedEventStore runs before the future completes.
- Definition Classes
- SequencerClient
- abstract def subscribeTracking(sequencerCounterTrackerStore: SequencerCounterTrackerStore, eventHandler: PossiblyIgnoredApplicationHandler[ClosedEnvelope], timeTracker: SynchronizerTimeTracker, onCleanHandler: (Traced[SequencerCounterCursorPrehead]) => Unit = _ => ())(implicit traceContext: TraceContext): FutureUnlessShutdown[Unit]
Create a subscription for sequenced events for this member, starting after the prehead in the
sequencerCounterTrackerStore
.Create a subscription for sequenced events for this member, starting after the prehead in the
sequencerCounterTrackerStore
.The
eventHandler
is monitored by com.digitalasset.canton.sequencing.handlers.CleanSequencerCounterTracker so that thesequencerCounterTrackerStore
advances the prehead when (a batch of) events has been successfully processed by theeventHandler
(synchronously and asynchronously).- Definition Classes
- SequencerClient
- See also
subscribe for the description of the
eventHandler
and thetimeTracker
- abstract def timeouts: ProcessingTimeout
- Attributes
- protected
- Definition Classes
- FlagCloseable
- abstract def trafficStateController: Option[TrafficStateController]
The sequencer client computes the cost of submission requests sent to the sequencer, and update the traffic state when receiving confirmation that the event has been sequenced.
The sequencer client computes the cost of submission requests sent to the sequencer, and update the traffic state when receiving confirmation that the event has been sequenced. This is done via the traffic state controller.
- Definition Classes
- SequencerClient
Concrete Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def addReader(reader: String)(implicit traceContext: TraceContext): UnlessShutdown[ReaderHandle]
TODO(#16601) Make this method private once PerformUnlessClosing doesn't need it any more
TODO(#16601) Make this method private once PerformUnlessClosing doesn't need it any more
- Attributes
- protected[this]
- Definition Classes
- HasSynchronizeWithReaders
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @IntrinsicCandidate() @native()
- final def close(): Unit
Blocks until all earlier tasks have completed and then prevents further tasks from being run.
Blocks until all earlier tasks have completed and then prevents further tasks from being run.
- Definition Classes
- FlagCloseable → OnShutdownRunner → AutoCloseable
- def closingTimeout: FiniteDuration
- Attributes
- protected
- Definition Classes
- FlagCloseable → PerformUnlessClosing
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def generateMessageId: MessageId
Generates a message id.
Generates a message id. The message id is only for correlation within this client and does not need to be globally unique.
- Definition Classes
- SequencerClientSend
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @IntrinsicCandidate() @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @IntrinsicCandidate() @native()
- def isClosing: Boolean
Check whether we're closing.
Check whether we're closing. Susceptible to race conditions; unless you're using this as a flag to the retry lib or you really know what you're doing, prefer
performUnlessClosing
and friends.- Definition Classes
- OnShutdownRunner → HasUnlessClosing
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def keepTrackOfReaderCallStack: Boolean
Set this to true to get detailed information about all futures that did not complete during shutdown.
Set this to true to get detailed information about all futures that did not complete during shutdown.
- Attributes
- protected[this]
- Definition Classes
- PerformUnlessClosing → HasSynchronizeWithReaders
- def maxSleepMillis: Long
How often to poll to check that all tasks have completed.
How often to poll to check that all tasks have completed.
- Attributes
- protected
- Definition Classes
- PerformUnlessClosing
- def nameInternal: String
- Attributes
- protected[this]
- Definition Classes
- PerformUnlessClosing → HasSynchronizeWithReaders
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @IntrinsicCandidate() @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @IntrinsicCandidate() @native()
- def onCloseFailure(e: Throwable): Unit
- Attributes
- protected
- Definition Classes
- PerformUnlessClosing
- def onClosed(): Unit
- Attributes
- protected
- Definition Classes
- PerformUnlessClosing
- final def onFirstClose(): Unit
Blocks until all earlier tasks have completed and then prevents further tasks from being run.
Blocks until all earlier tasks have completed and then prevents further tasks from being run.
- Definition Classes
- PerformUnlessClosing → OnShutdownRunner
- Annotations
- @SuppressWarnings()
- def performUnlessClosing[A](name: String)(f: => A)(implicit traceContext: TraceContext): UnlessShutdown[A]
Performs the task given by
f
unless a shutdown has been initiated.Performs the task given by
f
unless a shutdown has been initiated. The shutdown will only begin afterf
completes, but other tasks may execute concurrently withf
, if started using this function, or one of the other variants (performUnlessClosingF and performUnlessClosingEitherT). The tasks are assumed to take less than closingTimeout to complete.DO NOT CALL
this.close
as part off
, because it will result in a deadlock. DO NOT PUT retries, especially indefinite ones, insidef
.- f
The task to perform
- returns
scala.None$ if a shutdown has been initiated. Otherwise the result of the task.
- Definition Classes
- PerformUnlessClosing
- def performUnlessClosingCheckedT[A, N, R](name: String, onClosing: => Checked[A, N, R])(etf: => CheckedT[Future, A, N, R])(implicit ec: ExecutionContext, traceContext: TraceContext): CheckedT[Future, A, N, R]
- Definition Classes
- PerformUnlessClosing
- def performUnlessClosingCheckedUST[A, N, R](name: String, onClosing: => Checked[A, N, R])(etf: => CheckedT[FutureUnlessShutdown, A, N, R])(implicit ec: ExecutionContext, traceContext: TraceContext): CheckedT[FutureUnlessShutdown, A, N, R]
- Definition Classes
- PerformUnlessClosing
- def performUnlessClosingEitherT[E, R](name: String, onClosing: => E)(etf: => EitherT[Future, E, R])(implicit ec: ExecutionContext, traceContext: TraceContext): EitherT[Future, E, R]
Performs the EitherT[Future] given by
etf
unless a shutdown has been initiated, in which case the provided error is returned instead.Performs the EitherT[Future] given by
etf
unless a shutdown has been initiated, in which case the provided error is returned instead. Bothetf
and the error are lazy;etf
is only evaluated if there is no shutdown, the error only if we're shutting down. The shutdown will only begin afteretf
completes, but other tasks may execute concurrently withetf
, if started using this function, or one of the other variants (performUnlessClosing and performUnlessClosingF). The tasks are assumed to take less than closingTimeout to complete.DO NOT CALL
this.close
as part ofetf
, because it will result in a deadlock. DO NOT PUT retries, especially indefinite ones, insidef
.- etf
The task to perform
- Definition Classes
- PerformUnlessClosing
- def performUnlessClosingEitherU[E, R](name: String)(etf: => EitherT[Future, E, R])(implicit ec: ExecutionContext, traceContext: TraceContext): EitherT[FutureUnlessShutdown, E, R]
- Definition Classes
- PerformUnlessClosing
- def performUnlessClosingEitherUSF[E, R](name: String)(etf: => EitherT[FutureUnlessShutdown, E, R])(implicit ec: ExecutionContext, traceContext: TraceContext): EitherT[FutureUnlessShutdown, E, R]
- Definition Classes
- PerformUnlessClosing
- def performUnlessClosingEitherUSFAsync[E, R](name: String)(etf: => EitherT[FutureUnlessShutdown, E, R])(asyncResultToWaitForF: (R) => FutureUnlessShutdown[_])(implicit ec: ExecutionContext, traceContext: TraceContext): EitherT[FutureUnlessShutdown, E, R]
Use this method if closing/shutdown of the object should wait for asynchronous computation to finish too.
Use this method if closing/shutdown of the object should wait for asynchronous computation to finish too.
- etf
closing of this object will wait for all such spawned Futures to finish
- asyncResultToWaitForF
closing of this object will wait also wait for all such asynchronous Futures to finish too
- returns
the future spawned by etf
- Definition Classes
- PerformUnlessClosing
- def performUnlessClosingF[A](name: String)(f: => Future[A])(implicit ec: ExecutionContext, traceContext: TraceContext): FutureUnlessShutdown[A]
Performs the Future given by
f
unless a shutdown has been initiated.Performs the Future given by
f
unless a shutdown has been initiated. The future is lazy and not evaluated during shutdown. The shutdown will only begin afterf
completes, but other tasks may execute concurrently withf
, if started using this function, or one of the other variants (performUnlessClosing and performUnlessClosingEitherT). The tasks are assumed to take less than closingTimeout to complete.DO NOT CALL
this.close
as part off
, because it will result in a deadlock. DO NOT PUT retries, especially indefinite ones, insidef
.- f
The task to perform
- returns
The future completes with com.digitalasset.canton.lifecycle.UnlessShutdown.AbortedDueToShutdown if a shutdown has been initiated. Otherwise the result of the task wrapped in com.digitalasset.canton.lifecycle.UnlessShutdown.Outcome.
- Definition Classes
- PerformUnlessClosing
- def performUnlessClosingOptionUSF[R](name: String)(otf: => OptionT[FutureUnlessShutdown, R])(implicit ec: ExecutionContext, traceContext: TraceContext): OptionT[FutureUnlessShutdown, R]
- Definition Classes
- PerformUnlessClosing
- def performUnlessClosingUSF[A](name: String)(f: => FutureUnlessShutdown[A])(implicit ec: ExecutionContext, traceContext: TraceContext): FutureUnlessShutdown[A]
- Definition Classes
- PerformUnlessClosing
- def performUnlessClosingUSFAsync[A](name: String)(f: => FutureUnlessShutdown[A])(asyncResultToWaitForF: (A) => FutureUnlessShutdown[_])(implicit ec: ExecutionContext, traceContext: TraceContext): FutureUnlessShutdown[A]
Use this method if closing/shutdown of the object should wait for asynchronous computation to finish too.
Use this method if closing/shutdown of the object should wait for asynchronous computation to finish too.
- f
closing of this object will wait for all such spawned Futures to finish
- asyncResultToWaitForF
closing of this object will wait also wait for all such asynchronous Futures to finish too
- returns
the future spawned by f
- Definition Classes
- PerformUnlessClosing
- def remainingReaders(): Seq[String]
- Attributes
- protected[this]
- Definition Classes
- HasSynchronizeWithReaders
- def removeReader(handle: ReaderHandle): Unit
TODO(#16601) Make this method private once PerformUnlessClosing doesn't need it any more
TODO(#16601) Make this method private once PerformUnlessClosing doesn't need it any more
- Attributes
- protected[this]
- Definition Classes
- HasSynchronizeWithReaders
- def runOnClose(task: RunOnClosing): UnlessShutdown[LifeCycleRegistrationHandle]
Schedules the given task to be run upon closing.
Schedules the given task to be run upon closing.
- returns
An com.digitalasset.canton.lifecycle.UnlessShutdown.Outcome indicates that the task will have been run when the
LifeCycleManager
'scloseAsync
method completes or whenAutoCloseable
'sclose
method returns, unless the returnedLifeCycleRegistrationHandle
was used to cancel the task or the task has been done beforehand. com.digitalasset.canton.lifecycle.UnlessShutdown.AbortedDueToShutdown if the task is not run due to closing. This always happens if isClosing returns true.
- Definition Classes
- OnShutdownRunner → HasRunOnClosing
- def runOnOrAfterClose(task: RunOnClosing)(implicit traceContext: TraceContext): LifeCycleRegistrationHandle
Register a task to run when closing is initiated, or run it immediately if closing is already ongoing.
Register a task to run when closing is initiated, or run it immediately if closing is already ongoing. Unlike runOnClose, this method does not guarantee that this task will have run by the time the
LifeCycleManager
'scloseAsync
method completes orAutoCloseable
'sclose
returns. This is because the task is run immediately if the component has already been closed.- Definition Classes
- HasRunOnClosing
- final def runOnOrAfterClose_(task: RunOnClosing)(implicit traceContext: TraceContext): Unit
Variant of runOnOrAfterClose that does not return a com.digitalasset.canton.lifecycle.LifeCycleRegistrationHandle.
Variant of runOnOrAfterClose that does not return a com.digitalasset.canton.lifecycle.LifeCycleRegistrationHandle.
- Definition Classes
- HasRunOnClosing
- def runTaskUnlessDone(task: RunOnClosing)(implicit traceContext: TraceContext): Unit
- Attributes
- protected[this]
- Definition Classes
- OnShutdownRunner → HasRunOnClosing
- def send(batch: Batch[DefaultOpenEnvelope], topologyTimestamp: Option[CantonTimestamp] = None, maxSequencingTime: CantonTimestamp = generateMaxSequencingTime, messageId: MessageId = generateMessageId, aggregationRule: Option[AggregationRule] = None, callback: SendCallback = SendCallback.empty, amplify: Boolean = false)(implicit traceContext: TraceContext, metricsContext: MetricsContext): EitherT[FutureUnlessShutdown, SendAsyncClientError, Unit]
Flattened version of sendAsync
Flattened version of sendAsync
- Definition Classes
- SequencerClientSend
- def synchronizeWithClosingPatience: FiniteDuration
- Attributes
- protected[this]
- Definition Classes
- PerformUnlessClosing → HasSynchronizeWithReaders
- def synchronizeWithReaders()(implicit traceContext: TraceContext): Boolean
- Attributes
- protected[this]
- Definition Classes
- HasSynchronizeWithReaders
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- final def unlessClosing[F[_], A](fa: => F[A])(implicit F: CanAbortDueToShutdown[F]): F[A]
Runs the computation
fa
unless isClosing returns true.Runs the computation
fa
unless isClosing returns true.This method does not delay the closing while
fa
is running, unlike the methods inHasSynchronizeWithClosing
. Accordingly, this method is useful for intermittent checks whether the result of the computation is still relevant.- returns
The result of
fa
or com.digitalasset.canton.lifecycle.UnlessShutdown.AbortedDueToShutdown if isClosing is true
- Definition Classes
- HasUnlessClosing
- Annotations
- @inline()
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- def withReader[F[_], A](name: String)(f: => F[A])(implicit traceContext: TraceContext, F: Thereafter[F]): UnlessShutdown[F[A]]
- Attributes
- protected[this]
- Definition Classes
- HasSynchronizeWithReaders