* A version number and a boolean ''​synced''​ flag for each syncable object

* A version number and a boolean ''​synced''​ flag for each syncable object

-

* A flag indicating that a downloaded ​object ​could not be processed and should be requested explicitly regardless of its remote version number (optional; see [[#Handling save errors|Handling save errors]] for details)

+

* A list of downloaded ​objects that could not be processed and should be requested explicitly regardless of their remote version number (optional; see [[#Handling save errors|Handling save errors]] for details)

===== Version Numbers =====

===== Version Numbers =====

Line 219:

Line 219:

- Treat the error as fatal and stop the sync without updating the local library version

- Treat the error as fatal and stop the sync without updating the local library version

-

- Mark the object ​as needing to be downloaded later and continue with the sync, updating the local library version at the end as if the sync had succeeded. In a future sync, add objects ​with this flag to the set of objects returned from the ''​versions''​ request so that their data is requested again even if the remote version is lower than the library version specified in ''?​since=''​. Ideally, retry these objects on a backoff schedule, since they may require either a server-side fix or a client update to save successfully.

+

- Add the object ​key to a list of objects ​needing to be downloaded later and continue with the sync, updating the local library version at the end as if the sync had succeeded. In a future sync, add objects ​on this list to the set of objects returned from the ''​versions''​ request so that their data is requested again even if the remote version is lower than the library version specified in ''?​since=''​. Ideally, retry these objects on a backoff schedule, since they may require either a server-side fix or a client update to save successfully. If these objects later appear as deleted, remove them from the list of objects.

When processing a set of objects, it may be helpful to maintain a process queue for the sync run and move failing objects to the end of the queue in case they depend on other objects being retrieved. (In many cases, it's possible to sort objects beforehand to avoid such errors, such as by sorting parent collections before subcollections.) If a loop of the process queue completes without any objects being successfully processed, stop the sync.

When processing a set of objects, it may be helpful to maintain a process queue for the sync run and move failing objects to the end of the queue in case they depend on other objects being retrieved. (In many cases, it's possible to sort objects beforehand to avoid such errors, such as by sorting parent collections before subcollections.) If a loop of the process queue completes without any objects being successfully processed, stop the sync.