74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package executionregistry
|
|
|
|
import "time"
|
|
|
|
// Observation is an immutable in-flight execution snapshot entry.
|
|
type Observation struct {
|
|
RequestID string
|
|
CredentialID string
|
|
Model string
|
|
RequestKind string
|
|
StartedAt time.Time
|
|
Accounted bool
|
|
}
|
|
|
|
// Freeze is an immutable in-flight execution snapshot.
|
|
type Freeze struct {
|
|
Revision int64
|
|
BarrierRevision int64
|
|
Executions []Observation
|
|
}
|
|
|
|
// ObserveBarrier records the latest Home observation barrier.
|
|
func (r *Registry) ObserveBarrier(revision int64) {
|
|
if r == nil || revision <= 0 {
|
|
return
|
|
}
|
|
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
if revision > r.observedBarrier {
|
|
r.observedBarrier = revision
|
|
r.pendingBarrierSequence = r.next
|
|
}
|
|
}
|
|
|
|
// FreezeInFlight copies all active executions into an immutable snapshot.
|
|
func (r *Registry) FreezeInFlight(_ time.Time) Freeze {
|
|
if r == nil {
|
|
return Freeze{}
|
|
}
|
|
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
if r.observedBarrier > r.publishedBarrier {
|
|
blocked := false
|
|
for sequence := range r.pending {
|
|
if sequence <= r.pendingBarrierSequence {
|
|
blocked = true
|
|
break
|
|
}
|
|
}
|
|
if !blocked {
|
|
r.publishedBarrier = r.observedBarrier
|
|
}
|
|
}
|
|
|
|
r.snapshotRevision++
|
|
freeze := Freeze{
|
|
Revision: r.snapshotRevision,
|
|
BarrierRevision: r.publishedBarrier,
|
|
Executions: make([]Observation, 0, len(r.scopes)),
|
|
}
|
|
for _, scope := range r.scopes {
|
|
freeze.Executions = append(freeze.Executions, Observation{
|
|
RequestID: scope.spec.RequestID,
|
|
CredentialID: scope.spec.CredentialID,
|
|
Model: scope.spec.Model,
|
|
RequestKind: scope.spec.Kind,
|
|
StartedAt: scope.spec.StartedAt,
|
|
Accounted: scope.spec.Accounted,
|
|
})
|
|
}
|
|
return freeze
|
|
}
|