diff options
author | Jacob Vosmaer <jacob@gitlab.com> | 2019-02-05 20:15:22 +0300 |
---|---|---|
committer | Paul Okstad <pokstad@gitlab.com> | 2019-02-05 20:15:22 +0300 |
commit | 8ee388b54684b369e0e1a7000c4af5804c6716dc (patch) | |
tree | a405986c1783913d78a5729801bd2a9f9ea986b5 | |
parent | 0471ab52e26f1526dec0e36b57c0058150444c01 (diff) |
Use chunker in FindCommits
-rw-r--r-- | changelogs/unreleased/find-commits-use-chunker.yml | 5 | ||||
-rw-r--r-- | internal/service/commit/find_commits.go | 42 |
2 files changed, 25 insertions, 22 deletions
diff --git a/changelogs/unreleased/find-commits-use-chunker.yml b/changelogs/unreleased/find-commits-use-chunker.yml new file mode 100644 index 000000000..03e955273 --- /dev/null +++ b/changelogs/unreleased/find-commits-use-chunker.yml @@ -0,0 +1,5 @@ +--- +title: Use chunker in FindCommits +merge_request: 1059 +author: +type: other diff --git a/internal/service/commit/find_commits.go b/internal/service/commit/find_commits.go index bd7a178f5..8d4967873 100644 --- a/internal/service/commit/find_commits.go +++ b/internal/service/commit/find_commits.go @@ -13,6 +13,7 @@ import ( "gitlab.com/gitlab-org/gitaly/internal/git/catfile" "gitlab.com/gitlab-org/gitaly/internal/git/log" "gitlab.com/gitlab-org/gitaly/internal/helper" + "gitlab.com/gitlab-org/gitaly/internal/helper/chunk" ) const commitsPerPage int = 20 @@ -115,40 +116,37 @@ func (g *GetCommits) Commit() (*gitalypb.GitCommit, error) { return commit, nil } +type findCommitsSender struct { + stream gitalypb.CommitService_FindCommitsServer + commits []*gitalypb.GitCommit +} + +func (s *findCommitsSender) Reset() { s.commits = nil } +func (s *findCommitsSender) Append(it chunk.Item) { + s.commits = append(s.commits, it.(*gitalypb.GitCommit)) +} +func (s *findCommitsSender) Send() error { + return s.stream.Send(&gitalypb.FindCommitsResponse{Commits: s.commits}) +} + func streamPaginatedCommits(getCommits *GetCommits, commitsPerPage int, stream gitalypb.CommitService_FindCommitsServer) error { - var commitPage []*gitalypb.GitCommit + chunker := chunk.New(&findCommitsSender{stream: stream}) for getCommits.Scan() { commit, err := getCommits.Commit() if err != nil { return err } - commitPage = append(commitPage, commit) - if len(commitPage) == commitsPerPage { - if err := stream.Send( - &gitalypb.FindCommitsResponse{ - Commits: commitPage, - }, - ); err != nil { - return fmt.Errorf("error when sending stream response: %v", err) - } - commitPage = nil + + if err := chunker.Send(commit); err != nil { + return err } } if getCommits.Err() != nil { return fmt.Errorf("get commits: %v", getCommits.Err()) } - // send the last page - if len(commitPage) > 0 { - if err := stream.Send( - &gitalypb.FindCommitsResponse{ - Commits: commitPage, - }, - ); err != nil { - return fmt.Errorf("error when sending stream response: %v", err) - } - } - return nil + + return chunker.Flush() } func getLogCommandFlags(req *gitalypb.FindCommitsRequest) []string { |