diff --git a/api.go b/api.go index 619bd26..0c59031 100644 --- a/api.go +++ b/api.go @@ -487,19 +487,29 @@ func (ag *Agate) RegisterLocalSnapshot(ctx context.Context, snapshotID, parentID } // 2. Add the file to the blob store - localFile, err := os.Open(localPath) - if err != nil { - return fmt.Errorf("failed to open local snapshot file: %w", err) - } - defer func() { - if err := localFile.Close(); err != nil { - ag.options.Logger.Printf("ERROR: failed to close local file: %v", err) + // Check if blob already exists. If so, we assume it's the correct one and skip overwriting. + // This is to prevent issues when registering a file that is already in the blob store. + _, err = ag.options.BlobStore.GetBlobPath(ctx, snapshotID) + if err == nil { + ag.options.Logger.Printf("blob for snapshot %s already exists, skipping storing it", snapshotID) + } else if errors.Is(err, models.ErrNotFound) { + // Blob does not exist, so we store it. + localFile, err := os.Open(localPath) + if err != nil { + return fmt.Errorf("failed to open local snapshot file: %w", err) } - }() + defer func() { + if err := localFile.Close(); err != nil { + ag.options.Logger.Printf("ERROR: failed to close local file: %v", err) + } + }() - _, err = ag.options.BlobStore.StoreBlob(ctx, snapshotID, localFile) - if err != nil { - return fmt.Errorf("failed to store blob from local file: %w", err) + if _, err = ag.options.BlobStore.StoreBlob(ctx, snapshotID, localFile); err != nil { + return fmt.Errorf("failed to store blob from local file: %w", err) + } + } else { + // Another error occurred when checking for the blob. + return fmt.Errorf("failed to check for existing blob: %w", err) } // 3. Create and save snapshot metadata