From b32380867b84c4cacb717f9a7e3cb5f666da18cb Mon Sep 17 00:00:00 2001 From: Miguel Molina Date: Wed, 3 Jul 2019 10:35:20 +0200 Subject: [PATCH] gitbase: report repository id on errors Signed-off-by: Miguel Molina --- CHANGELOG.md | 6 +++++- blobs.go | 4 ++-- commit_blobs.go | 6 +++--- commit_files.go | 10 +++++----- commit_trees.go | 6 +++--- commits.go | 4 ++-- files.go | 6 +++--- fs_error_test.go | 2 +- partition.go | 33 +++++++++++++++++++++++++++++++++ ref_commits.go | 6 +++--- references.go | 4 ++-- remotes.go | 6 +++--- repositories.go | 4 ++-- squash.go | 9 ++++++--- tree_entries.go | 4 ++-- 15 files changed, 75 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4be8643f..2ef1e286a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Errors now report the repository causing the error, if possible. + ## [0.22.0] - 2019-07-03 ### Added @@ -28,7 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed error iterating over non ready repositories ([src-d/go-borges#54](https://github.com/src-d/go-borges/pull/54)) - Error saying value could not be converted to bool. - function: make array_length not fail with literal null ([#767](https://github.com/src-d/go-mysql-server/pull/767)) -- server: kill queries on connection closed (([#769](https://github.com/src-d/go-mysql-server/pull/769))) +- server: kill queries on connection closed (([#769](https://github.com/src-d/go-mysql-server/pull/769))) ## [0.22.0-rc2] - 2019-06-24 diff --git a/blobs.go b/blobs.go index 5d3098bc0..578773376 100644 --- a/blobs.go +++ b/blobs.go @@ -143,10 +143,10 @@ func (r *blobsTable) PartitionRows( if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } - return sql.NewSpanIter(span, iter), nil + return sql.NewSpanIter(span, newRepoRowIter(repo, iter)), nil } func (blobsTable) HandledFilters(filters []sql.Expression) []sql.Expression { diff --git a/commit_blobs.go b/commit_blobs.go index 0b9419adc..83f4f71ce 100644 --- a/commit_blobs.go +++ b/commit_blobs.go @@ -4,9 +4,9 @@ import ( "bytes" "io" + "github.com/src-d/go-mysql-server/sql" "gopkg.in/src-d/go-git.v4/plumbing" "gopkg.in/src-d/go-git.v4/plumbing/object" - "github.com/src-d/go-mysql-server/sql" ) type commitBlobsTable struct { @@ -113,10 +113,10 @@ func (t *commitBlobsTable) PartitionRows( if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } - return sql.NewSpanIter(span, iter), nil + return sql.NewSpanIter(span, newRepoRowIter(repo, iter)), nil } func (commitBlobsTable) HandledFilters(filters []sql.Expression) []sql.Expression { diff --git a/commit_files.go b/commit_files.go index f25a02dab..2f6518933 100644 --- a/commit_files.go +++ b/commit_files.go @@ -5,13 +5,13 @@ import ( "io" "github.com/sirupsen/logrus" + "github.com/src-d/go-mysql-server/sql" + "github.com/src-d/go-mysql-server/sql/expression" + "github.com/src-d/go-mysql-server/sql/plan" git "gopkg.in/src-d/go-git.v4" "gopkg.in/src-d/go-git.v4/plumbing" "gopkg.in/src-d/go-git.v4/plumbing/filemode" "gopkg.in/src-d/go-git.v4/plumbing/object" - "github.com/src-d/go-mysql-server/sql" - "github.com/src-d/go-mysql-server/sql/expression" - "github.com/src-d/go-mysql-server/sql/plan" ) type commitFilesTable struct { @@ -125,10 +125,10 @@ func (t *commitFilesTable) PartitionRows( if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } - return sql.NewSpanIter(span, iter), nil + return sql.NewSpanIter(span, newRepoRowIter(repo, iter)), nil } func (commitFilesTable) HandledFilters(filters []sql.Expression) []sql.Expression { diff --git a/commit_trees.go b/commit_trees.go index 543d7824c..b1f1c8cd1 100644 --- a/commit_trees.go +++ b/commit_trees.go @@ -6,9 +6,9 @@ import ( "gopkg.in/src-d/go-git.v4/plumbing" + "github.com/src-d/go-mysql-server/sql" "gopkg.in/src-d/go-git.v4/plumbing/filemode" "gopkg.in/src-d/go-git.v4/plumbing/object" - "github.com/src-d/go-mysql-server/sql" ) type commitTreesTable struct { @@ -106,10 +106,10 @@ func (t *commitTreesTable) PartitionRows( if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } - return sql.NewSpanIter(span, iter), nil + return sql.NewSpanIter(span, newRepoRowIter(repo, iter)), nil } // IndexKeyValues implements the sql.IndexableTable interface. diff --git a/commits.go b/commits.go index 4f4b0bc2b..b555c4ba4 100644 --- a/commits.go +++ b/commits.go @@ -133,10 +133,10 @@ func (r *commitsTable) PartitionRows( if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } - return sql.NewSpanIter(span, iter), nil + return sql.NewSpanIter(span, newRepoRowIter(repo, iter)), nil } func (commitsTable) HandledFilters(filters []sql.Expression) []sql.Expression { diff --git a/files.go b/files.go index 85ee2e821..14936acf1 100644 --- a/files.go +++ b/files.go @@ -4,11 +4,11 @@ import ( "bytes" "io" + "github.com/src-d/go-mysql-server/sql" git "gopkg.in/src-d/go-git.v4" "gopkg.in/src-d/go-git.v4/plumbing" "gopkg.in/src-d/go-git.v4/plumbing/filemode" "gopkg.in/src-d/go-git.v4/plumbing/object" - "github.com/src-d/go-mysql-server/sql" ) type filesTable struct { @@ -143,10 +143,10 @@ func (r *filesTable) PartitionRows( if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } - return sql.NewSpanIter(span, iter), nil + return sql.NewSpanIter(span, newRepoRowIter(repo, iter)), nil } func (filesTable) HandledFilters(filters []sql.Expression) []sql.Expression { diff --git a/fs_error_test.go b/fs_error_test.go index b5d2524e0..1a179d051 100644 --- a/fs_error_test.go +++ b/fs_error_test.go @@ -58,7 +58,7 @@ func setupErrorRepos(t *testing.T) (*sql.Context, CleanupFunc) { tmpDir, err := ioutil.TempDir("", "gitbase") require.NoError(err) - var rootFS billy.Filesystem = osfs.New(tmpDir) + rootFS := osfs.New(tmpDir) lib, pool, err := newMultiPool() require.NoError(err) diff --git a/partition.go b/partition.go index d3e0577d2..ad6a99480 100644 --- a/partition.go +++ b/partition.go @@ -271,3 +271,36 @@ func (i *partitionedIndexKeyValueIter) Close() error { } return nil } + +var errRepository = errors.NewKind("on repository %q") + +func errorWithRepo(repo *Repository, err error) error { + return errRepository.Wrap(err, repo.ID()) +} + +type repoRowIter struct { + iter sql.RowIter + repo *Repository +} + +func newRepoRowIter(repo *Repository, iter sql.RowIter) sql.RowIter { + return &repoRowIter{iter, repo} +} + +func (i *repoRowIter) Next() (sql.Row, error) { + row, err := i.iter.Next() + if err != nil { + if err == io.EOF { + return nil, io.EOF + } + return nil, errorWithRepo(i.repo, err) + } + return row, nil +} + +func (i *repoRowIter) Close() error { + if err := i.iter.Close(); err != nil { + return errorWithRepo(i.repo, err) + } + return nil +} diff --git a/ref_commits.go b/ref_commits.go index 5c71ecc13..8bd10fd21 100644 --- a/ref_commits.go +++ b/ref_commits.go @@ -7,9 +7,9 @@ import ( "gopkg.in/src-d/go-git.v4/plumbing" + "github.com/src-d/go-mysql-server/sql" "gopkg.in/src-d/go-git.v4/plumbing/object" "gopkg.in/src-d/go-git.v4/plumbing/storer" - "github.com/src-d/go-mysql-server/sql" ) type refCommitsTable struct { @@ -121,10 +121,10 @@ func (t *refCommitsTable) PartitionRows( if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } - return sql.NewSpanIter(span, iter), nil + return sql.NewSpanIter(span, newRepoRowIter(repo, iter)), nil } func (refCommitsTable) HandledFilters(filters []sql.Expression) []sql.Expression { diff --git a/references.go b/references.go index c2ea04291..c3887c891 100644 --- a/references.go +++ b/references.go @@ -119,10 +119,10 @@ func (r *referencesTable) PartitionRows( if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } - return sql.NewSpanIter(span, iter), nil + return sql.NewSpanIter(span, newRepoRowIter(repo, iter)), nil } func (referencesTable) HandledFilters(filters []sql.Expression) []sql.Expression { diff --git a/remotes.go b/remotes.go index 48125fcef..99a5cdeb3 100644 --- a/remotes.go +++ b/remotes.go @@ -4,9 +4,9 @@ import ( "bytes" "io" + "github.com/src-d/go-mysql-server/sql" git "gopkg.in/src-d/go-git.v4" "gopkg.in/src-d/go-git.v4/config" - "github.com/src-d/go-mysql-server/sql" ) type remotesTable struct { @@ -111,10 +111,10 @@ func (r *remotesTable) PartitionRows( if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } - return sql.NewSpanIter(span, iter), nil + return sql.NewSpanIter(span, newRepoRowIter(repo, iter)), nil } func (remotesTable) HandledFilters(filters []sql.Expression) []sql.Expression { diff --git a/repositories.go b/repositories.go index 352b40b2a..047df5aac 100644 --- a/repositories.go +++ b/repositories.go @@ -91,10 +91,10 @@ func (r *repositoriesTable) PartitionRows( if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } - return sql.NewSpanIter(span, iter), nil + return sql.NewSpanIter(span, newRepoRowIter(repo, iter)), nil } func (repositoriesTable) handledColumns() []string { return nil } diff --git a/squash.go b/squash.go index 63d50badb..9e0195abb 100644 --- a/squash.go +++ b/squash.go @@ -83,19 +83,22 @@ func (t *SquashedTable) PartitionRows(ctx *sql.Context, p sql.Partition) (sql.Ro iter, err := t.iter.New(ctx, repo) if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } if len(t.schemaMappings) == 0 { return sql.NewSpanIter( span, - NewChainableRowIter(iter), + newRepoRowIter(repo, NewChainableRowIter(iter)), ), nil } return sql.NewSpanIter( span, - NewSchemaMapperIter(NewChainableRowIter(iter), t.schemaMappings), + newRepoRowIter( + repo, + NewSchemaMapperIter(NewChainableRowIter(iter), t.schemaMappings), + ), ), nil } diff --git a/tree_entries.go b/tree_entries.go index 4c7a1caca..203a1c2c2 100644 --- a/tree_entries.go +++ b/tree_entries.go @@ -108,10 +108,10 @@ func (r *treeEntriesTable) PartitionRows( if err != nil { span.Finish() - return nil, err + return nil, errorWithRepo(repo, err) } - return sql.NewSpanIter(span, iter), nil + return sql.NewSpanIter(span, newRepoRowIter(repo, iter)), nil } func (treeEntriesTable) HandledFilters(filters []sql.Expression) []sql.Expression {