[gold] Delete fs_clstore
Bug: skia:10582
Change-Id: I4714cbac8c7f64fd8c4cc2f865a3434a913fb6df
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/373758
Reviewed-by: Leandro Lovisolo <lovisolo@google.com>
diff --git a/golden/cmd/gold_frontend/gold_frontend.go b/golden/cmd/gold_frontend/gold_frontend.go
index 6af7c6c..9485e92 100644
--- a/golden/cmd/gold_frontend/gold_frontend.go
+++ b/golden/cmd/gold_frontend/gold_frontend.go
@@ -45,8 +45,6 @@
"go.skia.org/infra/go/vcsinfo/bt_vcs"
"go.skia.org/infra/golden/go/baseline/simple_baseliner"
"go.skia.org/infra/golden/go/clstore"
- "go.skia.org/infra/golden/go/clstore/dualclstore"
- "go.skia.org/infra/golden/go/clstore/fs_clstore"
"go.skia.org/infra/golden/go/clstore/sqlclstore"
"go.skia.org/infra/golden/go/code_review"
"go.skia.org/infra/golden/go/code_review/commenter"
@@ -244,7 +242,7 @@
tjs := mustMakeTryJobStore(fsClient, sqlDB)
- reviewSystems := mustInitializeReviewSystems(fsc, fsClient, client, sqlDB)
+ reviewSystems := mustInitializeReviewSystems(fsc, client, sqlDB)
tileSource := mustMakeTileSource(ctx, fsc, expStore, ignoreStore, traceStore, vcs, publiclyViewableParams, reviewSystems)
@@ -506,7 +504,7 @@
// mustInitializeReviewSystems validates and instantiates one clstore.ReviewSystem for each CRS
// specified via the JSON configuration files.
-func mustInitializeReviewSystems(fsc *frontendServerConfig, fc *firestore.Client, hc *http.Client, sqlDB *pgxpool.Pool) []clstore.ReviewSystem {
+func mustInitializeReviewSystems(fsc *frontendServerConfig, hc *http.Client, sqlDB *pgxpool.Pool) []clstore.ReviewSystem {
rs := make([]clstore.ReviewSystem, 0, len(fsc.CodeReviewSystems))
for _, cfg := range fsc.CodeReviewSystems {
var crs code_review.Client
@@ -539,12 +537,11 @@
sklog.Fatalf("CRS flavor %s not supported.", cfg.Flavor)
return nil
}
- fireCS := fs_clstore.New(fc, cfg.ID)
sqlCS := sqlclstore.New(sqlDB, cfg.ID)
rs = append(rs, clstore.ReviewSystem{
ID: cfg.ID,
Client: crs,
- Store: dualclstore.New(sqlCS, fireCS),
+ Store: sqlCS,
URLTemplate: cfg.URLTemplate,
})
}
diff --git a/golden/go/clstore/dualclstore/BUILD.bazel b/golden/go/clstore/dualclstore/BUILD.bazel
deleted file mode 100644
index afd185b..0000000
--- a/golden/go/clstore/dualclstore/BUILD.bazel
+++ /dev/null
@@ -1,14 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-
-go_library(
- name = "dualclstore",
- srcs = ["dualclstore.go"],
- importpath = "go.skia.org/infra/golden/go/clstore/dualclstore",
- visibility = ["//visibility:public"],
- deps = [
- "//go/skerr",
- "//golden/go/clstore",
- "//golden/go/code_review",
- "@org_golang_x_sync//errgroup",
- ],
-)
diff --git a/golden/go/clstore/dualclstore/dualclstore.go b/golden/go/clstore/dualclstore/dualclstore.go
deleted file mode 100644
index 2e1c194..0000000
--- a/golden/go/clstore/dualclstore/dualclstore.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Package dualclstore contains an implementation of clstore.Store that reads and writes to
-// a primary implementation and writes to a secondary implementation. It is designed for migrating
-// between two implementations.
-package dualclstore
-
-import (
- "context"
-
- "golang.org/x/sync/errgroup"
-
- "go.skia.org/infra/go/skerr"
- "go.skia.org/infra/golden/go/clstore"
- "go.skia.org/infra/golden/go/code_review"
-)
-
-type StoreImpl struct {
- primary clstore.Store
- secondary clstore.Store
-}
-
-// New returns an implementation of clstore.Store that writes to both provided clstores but only
-// reads from the primary.
-func New(primary, secondary clstore.Store) clstore.Store {
- return &StoreImpl{
- primary: primary,
- secondary: secondary,
- }
-}
-
-// GetChangelist implements clstore.Store by returning data from the primary store.
-func (s *StoreImpl) GetChangelist(ctx context.Context, id string) (code_review.Changelist, error) {
- return s.primary.GetChangelist(ctx, id)
-}
-
-// GetPatchset implements clstore.Store by returning data from the primary store.
-func (s *StoreImpl) GetPatchset(ctx context.Context, clID, psID string) (code_review.Patchset, error) {
- return s.primary.GetPatchset(ctx, clID, psID)
-}
-
-// GetPatchsetByOrder implements clstore.Store by returning data from the primary store.
-func (s *StoreImpl) GetPatchsetByOrder(ctx context.Context, clID string, psOrder int) (code_review.Patchset, error) {
- return s.primary.GetPatchsetByOrder(ctx, clID, psOrder)
-}
-
-// GetChangelists implements clstore.Store by returning data from the primary store.
-func (s *StoreImpl) GetChangelists(ctx context.Context, opts clstore.SearchOptions) ([]code_review.Changelist, int, error) {
- return s.primary.GetChangelists(ctx, opts)
-}
-
-// GetPatchsets implements clstore.Store by returning data from the primary store.
-func (s *StoreImpl) GetPatchsets(ctx context.Context, clID string) ([]code_review.Patchset, error) {
- return s.primary.GetPatchsets(ctx, clID)
-}
-
-// PutChangelist implements clstore.Store by writing data to the primary and secondary in parallel.
-func (s *StoreImpl) PutChangelist(ctx context.Context, cl code_review.Changelist) error {
- eg, ctx := errgroup.WithContext(ctx)
- eg.Go(func() error {
- return skerr.Wrapf(s.primary.PutChangelist(ctx, cl), "primary PutChangelist failed")
- })
- eg.Go(func() error {
- return skerr.Wrapf(s.secondary.PutChangelist(ctx, cl), "secondary PutChangelist failed")
- })
- return skerr.Wrap(eg.Wait())
-}
-
-// PutPatchset implements clstore.Store by writing data to the primary and secondary in parallel.
-func (s *StoreImpl) PutPatchset(ctx context.Context, ps code_review.Patchset) error {
- eg, ctx := errgroup.WithContext(ctx)
- eg.Go(func() error {
- return skerr.Wrapf(s.primary.PutPatchset(ctx, ps), "primary PutPatchset failed")
- })
- eg.Go(func() error {
- return skerr.Wrapf(s.secondary.PutPatchset(ctx, ps), "secondary PutPatchset failed")
- })
- return skerr.Wrap(eg.Wait())
-}
diff --git a/golden/go/clstore/fs_clstore/BUILD.bazel b/golden/go/clstore/fs_clstore/BUILD.bazel
deleted file mode 100644
index 8c7639c..0000000
--- a/golden/go/clstore/fs_clstore/BUILD.bazel
+++ /dev/null
@@ -1,33 +0,0 @@
-load("//bazel/go:go_test.bzl", "go_test")
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-
-go_library(
- name = "fs_clstore",
- srcs = ["fs_clstore.go"],
- importpath = "go.skia.org/infra/golden/go/clstore/fs_clstore",
- visibility = ["//visibility:public"],
- deps = [
- "//go/firestore",
- "//go/metrics2",
- "//go/skerr",
- "//golden/go/clstore",
- "//golden/go/code_review",
- "@com_google_cloud_go_firestore//:firestore",
- "@org_golang_google_grpc//codes",
- "@org_golang_google_grpc//status",
- ],
-)
-
-go_test(
- name = "fs_clstore_test",
- srcs = ["fs_clstore_test.go"],
- embed = [":fs_clstore"],
- deps = [
- "//go/firestore",
- "//go/testutils/unittest",
- "//golden/go/clstore",
- "//golden/go/code_review",
- "@com_github_stretchr_testify//assert",
- "@com_github_stretchr_testify//require",
- ],
-)
diff --git a/golden/go/clstore/fs_clstore/FIRESTORE.md b/golden/go/clstore/fs_clstore/FIRESTORE.md
deleted file mode 100644
index d3aa3d2..0000000
--- a/golden/go/clstore/fs_clstore/FIRESTORE.md
+++ /dev/null
@@ -1,59 +0,0 @@
-Storing ChangeLists and PatchSets in Firestore
-==============================================
-
-We need to keep track of the ChangeLists and PatchSets that have been associated
-with TryJob data that we have ingested.
-
-See https://docs.google.com/document/d/1d0tOhgx51QOGiSXqTxiwNSlgm1pYHTUSBK3agysX6Iw/edit
-for more context.
-
-Schema
-------
-
-We should have two Firestore Collections (i.e. tables), one for ChangeList
-and a subcollection for PatchSet.
-
- ChangeList
- ID string # SystemID + System
- SystemID string # The id of the CL in, for example, Gerrit
- System string # "gerrit", "github", etc
- Status int # corresponds to code_review.CLStatus
- Owner string # email address
- Updated time.Time
- Subject string
- []PatchSet
- SystemID string # The id of the PS in, for example, Gerrit
- System string # "gerrit", "github", etc
- ChangeListID string # SystemID from ChangeList
- Order int # number of this PS
- GitHash string
- HasUntriagedDigests bool
- CommentedOnCL bool
-
-Indexing
---------
-We need the following composite indexes:
-
-Collection ID | Fields
-------------------------------------------------------------------
-clstore_changelist | status: ASC updated: DESC
-
-
-We should mark ChangeList.Subject as no-index, to save some index space.
-<https://cloud.google.com/firestore/docs/query-data/indexing#exemptions>
-
-Usage
------
-We'll be querying:
- - ChangeLists by SystemID, System
- - PatchSets belonging to a ChangeList ordered by Order.
-
-With this hierarchical setup, we should avoid conflicts
-between multiple systems.
-
-Growth Opportunities
--------------------
-
-We could open up the searching to include "get only Open CLs" or get CLs by
-a given (the logged in?) user. This should just entail adding some more
-indices and a few new functions to the API.
\ No newline at end of file
diff --git a/golden/go/clstore/fs_clstore/fs_clstore.go b/golden/go/clstore/fs_clstore/fs_clstore.go
deleted file mode 100644
index 2e3ef84..0000000
--- a/golden/go/clstore/fs_clstore/fs_clstore.go
+++ /dev/null
@@ -1,301 +0,0 @@
-// Package fs_clstore implements the clstore.Store interface with
-// a FireStore backend.
-package fs_clstore
-
-import (
- "context"
- "fmt"
- "time"
-
- "cloud.google.com/go/firestore"
- ifirestore "go.skia.org/infra/go/firestore"
- "go.skia.org/infra/go/metrics2"
- "go.skia.org/infra/go/skerr"
- "go.skia.org/infra/golden/go/clstore"
- "go.skia.org/infra/golden/go/code_review"
- "google.golang.org/grpc/codes"
- "google.golang.org/grpc/status"
-)
-
-const (
- // These are the collections in Firestore.
- changelistCollection = "clstore_changelist"
- patchsetCollection = "clstore_patchset"
-
- // These are the fields we query by
- orderField = "order"
- statusField = "status"
- updatedField = "updated"
-
- maxReadAttempts = 5
- maxWriteAttempts = 5
- maxOperationTime = time.Minute
-)
-
-// StoreImpl is the Firestore based implementation of clstore.
-type StoreImpl struct {
- client *ifirestore.Client
- crsID string
-}
-
-// New returns a new StoreImpl. The crsID should be distinct enough to separate an internal CRS
-// from an external one, if needed (e.g. "gerrit" vs "gerrit-internal")
-func New(client *ifirestore.Client, crsID string) *StoreImpl {
- return &StoreImpl{
- client: client,
- crsID: crsID,
- }
-}
-
-// changelistEntry represents how a Changelist is stored in Firestore.
-type changelistEntry struct {
- SystemID string `firestore:"systemid"`
- System string `firestore:"system"`
- Owner string `firestore:"owner"`
- Status code_review.CLStatus `firestore:"status"`
- Subject string `firestore:"subject"`
- Updated time.Time `firestore:"updated"`
-}
-
-// patchsetEntry represents how a Patchset is stored in Firestore.
-type patchsetEntry struct {
- SystemID string `firestore:"systemid"`
- System string `firestore:"system"`
- ChangelistID string `firestore:"changelistid"`
- Order int `firestore:"order"`
- GitHash string `firestore:"githash"`
- CommentedOnCL bool `firestore:"did_comment"`
- LastCheckedIfCommentNecessary time.Time `firestore:"last_checked_about_comment"`
-}
-
-// toPatchset converts the Firestore representation of a Patchset to a code_review.Patchset
-func (p patchsetEntry) toPatchset() code_review.Patchset {
- return code_review.Patchset{
- SystemID: p.SystemID,
- ChangelistID: p.ChangelistID,
- Order: p.Order,
- GitHash: p.GitHash,
- LastCheckedIfCommentNecessary: p.LastCheckedIfCommentNecessary,
- CommentedOnCL: p.CommentedOnCL,
- }
-}
-
-// GetChangelist implements the clstore.Store interface.
-func (s *StoreImpl) GetChangelist(ctx context.Context, id string) (code_review.Changelist, error) {
- defer metrics2.FuncTimer().Stop()
- fID := s.changelistFirestoreID(id)
- doc, err := s.client.Collection(changelistCollection).Doc(fID).Get(ctx)
- if err != nil {
- if status.Code(err) == codes.NotFound {
- return code_review.Changelist{}, clstore.ErrNotFound
- }
- return code_review.Changelist{}, skerr.Wrapf(err, "retrieving CL %s from Firestore", fID)
- }
- if doc == nil {
- return code_review.Changelist{}, clstore.ErrNotFound
- }
-
- cle := changelistEntry{}
- if err := doc.DataTo(&cle); err != nil {
- id := doc.Ref.ID
- return code_review.Changelist{}, skerr.Wrapf(err, "corrupt data in Firestore, could not unmarshal %s changelist with id %s", s.crsID, id)
- }
- cl := code_review.Changelist{
- SystemID: cle.SystemID,
- Owner: cle.Owner,
- Status: cle.Status,
- Subject: cle.Subject,
- Updated: cle.Updated,
- }
-
- return cl, nil
-}
-
-// changelistFirestoreID returns the id for a given CL in a given CRS - this allows us to
-// look up a document by id w/o having to perform a query.
-func (s *StoreImpl) changelistFirestoreID(clID string) string {
- return clID + "_" + s.crsID
-}
-
-// GetChangelists implements the clstore.Store interface.
-func (s *StoreImpl) GetChangelists(ctx context.Context, opts clstore.SearchOptions) ([]code_review.Changelist, int, error) {
- defer metrics2.FuncTimer().Stop()
- if opts.Limit <= 0 {
- return nil, 0, skerr.Fmt("must supply a limit")
- }
- q := s.client.Collection(changelistCollection).OrderBy(updatedField, firestore.Desc)
- if !opts.After.IsZero() {
- q = q.Where(updatedField, ">=", opts.After)
- }
- if opts.OpenCLsOnly {
- q = q.Where(statusField, "==", code_review.Open)
- }
- q = q.Limit(opts.Limit).Offset(opts.StartIdx)
-
- var xcl []code_review.Changelist
-
- r := fmt.Sprintf("[%d:%d]", opts.StartIdx, opts.StartIdx+opts.Limit)
- err := s.client.IterDocs(ctx, "GetChangelists", r, q, maxReadAttempts, maxOperationTime, func(doc *firestore.DocumentSnapshot) error {
- if doc == nil {
- return nil
- }
- entry := changelistEntry{}
- if err := doc.DataTo(&entry); err != nil {
- id := doc.Ref.ID
- return skerr.Wrapf(err, "corrupt data in Firestore, could not unmarshal entry with id %s", id)
- }
- xcl = append(xcl, code_review.Changelist{
- SystemID: entry.SystemID,
- Updated: entry.Updated,
- Subject: entry.Subject,
- Status: entry.Status,
- Owner: entry.Owner,
- })
- return nil
- })
- if err != nil {
- return nil, -1, skerr.Wrapf(err, "fetching cls in range %s", r)
- }
- n := len(xcl)
- if n == opts.Limit && n != 0 {
- // We don't know how many there are and it might be too slow to count, so just give
- // the "many" response.
- n = clstore.CountMany
- } else {
- // We know exactly either 1) how many there are (if n > 0) or 2) an upper bound on how many
- // there are (if n == 0)
- n += opts.StartIdx
- }
-
- return xcl, n, nil
-}
-
-// GetPatchset implements the clstore.Store interface.
-func (s *StoreImpl) GetPatchset(ctx context.Context, clID, psID string) (code_review.Patchset, error) {
- defer metrics2.FuncTimer().Stop()
- fID := s.changelistFirestoreID(clID)
- doc, err := s.client.Collection(changelistCollection).Doc(fID).
- Collection(patchsetCollection).Doc(psID).Get(ctx)
- if err != nil {
- if status.Code(err) == codes.NotFound {
- return code_review.Patchset{}, clstore.ErrNotFound
- }
- return code_review.Patchset{}, skerr.Wrapf(err, "retrieving PS %s from Firestore", fID)
- }
- if doc == nil {
- return code_review.Patchset{}, clstore.ErrNotFound
- }
-
- pse := patchsetEntry{}
- if err := doc.DataTo(&pse); err != nil {
- id := doc.Ref.ID
- return code_review.Patchset{}, skerr.Wrapf(err, "corrupt data in Firestore, could not unmarshal %s patchset with id %s", s.crsID, id)
- }
- return pse.toPatchset(), nil
-}
-
-// GetPatchsetByOrder implements the clstore.Store interface.
-func (s *StoreImpl) GetPatchsetByOrder(ctx context.Context, clID string, psOrder int) (code_review.Patchset, error) {
- defer metrics2.FuncTimer().Stop()
- fID := s.changelistFirestoreID(clID)
- q := s.client.Collection(changelistCollection).Doc(fID).
- Collection(patchsetCollection).Where(orderField, "==", psOrder)
-
- ps := code_review.Patchset{}
- found := false
- msg := fmt.Sprintf("%s:%d", clID, psOrder)
- err := s.client.IterDocs(ctx, "GetPatchsetByOrder", msg, q, maxReadAttempts, maxOperationTime, func(doc *firestore.DocumentSnapshot) error {
- if doc == nil || found {
- return nil
- }
- entry := patchsetEntry{}
- if err := doc.DataTo(&entry); err != nil {
- id := doc.Ref.ID
- return skerr.Wrapf(err, "corrupt data in Firestore, could not unmarshal patchsetEntry with id %s", id)
- }
- ps = entry.toPatchset()
- found = true
- return nil
- })
- if err != nil {
- return code_review.Patchset{}, skerr.Wrapf(err, "fetching patchsets for cl %s", clID)
- }
- if !found {
- return code_review.Patchset{}, clstore.ErrNotFound
- }
-
- return ps, nil
-}
-
-// GetPatchsets implements the clstore.Store interface.
-func (s *StoreImpl) GetPatchsets(ctx context.Context, clID string) ([]code_review.Patchset, error) {
- defer metrics2.FuncTimer().Stop()
- fID := s.changelistFirestoreID(clID)
- q := s.client.Collection(changelistCollection).Doc(fID).
- Collection(patchsetCollection).OrderBy(orderField, firestore.Asc)
-
- var xps []code_review.Patchset
-
- err := s.client.IterDocs(ctx, "GetPatchsets", clID, q, maxReadAttempts, maxOperationTime, func(doc *firestore.DocumentSnapshot) error {
- if doc == nil {
- return nil
- }
- entry := patchsetEntry{}
- if err := doc.DataTo(&entry); err != nil {
- id := doc.Ref.ID
- return skerr.Wrapf(err, "corrupt data in Firestore, could not unmarshal entry with id %s", id)
- }
- xps = append(xps, entry.toPatchset())
- return nil
- })
- if err != nil {
- return nil, skerr.Wrapf(err, "fetching patchsets for cl %s", clID)
- }
-
- return xps, nil
-}
-
-// PutChangelist implements the clstore.Store interface.
-func (s *StoreImpl) PutChangelist(ctx context.Context, cl code_review.Changelist) error {
- defer metrics2.FuncTimer().Stop()
- fID := s.changelistFirestoreID(cl.SystemID)
- cd := s.client.Collection(changelistCollection).Doc(fID)
- record := changelistEntry{
- SystemID: cl.SystemID,
- System: s.crsID,
- Owner: cl.Owner,
- Status: cl.Status,
- Subject: cl.Subject,
- Updated: cl.Updated,
- }
- _, err := s.client.Set(ctx, cd, record, maxWriteAttempts, maxOperationTime)
- if err != nil {
- return skerr.Wrapf(err, "could not write CL %v to clstore", cl)
- }
- return nil
-}
-
-// PutPatchset implements the clstore.Store interface.
-func (s *StoreImpl) PutPatchset(ctx context.Context, ps code_review.Patchset) error {
- defer metrics2.FuncTimer().Stop()
- fID := s.changelistFirestoreID(ps.ChangelistID)
- pd := s.client.Collection(changelistCollection).Doc(fID).
- Collection(patchsetCollection).Doc(ps.SystemID)
- record := patchsetEntry{
- SystemID: ps.SystemID,
- System: s.crsID,
- ChangelistID: ps.ChangelistID,
- Order: ps.Order,
- GitHash: ps.GitHash,
- LastCheckedIfCommentNecessary: ps.LastCheckedIfCommentNecessary,
- CommentedOnCL: ps.CommentedOnCL,
- }
- _, err := s.client.Set(ctx, pd, record, maxWriteAttempts, maxOperationTime)
- if err != nil {
- return skerr.Wrapf(err, "could not write PS %v to clstore", ps)
- }
- return nil
-}
-
-// Make sure StoreImpl fulfills the clstore.Store interface.
-var _ clstore.Store = (*StoreImpl)(nil)
diff --git a/golden/go/clstore/fs_clstore/fs_clstore_test.go b/golden/go/clstore/fs_clstore/fs_clstore_test.go
deleted file mode 100644
index f884e5c..0000000
--- a/golden/go/clstore/fs_clstore/fs_clstore_test.go
+++ /dev/null
@@ -1,446 +0,0 @@
-package fs_clstore
-
-import (
- "context"
- "strconv"
- "testing"
- "time"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- "go.skia.org/infra/go/firestore"
- "go.skia.org/infra/go/testutils/unittest"
- "go.skia.org/infra/golden/go/clstore"
- "go.skia.org/infra/golden/go/code_review"
-)
-
-func TestPutGetChangelist(t *testing.T) {
- unittest.LargeTest(t)
- c, cleanup := firestore.NewClientForTesting(context.Background(), t)
- defer cleanup()
-
- f := New(c, "gerrit")
- ctx := context.Background()
-
- expectedID := "987654"
-
- // Should not exist initially
- _, err := f.GetChangelist(ctx, expectedID)
- require.Error(t, err)
- require.Equal(t, clstore.ErrNotFound, err)
-
- cl := code_review.Changelist{
- SystemID: expectedID,
- Owner: "test@example.com",
- Status: code_review.Abandoned,
- Subject: "some code",
- Updated: time.Date(2019, time.August, 13, 12, 11, 10, 0, time.UTC),
- }
-
- err = f.PutChangelist(ctx, cl)
- require.NoError(t, err)
-
- actual, err := f.GetChangelist(ctx, expectedID)
- require.NoError(t, err)
- require.Equal(t, cl, actual)
-}
-
-func TestPutGetPatchset(t *testing.T) {
- unittest.LargeTest(t)
- c, cleanup := firestore.NewClientForTesting(context.Background(), t)
- defer cleanup()
-
- f := New(c, "gerrit")
- ctx := context.Background()
-
- expectedCLID := "987654"
- expectedPSID := "abcdef012345"
-
- // Should not exist initially
- _, err := f.GetPatchset(ctx, expectedCLID, expectedPSID)
- require.Error(t, err)
- require.Equal(t, clstore.ErrNotFound, err)
-
- ps := code_review.Patchset{
- SystemID: expectedPSID,
- ChangelistID: expectedCLID,
- Order: 3,
- GitHash: "fedcba98765443321",
- LastCheckedIfCommentNecessary: time.Date(2020, time.May, 1, 2, 3, 4, 0, time.UTC),
- CommentedOnCL: true,
- }
-
- err = f.PutPatchset(ctx, ps)
- require.NoError(t, err)
-
- actual, err := f.GetPatchset(ctx, expectedCLID, expectedPSID)
- require.NoError(t, err)
- require.Equal(t, ps, actual)
-}
-
-func TestPutGetPatchsetByOrder(t *testing.T) {
- unittest.LargeTest(t)
- c, cleanup := firestore.NewClientForTesting(context.Background(), t)
- defer cleanup()
-
- f := New(c, "gerrit")
- ctx := context.Background()
-
- expectedCLID := "987654"
- expectedPSOrder := 3
- otherPSOrder := 117
-
- // Should not exist initially
- _, err := f.GetPatchsetByOrder(ctx, expectedCLID, expectedPSOrder)
- require.Error(t, err)
- require.Equal(t, clstore.ErrNotFound, err)
-
- ps := code_review.Patchset{
- SystemID: "abcdef012345",
- ChangelistID: expectedCLID,
- Order: expectedPSOrder,
- GitHash: "fedcba98765443321",
- }
-
- err = f.PutPatchset(ctx, ps)
- require.NoError(t, err)
-
- ps2 := code_review.Patchset{
- SystemID: "zyx9876",
- ChangelistID: expectedCLID,
- Order: otherPSOrder,
- GitHash: "notthisone",
- }
-
- err = f.PutPatchset(ctx, ps2)
- require.NoError(t, err)
-
- actual, err := f.GetPatchsetByOrder(ctx, expectedCLID, expectedPSOrder)
- require.NoError(t, err)
- require.Equal(t, ps, actual)
-
- actual, err = f.GetPatchsetByOrder(ctx, expectedCLID, otherPSOrder)
- require.NoError(t, err)
- require.Equal(t, ps2, actual)
-}
-
-// TestDifferentSystems makes sure that two systems in the same
-// firestore namespace don't overlap.
-func TestDifferentSystems(t *testing.T) {
- unittest.LargeTest(t)
- c, cleanup := firestore.NewClientForTesting(context.Background(), t)
- defer cleanup()
-
- gerrit := New(c, "gerrit")
- github := New(c, "github")
- ctx := context.Background()
-
- expectedCLID := "987654"
-
- gerritCL := code_review.Changelist{
- SystemID: expectedCLID,
- Owner: "test@example.com",
- Status: code_review.Abandoned,
- Subject: "some code on gerrit",
- Updated: time.Date(2019, time.August, 13, 12, 11, 10, 0, time.UTC),
- }
-
- githubCL := code_review.Changelist{
- SystemID: expectedCLID,
- Owner: "test2@example.com",
- Status: code_review.Open,
- Subject: "some code on github",
- Updated: time.Date(2019, time.August, 15, 12, 11, 10, 0, time.UTC),
- }
-
- // Both systems have a CL with the same ID
- err := gerrit.PutChangelist(ctx, gerritCL)
- require.NoError(t, err)
- err = github.PutChangelist(ctx, githubCL)
- require.NoError(t, err)
-
- actualGerrit, err := gerrit.GetChangelist(ctx, expectedCLID)
- require.NoError(t, err)
- actualGithub, err := github.GetChangelist(ctx, expectedCLID)
- require.NoError(t, err)
-
- require.NotEqual(t, actualGerrit, actualGithub)
- require.Equal(t, gerritCL, actualGerrit)
- require.Equal(t, githubCL, actualGithub)
-}
-
-// TestGetPatchsets stores several patchsets and then makes sure we can fetch the ones
-// for a specific CL and they arrive sorted by Order, even if the Patchsets are sparse.
-func TestGetPatchsets(t *testing.T) {
- unittest.LargeTest(t)
- c, cleanup := firestore.NewClientForTesting(context.Background(), t)
- defer cleanup()
-
- f := New(c, "gerrit")
- ctx := context.Background()
-
- expectedID := "987654"
- sparseID := "sparse"
- // None should exist initially
- xps, err := f.GetPatchsets(ctx, expectedID)
- require.NoError(t, err)
- require.Empty(t, xps)
-
- // Create the Changelist, but don't add any Patchsets yet.
- err = f.PutChangelist(ctx, code_review.Changelist{SystemID: expectedID})
- require.NoError(t, err)
-
- // Still no Patchsets
- xps, err = f.GetPatchsets(ctx, expectedID)
- require.NoError(t, err)
- require.Empty(t, xps)
-
- for i := 0; i < 3; i++ {
- ps := code_review.Patchset{
- SystemID: "other_id" + strconv.Itoa(i),
- ChangelistID: "not this CL",
- GitHash: "nope",
- Order: i + 1,
- }
- require.NoError(t, f.PutPatchset(ctx, ps))
- }
- // use random ids to make sure the we are truly sorting on ids
- randIDs := []string{"zkdf", "bkand", "d-sd9f9s3n", "csdfksdfn1"}
- // put them in backwards to make sure they get resorted by order
- for i := 4; i > 0; i-- {
- ps := code_review.Patchset{
- // use an ID
- SystemID: randIDs[i-1],
- ChangelistID: expectedID,
- GitHash: "whatever",
- Order: i,
- }
- require.NoError(t, f.PutPatchset(ctx, ps))
- }
-
- for i := 0; i < 9; i += 3 {
- ps := code_review.Patchset{
- SystemID: "other_other_id" + strconv.Itoa(20-i),
- ChangelistID: sparseID,
- GitHash: "sparse",
- Order: i + 1,
- }
- require.NoError(t, f.PutPatchset(ctx, ps))
- }
-
- // Check that sequential orders work
- xps, err = f.GetPatchsets(ctx, expectedID)
- require.NoError(t, err)
- require.Len(t, xps, 4)
- // Make sure they are in order
- for i, ps := range xps {
- require.Equal(t, i+1, ps.Order)
- require.Equal(t, expectedID, ps.ChangelistID)
- require.Equal(t, "whatever", ps.GitHash)
- }
-
- // Check that sparse patchsets work.
- xps, err = f.GetPatchsets(ctx, sparseID)
- require.NoError(t, err)
- require.Len(t, xps, 3)
- // Make sure they are in order
- for i, ps := range xps {
- require.Equal(t, i*3+1, ps.Order)
- require.Equal(t, sparseID, ps.ChangelistID)
- require.Equal(t, "sparse", ps.GitHash)
- }
-}
-
-func TestGetChangelists(t *testing.T) {
- unittest.LargeTest(t)
- c, cleanup := firestore.NewClientForTesting(context.Background(), t)
- defer cleanup()
-
- f := New(c, "gerrit")
- ctx := context.Background()
-
- // None to start
- cls, total, err := f.GetChangelists(ctx, clstore.SearchOptions{
- StartIdx: 0,
- Limit: 50,
- })
- require.NoError(t, err)
- require.Len(t, cls, 0)
- require.Equal(t, 0, total)
-
- for i := 0; i < 40; i += 2 {
- cl := code_review.Changelist{
- SystemID: "cl" + strconv.Itoa(i),
- Owner: "test@example.com",
- Status: code_review.Open,
- Subject: "blarg",
- Updated: time.Date(2019, time.August, 31, 14, i, i, 0, time.UTC),
- }
- require.NoError(t, f.PutChangelist(ctx, cl))
- }
-
- // Put in a few other ones:
- for i := 1; i < 10; i += 2 {
- cl := code_review.Changelist{
- SystemID: "cl" + strconv.Itoa(i),
- Owner: "test@example.com",
- Status: code_review.Abandoned,
- Subject: "blarg",
- Updated: time.Date(2019, time.September, 1, 4, i, i, 0, time.UTC),
- }
- require.NoError(t, f.PutChangelist(ctx, cl))
- }
-
- for i := 31; i < 40; i += 2 {
- cl := code_review.Changelist{
- SystemID: "cl" + strconv.Itoa(i),
- Owner: "test@example.com",
- Status: code_review.Landed,
- Subject: "blarg",
- Updated: time.Date(2019, time.September, 1, 2, i, i, 0, time.UTC),
- }
- require.NoError(t, f.PutChangelist(ctx, cl))
- }
-
- // Get all of them
- cls, total, err = f.GetChangelists(ctx, clstore.SearchOptions{
- StartIdx: 0,
- Limit: 50,
- })
- require.NoError(t, err)
- require.Len(t, cls, 30)
- require.Equal(t, 30, total)
-
- // Get the first ones
- cls, total, err = f.GetChangelists(ctx, clstore.SearchOptions{
- StartIdx: 0,
- Limit: 3,
- })
- require.NoError(t, err)
- require.Len(t, cls, 3)
- require.Equal(t, clstore.CountMany, total)
- // spot check the dates to make sure the CLs are in the right order.
- require.Equal(t, time.Date(2019, time.September, 1, 4, 9, 9, 0, time.UTC), cls[0].Updated)
- require.Equal(t, time.Date(2019, time.September, 1, 4, 7, 7, 0, time.UTC), cls[1].Updated)
- require.Equal(t, time.Date(2019, time.September, 1, 4, 5, 5, 0, time.UTC), cls[2].Updated)
-
- // Get some in the middle
- cls, total, err = f.GetChangelists(ctx, clstore.SearchOptions{
- StartIdx: 5,
- Limit: 2,
- })
- require.NoError(t, err)
- require.Len(t, cls, 2)
- require.Equal(t, clstore.CountMany, total)
- require.Equal(t, time.Date(2019, time.September, 1, 2, 39, 39, 0, time.UTC), cls[0].Updated)
- require.Equal(t, time.Date(2019, time.September, 1, 2, 37, 37, 0, time.UTC), cls[1].Updated)
-
- // Get some at the end.
- cls, total, err = f.GetChangelists(ctx, clstore.SearchOptions{
- StartIdx: 28,
- Limit: 10,
- })
- require.NoError(t, err)
- require.Len(t, cls, 2)
- require.Equal(t, 30, total)
- require.Equal(t, time.Date(2019, time.August, 31, 14, 2, 2, 0, time.UTC), cls[0].Updated)
- require.Equal(t, time.Date(2019, time.August, 31, 14, 0, 0, 0, time.UTC), cls[1].Updated)
-
- // If we query off the end, we don't know how many there are, so 0 is a fine response.
- cls, total, err = f.GetChangelists(ctx, clstore.SearchOptions{
- StartIdx: 999,
- Limit: 3,
- })
- require.NoError(t, err)
- require.Len(t, cls, 0)
- require.Equal(t, 999, total)
-}
-
-// TestGetChangelistsOptions checks that various search options function.
-func TestGetChangelistsOptions(t *testing.T) {
- unittest.LargeTest(t)
- c, cleanup := firestore.NewClientForTesting(context.Background(), t)
- defer cleanup()
-
- f := New(c, "gerrit")
- ctx := context.Background()
- clA := code_review.Changelist{
- SystemID: "abc",
- Owner: "first@example.com",
- Status: code_review.Open,
- Subject: "Open sesame",
- Updated: time.Date(2019, time.October, 5, 4, 3, 2, 0, time.UTC),
- }
- clB := code_review.Changelist{
- SystemID: "def",
- Owner: "second@example.com",
- Status: code_review.Landed,
- Subject: "Landed Panda",
- Updated: time.Date(2019, time.October, 10, 4, 3, 2, 0, time.UTC),
- }
- clC := code_review.Changelist{
- SystemID: "ghi",
- Owner: "third@example.com",
- Status: code_review.Open,
- Subject: "Open again",
- Updated: time.Date(2019, time.October, 15, 4, 3, 2, 0, time.UTC),
- }
-
- require.NoError(t, f.PutChangelist(ctx, clA))
- require.NoError(t, f.PutChangelist(ctx, clB))
- require.NoError(t, f.PutChangelist(ctx, clC))
-
- xcl, _, err := f.GetChangelists(ctx, clstore.SearchOptions{
- Limit: 10,
- })
- require.NoError(t, err)
- assert.Equal(t, []code_review.Changelist{clC, clB, clA}, xcl)
-
- xcl, _, err = f.GetChangelists(ctx, clstore.SearchOptions{
- OpenCLsOnly: true,
- Limit: 10,
- })
- require.NoError(t, err)
- assert.Equal(t, []code_review.Changelist{clC, clA}, xcl)
-
- xcl, _, err = f.GetChangelists(ctx, clstore.SearchOptions{
- After: time.Date(2019, time.September, 28, 0, 0, 0, 0, time.UTC),
- Limit: 10,
- })
- require.NoError(t, err)
- assert.Equal(t, []code_review.Changelist{clC, clB, clA}, xcl)
-
- xcl, _, err = f.GetChangelists(ctx, clstore.SearchOptions{
- After: time.Date(2019, time.November, 28, 0, 0, 0, 0, time.UTC),
- Limit: 10,
- })
- require.NoError(t, err)
- assert.Empty(t, xcl)
-
- xcl, _, err = f.GetChangelists(ctx, clstore.SearchOptions{
- After: time.Date(2019, time.October, 7, 0, 0, 0, 0, time.UTC),
- Limit: 10,
- })
- require.NoError(t, err)
- assert.Equal(t, []code_review.Changelist{clC, clB}, xcl)
- xcl, _, err = f.GetChangelists(ctx, clstore.SearchOptions{
- OpenCLsOnly: true,
- After: time.Date(2019, time.October, 7, 0, 0, 0, 0, time.UTC),
- Limit: 10,
- })
- require.NoError(t, err)
- assert.Equal(t, []code_review.Changelist{clC}, xcl)
-}
-
-func TestGetChangelistsNoLimit(t *testing.T) {
- unittest.LargeTest(t)
- c, cleanup := firestore.NewClientForTesting(context.Background(), t)
- defer cleanup()
-
- f := New(c, "gerrit")
- ctx := context.Background()
-
- _, _, err := f.GetChangelists(ctx, clstore.SearchOptions{})
- require.Error(t, err)
- assert.Contains(t, err.Error(), "limit")
-}
diff --git a/golden/go/ingestion/fs_ingestionstore/BUILD.bazel b/golden/go/ingestion/fs_ingestionstore/BUILD.bazel
deleted file mode 100644
index e69de29..0000000
--- a/golden/go/ingestion/fs_ingestionstore/BUILD.bazel
+++ /dev/null
diff --git a/golden/go/ingestion_processors/tryjob_ingestion.go b/golden/go/ingestion_processors/tryjob_ingestion.go
index 6d9a715..dfb8a8b 100644
--- a/golden/go/ingestion_processors/tryjob_ingestion.go
+++ b/golden/go/ingestion_processors/tryjob_ingestion.go
@@ -19,8 +19,6 @@
"go.skia.org/infra/go/sklog"
"go.skia.org/infra/go/vcsinfo"
"go.skia.org/infra/golden/go/clstore"
- "go.skia.org/infra/golden/go/clstore/dualclstore"
- "go.skia.org/infra/golden/go/clstore/fs_clstore"
"go.skia.org/infra/golden/go/clstore/sqlclstore"
"go.skia.org/infra/golden/go/code_review"
"go.skia.org/infra/golden/go/code_review/gerrit_crs"
@@ -119,12 +117,11 @@
if err != nil {
return nil, skerr.Wrapf(err, "could not create client for CRS %q", crsName)
}
- fireCS := fs_clstore.New(fsClient, crsName)
sqlCS := sqlclstore.New(db, crsName)
reviewSystems = append(reviewSystems, clstore.ReviewSystem{
ID: crsName,
Client: crsClient,
- Store: dualclstore.New(sqlCS, fireCS),
+ Store: sqlCS,
})
}