Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This page is based on 'Conflict detection and resolution - research'.

Introduction

Conflict scenarios:

  • Update-update
    Occurs when the same object was updated at more than one node.
  • Update-delete
    Occurs if a row was updated at one node, but the same row was deleted at another node.
  • Delete-delete
    Occurs when a row was deleted from more than one node.

...

Conflict Detection

We need a new table in a database of each instance to store hashcodeshash codes of objects pulled from this instance's Parent.

...

  1. At first, when we pull an object from Parent to Child instance (where it does not exist yet):
    1. calculate hashcodehash code of an object pulled from Parent,
    2. look for an object on Child instance with UUID of pulled object,
    3. such object on Child instance does not exist, so object is created on Child instance,
    4. object's hashcodehash code is saved in Child's database as the latest version of this object on Parent instance,
    5. there is NO conflict.
  2. Object is NOT modified on Parent instance.
  3. When we pull the same object from Parent the second time (this object already exist on Child instance):
    1. calculate hashcodehash code of an object pulled from Parent,
    2. look for an object on Child instance with UUID of pulled object,
    3. such object on Child instance exists, so compare calculated hashcodehash code with a hashcodehash code that is saved in Child's database,
    4. they are equal, which means that object on Child instance is up to date with corresponding object on Parent instance,
    5. there is NO conflict.
  4. Object is modified both on Parent and/or Child instance.
  5. When we pull the same object from Parent the third time (this object already exist on Child instance):
    1. calculate hashcodehash code of an object pulled from Parent,
    2. look for an object on Child instance with UUID of pulled object,
    3. such object on Child instance exists, so compare calculated hashcodehash code with a hashcodehash code that is saved in Child's database,
    4. they are NOT equal, which means that object on Child instance is NOT up to date with corresponding object on Parent instance
    5. there is a conflict, which is resolved using rule RULE 1

...

  1. At first, when we push an object from Child to Parent instance (where it does not exist yet):
    1. In SyncPushServiceImpl class during execution of readAndPushObjectToParent method we call shouldPushObject method, where we pull corresponding object from Parent instance,
    2. this object does not exist on Parent instance yet, shouldPushObject returns true,
    3. object is pushed to Parent,
    4. object's hashcodehash code is saved in Child's database as the latest version of this object on Parent instance.
  2. Object is modified on Child instance.
  3. When we push this object from Child to Parent instance (where it already exists):
    1. In SyncPushServiceImpl class during execution of readAndPushObjectToParent method we call shouldPushObject method, where we pull corresponding object from Parent instance,
    2. this object already exists on Parent instance,
    3. calculate hashcodehash code of an object pulled from Parent,
    4. compare calculated hashcodehash code with a hashcodehash code that is saved in Child's database,
    5. they are equal, which means that Child modified the latest version of object on Parent instance,
    6. object is pushed to Parent,
    7. object's hashcodehash code is updated in Child's database as the last version of this object.
  4. Object is modified both on Parent and/or Child instance.
  5. When we push this object from Child to Parent instance (where it already exists):
    1. In SyncPushServiceImpl class during execution of readAndPushObjectToParent method we call shouldPushObject method, where we pull corresponding object from Parent instance,
    2. this object already exists on Parent instance,
    3. calculate hashcodehash code of an object pulled from Parent,
    4. compare calculated hashcodehash code with a hashcodehash code that is saved in Child's database,
    5. they are NOT equal, which means that object on Child instance is NOT up to date with corresponding object on Parent instance (someone modified this object on Parent instance),
    6. there is a conflict, which is resolved using rule RULE 2.

...

Conflict Resolution

PULL:

  • RULE 1

    If hashcodehash code of an object on Parent instance is NOT equal to hashcodehash code of an object on Child instance* it means that there is a new version of this object on Parent → 

    • if object on Child instance was NOT modified (calculated hashcodehash code of modified object is equal to hashcodehash code saved on Child's instance*) →
      • void current object's fields on Child instance,
      • save fields of object from Parent instance to Child.

    • if object on Child instance was modified (calculated hashcodehash code of modified object is NOT equal to hashcodehash code saved on Child's instance*) → 
      • these two objects have to be merged**, then
      • saved on Child and Parent instance;
      • hashcodeshash codes on both Child and Parent instance have to be updated.


* REMEMBER: This is a hashcodehash code of an object that was calculated and saved on the last pull of this object from Parent. This hashcodehash code is stored in a seperate separate table than pulled object.

** See Merge

PUSH:

  • RULE 2

    If hashcodehash code of an object on Parent instance is NOT equal to hashcodehash code of an object on Child instance* it means that the object was updated on Parent instance after the last pull to Child (we are pushing modifications of outdated version of object) → 

    • if object on Child instance was NOT modified (calculated hashcodehash code of modified object is equal to hashcodehash code saved on Child's instance*) → PUSH operation of this object will not take place

    • if object on Child instance was modified (calculated hashcodehash code of modified object is NOT equal to hashcodehash code saved on Child's instance*) → 
      • these two objects have to be merged**, then
      • saved on Child and Parent instance;
      • hashcodes on both Child and Parent instance have to be updated.

...

* REMEMBER: This is a hashcode of an object that was calculated and saved on the last pull of this object from Parent. This hashcodehash code is stored in a seperate separate table than pulled object.

...

UI for merging will use openmrs_class field to determine what class are child_object and parent_object.
Fields of determined class will be displayed as textboxes text-boxes or buttons for each of two objects.
User will be able to choose which value he wants to keep.

...