Skip to content

Commit 6019903

Browse files
committed
feat: add prebuild invalidation via last_invalidated_at timestamp
Implements new approach for prebuild invalidation as discussed in issue #17917. Instead of directly deleting workspaces, this sets a timestamp on presets, and the reconciler automatically marks prebuilds as expired and creates new ones. Implementation: - Add last_invalidated_at column to template_version_presets table - API endpoint: POST /templates/{template}/prebuilds/invalidate - Updates last_invalidated_at = NOW() for all active template version presets - filterExpiredWorkspaces checks if prebuild.created_at < preset.last_invalidated_at - Reconciler automatically deletes expired prebuilds and spawns fresh ones Changes: - Migration 000394: Add last_invalidated_at column - Query: UpdatePresetsLastInvalidatedAt sets timestamp on active presets - API: Returns count and list of invalidated preset names - Logic: filterExpiredWorkspaces prioritizes last_invalidated_at over TTL - SDK: InvalidateTemplatePrebuilds client method with structured response Benefits: - Non-blocking: API doesn't wait for reconciler - Async: Reconciler handles actual deletion - Safe: template_version_presets is no longer write-once Updates #17917
1 parent 2bcf084 commit 6019903

File tree

15 files changed

+241
-21
lines changed

15 files changed

+241
-21
lines changed

coderd/coderd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,6 +1214,7 @@ func New(options *Options) *API {
12141214
r.Get("/", api.template)
12151215
r.Delete("/", api.deleteTemplate)
12161216
r.Patch("/", api.patchTemplateMeta)
1217+
r.Post("/prebuilds/invalidate", api.postInvalidateTemplatePrebuilds)
12171218
r.Route("/versions", func(r chi.Router) {
12181219
r.Post("/archive", api.postArchiveTemplateVersions)
12191220
r.Get("/", api.templateVersionsByTemplate)

coderd/database/dbauthz/dbauthz.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4968,6 +4968,20 @@ func (q *querier) UpdatePresetPrebuildStatus(ctx context.Context, arg database.U
49684968
return q.db.UpdatePresetPrebuildStatus(ctx, arg)
49694969
}
49704970

4971+
func (q *querier) UpdatePresetsLastInvalidatedAt(ctx context.Context, arg database.UpdatePresetsLastInvalidatedAtParams) ([]database.TemplateVersionPreset, error) {
4972+
// Fetch template to check authorization
4973+
template, err := q.db.GetTemplateByID(ctx, arg.TemplateID.UUID)
4974+
if err != nil {
4975+
return nil, err
4976+
}
4977+
4978+
if err := q.authorizeContext(ctx, policy.ActionUpdate, template); err != nil {
4979+
return nil, err
4980+
}
4981+
4982+
return q.db.UpdatePresetsLastInvalidatedAt(ctx, arg)
4983+
}
4984+
49714985
func (q *querier) UpdateProvisionerDaemonLastSeenAt(ctx context.Context, arg database.UpdateProvisionerDaemonLastSeenAtParams) error {
49724986
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceProvisionerDaemon); err != nil {
49734987
return err

coderd/database/dbmetrics/querymetrics.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbmock/dbmock.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dump.sql

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE template_version_presets DROP COLUMN last_invalidated_at;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE template_version_presets ADD COLUMN last_invalidated_at TIMESTAMPTZ;

coderd/database/models.go

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/querier.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

Lines changed: 71 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)