Share via


Récupération d'un réplica obsolète

Avant que Microsoft Sync Framework n'applique les modifications, il compare la connaissance oubliée du réplica source à la connaissance actuelle du réplica de destination. Si le réplica de destination ne contient pas la connaissance oubliée, Sync Framework identifie le réplica de destination comme étant obsolète et commence une synchronisation de récupération.

Pour effectuer une synchronisation de récupération, Sync Framework procède comme suit :

  • Si l'application s'est inscrite pour recevoir une notification, Sync Framework lui indique qu'une synchronisation de récupération est requise. L'application peut choisir d'énumérer complètement tous les éléments dans le réplica source, d'effectuer une synchronisation partielle ou d'annuler la synchronisation. L'action par défaut est d'effectuer l'énumération complète.

  • Lorsque l'application spécifie une énumération complète, Sync Framework ignore le lot de modifications en cours, énumère complètement tous les éléments dans le réplica source et les applique au réplica de destination.

  • Lorsque l'application spécifie une synchronisation partielle, Sync Framework continue d'énumérer les modifications de la source et de les appliquer au réplica de destination comme dans une synchronisation classique, sauf que les modifications apportées à la connaissance acquise sont appliquées en tant qu'exceptions d'élément uniques.

Présentation de la synchronisation de récupération

Dans une communauté de synchronisation Sync Framework, chaque réplica contient des métadonnées sur les éléments du réplica. Les métadonnées effectuent le suivi des informations sur la création, la modification et la suppression des éléments stockés sur le réplica. En règle générale, un réplica doit régulièrement nettoyer les métadonnées des éléments supprimés pour éviter de manquer d'espace de stockage. Lorsqu'un réplica a retiré les métadonnées pour un élément supprimé, il ne peut plus énumérer la suppression et l'envoyer en tant que modification lors de la synchronisation. Tant que tous les réplicas d'une communauté de synchronisation synchronisent les suppressions avant le nettoyage des métadonnées, ces suppressions sont correctement propagées et aucun problème ne survient.

Toutefois, un réplica peut devenir obsolète s'il ne synchronise pas ses données tant qu'un autre réplica n'a pas effectué le nettoyage des métadonnées. Dans ce cas, le réplica qui a effectué le nettoyage ne peut plus énumérer les modifications qui ont été nettoyées et ne peut donc pas les envoyer au réplica obsolète. Pour récupérer à partir de cette situation, lors d'une tentative de synchronisation entre un réplica source qui a effectué le nettoyage des métadonnées et un réplica de destination obsolète, Sync Framework exige que le réplica de destination soit restauré à l'aide d'une synchronisation de récupération. La synchronisation de récupération est requise pour empêcher le réplica obsolète de réintroduire un élément qui a été supprimé de la communauté de synchronisation.

Sync Framework utilise la connaissance oubliée du réplica source pour détecter le moment où le réplica de destination est obsolète. Lorsqu'un réplica retire les métadonnées d'un élément supprimé, il enregistre la version de la suppression dans la connaissance oubliée du réplica. La connaissance oubliée peut ensuite être utilisée pour identifier les éléments connus du réplica, supprimés et dont les métadonnées ont été supprimées. Gardez à l'esprit que la connaissance oubliée est une surestimation des éléments dont les métadonnées ont été supprimées. Par conséquent, elle peut également contenir des éléments qui ont toujours des entrées actives dans les métadonnées.

Réponse à la notification d'une synchronisation de récupération

Une application peut s'inscrire pour recevoir une notification de la nécessité d'une synchronisation de récupération. Cette notification donne la possibilité à l'application de commencer une énumération complète, de poursuivre la session active ou d'arrêter la session. Par défaut, si l'application ne s'est pas inscrite pour recevoir cette notification, Sync Framework commence une énumération complète.

Réponse à la notification d'une synchronisation de récupération à l'aide de code managé

