Troubleshooting

Working with data management and synchronization can be challenging at times. We have listed a set of challenges and their potential solutions to help you troubleshoot some of the most challenging issues you can encounter.

Note

This document is subject to improvements as we are continuously identifying new issues and trying to provide adequate solutions.

Common issues with data synchronization

  1. Insert or update of an entity throws an exception due to the target system not being idempotent.

  2. Deletes fails due to dependencies on the object you want to delete.

  3. Deletes fails due to the object already being deleted in the target system.

  4. Wrong order of inserts, an object has dependencies that must exist in the target system before an insert can occur, such as a parent object.

  5. Batch inserts and updates, when they fail it is difficult to locate which entities causes the batch to fail.

  6. Reading data from a SQL database or other systems that supports incremental updates without configuring partial rescans can lead to entities not being read from the source system.

  7. Data that contains erroneous values.

  8. Data that is in the wrong form.

  9. Microservices causing errors due to:

    1. Memory issues.

    2. Unstable or unrobust code.

    3. Lacking good exception handling.

  10. Configured dead letter datasets, but no monitoring or handling of them.

  11. Duplicates in the target source.

  12. Pipes that are stuck and unresponsive.

  13. Expired certificates on the server.

Solutions

Common solutions to some of the operation issues above are:

  1. The result / status / feedback from the target system for both inserts, updates and deletes should be stored in a dataset in Sesam. Need to separate entity and system failures.

  2. Partial rescans on all connect pipes that reads data using incremental update.

  3. Data in dead letter datasets should be collected and sent to a monitoring system or other error handling systems.

  4. Data being sent from Sesam should be validated.

  5. Error messages from deletes that fails due to the object already being deleted should be ignored.

  6. Insert pipes should have safeguards against sending duplicates to the target system.

Common issues with data management

  1. Dependency tracking limit failure. Difficult to debug. Join on blank properties. Equality set has too high cardinality.

  2. Exceptions when using http transforms, might ignore some errors.

  3. Cascading issues, like a pipe waits for another pipe to be ready, which has failed.

  4. Unforeseen merges yield wrong data and unwanted load on both Sesam and connected systems.

  5. Merged entities in globals has wrong status, entities should be unmerged, versions should be deleted, etc.

  6. Systems that automatically changes data that is written to it, causing a loop if the data is part of a bidirectional sync.

  7. Using ‘first’ to return an unique entity from the result of a hops, might not be deterministic.

  8. Wrong result out of globals for entities used in a feedback loop.

  9. Wrong generation of unique identifiers for a target system, might cause unexpected updates and deletes.

  10. An object produces the same child as another object.

  11. Use of ‘create’ in pipes without rescan creates orphaned children.

Solutions

Common solutions to some of the operation issues above are:

  1. Construct the equality sets in hops by using tuples, not all the ‘eq’-statements becomes indexes.

  2. Decrease the chance of high cardinality in a hops by joining on more than on property, for example not only join on email, but on email and gender for instance.

  3. Include rescans on all pipes still prone to dependency tracking limit failures.

  4. Monitor pipes that has been unresponsive or unable to process over a given period.

  5. Add circuit breakers to preparation pipes.

  6. If the result of a feedback loop in a global is wrong, verify that the documented feedback pattern has been used.

  7. Be ware of the difference between ‘in’ and ‘eq’ in DTL.

  8. Set ‘set_initial_offset:onload’ on pipes that contains hops to themselves.