Skip to content

Fix thread-safety crash and multipart upload deadlock#39

Merged
patricioxavier8 merged 1 commit into
mainfrom
fix/upload-thread-safety-and-multipart-deadlock
Apr 30, 2026
Merged

Fix thread-safety crash and multipart upload deadlock#39
patricioxavier8 merged 1 commit into
mainfrom
fix/upload-thread-safety-and-multipart-deadlock

Conversation

@patricioxavier8
Copy link
Copy Markdown
Contributor

Problem
Two issues discovered under high-concurrency backup workloads:

EXC_BAD_ACCESS in Upload.uploadEncryptedFile — The progressHandlersByTaskID dictionary is accessed from multiple threads without synchronization. When 10 uploads write to it simultaneously, the dictionary's internal buffer can be reallocated mid-access, causing a segfault.

Multipart upload deadlock in NetworkFacade.runMultipartUpload — waitUntilAllOperationsAreFinished() is a blocking call that holds the current OS thread indefinitely. When multiple large files (>100MB) trigger multipart uploads concurrently, all threads in Swift's cooperative thread pool get blocked, leaving no threads available to execute the actual upload part operations → deadlock.

Solution
Made progressHandlersByTaskID thread-safe using NSLock and added cleanup on completion to prevent memory leaks.
Avoided retain cycles by using [weak self] and a taskRef pattern.
Replaced a blocking operationQueue.waitUntilAllOperationsAreFinished() with an async-safe alternative using withCheckedContinuation, preventing thread pool exhaustion.

- Add NSLock to progressHandlersByTaskID dictionary to prevent
  data race crashes under concurrent access
- Clean up progress handlers on upload completion to fix memory leak
- Replace waitUntilAllOperationsAreFinished() with async-safe
  withCheckedContinuation to prevent cooperative thread pool exhaustion
  during multipart uploads
@patricioxavier8 patricioxavier8 requested a review from sg-gs April 29, 2026 15:45
@patricioxavier8 patricioxavier8 merged commit 80e3e10 into main Apr 30, 2026
1 check passed
@patricioxavier8 patricioxavier8 deleted the fix/upload-thread-safety-and-multipart-deadlock branch April 30, 2026 18:11
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.

2 participants