Skip to content

Commit ef1ab45

Browse files
authored
chore: improve performance store attestation (#1596)
Signed-off-by: Miguel Martinez <[email protected]>
1 parent f325c87 commit ef1ab45

File tree

4 files changed

+43
-55
lines changed

4 files changed

+43
-55
lines changed

app/controlplane/configs/config.devel.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ data:
5151
database:
5252
driver: pgx
5353
source: postgresql://postgres:@${DB_HOST:0.0.0.0}/controlplane
54-
max_open_conns: 5
55-
min_open_conns: 1
56-
max_conn_idle_time: 120s
54+
# max_open_conns: 5
55+
# min_open_conns: 1
56+
# max_conn_idle_time: 120s
5757

5858
# Development credentials for the SSO authentication roundtrip
5959
auth:

app/controlplane/internal/service/attestation.go

+16-20
Original file line numberDiff line numberDiff line change
@@ -255,30 +255,26 @@ func (s *AttestationService) Store(ctx context.Context, req *cpAPI.AttestationSe
255255
if err != nil {
256256
return nil, handleUseCaseErr(err, s.log)
257257
}
258-
go func(ctx context.Context) {
259-
// Store the exploded attestation referrer information in the DB
260-
if err := s.referrerUseCase.ExtractAndPersist(ctx, envelope, wf.ID.String()); err != nil {
261-
_ = handleUseCaseErr(err, s.log)
262-
return
263-
}
264258

265-
if !casBackend.Inline {
266-
// Store the mappings in the DB
267-
references, err := s.casMappingUseCase.LookupDigestsInAttestation(envelope)
268-
if err != nil {
269-
_ = handleUseCaseErr(err, s.log)
270-
return
271-
}
259+
// Store the exploded attestation referrer information in the DB
260+
if err := s.referrerUseCase.ExtractAndPersist(ctx, envelope, wf.ID.String()); err != nil {
261+
return nil, handleUseCaseErr(err, s.log)
262+
}
272263

273-
for _, ref := range references {
274-
s.log.Infow("msg", "creating CAS mapping", "name", ref.Name, "digest", ref.Digest, "workflowRun", req.WorkflowRunId, "casBackend", casBackend.ID.String())
275-
if _, err := s.casMappingUseCase.Create(ctx, ref.Digest, casBackend.ID.String(), req.WorkflowRunId); err != nil {
276-
_ = handleUseCaseErr(err, s.log)
277-
return
278-
}
264+
if !casBackend.Inline {
265+
// Store the mappings in the DB
266+
references, err := s.casMappingUseCase.LookupDigestsInAttestation(envelope)
267+
if err != nil {
268+
return nil, handleUseCaseErr(err, s.log)
269+
}
270+
271+
for _, ref := range references {
272+
s.log.Infow("msg", "creating CAS mapping", "name", ref.Name, "digest", ref.Digest, "workflowRun", req.WorkflowRunId, "casBackend", casBackend.ID.String())
273+
if _, err := s.casMappingUseCase.Create(ctx, ref.Digest, casBackend.ID.String(), req.WorkflowRunId); err != nil {
274+
return nil, handleUseCaseErr(err, s.log)
279275
}
280276
}
281-
}(context.Background()) // reset context
277+
}
282278

283279
secretName := casBackend.SecretName
284280

app/controlplane/pkg/data/referrer.go

+23-32
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,9 @@ func NewReferrerRepo(data *Data, wfRepo biz.WorkflowRepo, logger log.Logger) biz
4343
}
4444
}
4545

46-
type storedReferrerMap map[string]*ent.Referrer
46+
type storedReferrerMap map[string]uuid.UUID
4747

4848
func (r *ReferrerRepo) Save(ctx context.Context, referrers []*biz.Referrer, workflowID uuid.UUID) (err error) {
49-
// Start transaction
50-
tx, err := r.data.DB.Tx(ctx)
51-
if err != nil {
52-
return fmt.Errorf("failed to create transaction: %w", err)
53-
}
54-
55-
defer func() {
56-
// Unblock the row if there was an error
57-
if err != nil {
58-
_ = tx.Rollback()
59-
}
60-
}()
61-
6249
// find the workflow
6350
wf, err := r.workflowRepo.FindByID(ctx, workflowID)
6451
if err != nil {
@@ -69,50 +56,54 @@ func (r *ReferrerRepo) Save(ctx context.Context, referrers []*biz.Referrer, work
6956

7057
storedMap := make(storedReferrerMap)
7158

72-
for _, r := range referrers {
59+
for _, ref := range referrers {
7360
// Check if it exists already, if not create it
74-
err := tx.Referrer.Create().
75-
SetDigest(r.Digest).SetKind(r.Kind).SetDownloadable(r.Downloadable).
76-
SetMetadata(r.Metadata).SetAnnotations(r.Annotations).
61+
storedID := r.data.DB.Referrer.Create().
62+
SetDigest(ref.Digest).SetKind(ref.Kind).SetDownloadable(ref.Downloadable).
63+
SetMetadata(ref.Metadata).SetAnnotations(ref.Annotations).
7764
AddWorkflowIDs(workflowID).
7865
OnConflictColumns(
7966
referrer.FieldDigest, referrer.FieldKind,
80-
).UpdateNewValues().Exec(ctx)
67+
).UpdateNewValues().IDX(ctx)
8168
if err != nil {
8269
return fmt.Errorf("failed to create referrer: %w", err)
8370
}
8471

85-
storedRef, err := tx.Referrer.Query().Where(referrer.Digest(r.Digest), referrer.Kind(r.Kind)).Only(ctx)
72+
storedRef, err := r.data.DB.Referrer.Query().Select(referrer.FieldID).Where(referrer.ID(storedID)).First(ctx)
8673
if err != nil {
8774
return fmt.Errorf("failed to load referrer: %w", err)
75+
} else if storedRef == nil {
76+
return fmt.Errorf("failed to load referrer: %w", err)
8877
}
8978

9079
// Store it in the map
91-
storedMap[r.MapID()] = storedRef
80+
storedMap[ref.MapID()] = storedRef.ID
9281
}
9382

9483
// 2 - define the relationship between referrers
95-
for _, r := range referrers {
84+
for _, parentRef := range referrers {
9685
// This is the current item stored in DB
97-
storedReferrer := storedMap[r.MapID()]
86+
storedReferrer := storedMap[parentRef.MapID()]
9887
// Iterate on the items it refer to (references)
99-
for _, ref := range r.References {
88+
var references []uuid.UUID
89+
for _, ref := range parentRef.References {
10090
// amd find it in the DB
10191
storedReference, ok := storedMap[ref.MapID()]
10292
if !ok {
10393
return fmt.Errorf("referrer %v not found", ref)
10494
}
10595

106-
// Create the relationship
107-
_, err := storedReferrer.Update().AddReferenceIDs(storedReference.ID).Save(ctx)
108-
if err != nil {
109-
return fmt.Errorf("failed to create referrer relationship: %w", err)
110-
}
96+
references = append(references, storedReference)
11197
}
112-
}
11398

114-
if err := tx.Commit(); err != nil {
115-
return fmt.Errorf("failed to commit transaction: %w", err)
99+
if len(references) == 0 {
100+
continue
101+
}
102+
103+
// Create the relationship
104+
if err := r.data.DB.Referrer.UpdateOneID(storedReferrer).AddReferenceIDs(references...).Exec(ctx); err != nil {
105+
return fmt.Errorf("failed to create referrer relationship: %w", err)
106+
}
116107
}
117108

118109
return nil

devel/compose.common.yml

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ services:
1111
- ALLOW_EMPTY_PASSWORD=yes
1212
- POSTGRESQL_DATABASE=controlplane
1313
- POSTGRESQL_USERNAME=postgres
14+
- POSTGRESQL_SHARED_PRELOAD_LIBRARIES=pgaudit,pg_stat_statements
1415
healthcheck:
1516
test: ["CMD", "pg_isready", "-U", "postgres"]
1617
interval: 2s

0 commit comments

Comments
 (0)