Recuperar una réplica obsoleta

Antes de que Microsoft Sync Framework aplique los cambios, compara el conocimiento olvidado de la réplica de origen con el conocimiento actual de la réplica de destino. Si el conocimiento de destino no contiene el conocimiento olvidado, Sync Framework identifica la réplica de destino como obsoleta y comienza una sincronización de recuperación.

Para realizar una sincronización de recuperación, Sync Framework sigue estos pasos:

  • Si la aplicación se ha registrado para recibir notificaciones, Sync Framework notifica a la aplicación que se necesita una sincronización de recuperación. La aplicación puede decidir enumerar completamente todos los elementos de la réplica de origen, realizar una sincronización parcial o cancelar la sincronización. La acción predeterminada es realizar la enumeración completa.

  • Cuando la aplicación especifica una enumeración completa, Sync Framework descarta el lote de cambios actual, enumera totalmente todos los elementos de la réplica de origen y los aplica a la réplica de destino.

  • Cuando la aplicación especifica una sincronización parcial, Sync Framework continúa enumerando los cambios del origen y aplicándolos a la réplica de destino como en una sincronización típica, excepto en que los cambios del conocimiento aprendido se aplican como excepciones de un único elemento.

Introducción a la sincronización de recuperación

En una comunidad de sincronización de Sync Framework, cada réplica contiene los metadatos sobre los elementos de la réplica. Los metadatos someten a seguimiento la información de la creación, modificación y eliminación de los elementos que están almacenados en la réplica. Generalmente, para evitar quedarse sin espacio de almacenamiento, una réplica debe limpiar de forma periódica los metadatos de los elementos eliminados. Cuando una réplica ha quitado los metadatos de un elemento eliminado, ya no puede enumerar la eliminación y enviarla como un cambio durante la sincronización. Siempre que todas las réplicas de una comunidad de sincronización sincronicen las eliminaciones antes de que se limpien los metadatos, todas las eliminaciones se propagan correctamente y no se produce ningún problema.

Sin embargo, una réplica puede quedarse obsoleta si no sincroniza sus datos hasta después de que otra réplica haya limpiado los metadatos. En este caso, la réplica que ha realizado la limpieza ya no puede enumerar los cambios que se han limpiado y por lo tanto no puede enviarlos a la réplica obsoleta. Para recuperarse ante esta situación, cuando se intenta la sincronización entre una réplica de origen que ha realizado la limpieza de los metadatos y una réplica de destino que está obsoleta, Sync Framework requiere que la réplica de destino se restaure mediante la sincronización de recuperación. Se necesita una sincronización de recuperación para evitar que la réplica obsoleta vuelva a introducir un elemento que se eliminó de la comunidad de sincronización.

Sync Framework usa el conocimiento olvidado de la réplica de origen para detectar cuándo una réplica de destino está obsoleta. Cuando una réplica quita los metadatos de un elemento eliminado, registra la versión de la eliminación en el conocimiento olvidado de la réplica. El conocimiento olvidado se puede utilizar entonces para identificar los elementos que la réplica conocía, se eliminaron y se hizo que sus metadatos se quitaran. Tenga en cuenta que el conocimiento olvidado es una estimación exagerada de qué elementos tienen quitados sus metadatos. Por consiguiente, el conocimiento olvidado también podría contener elementos que todavía tengan entradas activas en los metadatos.

Responder a la notificación de una sincronización de recuperación

Una aplicación se puede registrar para recibir la notificación de que se necesita una sincronización de recuperación. Esta notificación da a la aplicación la oportunidad de comenzar una enumeración completa, continuar con la sesión actual o detener la sesión. De forma predeterminada, si la aplicación no se ha registrado para recibir esta notificación, Sync Framework comienza una enumeración completa.

Responder a la notificación de una sincronización de recuperación mediante código administrado

