Skip to content

⚡ Bolt: Parallelize bulk file deletion to reduce UI blocking#261

Open
acebytes wants to merge 1 commit into
mainfrom
bolt-optimize-cache-cleaner-parallel-io-16464097639330715002
Open

⚡ Bolt: Parallelize bulk file deletion to reduce UI blocking#261
acebytes wants to merge 1 commit into
mainfrom
bolt-optimize-cache-cleaner-parallel-io-16464097639330715002

Conversation

@acebytes
Copy link
Copy Markdown
Contributor

  • 💡 What: Refactored removeContents(of:) in CacheCleaner to perform parallel file deletion using withThrowingTaskGroup with a sliding window iterator and Task.detached.
  • 🎯 Why: Synchronously looping through and deleting hundreds or thousands of cached files sequentially blocks the actor. Parallelizing these bulk I/O operations maximizes disk throughput and prevents thread pool exhaustion.
  • 📊 Impact: Significantly speeds up permanent deletion of large cache directories by processing deletions in parallel instead of sequentially.
  • 🔬 Measurement: Observe time taken for cleanup on directories with many files before and after the change; parallel operations will finish noticeably faster.

PR created automatically by Jules for task 16464097639330715002 started by @acebytes

Refactored `removeContents(of:)` in `CacheCleaner` to perform parallel file deletion using `withThrowingTaskGroup` with a sliding window iterator and `Task.detached`. This significantly speeds up permanent deletion of large cache directories and prevents the actor's thread pool from exhaustion, which could otherwise lead to application blocking.

Co-authored-by: acebytes <2820910+acebytes@users.noreply.github.com>
@google-labs-jules
Copy link
Copy Markdown
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 82458ee295

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

try await trashDirectory(url)
} else {
try removeContents(of: url)
try await removeContents(of: url, fileManager: fileManager)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep permanent-clean path actor-isolated

Changing permanent deletion from removeContents (sync, actor-isolated) to await removeContents with a nonisolated implementation introduces a suspension point in the clean loop, so CacheCleaner can now interleave another clean request while the first one is still deleting files. If two clean operations overlap (for example, duplicate UI triggers or concurrent callers), both runs can enumerate/delete the same paths and produce spurious ENOENT errors or inconsistent cleanup reports. The previous synchronous path did not permit this interleaving for permanent deletes.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant