diff --git a/src/internal/kopia/upload.go b/src/internal/kopia/upload.go index de4f027cc..deced5bd4 100644 --- a/src/internal/kopia/upload.go +++ b/src/internal/kopia/upload.go @@ -1122,26 +1122,41 @@ func traverseBaseDir( var hasItems bool if changed { - err = fs.IterateEntries( - ctx, - dir, - func(innerCtx context.Context, entry fs.Entry) error { - dEntry, ok := entry.(fs.Directory) - if !ok { - hasItems = true - return nil - } + iter, err := dir.Iterate(ctx) + if err != nil { + return clues.WrapWC(ctx, err, "getting directory iterator") + } + + var entry fs.Entry + + // Need to keep err for the check after the loop as well so we also need to + // declare entry. + for entry, err = iter.Next(ctx); entry != nil && err == nil; entry, err = iter.Next(ctx) { + dEntry, ok := entry.(fs.Directory) + if !ok { + hasItems = true + continue + } + + err = traverseBaseDir( + ctx, + depth+1, + updatedPaths, + oldDirPath, + currentPath, + dEntry, + roots, + stats) + if err != nil { + // Break here instead of just returning so we can close the iterator. + // The error will be returned below. + err = clues.Stack(err) + break + } + } + + iter.Close() - return traverseBaseDir( - innerCtx, - depth+1, - updatedPaths, - oldDirPath, - currentPath, - dEntry, - roots, - stats) - }) if err != nil { return clues.WrapWC(ctx, err, "traversing base directory") }