Pour recevoir une notification de la nécessité d'une synchronisation de récupération, l'application implémente un gestionnaire d'événements et l'inscrit pour recevoir l'événement FullEnumerationNeeded. Lorsque cet événement est déclenché, le gestionnaire d'événements répond en affectant à la propriété Action de l'objet FullEnumerationNeededEventArgs l'une des actions suivantes :

  • Full a pour conséquence que Sync Framework ignore le lot de modifications en cours et commence une énumération complète en appelant les méthodes suivantes :

  • Partial a pour conséquence que Sync Framework applique le lot de modifications en cours et continue la session comme dans une synchronisation classique, sauf que toutes les modifications apportées à la connaissance acquise sont appliquées en tant qu'exceptions d'élément uniques.

  • Abort a pour conséquence que Sync Framework arrête la session active.

Réponse à la notification d'une synchronisation de récupération à l'aide de code non managé

Pour recevoir une notification de la nécessité d'une synchronisation de récupération, l'application implémente l'interface ISyncCallback et l'inscrit en utilisant ISyncSession::RegisterCallback. Avant le début d'une synchronisation de récupération, Sync Framework appelle ISyncCallback::OnFullEnumerationNeeded. Cette méthode retourne l'une des actions suivantes :

  • SFEA_FULL_ENUMERATION a pour conséquence que Sync Framework ignore le lot de modifications en cours et commence une énumération complète en appelant les méthodes suivantes :

  • SFEA_PARTIAL_SYNC a pour conséquence que Sync Framework applique le lot de modifications en cours et continue la session comme dans une synchronisation classique, sauf que toutes les modifications apportées à la connaissance acquise sont appliquées en tant qu'exceptions d'élément uniques.

  • SFEA_ABORT a pour conséquence que Sync Framework arrête la session active.

Énumération complète de toutes les modifications sur le réplica source.

Pendant une énumération complète, Sync Framework demande au fournisseur de source d'énumérer toutes ses modifications. Sync Framework compare ensuite les modifications du fournisseur de source aux éléments du réplica de destination. Tout élément du réplica de destination qui n'a pas de modification correspondante du fournisseur de source est considéré comme ayant été supprimé du réplica source et sera supprimé du réplica de destination. Pour cette raison, assurez-vous que le fournisseur de source énumère correctement tous les éléments du réplica source ou les éléments seront supprimés de façon incorrecte du réplica de destination.

Énumération complète des modifications en utilisant le code managé

Pour énumérer complètement les modifications du fournisseur de source, Sync Framework appelle GetFullEnumerationChangeBatch au lieu de GetChangeBatch. Lorsque cette méthode est appelée, le fournisseur de source retourne un objet FullEnumerationChangeBatch. Pour générer ce lot de modifications, procédez comme suit :

  1. Ouvrez un groupe ordonné à l'aide de BeginOrderedGroup. L'ID d'élément qui est utilisé au début du groupe doit être le premier ID énuméré et doit être inférieur ou égal à la limite d'énumération inférieure spécifiée dans GetFullEnumerationChangeBatch.

  2. Vous pouvez éventuellement ajouter des modifications au lot, trié par ID d'élément, dont les ID d'élément sont inférieurs à la limite d'énumération inférieure et qui ne sont pas contenues dans la connaissance de destination.

  3. Ajoutez des modifications au lot, trié par ID d'élément, dont les ID d'élément sont supérieurs ou égaux à la limite d'énumération inférieure.

  4. Fermez le groupe ordonné à l'aide de EndOrderedGroup. Spécifiez la limite d'énumération supérieure en tant qu'ID de la dernière modification ajoutée au groupe. Lorsqu'il s'agit du dernier lot, spécifiez la limite d'énumération supérieure en tant que Infinity.

  5. Lorsqu'il s'agit du dernier lot, appelez SetLastBatch; sinon, Sync Framework appelle à nouveau GetFullEnumerationChangeBatch.

Énumération complète des modifications en utilisant le code non managé

