| Index: docs/sync/uss/shared_model_type_processor.md
|
| diff --git a/docs/sync/uss/shared_model_type_processor.md b/docs/sync/uss/shared_model_type_processor.md
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..46bc5a1114eae7038ada1b856cfd7ba85e722735
|
| --- /dev/null
|
| +++ b/docs/sync/uss/shared_model_type_processor.md
|
| @@ -0,0 +1,114 @@
|
| +# SharedModelTypeProcessor
|
| +
|
| +The [`SharedModelTypeProcessor`][SMTP] is a crucial piece of the USS codepath.
|
| +It lives on the model thread and performs the tracking of sync metadata for the
|
| +[`ModelTypeSyncBridge`][MTSB] that owns it by implementing the
|
| +[`ModelTypeChangeProcessor`][MTCP] interface, as well as sending commit requests
|
| +to the [`ModelTypeWorker`][MTW] on the sync thread via the [`CommitQueue`][CQ]
|
| +interface and receiving updates from the same worker via the
|
| +[`ModelTypeProcessor`][MTP] interface.
|
| +
|
| +[SMTP]: https://cs.chromium.org/chromium/src/components/sync/model_impl/shared_model_type_processor.h
|
| +[MTSB]: https://cs.chromium.org/chromium/src/components/sync/model/model_type_sync_bridge.h
|
| +[MTCP]: https://cs.chromium.org/chromium/src/components/sync/model/model_type_change_processor.h
|
| +[MTW]: https://cs.chromium.org/chromium/src/components/sync/engine_impl/model_type_worker.h
|
| +[CQ]: https://cs.chromium.org/chromium/src/components/sync/engine/commit_queue.h
|
| +[MTP]: https://cs.chromium.org/chromium/src/components/sync/engine/model_type_processor.h
|
| +
|
| +[TOC]
|
| +
|
| +## Lifetime
|
| +
|
| +The bridge owns a processor object at all times and operates on the same thread
|
| +as it. If sync is disabled, the processor is destroyed but a new one is
|
| +immediately created to replace it.
|
| +
|
| +## Processor State Machines
|
| +
|
| +The processor sits between the model bridge and the sync engine. It has
|
| +knowledge of what state each is in based on the calls it has receieved and
|
| +performed. The states are not stored explicitly, but are implicit based on
|
| +state stored in the processor. Here are the states of each, with notes on their
|
| +transitions and how to determine them.
|
| +
|
| +### Model States
|
| +
|
| +* `UNREADY`
|
| + * Waiting for `ModelReadyToStart` to be called.
|
| + * Determined by: `waiting_for_metadata_ && !model_error_`
|
| +* `NEEDS_DATA`
|
| + * Waiting for data for pending commits to be loaded.
|
| + * This state is skipped if there are no pending commits.
|
| + * Determined by: `waiting_for_pending_data_ && !model_error_`
|
| +* `READY`
|
| + * The model is completely ready to sync.
|
| + * Determined by: `!waiting_for_metadata_ && !waiting_for_pending_data &&
|
| + !model_error`
|
| +* `ERROR`
|
| + * Something in the model or storage broke.
|
| + * This state is permanent until DisableSync destroys the object.
|
| + * Determined by: `!!model_error_`
|
| +
|
| +### Sync States
|
| +
|
| +* `DISCONNECTED`
|
| + * Sync for this type has not started.
|
| + * This state can be re-entered from any other state if Disconnect is
|
| + called.
|
| + * Determined by: `!error_handler_`.
|
| +* `STARTED`
|
| + * Sync has started but the model is not yet `READY` (or `ERROR`).
|
| + * This state is skipped if the model is ready before sync is.
|
| + * Determined by: `error_handler_ && start_callback_`
|
| +* `CONNECT_PENDING`
|
| + * Both the model and sync are ready. The start callback has been called
|
| + and we're waiting to connect to the sync thread.
|
| + * If the model was `ERROR`, the error is passed along and the callback is
|
| + cleared; we're really waiting for DisableSync instead of connect.
|
| + * Determined by: `error_handler_ && !start_callback_`
|
| +* `CONNECTED`
|
| + * We have a [`CommitQueue`][CQ] that passes changes to the
|
| + [`ModelTypeWorker`][MTW] on the sync thread.
|
| + * Determined by: `!!worker_`
|
| +
|
| +### Processor States
|
| +
|
| +Based on the interplay of the model and sync states, the processor effectively
|
| +progresses through 3 states worth noting:
|
| +
|
| +* `UNINITIALIZED`
|
| + * Metadata isn't loaded so we have no knowledge of entities.
|
| + * `Put` and `Delete` calls are not allowed in this state (will DCHECK).
|
| +* `NOT_TRACKING`
|
| + * Indicates that not metadata is being tracked and that `Put` and `Delete`
|
| + calls will be ignored.
|
| + * This state is entered if the loaded metadata shows an initial merge
|
| + hasn't happened (`ModelTypeState::initial_sync_done` is false).
|
| + * Exposed via `IsTrackingMetadata` for optimization, not correctness.
|
| +* `TRACKING`
|
| + * Indicates that metadata is being tracked and `Put` and `Delete` calls
|
| + must happen for entity changes.
|
| + * This state is entered if the loaded metadata shows an initial merge
|
| + has happened (`ModelTypeState::initial_sync_done` is true).
|
| +* `SYNCING`
|
| + * Indicates that commits can be sent and updates can be received from the
|
| + sync server. This is a superstate of `TRACKING`.
|
| + * If the processor was in `TRACKING`, it progresses to this state as soon
|
| + as it gets connected to the worker.
|
| + * If the processor was in `NOT_TRACKING`, it progresses to this state
|
| + after `MergeSyncData` is called and the metadata is initialized.
|
| +
|
| +## Entity Tracker
|
| +
|
| +The [`ProcessorEntityTracker`][PET] tracks the state of individual entities for
|
| +the processor. It keeps the [`EntityMetadata`][EM] proto in memory, as well as
|
| +any pending commit data until it gets acked by the server. It also stores the
|
| +special `commit_requested_sequence_number_`, which tracks the sequence number of
|
| +the last version that's been sent to the server.
|
| +
|
| +The tracker holds the metadata in memory forever, which is needed so we know
|
| +what to update the on-disk memory with when we get a new local or remote change.
|
| +Changing this would require being able to handle updates asynchronously.
|
| +
|
| +[PET]: https://cs.chromium.org/chromium/src/components/sync/model_impl/processor_entity_tracker.h
|
| +[EM]: https://cs.chromium.org/chromium/src/components/sync/protocol/entity_metadata.proto
|
|
|