Skip to content

Commit 8e2e62e

Browse files
committed
WIP: claim prebuilds based on parameters
1 parent b0405ad commit 8e2e62e

File tree

14 files changed

+558
-56
lines changed

14 files changed

+558
-56
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4255,6 +4255,10 @@ func (q *querier) RevokeDBCryptKey(ctx context.Context, activeKeyDigest string)
42554255
return q.db.RevokeDBCryptKey(ctx, activeKeyDigest)
42564256
}
42574257

4258+
func (q *querier) SetWorkspaceBuildPresetByParameterHash(ctx context.Context, workspaceBuildID uuid.UUID) (database.SetWorkspaceBuildPresetByParameterHashRow, error) {
4259+
panic("not implemented")
4260+
}
4261+
42584262
func (q *querier) TryAcquireLock(ctx context.Context, id int64) (bool, error) {
42594263
return q.db.TryAcquireLock(ctx, id)
42604264
}
@@ -4452,6 +4456,10 @@ func (q *querier) UpdateOrganizationDeletedByID(ctx context.Context, arg databas
44524456
return deleteQ(q.log, q.auth, q.db.GetOrganizationByID, deleteF)(ctx, arg.ID)
44534457
}
44544458

4459+
func (q *querier) UpdatePresetParameterHash(ctx context.Context, id uuid.UUID) (database.UpdatePresetParameterHashRow, error) {
4460+
panic("not implemented")
4461+
}
4462+
44554463
func (q *querier) UpdatePresetPrebuildStatus(ctx context.Context, arg database.UpdatePresetPrebuildStatusParams) error {
44564464
preset, err := q.db.GetPresetByID(ctx, arg.PresetID)
44574465
if err != nil {

coderd/database/dbmetrics/querymetrics.go

Lines changed: 14 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: 30 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: 38 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-- Drop the index first
2+
DROP INDEX IF EXISTS idx_template_version_presets_parameter_hash;
3+
4+
-- Remove the parameter_hash column
5+
ALTER TABLE template_version_presets
6+
DROP COLUMN IF EXISTS parameter_hash;
7+
8+
-- Drop the function
9+
DROP FUNCTION IF EXISTS generate_parameter_hash(TEXT[], TEXT[]);
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
-- Add parameter_hash column to template_version_presets table
2+
ALTER TABLE template_version_presets
3+
ADD COLUMN parameter_hash TEXT;
4+
5+
-- Create a generic function to generate parameter hash from arrays
6+
CREATE OR REPLACE FUNCTION generate_parameter_hash(names TEXT[], param_values TEXT[])
7+
RETURNS TEXT AS $$
8+
DECLARE
9+
param_pairs TEXT[] := '{}';
10+
sorted_pairs TEXT[] := '{}';
11+
hash_value TEXT;
12+
i INTEGER;
13+
BEGIN
14+
-- Validate input arrays have same length
15+
IF array_length(names, 1) != array_length(param_values, 1) THEN
16+
RAISE EXCEPTION 'Names and values arrays must have the same length';
17+
END IF;
18+
19+
-- Build parameter pairs from arrays
20+
FOR i IN 1..array_length(names, 1) LOOP
21+
param_pairs := array_append(param_pairs, names[i] || '=' || param_values[i]);
22+
END LOOP;
23+
24+
-- Sort the pairs for consistent hashing
25+
SELECT array_agg(pair ORDER BY pair) INTO sorted_pairs
26+
FROM unnest(param_pairs) AS pair;
27+
28+
-- Generate hash from sorted pairs
29+
SELECT encode(sha256(array_to_string(sorted_pairs, '|')::bytea), 'hex') INTO hash_value;
30+
31+
RETURN hash_value;
32+
END;
33+
$$ LANGUAGE plpgsql;
34+
35+
-- Populate parameter_hash for existing presets
36+
UPDATE template_version_presets
37+
SET parameter_hash = generate_parameter_hash(
38+
(SELECT array_agg(name ORDER BY name) FROM template_version_preset_parameters WHERE template_version_preset_id = template_version_presets.id),
39+
(SELECT array_agg(value ORDER BY name) FROM template_version_preset_parameters WHERE template_version_preset_id = template_version_presets.id)
40+
)
41+
WHERE id IN (
42+
SELECT DISTINCT template_version_preset_id
43+
FROM template_version_preset_parameters
44+
);
45+
46+
-- Make parameter_hash NOT NULL after populating
47+
-- ALTER TABLE template_version_presets
48+
-- ALTER COLUMN parameter_hash SET NOT NULL;
49+
50+
-- Create index for efficient parameter hash lookups
51+
CREATE INDEX idx_template_version_presets_parameter_hash
52+
ON template_version_presets (template_version_id, parameter_hash);
53+
54+
-- Add comment explaining the column
55+
COMMENT ON COLUMN template_version_presets.parameter_hash IS 'SHA256 hash of sorted parameter name-value pairs for efficient preset matching';
56+
57+
-- Keep the function for use by the application
58+
COMMENT ON FUNCTION generate_parameter_hash(TEXT[], TEXT[]) IS 'Generates SHA256 hash of sorted parameter name-value pairs from arrays. First parameter is names array, second is values array.';
59+
60+

coderd/database/models.go

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

coderd/database/querier.go

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

0 commit comments

Comments
 (0)