Moving elements in list CRDTs

Moving elements in list CRDTs

Slides from a talk at the 7th Workshop on Principles and Practice of Consistency for Distributed Data (PaPoC), 27 April 2020.
https://papoc-workshop.github.io/2020/
https://martin.kleppmann.com/2020/04/27/papoc-list-move.html

Abstract:

Conflict-free Replicated Data Types (CRDTs) for lists allow multiple users to concurrently insert and delete elements in a shared list object. However, existing algorithms behave poorly when users concurrently move list elements to a new position (i.e. reorder the elements in the list). We demonstrate the need for such a move operation, and describe an algorithm that extends a list CRDT with an explicit move operation. Our algorithm can be used in conjunction with any existing list CRDT algorithm. In addition to moving a single list element, we also discuss the open problem of moving ranges of elements.

0d4ef9af8e4f0cf5c162b48ba24faea6?s=128

Martin Kleppmann

April 24, 2020
Tweet

Transcript

  1. Moving elements in list CRDTs Martin Kleppmann University of Cambridge,

    UK mk428@cl.cam.ac.uk
  2. None
  3. None
  4. None
  5. None
  6. None
  7. None
  8. None
  9. None
  10. None
  11. List (sequence, array) CRDTs: WOOT, Treedoc, Logoot, RGA, Causal Trees,

    LSEQ, …
  12. List (sequence, array) CRDTs: WOOT, Treedoc, Logoot, RGA, Causal Trees,

    LSEQ, … Emulating “move” as “delete-and-reinsert”: concurrent moves of the same item à duplication
  13. Concurrent move of the same item to different positions —

    what should happen?
  14. Converge to one of the destination positions (pick one arbitrarily

    but deterministically)
  15. “pick one arbitrarily” = last-writer wins register! posphone joe :=

    “head of the list” merge posphone joe == “head of the list” posphone joe := “after buy milk”
  16. List CRDT with move operation posphone joe := “after buy

    milk” need one register per list item state = AWSet({ (v1 , LWWRegister(p1 )), (v2 , LWWRegister(p2 )), … }) need a stable way of referencing list positions Treedoc: path through binary tree Logoot: list of (integer, replicaID) pairs RGA: s4vector Causal Trees: logical timestamp etc… Composition of any list CRDT + AWSet + LWWRegister = another CRDT
  17. Moving ranges of elements

  18. Moving ranges of elements

  19. Desired outcome

  20. Actual outcome Fixing this: an open problem!

  21. Thanks! Martin Kleppmann University of Cambridge, UK mk428@cl.cam.ac.uk