Поделиться через


Управление отметками полного удаления

Отметки полного удаления представляют элементы, удаленные из реплики. Главной задачей отметок полного удаления является защита от повторного добавления удаленных элементов в реплику. Чтобы избежать возможных проблем с производительностью или с хранением данных, необходимо периодически очищать отметки полного удаления. Такую очистку необходимо проводить осторожно, чтобы избежать повторного добавления удаленных элементов.

Представление отметок полного удаления

Реплика может использовать любой способ для отслеживания удаленных элементов. Рекомендуется использовать бит полного удаления или журнал отметок полного удаления.

Бит полного удаления

Реплика определяет, что метаданные для элемента содержат логическое значение, указывающее, был ли элемент удален из хранилища элементов. Если элемент удален, в записи метаданных для этого элемента этот бит устанавливается в значение true. Использование бита полного удаления эффективно в хранилище, где нужно отслеживать большое количество удаленных элементов, поскольку для этого требуется только один дополнительный бит на элемент. Этот способ менее эффективен для перечисления или очистки отметок полного удаления, поскольку необходимо выполнять поиск во всем хранилище метаданных.

Журнал отметок полного удаления

Реплика ведет отдельный журнал, в котором перечисляются элементы, удаленные из хранилища элементов. Когда элемент удаляется, в журнал отметок полного удаления добавляется запись. Использование журнала отметок полного удаления неэффективно в хранилищах, где нужно отслеживать большое количество удаленных элементов, поскольку журнал должен содержать идентификатор для каждого удаленного элемента. Этот способ эффективен для перечисления или очистки отметок полного удаления, поскольку в список входят только удаленные элементы.

Очистка отметок полного удаления

Каждая реплика в сообществе синхронизации содержит набор знаний только о собственном состоянии, но не о состоянии других реплик. Поэтому невозможно определить, прошла ли отметка полного удаления репликацию по всему сообществу. В результате для каждой отдельной реплики решение о времени и способе очистки отметок полного удаления применяется исключительно на основании локальных условий. Например, отметки полного удаления можно очищать на основании локальной отметки времени или исходя из требований к месту на диске. В реплике может действовать политика, запрещающая отметкам полного удаления занимать более 10 процентов набора данных.

После очистки отметки полного удаления реплика не получает сведений об удалении, однако по-прежнему должна предотвращать повторное добавление элемента в собственном хранилище или в другой реплике. Чтобы решить эту проблему, в хранилище метаданных для реплики хранится версия создания для каждого элемента и утраченный набор знаний для реплики. Когда реплика очищает отметку полного удаления, она должна записывать версию отметки полного удаления в раздел утраченного набора знаний.

Запись очищенных отметок полного удаления в управляемом коде

Для записи того, что метаданные удаленного элемента были удалены из хранилища метаданных реплики, вызовите метод ForgetTo объекта реплики ForgottenKnowledge. Для этого метода требуется версия удаленного элемента.

Запись очищенных отметок полного удаления в неуправляемом коде

Для записи того, что метаданные удаленного элемента были удалены из хранилища метаданных реплики, вызовите метод IForgottenKnowledge::ForgetToVersion объекта реплики IForgottenKnowledge. Для этого метода требуется версия удаленного элемента.

Передача утраченного набора знаний в Sync Framework

Если реплика отслеживает очищенные отметки полного удаления с помощью утраченного набора знаний, связанный с ней поставщик должен передать утраченный набор знаний в метод Sync Framework, которому требуются эти данные, например в виде ChangeBatch (управляемый код) или IProviderSyncServices::CreateChangeBatch (неуправляемый код). Во время синхронизации поставщик должен сохранить утраченный набор знаний вместе с обновленным набором знаний, например в методе StoreKnowledgeForScope (управляемый код) или ISynchronousNotifyingChangeApplierTarget::SaveKnowledge (неуправляемый код).

Если реплика не очищает отметки полного удаления и не поддерживает утраченный набор знаний, связанный с ней поставщик должен передать в метод Sync Framework, содержащий параметр утраченного набора знаний, значение null (управляемый код) или NULL (неуправляемый код).

Ситуации, связанные с отметками полного удаления

Следует рассмотреть две ситуации, связанные с отметками полного удаления: в одном случае устаревшая реплика запрашивает синхронизацию, а в другом реплика отправляет обновление для удаленного элемента. Платформа Sync Framework обнаруживает ситуации обоих типов.

Обнаружение устаревшей реплики

В такой ситуации реплика-назначение является устаревшей по отношению к реплике-источнику. Поскольку в реплике-источнике очищены отметки полного удаления, существуют операции удаления, о которых неизвестно реплике-источнику. Поэтому поставщик источника не может отправить поставщику назначения изменения, которые представляют эти операции удаления. Перед применением изменений платформа Sync Framework сравнивает утраченный набор знаний реплики-источника с текущим набором знаний реплики-назначения. Если реплика-назначение не содержит утраченный набор знаний, Sync Framework идентифицирует ее как устаревшую и начинает синхронизацию восстановления.

Если приложение зарегистрировало обработчик события, платформа Sync Framework предоставит приложению возможность продолжить или остановить полное перечисление. В управляемом коде будет вызвано событие FullEnumerationNeeded. В неуправляемом коде приложение получит ответный вызов ISyncCallback::OnFullEnumerationNeeded.

Если приложение не зарегистрировало обработчик события, автоматически будет выполняться полное перечисление. Полное перечисление позволяет Sync Framework сравнить изменения между поставщиком источника и элементами в реплике назначения и определить таким образом, какие элементы должны быть удалены из реплики назначения. Элементы реплики назначения, не содержащие соответствующих изменений по сравнению с поставщиком источника, удаляются из реплики назначения.

Обнаружение обновления для удаленного элемента

В этом сценарии реплика-источник является устаревшей по отношению к реплике-назначению. Это происходит, если реплика-источник не была синхронизирована с момента последней очистки отметок полного удаления в реплике-назначении. Может возникнуть проблема, если элемент был удален в реплике-назначении, но затем его отметка полного удаления была очищена в реплике-назначении, и этот элемент был обновлен в реплике-источнике. Элемент включен в пакет изменений, который поставщик источника отправляет поставщику назначения. Поставщик назначения должен иметь возможность определить, что этот элемент не является новым. В противном случае этот элемент будет повторно добавлен в реплику-назначение.

Учтите, что нет смысла сравнивать текущую версию элемента из реплики-источника с текущим набором знаний реплики-назначения, поскольку текущая версия добавляемого элемента не содержится в текущем наборе знаний реплики-назначения. Вместо этого версия создания элемента из реплики-источника сравнивается с текущим набором знаний реплики-назначения, чтобы определить, входил ли ранее элемент в набор знаний реплики-назначения. Поскольку удаление элемента должно было случиться после создания элемента и в текущем наборе знаний реплики-назначения содержится удаление, текущий набор знаний также должен содержать сведения о создании.

Поэтому перед добавлением нового элемента в реплику-назначение платформа Sync Framework сравнивает версию создания элемента с текущим набором знаний реплики-назначения. Если в набор знаний назначения входит версия создания элемента, это значит, что элемент ранее входил в набор знаний, но затем был удален и утрачен. Такой элемент считается конфликтом операций обновления и удаления.

См. также

Справочник

ISyncCallback::OnFullEnumerationNeeded
FullEnumerationNeeded

Основные понятия

Управление метаданными