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


Восстановление устаревшей реплики

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

В ходе синхронизации восстановления Sync Framework выполняет указанные ниже действия.

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

  • Когда в приложении задается полное перечисление, Sync Framework отменяет текущий пакет изменений, выполняет полное перечисление элементов в реплике-источнике и применяет их в реплике назначения. 

  • Когда в приложении задается частичная синхронизация, Sync Framework продолжает перечисление изменений источника и применяет их в реплике назначения, как при обычной синхронизации, за исключением того, что изменения известного набора знаний применяются как исключения одного элемента.

Основные сведения о синхронизации восстановления

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

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

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

Ответ на уведомление синхронизации восстановления

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

Ответ на уведомление синхронизации восстановления в управляемом коде

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

  • Full приводит к тому, что Sync Framework отменяет текущий пакет изменений и начинает полное перечисление, вызывая указанные далее методы.

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

  • Вызов метода Abort приводит к тому, что платформа Sync Framework останавливает текущий сеанс.

Ответ на уведомление синхронизации восстановления в неуправляемом коде

Чтобы получить уведомление о необходимости синхронизации восстановления, в приложении реализуется интерфейс ISyncCallback, который регистрируется с помощью метода ISyncSession::RegisterCallback. Перед началом синхронизации восстановления Sync Framework вызывает метод ISyncCallback::OnFullEnumerationNeeded. Этот метод возвращает одно из указанных далее действий.

  • SFEA_FULL_ENUMERATION приводит к тому, что Sync Framework отменяет текущий пакет изменений и начинает полное перечисление, вызывая указанные далее методы.

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

  • Вызов метода SFEA_ABORT приводит к тому, что платформа Sync Framework останавливает текущий сеанс.

Полное перечисление всех изменений в реплике источника

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

Выполнение полного перечисления изменений в управляемом коде

Для полного перечисления изменений в поставщике источника Sync Framework вызывает метод GetFullEnumerationChangeBatch вместо метода GetChangeBatch. При вызове этого метода поставщик источника возвращает объект полного перечисления пакета изменений FullEnumerationChangeBatch. Для построения этого пакета изменений выполните следующие действия.

  1. Откройте упорядоченную группу с помощью метода BeginOrderedGroup. Идентификатор элемента, с которого начинается группа, должен первым включаться в перечисление и должен быть меньше или равен нижней границе перечисления, указанной в методе GetFullEnumerationChangeBatch.

  2. При необходимости добавьте в пакет, отсортированный по идентификаторам элементов, изменения с теми идентификаторами элементов, которые меньше нижней границы перечисления и не содержатся в наборе знаний назначения.

  3. Добавьте в пакет, отсортированный по идентификаторам элементов, изменения с теми идентификаторами элементов, которые больше или равны нижней границе перечисления.

  4. Закройте упорядоченную группу с помощью метода EndOrderedGroup. Задайте верхнюю границу перечисления, равную идентификатору последнего изменения, добавленного в группу. Для последнего пакета задайте для верхней границы перечисления значение Infinity.

  5. Для последнего пакета вызовите метод [M:Microsoft.Synchronization.ChangeBatchBase.SetLastBatch;], в противном случае Sync Framework повторно вызовет метод GetFullEnumerationChangeBatch.

Выполнение полного перечисления изменений в неуправляемом коде

Для полного перечисления изменений в поставщике источника Sync Framework вызывает метод IKnowledgeSyncProvider::GetFullEnumerationChangeBatch вместо метода IKnowledgeSyncProvider::GetChangeBatch. При вызове этого метода поставщик источника возвращает объект полного перечисления пакета изменений ISyncFullEnumerationChangeBatch. Для построения этого пакета изменений выполните следующие действия.

  1. Создайте объект пакета изменений с помощью метода IProviderSyncServices::CreateFullEnumerationChangeBatch.

  2. Откройте упорядоченную группу с помощью метода ISyncChangeBatchBase::BeginOrderedGroup. Идентификатор элемента, с которого начинается группа, должен первым включаться в перечисление и должен быть меньше или равен нижней границе перечисления, указанной в методе GetFullEnumerationChangeBatch.

  3. При необходимости добавьте в пакет, отсортированный по идентификаторам элементов, изменения с теми идентификаторами элементов, которые меньше нижней границы перечисления и не содержатся в наборе знаний назначения.

  4. Добавьте в пакет, отсортированный по идентификаторам элементов, изменения с теми идентификаторами элементов, которые больше или равны нижней границе перечисления.

  5. Закройте упорядоченную группу с помощью метода ISyncChangeBatchBase::EndOrderedGroup. Задайте верхнюю границу перечисления, равную идентификатору последнего изменения, добавленного в группу. Для последнего пакета задайте для верхней границы перечисления значение NULL.

  6. Для последнего пакета вызовите метод ISyncChangeBatchBase::SetLastBatch, в противном случае Sync Framework повторно вызовет метод GetFullEnumerationChangeBatch.

Обработка изменений в ходе синхронизации восстановления

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

Поставщик назначения передает этот список элементов назначения объекту применения изменений. Объект применения изменений определяет порядок обработки каждого изменения и вызывает соответствующий метод поставщика назначения для применения изменений в реплике назначения.

Обработка изменений в управляемом коде

Для обработки изменений в ходе синхронизации восстановления Sync Framework вызывает метод ProcessFullEnumerationChangeBatch поставщика назначения. Этот метод предоставляет объект FullEnumerationChangeBatch, который содержит изменения, полученные от поставщика источника.

Если поставщик назначения использует объект NotifyingChangeApplier, предоставленный платформой Sync Framework, он должен применить изменения с помощью метода ApplyFullEnumerationChanges. Этому методу требуется коллекция всех изменений назначения, отсортированная по идентификаторам элементов и содержащая только элементы, у которых идентификаторы лежат в диапазоне от значения свойства DestinationVersionEnumerationRangeLowerBound до значения свойства DestinationVersionEnumerationRangeUpperBound. Чтобы применить изменения, объект NotifyingChangeApplier вызывает методы INotifyingChangeApplierTarget, как при обычной синхронизации.

Обработка изменений в неуправляемом коде

Для обработки изменений в ходе синхронизации восстановления Sync Framework вызывает метод IKnowledgeSyncProvider::ProcessFullEnumerationChangeBatch поставщика назначения. Этот метод предоставляет объект ISyncFullEnumerationChangeBatch, который содержит изменения, полученные от поставщика источника.

Если поставщик назначения использует объект ISynchronousNotifyingChangeApplier, предоставленный платформой Sync Framework, он должен применить изменения с помощью метода ISynchronousNotifyingChangeApplier::ApplyFullEnumerationChanges. Этому методу требуется коллекция всех изменений назначения, отсортированная по идентификаторам элементов и содержащая только элементы, у которых идентификаторы лежат в диапазоне от значения свойства ISyncFullEnumerationChangeBatch::GetClosedLowerBoundItemId до значения свойства ISyncFullEnumerationChangeBatch::GetClosedUpperBoundItemId. Чтобы применить изменения, объект ISynchronousNotifyingChangeApplier вызывает методы Интерфейс ISynchronousNotifyingChangeApplierTarget, как при обычной синхронизации.

См. также

Другие ресурсы

Реализация стандартного пользовательского поставщика

Перечисление изменений

Применение изменений