Pour énumérer complètement les modifications du fournisseur de source, Sync Framework appelle IKnowledgeSyncProvider::GetFullEnumerationChangeBatch au lieu de IKnowledgeSyncProvider::GetChangeBatch. Lorsque cette méthode est appelée, le fournisseur de source retourne un objet ISyncFullEnumerationChangeBatch. Pour générer ce lot de modifications, procédez comme suit :

  1. Créez l'objet de lot de modifications en utilisant IProviderSyncServices::CreateFullEnumerationChangeBatch.

  2. Ouvrez un groupe ordonné à l'aide de ISyncChangeBatchBase::BeginOrderedGroup. L'ID d'élément qui est utilisé au début du groupe doit être le premier ID énuméré et doit être inférieur ou égal à la limite d'énumération inférieure spécifiée dans GetFullEnumerationChangeBatch.

  3. Vous pouvez éventuellement ajouter des modifications au lot, trié par ID d'élément, dont les ID d'élément sont inférieurs à la limite d'énumération inférieure et qui ne sont pas contenues dans la connaissance de destination.

  4. Ajoutez des modifications au lot, trié par ID d'élément, dont les ID d'élément sont supérieurs ou égaux à la limite d'énumération inférieure.

  5. Fermez le groupe ordonné à l'aide de ISyncChangeBatchBase::EndOrderedGroup. Spécifiez la limite d'énumération supérieure en tant qu'ID de la dernière modification ajoutée au groupe. Lorsqu'il s'agit du dernier lot, spécifiez la limite d'énumération supérieure en tant que NULL.

  6. Lorsqu'il s'agit du dernier lot, appelez ISyncChangeBatchBase::SetLastBatch ; sinon, Sync Framework appelle à nouveau GetFullEnumerationChangeBatch.

Traitement des modifications lors d'une synchronisation de récupération

Pour identifier les éléments à supprimer du réplica de destination, Sync Framework exige que le fournisseur de destination énumère, en ordre trié par ID d'élément, tous les éléments du réplica de destination dont les ID d'élément se situent entre les limites d'énumération inférieure et supérieure de chaque lot de modifications. Un élément du réplica de destination qui n'a pas de modification correspondante énumérée du fournisseur de source sera supprimé.

Le fournisseur de destination passe cette liste d'éléments de destination à l'applicateur de modifications. L'applicateur de modifications détermine la façon de gérer chaque modification et appelle la méthode du fournisseur de destination appropriée pour appliquer la modification au réplica de destination.

Traitement des modifications en utilisant le code managé

Pour traiter les modifications lors d'une synchronisation de récupération, Sync Framework appelle la méthode ProcessFullEnumerationChangeBatch du fournisseur de destination. Cette méthode fournit un objet FullEnumerationChangeBatch qui contient les modifications du fournisseur de source.

Si le fournisseur de destination utilise l'objet NotifyingChangeApplier fourni par Sync Framework, le fournisseur de destination doit appeler la méthode ApplyFullEnumerationChanges pour appliquer les modifications. Cette méthode requiert une collection, triée par ID d'élément, de toutes les modifications de destination dont les ID d'élément se situent entre les propriétés DestinationVersionEnumerationRangeLowerBound et DestinationVersionEnumerationRangeUpperBound du lot de modifications source. Pour appliquer les modifications, l'objet NotifyingChangeApplier appelle les méthodes INotifyingChangeApplierTarget de la même façon que pendant une synchronisation classique.

Traitement des modifications en utilisant le code non managé

Pour traiter les modifications lors d'une synchronisation de récupération, Sync Framework appelle la méthode IKnowledgeSyncProvider::ProcessFullEnumerationChangeBatch du fournisseur de destination. Cette méthode fournit un objet ISyncFullEnumerationChangeBatch qui contient les modifications du fournisseur de source.

Si le fournisseur de destination utilise l'objet ISynchronousNotifyingChangeApplier fourni par Sync Framework, le fournisseur de destination doit appeler la méthode ISynchronousNotifyingChangeApplier::ApplyFullEnumerationChanges pour appliquer les modifications. Cette méthode requiert une collection, triée par ID d'élément, de toutes les modifications de destination dont les ID d'élément se situent entre les propriétés ISyncFullEnumerationChangeBatch::GetClosedLowerBoundItemId et ISyncFullEnumerationChangeBatch::GetClosedUpperBoundItemId du lot de modifications source. Pour appliquer les modifications, l'objet ISynchronousNotifyingChangeApplier appelle les méthodes Interface ISynchronousNotifyingChangeApplierTarget de la même façon que pendant une synchronisation classique.

Voir aussi

Concepts

Fournisseurs de synchronisation
Énumération des modifications
Application des modifications