From 1727e97fc5052e7e7fd8fb1da972ccbb128d5785 Mon Sep 17 00:00:00 2001 From: Christos Vontas <1437125+cv711@users.noreply.github.com> Date: Mon, 16 Feb 2026 18:41:24 +0000 Subject: [PATCH 1/4] fix: typo --- internal/controller/store_controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/controller/store_controller.go b/internal/controller/store_controller.go index b80e3d26..7d1fdc97 100644 --- a/internal/controller/store_controller.go +++ b/internal/controller/store_controller.go @@ -65,7 +65,7 @@ func (r *StoreReconciler) SetupWithManager(mgr ctrl.Manager, logger *zap.Sugared } return ctrl.NewControllerManagedBy(mgr). For(&v1.Store{}). - // We get triggerd by every update on the created resources, this leeads to high reconciles at the start. + // We get triggered by every update on the created resources, this leads to high reconciles at the start. Owns(&corev1.Secret{}). Owns(&corev1.Service{}). Owns(&networkingv1.Ingress{}). From c5e3ce29f46605a1c8de821087790c2a59e98263 Mon Sep 17 00:00:00 2001 From: Christos Vontas <1437125+cv711@users.noreply.github.com> Date: Mon, 16 Feb 2026 18:57:49 +0000 Subject: [PATCH 2/4] fix: rootDirs: create for backup and check existence for restoration --- internal/snapshot/s3.go | 34 ++++++++++++++++++++++++---------- internal/util/s3.go | 10 ++++++++++ 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/internal/snapshot/s3.go b/internal/snapshot/s3.go index 2a075895..f689ec80 100644 --- a/internal/snapshot/s3.go +++ b/internal/snapshot/s3.go @@ -162,12 +162,19 @@ func (s *SnapshotService) createAssetBackup( defer wg.Done() logger := logger.With(zap.String("bucket", "private")) logger.Info("Starting S3 bucket read") + + // make sure to create the directory for the public bucket backup, even if the bucket is empty + routeFilePath := filepath.Join(snapshotCtx.TempArchiveDir, "private") + if err := os.MkdirAll(routeFilePath, 0755); err != nil { + logger.Errorw("failed to create directory for bucket backup", zap.String("path", routeFilePath), zap.Error(err)) + errChan <- fmt.Errorf("failed to create directory for private bucket backup: %w", err) + return + } + downloader := util.NewS3Downloader(minioClient, cfg.S3.PrivateBucket) - err := downloader.DownloadBucket(ctx, parallelDownloads, - processDownloadObject( - filepath.Join(snapshotCtx.TempArchiveDir, "private"), - logger, - )) + err := downloader.DownloadBucket(ctx, + parallelDownloads, + processDownloadObject(routeFilePath, logger)) if err != nil { logger.Errorw("bucket backup failed", zap.Error(err)) errChan <- fmt.Errorf("private bucket backup: %w", err) @@ -183,12 +190,19 @@ func (s *SnapshotService) createAssetBackup( logger := logger.With(zap.String("bucket", "public")) logger.Info("Starting S3 bucket read") + + // make sure to create the directory for the public bucket backup, even if the bucket is empty + routeFilePath := filepath.Join(snapshotCtx.TempArchiveDir, "public") + if err := os.MkdirAll(routeFilePath, 0755); err != nil { + logger.Errorw("failed to create directory for bucket backup", zap.String("path", routeFilePath), zap.Error(err)) + errChan <- fmt.Errorf("failed to create directory for public bucket backup: %w", err) + return + } + downloader := util.NewS3Downloader(minioClient, cfg.S3.PublicBucket) - err := downloader.DownloadBucket(ctx, parallelDownloads, - processDownloadObject( - filepath.Join(snapshotCtx.TempArchiveDir, "public"), - logger, - )) + err := downloader.DownloadBucket(ctx, + parallelDownloads, + processDownloadObject(routeFilePath, logger)) if err != nil { logger.Errorw("bucket backup failed", zap.Error(err)) errChan <- fmt.Errorf("public bucket backup: %w", err) diff --git a/internal/util/s3.go b/internal/util/s3.go index d9dec40a..d02546e4 100644 --- a/internal/util/s3.go +++ b/internal/util/s3.go @@ -251,6 +251,12 @@ func uploadBucket(ctx context.Context, s3Client *minio.Client, bucketName, sourc } logger.Info("Scanning source directory for files") + if _, err := os.Stat(sourcePath); os.IsNotExist(err) { + logger.Warnw("Source path does not exist", zap.String("source_path", sourcePath)) + logger.Info("No files to upload, operation complete") + return nil + } + var files []string err := filepath.WalkDir(sourcePath, func(path string, d fs.DirEntry, err error) error { if err != nil { @@ -435,6 +441,10 @@ func downloadBucket(ctx context.Context, s3Client *minio.Client, bucketName stri errCh := make(chan error, workers) sem := make(chan struct{}, workers) + if err := os.MkdirAll(destinationPath, 0755); err != nil { + return fmt.Errorf("error creating destination directory: %w", err) + } + for object := range objects { if object.Err != nil { return fmt.Errorf("error listing objects: %w", object.Err) From 0c8f497a0de599253a0213d4d2a1453f3794f27c Mon Sep 17 00:00:00 2001 From: Christos Vontas <1437125+cv711@users.noreply.github.com> Date: Tue, 17 Feb 2026 11:49:46 +0000 Subject: [PATCH 3/4] fix: better error handling --- internal/util/s3.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/internal/util/s3.go b/internal/util/s3.go index d02546e4..b07cfe04 100644 --- a/internal/util/s3.go +++ b/internal/util/s3.go @@ -251,10 +251,14 @@ func uploadBucket(ctx context.Context, s3Client *minio.Client, bucketName, sourc } logger.Info("Scanning source directory for files") - if _, err := os.Stat(sourcePath); os.IsNotExist(err) { - logger.Warnw("Source path does not exist", zap.String("source_path", sourcePath)) - logger.Info("No files to upload, operation complete") - return nil + if _, err := os.Stat(sourcePath); err != nil { + if os.IsNotExist(err) { + logger.Warnw("Source path does not exist", zap.String("source_path", sourcePath)) + logger.Info("No files to upload, operation complete") + return nil + } + logger.Errorw("Failed to stat source path", zap.String("source_path", sourcePath), zap.Error(err)) + return fmt.Errorf("failed to stat source path: %w", err) } var files []string From 13b04f6586f6a25730abd5bbfee33d9a0567075b Mon Sep 17 00:00:00 2001 From: Christos Vontas <1437125+cv711@users.noreply.github.com> Date: Wed, 18 Feb 2026 09:13:25 +0000 Subject: [PATCH 4/4] fix: lint suggestions --- internal/snapshot/s3.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/snapshot/s3.go b/internal/snapshot/s3.go index f689ec80..eb089a88 100644 --- a/internal/snapshot/s3.go +++ b/internal/snapshot/s3.go @@ -163,7 +163,7 @@ func (s *SnapshotService) createAssetBackup( logger := logger.With(zap.String("bucket", "private")) logger.Info("Starting S3 bucket read") - // make sure to create the directory for the public bucket backup, even if the bucket is empty + // make sure to create the directory for the private bucket backup, even if the bucket is empty routeFilePath := filepath.Join(snapshotCtx.TempArchiveDir, "private") if err := os.MkdirAll(routeFilePath, 0755); err != nil { logger.Errorw("failed to create directory for bucket backup", zap.String("path", routeFilePath), zap.Error(err)) @@ -192,9 +192,9 @@ func (s *SnapshotService) createAssetBackup( logger.Info("Starting S3 bucket read") // make sure to create the directory for the public bucket backup, even if the bucket is empty - routeFilePath := filepath.Join(snapshotCtx.TempArchiveDir, "public") - if err := os.MkdirAll(routeFilePath, 0755); err != nil { - logger.Errorw("failed to create directory for bucket backup", zap.String("path", routeFilePath), zap.Error(err)) + rootDirPath := filepath.Join(snapshotCtx.TempArchiveDir, "public") + if err := os.MkdirAll(rootDirPath, 0755); err != nil { + logger.Errorw("failed to create directory for bucket backup", zap.String("path", rootDirPath), zap.Error(err)) errChan <- fmt.Errorf("failed to create directory for public bucket backup: %w", err) return } @@ -202,7 +202,7 @@ func (s *SnapshotService) createAssetBackup( downloader := util.NewS3Downloader(minioClient, cfg.S3.PublicBucket) err := downloader.DownloadBucket(ctx, parallelDownloads, - processDownloadObject(routeFilePath, logger)) + processDownloadObject(rootDirPath, logger)) if err != nil { logger.Errorw("bucket backup failed", zap.Error(err)) errChan <- fmt.Errorf("public bucket backup: %w", err)