Administrar marcadores de exclusión
Los marcadores de exclusión representan los elementos eliminados de una réplica. Principalmente, ayudan a evitar que los elementos eliminados se vuelvan a introducir en una réplica. Para evitar posibles problemas de almacenamiento o rendimiento, los marcadores de exclusión se deben limpiar periódicamente. Esta limpieza se debería administrar con cuidado para no reintroducir los elementos eliminados.
Representar los marcadores de exclusión
Una réplica puede utilizar cualquier método para realizar el seguimiento de los elementos eliminados. Para efectuar esta tarea, recomendamos usar un bit de marcador de exclusión o un registro de marcadores de exclusión en las réplicas.
Bit de marcador de exclusión
Una réplica define que los metadatos de un elemento contienen un valor booleano que indica si el elemento se ha eliminado del almacén de elementos. Cuando se elimina un elemento, este valor se establece como verdadero en la entrada de los metadatos correspondientes a ese elemento. El uso de un bit de marcador de exclusión es eficaz para el almacenamiento si se debe realizar el seguimiento de muchos elementos eliminados porque solo requiere un bit adicional por cada elemento. Este método es menos eficaz para enumerar o limpiar los marcadores de exclusión porque se debe buscar en todo el almacén de metadatos.
Registro de marcadores de exclusión
Una réplica mantiene un registro independiente que enumera los elementos que se han eliminado del almacén de elementos. Cuando se elimina un elemento, se agrega una entrada al registro de marcadores de exclusión. El uso de un registro de marcadores de exclusión es ineficaz para el almacenamiento si se debe realizar el seguimiento de muchos elementos eliminados porque el registro debe contener un identificador para cada uno. Este método es eficaz para enumerar o limpiar los marcadores de exclusión porque la lista contiene únicamente los elementos eliminados.
Limpieza de marcadores de exclusión
Cada réplica de una comunidad de sincronización sólo contiene el conocimiento sobre su propio estado y no sobre el estado de cualquier otra réplica. Por consiguiente, no se puede determinar cuándo se ha replicado un marcador de exclusión en toda la comunidad. Por consiguiente, determinar cuándo y cómo limpiar los marcadores de exclusión para una réplica concreta es una decisión completamente local. Por ejemplo, los marcadores de exclusión se podrían limpiar según la marca de tiempo local o los requisitos de espacio. Una réplica podría tener una directiva que indique que los marcadores de exclusión no pueden ocupar más del 10 por ciento del conjunto de datos.
Una vez limpiado un marcador de exclusión, una réplica no sabe nada sobre su eliminación, pero todavía se debe evitar que el elemento se vuelva a introducir en su propio almacén o en otra réplica. Para ayudar a evitar este problema, la versión de creación de cada elemento y el conocimiento olvidado de la réplica se mantienen en el almacén de metadatos correspondiente a la réplica. Cuando una réplica limpia un marcador de exclusión, debe registrar la versión del marcador de exclusión en su conocimiento olvidado.
Registrar los marcadores de exclusión limpiados mediante código administrado
Para registrar que los metadatos de un elemento eliminado se han quitado del almacén de metadatos de una réplica, llame al método ForgetTo en el objeto ForgottenKnowledge de la réplica. Este método requiere la versión del elemento eliminado.
Registrar los marcadores de exclusión limpiados mediante código no administrado
Para registrar que los metadatos de un elemento eliminado se han quitado del almacén de metadatos de una réplica, llame al método IForgottenKnowledge::ForgetToVersion en el objeto IForgottenKnowledge de la réplica. Este método requiere la versión del elemento eliminado.
Proporcionar el conocimiento olvidado a Sync Framework
Si una réplica realiza el seguimiento de los marcadores de exclusión limpiados mediante el conocimiento olvidado, su proveedor asociado debe proporcionar el conocimiento olvidado a los métodos Sync Framework que lo requieren, como ChangeBatch (en el código administrado) o IProviderSyncServices::CreateChangeBatch (en el código no administrado). El proveedor también debe guardar el conocimiento olvidado junto con el conocimiento actualizado durante la sincronización, como en su método StoreKnowledgeForScope (en el código no administrado) o el método ISynchronousNotifyingChangeApplierTarget::SaveKnowledge (en el código administrado).
Si una réplica no limpia los marcadores de exclusión y no mantiene el conocimiento olvidado, su proveedor asociado debe pasar null (en el código administrado) o NULL (en el código no administrado) a Sync Framework a los métodos que tienen un parámetro de conocimiento olvidado.
Escenarios relacionados con los marcadores de exclusión
Dos escenarios relacionados con los marcadores de exclusión que hay que considerar implican una réplica obsoleta que solicita la sincronización y una réplica que envía una actualización a un elemento eliminado. Sync Framework detecta ambos.
Detectar una réplica obsoleta
En este escenario, la réplica de destino está obsoleta con respecto a la réplica de origen. Dado que la réplica de origen ha limpiado sus marcadores de exclusión, hay eliminaciones que la réplica de origen ya no conoce. Por consiguiente, el proveedor de origen no puede enviar los cambios que representan estas eliminaciones al proveedor de destino. Antes de que se apliquen los cambios, Sync Framework compara el conocimiento olvidado de la réplica del 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.
Si una aplicación ha registrado un controlador de eventos, Sync Framework dará a la aplicación la oportunidad de continuar o detener la enumeración completa. En el código administrado, se desencadenará el evento FullEnumerationNeeded. En el código no administrado, la aplicación recibirá una devolución de llamada de ISyncCallback::OnFullEnumerationNeeded.
Si la aplicación no ha registrado un controlador de eventos, la enumeración completa se producirá automáticamente. Una enumeración completa permite a Sync Framework comparar los cambios del proveedor de origen con los elementos de la réplica de destino y determinar así qué elementos se deben eliminar 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 elimina de la réplica de destino.
Detectar una actualización de un elemento eliminado
En este escenario, la réplica de origen está obsoleta con respecto a la réplica de destino. Esto ocurre cuando la réplica de origen no se ha sincronizado desde la última vez que la réplica de destino limpió sus marcadores de exclusión. Un problema se puede producir cuando un elemento se eliminó en la réplica de destino, posteriormente hizo que su marcador de exclusión se limpiara en la réplica de destino y ese mismo elemento se actualizó en la réplica de origen. El elemento aparece en el lote de cambios que el proveedor de origen envía al proveedor de destino. El proveedor de destino debe reconocer que este elemento no es nuevo; de lo contrario, el elemento se volverá a introducir incorrectamente en la réplica de destino.
Tenga en cuenta que la versión actual de un elemento de la réplica de origen no resulta útil para comparar con el conocimiento actual de la réplica de destino, porque la versión actual del elemento que se introduciría de nuevo no está contenida en el conocimiento actual de la réplica de destino. En cambio, la versión de creación del elemento de la réplica de origen se compara con el conocimiento actual de la réplica de destino para determinar si esta conocía previamente el elemento. Dado que la eliminación del elemento debe haber ocurrido después de su creación y el conocimiento actual de la réplica de destino contiene la eliminación, el conocimiento actual también debe contener la creación.
Por lo tanto, antes de agregar un elemento nuevo a una réplica de destino, Sync Framework compara la versión de creación del elemento con el conocimiento actual de la réplica de destino. Si el conocimiento de destino contiene la versión de creación del elemento, el elemento se conocía anteriormente pero se ha eliminado y olvidado. El elemento se trata como un conflicto de actualización-eliminación.
Vea también
Referencia
ISyncCallback::OnFullEnumerationNeeded
FullEnumerationNeeded