Skip to content

Commit 3b656af

Browse files
committed
dashboard/app: periodically remove coverage garbage from spanner
1 parent 52b38cc commit 3b656af

File tree

4 files changed

+54
-1
lines changed

4 files changed

+54
-1
lines changed

dashboard/app/batch_coverage.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ import (
77
"context"
88
"fmt"
99
"net/http"
10+
"os"
1011
"strconv"
1112

1213
"cloud.google.com/go/batch/apiv1/batchpb"
1314
"cloud.google.com/go/bigquery"
1415
"cloud.google.com/go/civil"
16+
"cloud.google.com/go/spanner"
1517
"github.com/google/syzkaller/pkg/coveragedb"
1618
"google.golang.org/api/iterator"
1719
"google.golang.org/appengine/v2"
@@ -151,3 +153,45 @@ func nsDataAvailable(ctx context.Context, ns string) ([]coveragedb.TimePeriod, [
151153
}
152154
return periods, recordsCount, nil
153155
}
156+
157+
func handleBatchCoverageClean(w http.ResponseWriter, r *http.Request) {
158+
err, deletedRows := cleanCoverageDB(20)
159+
if err != nil {
160+
w.WriteHeader(http.StatusInternalServerError)
161+
w.Write([]byte(fmt.Sprintf("failed to cleanCoverageDB: %w", err.Error())))
162+
return
163+
}
164+
w.Write([]byte(fmt.Sprintf("cleanCoverageDB deleted %d rows", deletedRows)))
165+
}
166+
167+
func cleanCoverageDB(maxSessionsToDelete int) (error, int64) {
168+
ctx := context.Background()
169+
client, err := spanner.NewClient(ctx, os.Getenv("GOOGLE_CLOUD_PROJECT"))
170+
if err != nil {
171+
return fmt.Errorf("failed to coveragedb.NewClient: %w", err), 0
172+
}
173+
defer client.Close()
174+
var rowCount int64
175+
176+
_, err = client.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
177+
stmt := spanner.Statement{
178+
SQL: fmt.Sprintf(` delete from files
179+
where files.session in (
180+
select
181+
distinct(files.session)
182+
from files
183+
left join merge_history
184+
on files.session = merge_history.session
185+
where merge_history.session is NULL
186+
limit %d
187+
);`, maxSessionsToDelete),
188+
}
189+
var err error
190+
rowCount, err = txn.Update(ctx, stmt)
191+
if err != nil {
192+
return fmt.Errorf("txn.Update: %w", err)
193+
}
194+
return nil
195+
})
196+
return err, rowCount
197+
}

dashboard/app/batch_main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
func initBatchProcessors() {
1919
http.HandleFunc("/cron/batch_coverage", handleBatchCoverage)
2020
http.HandleFunc("/cron/batch_db_export", handleBatchDBExport)
21+
http.HandleFunc("/cron/batch_coverage_clean", handleBatchCoverageClean)
2122
}
2223

2324
// from https://cloud.google.com/batch/docs/samples/batch-create-script-job

dashboard/app/cron.yaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ cron:
2424
schedule: every sunday 00:00
2525
# Update other coverage numbers every day.
2626
- url: /cron/batch_coverage?days=true&months=true&steps=10
27-
schedule: every 24 hours
27+
schedule: every day 00:00
28+
# Clean up coverage db every week.
29+
# We're adding data w/o transactions.
30+
# It is important to run clean operation when there are no batch_coverage in progress.
31+
- url: /cron/batch_coverage_clean
32+
schedule: every saturday 12:00
2833
# Export reproducers every week.
2934
- url: /cron/batch_db_export
3035
schedule: every saturday 00:00

tools/syz-covermerger/init_db.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ CREATE TABLE
2323
(session, filepath) );')
2424
gcloud spanner databases ddl update $db --instance=syzbot --project=syzkaller \
2525
--ddl="$create_table"
26+
echo "creating 'files' indexes"
27+
gcloud spanner databases ddl update $db --instance=syzbot --project=syzkaller \
28+
--ddl="CREATE INDEX files_session ON files (session);"
2629

2730
echo "drop table 'merge_history' if exists"
2831
gcloud spanner databases ddl update $db --instance=syzbot --project=syzkaller \

0 commit comments

Comments
 (0)