aboutsummaryrefslogtreecommitdiffstats
path: root/syz-cluster/pkg/db
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2025-08-19 16:08:42 +0200
committerAleksandr Nogikh <nogikh@google.com>2025-08-21 12:29:47 +0000
commit55d1b48ed250d44ae3796f56178fd1c4729540c9 (patch)
tree293d6392a2b4265c63f0c28e90d45345588703eb /syz-cluster/pkg/db
parentd20da451d2ba749a51a7cbe5bacdd182095a3f0d (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.go49
-rw-r--r--syz-cluster/pkg/db/base_finding_repo_test.go40
-rw-r--r--syz-cluster/pkg/db/entities.go9
-rw-r--r--syz-cluster/pkg/db/migrations/6_base_findings.down.sql1
-rw-r--r--syz-cluster/pkg/db/migrations/6_base_findings.up.sql6
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);