notify/snapshot_binding.go

93 lines
3.8 KiB
Go
Raw Permalink Normal View History

package notify
import "time"
type snapshotBindingDiagnostics struct {
BindingOwner string
BindingAlive bool
BindingCurrent bool
BindingReason string
BindingError string
BindingBulkAdaptiveSoftPayloadBytes int
BindingStreamAdaptiveSoftPayloadBytes int
BindingStreamAdaptiveWaitThresholdBytes int
BindingStreamAdaptiveFlushDelay time.Duration
TransportAttached bool
TransportHasRuntimeConn bool
TransportCurrent bool
TransportDetachReason string
TransportDetachKind string
TransportDetachError string
TransportDetachGeneration uint64
TransportDetachedAt time.Time
ReattachEligible bool
}
func snapshotBindingDiagnosticsFromClient(c *ClientCommon, sessionEpoch uint64) snapshotBindingDiagnostics {
diag := snapshotBindingDiagnostics{
BindingOwner: "client-session",
}
if c == nil {
return diag
}
status := c.Status()
diag.BindingAlive = status.Alive
diag.BindingCurrent = sessionEpoch == 0 || c.isClientSessionEpochCurrent(sessionEpoch)
diag.BindingReason = status.Reason
if status.Err != nil {
diag.BindingError = status.Err.Error()
}
diag.TransportAttached = c.clientTransportAttachedSnapshot()
diag.TransportHasRuntimeConn = c.clientTransportConnSnapshot() != nil
diag.TransportCurrent = diag.BindingCurrent && diag.TransportAttached
if binding := c.clientTransportBindingSnapshot(); binding != nil {
diag.BindingBulkAdaptiveSoftPayloadBytes = binding.bulkAdaptiveSoftPayloadBytesSnapshot()
diag.BindingStreamAdaptiveSoftPayloadBytes = binding.streamAdaptiveSoftPayloadBytesSnapshot()
diag.BindingStreamAdaptiveWaitThresholdBytes = binding.streamAdaptiveWaitThresholdBytesSnapshot()
diag.BindingStreamAdaptiveFlushDelay = binding.streamAdaptiveFlushDelaySnapshot()
}
return diag
}
func snapshotBindingDiagnosticsFromLogical(logical *LogicalConn, transport *TransportConn, transportGeneration uint64) snapshotBindingDiagnostics {
if logical == nil && transport != nil {
logical = transport.LogicalConn()
}
diag := snapshotBindingDiagnostics{}
if logical == nil {
return diag
}
runtime := logical.runtimeSnapshot()
diag.BindingOwner = "server-logical"
if transport != nil {
diag.BindingOwner = "server-transport"
}
diag.BindingAlive = runtime.Alive
diag.BindingReason = runtime.Reason
diag.BindingError = runtime.Error
diag.TransportAttached = runtime.TransportAttached
diag.TransportHasRuntimeConn = runtime.HasRuntimeConn
diag.TransportDetachReason = runtime.TransportDetachReason
diag.TransportDetachKind = runtime.TransportDetachKind
diag.TransportDetachError = runtime.TransportDetachError
diag.TransportDetachGeneration = runtime.TransportDetachGeneration
diag.TransportDetachedAt = runtime.TransportDetachedAt
diag.ReattachEligible = runtime.ReattachEligible
switch {
case transport != nil:
diag.TransportCurrent = transport.IsCurrent()
case transportGeneration != 0:
diag.TransportCurrent = runtime.TransportAttached && runtime.TransportGeneration == transportGeneration
default:
diag.TransportCurrent = runtime.TransportAttached
}
diag.BindingCurrent = diag.BindingAlive && diag.TransportCurrent
if binding := logical.transportBindingSnapshot(); binding != nil {
diag.BindingBulkAdaptiveSoftPayloadBytes = binding.bulkAdaptiveSoftPayloadBytesSnapshot()
diag.BindingStreamAdaptiveSoftPayloadBytes = binding.streamAdaptiveSoftPayloadBytesSnapshot()
diag.BindingStreamAdaptiveWaitThresholdBytes = binding.streamAdaptiveWaitThresholdBytesSnapshot()
diag.BindingStreamAdaptiveFlushDelay = binding.streamAdaptiveFlushDelaySnapshot()
}
return diag
}