diff options
author | James Fargher <jfargher@gitlab.com> | 2023-04-05 00:08:05 +0300 |
---|---|---|
committer | James Fargher <jfargher@gitlab.com> | 2023-04-11 01:28:43 +0300 |
commit | 3eac5d6142281c8c272ea33c6b8ad92582cd17ff (patch) | |
tree | 8f0aca5009fb209ee1f8ae6c816eff1c9e23583a | |
parent | 1bbafe2d66283dce559e5d2e63707a45bcfc4358 (diff) |
backup: Rewrite bundle writing to use GetWriter
-rw-r--r-- | internal/backup/backup.go | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/internal/backup/backup.go b/internal/backup/backup.go index ec2085832..cb5535273 100644 --- a/internal/backup/backup.go +++ b/internal/backup/backup.go @@ -297,7 +297,7 @@ func (mgr *Manager) createRepository(ctx context.Context, server storage.ServerI return nil } -func (mgr *Manager) writeBundle(ctx context.Context, step *Step, server storage.ServerInfo, repo *gitalypb.Repository, refs []*gitalypb.ListRefsResponse_Reference) error { +func (mgr *Manager) writeBundle(ctx context.Context, step *Step, server storage.ServerInfo, repo *gitalypb.Repository, refs []*gitalypb.ListRefsResponse_Reference) (returnErr error) { repoClient, err := mgr.newRepoClient(ctx, server) if err != nil { return err @@ -326,6 +326,7 @@ func (mgr *Manager) writeBundle(ctx context.Context, step *Step, server storage. if err := stream.CloseSend(); err != nil { return err } + bundle := streamio.NewReader(func() ([]byte, error) { resp, err := stream.Recv() if structerr.GRPCCode(err) == codes.FailedPrecondition { @@ -333,13 +334,22 @@ func (mgr *Manager) writeBundle(ctx context.Context, step *Step, server storage. } return resp.GetData(), err }) + w := NewLazyWriter(func() (io.WriteCloser, error) { + return mgr.sink.GetWriter(ctx, step.BundlePath) + }) + defer func() { + if err := w.Close(); err != nil && returnErr == nil { + returnErr = err + } + }() - if err := LazyWrite(ctx, mgr.sink, step.BundlePath, bundle); err != nil { + if _, err := io.Copy(w, bundle); err != nil { if errors.Is(err, errEmptyBundle) { return fmt.Errorf("%T write: %w: no changes to bundle", mgr.sink, ErrSkipped) } return fmt.Errorf("%T write: %w", mgr.sink, err) } + return nil } |