Para recibir una notificación de que se necesita una sincronización de recuperación, la aplicación implementa un controlador de eventos y se registra para recibir el evento FullEnumerationNeeded. Cuando se genera este evento, el controlador de eventos responde estableciendo la propiedad Action del objeto FullEnumerationNeededEventArgs en una de las acciones siguientes:

  • Full hace que Sync Framework descarte el lote de cambios actual y comience una enumeración completa llamando a los métodos siguientes:

  • Partial hace que Sync Framework aplique el lote de cambios actual y continúe con la sesión como en una sincronización típica, excepto en que todos los cambios del conocimiento aprendido se aplican como excepciones de un único elemento.

  • Abort hace que Sync Framework detenga la sesión actual.

Responder a la notificación de una sincronización de recuperación mediante código no administrado

Para recibir la notificación de que se necesita una sincronización de recuperación, la aplicación implementa la interfaz ISyncCallback y la registra usando ISyncSession::RegisterCallback. Antes de que una sincronización de recuperación comience, Sync Framework llama a ISyncCallback::OnFullEnumerationNeeded. Este método devuelve una de las acciones siguientes:

  • SFEA_FULL_ENUMERATION hace que Sync Framework descarte el lote de cambios actual y comience una enumeración completa llamando a los métodos siguientes:

  • SFEA_PARTIAL_SYNC hace que Sync Framework aplique el lote de cambios actual y continúe con la sesión como en una sincronización típica, excepto en que todos los cambios del conocimiento aprendido se aplican como excepciones de un único elemento.

  • SFEA_ABORT hace que Sync Framework detenga la sesión actual.

Enumerar totalmente todos los cambios en la réplica de origen

Durante una enumeración completa, Sync Framework requiere que el proveedor de origen enumere todos sus cambios. Sync Framework compara entonces los cambios del proveedor de origen con los elementos de la réplica de destino. Cualquier elemento de la réplica de destino que no tenga un cambio correspondiente del proveedor de origen se supone que se ha eliminado de la réplica de origen y se eliminará de la réplica de destino. Debido a esto, asegúrese de que el proveedor de origen enumera correctamente todos los elementos de la réplica de origen o los elementos se eliminarán incorrectamente de la réplica de destino.

Enumerar totalmente los cambios utilizando código administrado

Para enumerar totalmente los cambios del proveedor de origen, Sync Framework llama al método GetFullEnumerationChangeBatch en lugar de a GetChangeBatch. Cuando se llama a este método, el proveedor de origen devuelve un objeto FullEnumerationChangeBatch. Para generar este lote de cambios, siga estos pasos:

  1. Abra un grupo ordenado utilizando BeginOrderedGroup. El identificador de elemento que se utiliza para comenzar el grupo debe ser el primero que se enumera y debe ser menor o igual que el límite menor de la enumeración especificado en GetFullEnumerationChangeBatch.

  2. Si lo desea, agregue al lote los cambios, ordenados por identificador de elemento, que tengan los identificadores de elemento menores que el límite menor de la enumeración y que no estén contenidos en el conocimiento de destino.

  3. Agregue al lote los cambios, ordenados por identificador de elemento, que tengan los identificadores de elemento mayores o iguales que el límite menor de la enumeración.

  4. Cierre el grupo ordenado utilizando EndOrderedGroup. Especifique el límite superior de la enumeración como identificador del último cambio que se agregó al grupo. Cuando se llegue al último lote, especifique el límite superior de la enumeración como Infinity.

  5. Cuando se llegue al último lote, llame al método SetLastBatch;; de lo contrario Sync Framework llamará de nuevo a GetFullEnumerationChangeBatch.

Enumerar totalmente los cambios utilizando código no administrado

