From 612e21d42b2d1310e608caf3ace0872b564cb6f1 Mon Sep 17 00:00:00 2001 From: Winfried Plappert Date: Sun, 2 Mar 2025 09:09:43 +0000 Subject: [PATCH] restic backup - handle MaxCapacityExceeded while saving a blob If the capacity size limit condition is activated, a TreeBlob is passed through unharmed, so the new tree can be saved properly. A DataBlob however, which could be very large in size will be replaced by the data blob which contains the string "MaxCapacityExceeded\n". --- internal/archiver/blob_saver.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/internal/archiver/blob_saver.go b/internal/archiver/blob_saver.go index 356a32ce2..96da5b008 100644 --- a/internal/archiver/blob_saver.go +++ b/internal/archiver/blob_saver.go @@ -68,6 +68,16 @@ type saveBlobResponse struct { func (s *blobSaver) saveBlob(ctx context.Context, t restic.BlobType, buf []byte) (saveBlobResponse, error) { id, known, sizeInRepo, err := s.repo.SaveBlob(ctx, t, buf, restic.ID{}, false) + if err != nil && t == restic.TreeBlob && err.Error() == "MaxCapacityExceeded" { + err = nil + } + + // need to modify data for repository monitoring being triggered + if err != nil && t == restic.DataBlob && err.Error() == "MaxCapacityExceeded" { + buf = []byte("MaxCapacityExceeded\n") + id = restic.Hash(buf) + return saveBlobResponse{id: id}, err + } if err != nil { return saveBlobResponse{}, err @@ -95,6 +105,10 @@ func (s *blobSaver) worker(ctx context.Context, jobs <-chan saveBlobJob) error { } res, err := s.saveBlob(ctx, job.BlobType, job.buf.Data) + // pass through unharmed for repository monitoring + if err != nil && err.Error() == "MaxCapacityExceeded" { + err = nil + } if err != nil { debug.Log("saveBlob returned error, exiting: %v", err) return fmt.Errorf("failed to save blob from file %q: %w", job.fn, err)