Documentation
¶
Overview ¶
Package store is the server's SQLite persistence layer: executions, their stack/edge subgraph, and per-(class,target) approval gate state. Pure-Go SQLite (modernc.org/sqlite, no cgo); schema migrated by goose at Open.
Index ¶
- Variables
- func AssociateClaimExecution(db *sql.DB, env string, pr int, execID string) error
- func BumpRev(db *sql.DB, id string) error
- func DeleteTarget(tx *sql.Tx, pr int, environment, class, target string) error
- func EnvironmentsForPR(db *sql.DB, pr int) ([]string, error)
- func FindNonSupersededExecution(db *sql.DB, pr int, environment, sha, statusContext, incomingID string) (string, bool, error)
- func GetStackOutput(db *sql.DB, execID, stack, kind string) (pointer, excerpt string, ok bool, err error)
- func LatestExecutionID(db *sql.DB, pr int, environment string) (string, bool)
- func LatestPRForSHA(db *sql.DB, sha, environment, statusContext string) (int, bool)
- func LatestReportedExecutionID(db *sql.DB, pr int, environment string) (string, bool)
- func LatestVerifyExecutionID(db *sql.DB, pr int, environment string) (string, bool)
- func LoadGraph(db *sql.DB, id string) (events.Graph, error)
- func Open(dsn string) (*sql.DB, error)
- func ReplaceClaims(db *sql.DB, env string, rows map[string]Claim) error
- func SetCheckRunID(db *sql.DB, id string, checkRunID int64) error
- func SetExecutionStatus(db *sql.DB, id, status string) error
- func SetReport(db *sql.DB, id, markdown string) error
- func SupersedeExecution(db *sql.DB, oldID, newID string) error
- func SweepExpiredClaims(db *sql.DB, now time.Time) ([]string, error)
- func UpdateStack(db *sql.DB, id, stack string, status events.Status, detail string) error
- func UpsertApplyLockCheck(db *sql.DB, c ApplyLockCheck) error
- func UpsertInit(db *sql.DB, in events.Init) error
- func UpsertPhase(db *sql.DB, p events.PhaseEvent) error
- func UpsertStackOutput(db *sql.DB, execID, stack, kind, pointer, excerpt string) error
- type ApplyLockCheck
- type Claim
- type EventStore
- func (s *EventStore) Append(streamID string, expectedVersion int, evs []StoredEvent) error
- func (s *EventStore) Load(streamID string) ([]StoredEvent, int, error)
- func (s *EventStore) LoadSnapshot(streamID string) (state []byte, version int, ok bool, err error)
- func (s *EventStore) SaveSnapshot(streamID string, version int, state []byte) error
- type Execution
- type Gate
- type GateTarget
- type OpenGrantPR
- type PRTarget
- type StoredEvent
Constants ¶
This section is empty.
Variables ¶
var ErrConcurrencyConflict = errors.New("eventstore: concurrency conflict")
ErrConcurrencyConflict is returned by Append when the stream's current version is not the expected version — i.e. another writer advanced the stream since the caller last read it. The caller should reload and retry.
Functions ¶
func AssociateClaimExecution ¶ added in v0.15.0
AssociateClaimExecution links a PR's claims to the apply execution that now owns them (so heartbeats/finalize can target by pr+env).
func BumpRev ¶
BumpRev increments the cache-bust revision (used by the rendered SVG URL so GitHub's image proxy re-fetches on each state change).
func DeleteTarget ¶ added in v0.9.9
DeleteTarget removes a single gate target row.
func EnvironmentsForPR ¶ added in v0.15.0
EnvironmentsForPR returns the distinct environments that have at least one execution for the given PR. Order is unspecified.
func FindNonSupersededExecution ¶ added in v0.18.2
func FindNonSupersededExecution(db *sql.DB, pr int, environment, sha, statusContext, incomingID string) (string, bool, error)
FindNonSupersededExecution looks up the most recent non-superseded execution for the given (pr, environment, sha, status_context) where pr > 0 and id != incoming id.
func GetStackOutput ¶ added in v0.6.0
func GetStackOutput(db *sql.DB, execID, stack, kind string) (pointer, excerpt string, ok bool, err error)
GetStackOutput returns the stored pointer + excerpt for a stack's output kind. ok is false when none is recorded.
func LatestExecutionID ¶ added in v0.6.0
LatestExecutionID returns the most recent execution id for (pr, environment). ok is false when none exists.
func LatestPRForSHA ¶ added in v0.22.0
LatestPRForSHA recovers the PR of the newest execution for (sha, env, context) — the check_run rerequested path for apply checks, whose webhook payload carries no pull_requests on merge commits.
func LatestReportedExecutionID ¶ added in v0.22.0
LatestReportedExecutionID is LatestExecutionID restricted to executions the runner actually reported on (a phase tick or registered stacks) — a serve-queued row awaiting its build has neither and must not shadow the last real plan (the apply-lock evaluation reads the graph through this).
func LatestVerifyExecutionID ¶ added in v0.6.0
LatestVerifyExecutionID returns the most recent verify-context execution id for (pr, environment) — i.e. a run whose status_context begins with "verify". ok is false when none exists.
func Open ¶
Open opens the SQLite database at dsn, enables WAL, and applies all migrations. dsn is a modernc.org/sqlite DSN, e.g. a file path or "file:/data/server.db".
func ReplaceClaims ¶ added in v0.17.0
ReplaceClaims rewrites the apply_claims projection for env to exactly match `rows` (stack_path → {owner_pr, expires_at}). Upserts each row and deletes any existing rows for env not present in the new set. This is the projector seam: the env:<env> event stream is the source of truth, apply_claims a derived cross-env index for the sweep + the live-UI list. Atomic in one tx.
func SetCheckRunID ¶
SetCheckRunID records the GitHub check-run id created for an execution.
func SetExecutionStatus ¶ added in v0.13.2
SetExecutionStatus persists the execution-level commit status (e.g. terminal "success"/"failure"). This is the signal isFinished reads for an apply; the apply driver writes it once the apply concludes.
func SupersedeExecution ¶ added in v0.18.2
SupersedeExecution links an old execution ID to its replacing execution ID.
func SweepExpiredClaims ¶ added in v0.15.0
SweepExpiredClaims deletes all claims expired at `now` and returns the distinct environments that lost a claim (so the caller can re-evaluate their held checks).
func UpdateStack ¶
UpdateStack ticks one stack's status (and optional failure detail).
func UpsertApplyLockCheck ¶ added in v0.15.0
func UpsertApplyLockCheck(db *sql.DB, c ApplyLockCheck) error
func UpsertInit ¶
UpsertInit records an execution and its changed subgraph from an Init event. Re-init with the same id is upsert-safe. The phase column is intentionally left untouched: the lifecycle phase is owned by UpsertPhase, which may run before Init. Stack status is set only on first insert; a repeat Init (e.g. run register followed by run plan) never regresses an already-advanced stack.
func UpsertPhase ¶
func UpsertPhase(db *sql.DB, p events.PhaseEvent) error
UpsertPhase sets the execution's lifecycle phase, creating a bare row if Init has not run yet. Identity fields are only overwritten when the event carries a non-zero value, so a bare phase bump never clobbers data set by an earlier Init (and an early phase event survives a later Init).
Types ¶
type ApplyLockCheck ¶ added in v0.15.0
type ApplyLockCheck struct {
Environment string
HeadSHA string
CheckRunID int64
PR int
Repo string
Stacks []string
State string // clear | held | unverifiable
Kind string // merge_group | pr_head
ExecutionID string // plan execution whose check run carries the consolidated render; "" for legacy/merge-group records
}
ApplyLockCheck is a persisted apply-lock check run (so serve can PATCH it later when an overlapping apply releases). Keyed by (environment, head_sha).
func GetApplyLockCheck ¶ added in v0.15.0
func HeldApplyLockChecks ¶ added in v0.15.0
func HeldApplyLockChecks(db *sql.DB, env string) ([]ApplyLockCheck, error)
type EventStore ¶ added in v0.17.0
type EventStore struct {
// contains filtered or unexported fields
}
EventStore is the append-only event log + snapshot cache over SQLite. It is domain-agnostic: it deals only in StoredEvent and []byte snapshot blobs.
func NewEventStore ¶ added in v0.17.0
func NewEventStore(db *sql.DB) *EventStore
NewEventStore wraps db as an EventStore.
func (*EventStore) Append ¶ added in v0.17.0
func (s *EventStore) Append(streamID string, expectedVersion int, evs []StoredEvent) error
Append writes evs as the next contiguous versions after expectedVersion (the caller's last-seen stream version; 0 for a new/empty stream). It is all-or-nothing. Returns ErrConcurrencyConflict if the stream's current version is not expectedVersion.
func (*EventStore) Load ¶ added in v0.17.0
func (s *EventStore) Load(streamID string) ([]StoredEvent, int, error)
Load returns the stream's events in version order plus its current version (0 and an empty slice for an unknown/empty stream).
func (*EventStore) LoadSnapshot ¶ added in v0.17.0
LoadSnapshot returns the latest snapshot for the stream (ok=false if none).
func (*EventStore) SaveSnapshot ¶ added in v0.17.0
func (s *EventStore) SaveSnapshot(streamID string, version int, state []byte) error
SaveSnapshot upserts the latest snapshot for the stream (last-write-wins). No concurrency check: the events table is authoritative, so a stale snapshot only means replaying a longer event tail. version is the event version the snapshot reflects.
type Execution ¶
type Execution struct {
ID string
Repo string
SHA string
PR int
Environment string
CheckRunID sql.NullInt64
Rev int
ReportMarkdown string
LogURL string
Status string // execution-level commit status (e.g. "in_progress"/"success"/"failure"); written by the serve handler, distinct from per-stack events.Status
StatusContext string
Phase string
CreatedAt time.Time
SupersededBy string
}
Execution is a row of the executions table.
func GetExecution ¶
GetExecution loads one execution row.
func ListExecutions ¶ added in v0.6.0
ListExecutions returns the most recent executions, newest first.
func ListExecutionsForPR ¶ added in v0.6.0
ListExecutionsForPR returns all executions for a PR, newest first.
func StuckPendingExecutions ¶ added in v0.22.0
StuckPendingExecutions returns this environment's serve-initiated executions (id prefix per reconcile.RunExecutionIDPrefix) still in_progress with no runner activity at all (empty phase) created before cutoff — the start-watchdog's candidates. Runner-created executions and other tiers' rows are excluded in SQL so the watchdog never replays streams it cannot act on.
type Gate ¶
Gate identifies the unit an approval verdict is posted for.
func PendingGates ¶
PendingGates returns the (pr, environment) gates that still have at least one target not yet ACTIVE — i.e. gates whose verdict may still need posting. The reconcile loop walks these to self-heal the gap where an approval event is processed while the grant is still activating (some providers fire no further event for the activating→active transition) and dropped events / restarts.
type GateTarget ¶
type GateTarget struct {
Class string
Target string
GrantName string
State string
Requester string
}
GateTarget holds the per-(class,target) grant state recorded for a (pr, environment).
func TargetsFor ¶
TargetsFor returns every GateTarget recorded for (pr, environment). Returns a non-nil empty slice when none match.
type OpenGrantPR ¶ added in v0.10.0
OpenGrantPR is a PR that still holds at least one open (non-terminal) grant, paired with the repo of its latest execution (for the orphan sweep's GitHub closed-state check). Repo is "" when no execution row exists.
func OpenGrantPRs ¶ added in v0.10.0
func OpenGrantPRs(db *sql.DB) ([]OpenGrantPR, error)
OpenGrantPRs returns every PR with at least one gate target in an open state (AWAITING/ACTIVATING/ACTIVE), each paired with its latest execution's repo. Unlike PendingGates it INCLUDES fully-ACTIVE (Satisfied) gates — the merged-PR orphan whose grants were never revoked — which is exactly what the sweep must re-examine. Terminal states (DENIED/REVOKED/EXPIRED) are deliberately excluded: those grants are no longer live, so the sweep has nothing to revoke for them (an EXPIRED grant the reconciler may later re-arm becomes AWAITING again — open — and is caught on the next sweep). A PR is one row regardless of how many environments hold open grants (GROUP BY pr); revokeOrphans handles every env.
type PRTarget ¶ added in v0.9.5
PRTarget is a (environment, class, target) tuple recorded for a PR, used by the PR-closed webhook to revoke orphaned grants across all environments.
type StoredEvent ¶ added in v0.17.0
StoredEvent is one opaque appended fact. Type is an event-type tag and Data is the opaque payload (JSON bytes in practice). The store never interprets either.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package migrations embeds the goose SQL migrations for the server store.
|
Package migrations embeds the goose SQL migrations for the server store. |