Para enumerar totalmente los cambios del proveedor de origen, Sync Framework llama al método IKnowledgeSyncProvider::GetFullEnumerationChangeBatch en lugar de a IKnowledgeSyncProvider::GetChangeBatch. Cuando se llama a este método, el proveedor de origen devuelve un objeto ISyncFullEnumerationChangeBatch. Para generar este lote de cambios, siga estos pasos:

  1. Cree el objeto del lote de cambios mediante IProviderSyncServices::CreateFullEnumerationChangeBatch.

  2. Abra un grupo ordenado utilizando ISyncChangeBatchBase::BeginOrderedGroup. El identificador de elemento que se utiliza para comenzar el grupo debe ser el primero que se enumera y debe ser menor o igual que el límite menor de la enumeración especificado en GetFullEnumerationChangeBatch.

  3. Si lo desea, agregue al lote los cambios, ordenados por identificador de elemento, que tengan los identificadores de elemento menores que el límite menor de la enumeración y que no estén contenidos en el conocimiento de destino.

  4. Agregue al lote los cambios, ordenados por identificador de elemento, que tengan los identificadores de elemento mayores o iguales que el límite menor de la enumeración.

  5. Cierre el grupo ordenado utilizando ISyncChangeBatchBase::EndOrderedGroup. Especifique el límite superior de la enumeración como identificador del último cambio que se agregó al grupo. Cuando se llegue al último lote, especifique el límite superior de la enumeración como NULL.

  6. Cuando se llegue al último lote, llame al método ISyncChangeBatchBase::SetLastBatch; de lo contrario Sync Framework llamará de nuevo a GetFullEnumerationChangeBatch.

Procesar los cambios durante una sincronización de recuperación

Para determinar qué elementos eliminar de la réplica de destino, Sync Framework exige que el proveedor de destino enumere, en orden de identificador de elemento, todos los elementos de la réplica de destino cuyo identificador de elemento tenga un valor comprendido entre los límites inferior y superior de la enumeración de cada lote de cambios. Se eliminarán los elementos de la réplica de destino que no tengan un cambio correspondiente enumerado desde el proveedor de origen.

El proveedor de destino pasa esta lista de elementos de destino al aplicador de cambios. El aplicador de cambios determina cómo tratar cada cambio y llama al método del proveedor de destino adecuado para aplicar el cambio a la réplica de destino.

Procesar los cambios utilizando código administrado

Para procesar los cambios durante una sincronización de recuperación, Sync Framework llama al método ProcessFullEnumerationChangeBatch del proveedor de destino. Este método proporciona un objeto FullEnumerationChangeBatch que contiene los cambios del proveedor de origen.

Si el proveedor de destino usa el objeto NotifyingChangeApplier que proporciona Sync Framework, el proveedor de destino debe llamar al método ApplyFullEnumerationChanges para aplicar los cambios. Este método requiere una recopilación, ordenada por identificador de elemento, de todos los cambios del destino que tienen identificadores de elemento entre las propiedades DestinationVersionEnumerationRangeUpperBound y DestinationVersionEnumerationRangeLowerBound del lote de cambios de origen. Para aplicar los cambios, el objeto NotifyingChangeApplier llama a los métodos INotifyingChangeApplierTarget igual que durante una sincronización típica.

Procesar los cambios utilizando código no administrado

Para procesar los cambios durante una sincronización de recuperación, Sync Framework llama al método IKnowledgeSyncProvider::ProcessFullEnumerationChangeBatch del proveedor de destino. Este método proporciona un objeto ISyncFullEnumerationChangeBatch que contiene los cambios del proveedor de origen.

Si el proveedor de destino usa el objeto ISynchronousNotifyingChangeApplier que proporciona Sync Framework, el proveedor de destino debe llamar al método ISynchronousNotifyingChangeApplier::ApplyFullEnumerationChanges para aplicar los cambios. Este método requiere una recopilación, ordenada por identificador de elemento, de todos los cambios del destino que tienen identificadores de elemento entre las propiedades ISyncFullEnumerationChangeBatch::GetClosedUpperBoundItemId y ISyncFullEnumerationChangeBatch::GetClosedLowerBoundItemId del lote de cambios de origen. Para aplicar los cambios, el objeto ISynchronousNotifyingChangeApplier llama a los métodos de Interfaz ISynchronousNotifyingChangeApplierTarget igual que durante una sincronización típica.

Vea también

Conceptos

Proveedores de sincronización
Enumerar los cambios
Aplicar los cambios