fix: skip re-uploading unchanged attachments to avoid Confluence rollback error#26
Conversation
|
Warning Review limit reached
More reviews will be available in 4 minutes and 3 seconds. Learn how PR review limits work. Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file). ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits. 🚦 How do rate limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Why
Re-syncing a page that contains a Mermaid diagram or a local image — without changing those assets — fails on the attachment step, and the failure is silent and misleading.
Both Mermaid diagrams and local images are named after an md5 hash of their content (
mermaid-<hash>.png,<basename>-<hash>.<ext>). On a re-sync the page body is written first (so the page looks correct), then the attachment step finds the asset already present under the same name and re-uploads byte-for-byte identical content.Confluence Cloud rejects that no-op update with
UnexpectedRollbackException: marked as rollback-only. The client turns the non-OK response into an error, the whole file is treated as failed, and it disappears from the run summary — so you get a confusing "0 updated" even though the body was actually saved. First-time sync worked because the asset didn't exist yet (a fresh upload, not an update).What
Since the attachment name embeds a content hash, a name match guarantees the bytes are already identical — there is nothing to update. So the upload step now skips any attachment that already exists instead of re-uploading it. This makes re-syncs idempotent and removes the rollback error.
The now-unused update-attachment client method (its only caller was the buggy path, and it wasn't part of the documented client surface) is removed rather than left as a footgun.
Tests
Two regression tests around an idempotent re-sync with a local image:
updated(not silently dropped).