Visual Desynchronization during Concurrent Element Movement in Shared Designs
0 reputation · 15 Sept 2021, 05:52 UTC
0 reputation · 15 Sept 2021, 05:52 UTC
Canva employs a real-time synchronization engine to manage collaborative editing, utilizing conflict resolution strategies to handle concurrent object movements across multiple user sessions.
When multiple collaborators manipulate the same design element simultaneously, high-latency network conditions can introduce a gap between the local state and the server-synchronized state. This behavior becomes more complex when elements are part of nested groups, as the system must translate coordinates for both the group entity and the individual components.
There is uncertainty regarding how the synchronization engine prioritizes updates when a 'Locked' element is modified by an administrator while a collaborator is attempting to move a grouped object containing that locked element.
Based on how real-time collaborative design editors are generally built, the lock almost certainly wins over the group translation, and out-of-order movement packets are resolved by server-side ordering rather than by merging positions. One important caveat up front: Canva's synchronization engine is proprietary and not publicly documented, so the specifics below describe well-established patterns in collaborative editors, not confirmed Canva internals. Treat this as the likely explanation, and verify against Canva's own support documentation if you need an authoritative statement.
A lock in a collaborative editor is normally enforced at the application layer as a permission check, applied before a mutation is accepted into the shared state. It is not just another property competing in the merge. When a collaborator drags a group containing a locked element, the typical outcomes are:
That snap-back is the visible signature of server-side rejection. So in the admin-locks-while-collaborator-drags scenario, the expected end state is: the locked element remains where the admin's lock left it, and the collaborator's conflicting translation is discarded or partially applied to the unlocked siblings.
Concurrent moves of the same element are almost never merged into an averaged position. The standard approach is last-writer-wins keyed on a server-assigned ordering — sequence numbers or timestamps applied when the server processes each update, not when the client sent it. This matters under high latency:
The desynchronization you observe is therefore transient by design. Once sync packets settle, every client should converge. If divergence persists after the network recovers, that indicates a dropped update or a client bug, not intended conflict resolution.
Groups typically store child coordinates relative to the group origin. Moving the group transforms only the origin, which is why a locked child creates a genuine conflict: honoring the group move would implicitly move the locked element. This is the strongest reason to expect the engine to block or revert the group translation rather than silently reposition the locked child — the alternative would make locks meaningless inside groups.
Because the internals are unconfirmed, a quick empirical test settles it:
Note that lock semantics may vary by role (owner vs. collaborator) and by product tier, and offline or cached states in desktop and mobile clients can change reconciliation timing. One detail that would sharpen this answer: whether the collaborator's client shows a snap-back or an immediate drag rejection — that distinguishes server-side rejection from client-side lock enforcement.
Use comments to ask for clarification. Post a solution as an answer.
No question comments on this page.