diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2025-08-19 16:08:42 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2025-08-21 12:29:47 +0000 |
| commit | 55d1b48ed250d44ae3796f56178fd1c4729540c9 (patch) | |
| tree | 293d6392a2b4265c63f0c28e90d45345588703eb /syz-cluster/pkg/db | |
| parent | d20da451d2ba749a51a7cbe5bacdd182095a3f0d (diff) | |
syz-cluster: collect information about base crashes
Track base crashes for (commit hash, config, arch) tuples.
Diffstat (limited to 'syz-cluster/pkg/db')
| -rw-r--r-- | syz-cluster/pkg/db/base_finding_repo.go | 49 | ||||
| -rw-r--r-- | syz-cluster/pkg/db/base_finding_repo_test.go | 40 | ||||
| -rw-r--r-- | syz-cluster/pkg/db/entities.go | 9 | ||||
| -rw-r--r-- | syz-cluster/pkg/db/migrations/6_base_findings.down.sql | 1 | ||||
| -rw-r--r-- | syz-cluster/pkg/db/migrations/6_base_findings.up.sql | 6 |
5 files changed, 105 insertions, 0 deletions
diff --git a/syz-cluster/pkg/db/base_finding_repo.go b/syz-cluster/pkg/db/base_finding_repo.go new file mode 100644 index 000000000..e963cb691 --- /dev/null +++ b/syz-cluster/pkg/db/base_finding_repo.go @@ -0,0 +1,49 @@ +// Copyright 2025 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package db + +import ( + "context" + + "cloud.google.com/go/spanner" +) + +type BaseFindingRepository struct { + client *spanner.Client +} + +func NewBaseFindingRepository(client *spanner.Client) *BaseFindingRepository { + return &BaseFindingRepository{ + client: client, + } +} + +func (repo *BaseFindingRepository) Save(ctx context.Context, info *BaseFinding) error { + _, err := repo.client.ReadWriteTransaction(ctx, + func(ctx context.Context, txn *spanner.ReadWriteTransaction) error { + m, err := spanner.InsertOrUpdateStruct("BaseFindings", info) + if err != nil { + return err + } + return txn.BufferWrite([]*spanner.Mutation{m}) + }) + return err +} + +func (repo *BaseFindingRepository) Exists(ctx context.Context, info *BaseFinding) (bool, error) { + entity, err := readEntity[BaseFinding](ctx, repo.client.Single(), spanner.Statement{ + SQL: `SELECT * FROM BaseFindings WHERE +CommitHash = @commit AND +Config = @config AND +Arch = @arch AND +Title = @title`, + Params: map[string]interface{}{ + "commit": info.CommitHash, + "config": info.Config, + "arch": info.Arch, + "title": info.Title, + }, + }) + return entity != nil, err +} diff --git a/syz-cluster/pkg/db/base_finding_repo_test.go b/syz-cluster/pkg/db/base_finding_repo_test.go new file mode 100644 index 000000000..de7eb07b6 --- /dev/null +++ b/syz-cluster/pkg/db/base_finding_repo_test.go @@ -0,0 +1,40 @@ +// Copyright 2025 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package db + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestBaseFindingRepository(t *testing.T) { + client, ctx := NewTransientDB(t) + repo := NewBaseFindingRepository(client) + + // It works fine on unknown titles. + exists, err := repo.Exists(ctx, &BaseFinding{ + CommitHash: "abcd", + Config: "cfg", + Arch: "x86", + }) + require.NoError(t, err) + assert.False(t, exists) + + // Add some new title. + finding := &BaseFinding{ + CommitHash: "hash", + Config: "config", + Arch: "arch", + Title: "title", + } + err = repo.Save(ctx, finding) + require.NoError(t, err) + + // Verify it exists. + exists, err = repo.Exists(ctx, finding) + require.NoError(t, err) + assert.True(t, exists) +} diff --git a/syz-cluster/pkg/db/entities.go b/syz-cluster/pkg/db/entities.go index 53e52b4ea..13ba2fb85 100644 --- a/syz-cluster/pkg/db/entities.go +++ b/syz-cluster/pkg/db/entities.go @@ -161,3 +161,12 @@ type ReportReply struct { ReportID string `spanner:"ReportID"` Time time.Time `spanner:"Time"` } + +// BaseFinding collects all crashes observed on the base kernel tree. +// It will be used to avoid unnecessary bug reproduction attempts. +type BaseFinding struct { + CommitHash string `spanner:"CommitHash"` + Config string `spanner:"Config"` + Arch string `spanner:"Arch"` + Title string `spanner:"Title"` +} diff --git a/syz-cluster/pkg/db/migrations/6_base_findings.down.sql b/syz-cluster/pkg/db/migrations/6_base_findings.down.sql new file mode 100644 index 000000000..c30ac67a0 --- /dev/null +++ b/syz-cluster/pkg/db/migrations/6_base_findings.down.sql @@ -0,0 +1 @@ +DROP TABLE BaseFindings; diff --git a/syz-cluster/pkg/db/migrations/6_base_findings.up.sql b/syz-cluster/pkg/db/migrations/6_base_findings.up.sql new file mode 100644 index 000000000..8ec8f245a --- /dev/null +++ b/syz-cluster/pkg/db/migrations/6_base_findings.up.sql @@ -0,0 +1,6 @@ +CREATE TABLE BaseFindings ( + CommitHash STRING(64) NOT NULL, + Config STRING(256) NOT NULL, + Arch STRING(64) NOT NULL, + Title STRING(512) NOT NULL, +) PRIMARY KEY (CommitHash, Config, Arch, Title); |
