Guarantees and limits#
What the core guarantees, whichever adapter and store you use, and the limits it has. Each row links to the reason behind it.
Guarantees#
Guarantee |
Why |
|---|---|
A change set is applied whole or not at all, and the sync token moves only with it. |
|
A sync that stops at any point loses nothing: the next one starts from the last sync token the store saved. |
|
A change set fetched from an outdated token is refused, so two processes never apply the same changes twice. |
|
Nothing is pushed until every page of a sync is ingested. |
|
Two processes never claim the same push at once. |
|
A pending edit stays until the server applies it. A rejected push, or one whose answer never arrived, doesn’t discard it. |
|
An object the server removed while you edited it is always a conflict, never resolved for you. |
|
A conflict that changed since you read it can’t be resolved, so a decision never applies to changes you haven’t seen. |
|
A server’s copy of your own write isn’t reported as a change, however the server rewrote it. |
|
Everything a sync changes, every conflict you resolve and every scope you drop reaches the change feed in the same transaction, numbered in order, and a removal stays readable until you purge it. Your own edit reaches it when its push ends. |
|
A scope the server no longer has is never emptied for you. Dropping it returns the edits and conflicts it discards. |
|
In the stores that ship, a read in another thread doesn’t wait for a sync’s write, at most for its commit, and sees the store as it was before the write began. A store over a storage of your own does the same where the storage sets |
|
Every store checks arguments and raises errors the same way, since the checks live in the base class. |
Limits#
Limit |
Why |
|---|---|
An edit that changes only values a server stamps on its own, such as when an object was last saved, isn’t pushed. |
|
If two processes sync a scope at once, both can send the same edit. A guarded change or delete is then rejected, but a create whose id the server picks can exist twice where the adapter doesn’t treat logical keys as unique. |
|
After a push is applied, the next sync fetches that object from the server once more. |
|
A full listing compares every object, and an adapter whose protocol has no version for each object fetches every one. |
|
A replica runs one sync of a scope at a time, and a second raises |
|
Store calls are synchronous. The asynchronous adapters run them in a worker thread. |
|
A store restored from an older copy numbers new feed entries again from the copy’s point, so a cursor saved after the copy skips entries. |
|
calendaring-sync logs nothing. Your client library’s logging shows the requests an adapter sends. |
Each adapter’s own limits, and how each tested server behaves, are on Adapters and Server compatibility.