O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Real-time, Fine-grained Version Control with CRDTs

99 visualizações

Publicada em

Video and slides synchronized, mp3 and slide download available at URL https://bit.ly/2xOvwbR.

Nathan Sobo covers the foundations of CRDTs, then explores how Github is using them in Eon to synchronize and persist changes to a repository at the granularity of individual keystrokes. Filmed at qconnewyork.com.

Nathan Sobo is a founding member of the Atom Editor team at GitHub.

Publicada em: Tecnologia
  • Seja o primeiro a comentar

Real-time, Fine-grained Version Control with CRDTs

  1. 1. Real-time, Fine-grained Version Control with CRDTs @nathansobo
  2. 2. InfoQ.com: News & Community Site • 750,000 unique visitors/month • Published in 4 languages (English, Chinese, Japanese and Brazilian Portuguese) • Post content from our QCon conferences • News 15-20 / week • Articles 3-4 / week • Presentations (videos) 12-15 / week • Interviews 2-3 / week • Books 1 / month Watch the video with slide synchronization on InfoQ.com! https://www.infoq.com/presentations/ github-crdt
  3. 3. Presented at QCon New York www.qconnewyork.com Purpose of QCon - to empower software development by facilitating the spread of knowledge and innovation Strategy - practitioner-driven conference designed for YOU: influencers of change and innovation in your teams - speakers and topics driving the evolution and innovation - connecting and catalyzing the influencers and innovators Highlights - attended by more than 12,000 delegates since 2007 - held in 9 cities worldwide
  4. 4. Teletype Real-time collaborative editing package for Atom
  5. 5. Eon Real-time Distributed Version Control
  6. 6. Text Editor Eon File System Buffers Continuous Persistence History
  7. 7. Remote Eon Text EditorText Editor Eon File System Buffers File System Buffers Real-Time Synchronization
  8. 8. Text Editor Eon File System Buffers Stream Edits to the Cloud
  9. 9. CRDTs Conflict-Free Replicated Data Types
  10. 10. Gambettola Italy ~30 ms at the speed of light Boulder Colorado
  11. 11. a b c a b c
  12. 12. a b c a b c insert(x, 1) a x b c insert(y, 2) a b y c
  13. 13. a b c a b c insert(x, 1) a x b c insert(y, 2) a b y c insert(x, 1) a x b y c
  14. 14. a b c a b c insert(x, 1) a x b c insert(y, 2) a b y c insert(x, 1) a x b y c insert(y, 2) a x y b c
  15. 15. a b c a b c insert(x, 1) a x b c insert(y, 2) a b y c insert(x, 1) a x b y c insert(y, 3) a x b y c ✨ ✨ ✨ "✨✨ ✨ # Operational Transformation
  16. 16. Concurrent operations are commutative All replicas converge to the same state
  17. 17. All replicas converge to the same state Q
  18. 18. A CRDT for Text
  19. 19. Unique Identifiers site id . sequence number
  20. 20. site id . sequence number 1.0 1.1 1.2 2.0 2.1 3.0 3.1
  21. 21. “ABC” 2.5 1.2 @ 6 Insertions
  22. 22. “ABC” 2.5 1.2 @ 6 Content
  23. 23. “ABC” 2.5 1.2 @ 6 Content Unique Id
  24. 24. “ABC” 2.5 1.2 @ 6 Content Unique Id Location
  25. 25. “ABC” 2.5 1.2 @ 6 Content Unique Id Location Parent insertion id
  26. 26. “ABC” 2.5 1.2 @ 6 Content Unique Id Location Parent insertion id Offset within parent insertion
  27. 27. 1.0 Site 1 ABC ABC 0.0 @ 0 1.0 Site 2 ABC ABC 0.0 @ 0
  28. 28. 1.0 Site 1 ABGHIC ABC 0.0 @ 0 GHI 1.0 @ 2 1.1 1.0 Site 2 ABC ABC 0.0 @ 0
  29. 29. 1.0 Site 1 ABGHIC ABC 0.0 @ 0 GHI 1.0 @ 2 1.1 1.0 Site 2 ADEFBC ABC 0.0 @ 0 DEF 1.0 @ 1 2.0
  30. 30. 1.0 Site 1 ADEFBGHIC ABC 0.0 @ 0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 2 1.1 1.0 Site 2 ADEFBGHIC ABC 0.0 @ 0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 2 1.1
  31. 31. 1.0 Site 1 ADEFBGHIC ABC 0.0 @ 0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 2 1.1 1.0 Site 2 ADJKLEFBGHIC ABC 0.0 @ 0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 2 1.1 JKL 2.0 @ 1 3.0
  32. 32. 1.0 Site 1 ADEFBGHICMNO ABC 0.0 @ 0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 2 1.1 MNO 1.1 @ 3 id: 2.1 1.0 Site 2 ADJKLEFBGHIC ABC 0.0 @ 0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 2 1.1 JKL 2.0 @ 1 3.0
  33. 33. 1.0 Site 1 ADJKLEFBGHICMNO ABC 0.0 @ 0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 2 1.1 JKL 2.0 @ 1 3.0 MNO 1.1 @ 3 id: 2.1 1.0 Site 2 ADJKLEFBGHIC ABC 0.0 @ 0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 2 1.1 JKL 2.0 @ 1 3.0
  34. 34. 1.0 Site 1 ADJKLEFBGHICMNO ABC 0.0 @ 0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 2 1.1 JKL 2.0 @ 1 3.0 MNO 1.1 @ 3 id: 2.1 1.0 Site 2 ADJKLEFBGHICMNO ABC 0.0 @ 0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 2 1.1 JKL 2.0 @ 1 3.0 MNO 1.1 @ 3 id: 2.1
  35. 35. 1.0 ABC 0.0 @ 0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 2 1.1 JKL 2.0 @ 1 3.0 MNO 1.1 @ 3 id: 2.1 1.0 @ 0 B 2.0 @ 0 1.0 @ 1 JKL 1.1 @ 0 A EF 1.0 @ 2 GHI 1.0 @ 2 C 1.1 @ 0 MNOD 3.0 @ 0 Fragment Sequence:
  36. 36. Dealing With Ties
  37. 37. ABC ABC 0.0 @ 0 1.0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 1 1.1 JKL 1.0 @ 1 3.0
  38. 38. ABC ABC 0.0 @ 0 1.0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 1 1.1 JKL 1.0 @ 1 3.0
  39. 39. AGHIBC ABC 0.0 @ 0 1.0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 1 1.1 JKL 1.0 @ 1 3.0
  40. 40. AGHIDEFBC ABC 0.0 @ 0 1.0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 1 1.1 JKL 1.0 @ 1 3.0
  41. 41. AGHIDEFJKLBC ABC 0.0 @ 0 1.0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 1 1.1 JKL 1.0 @ 1 3.0
  42. 42. AGHIDEFBC ADEFBC ADEFBC ABC 0.0 @ 0 1.0 DEF 1.0 @ 1 2.0 GHI 3.0
  43. 43. AGHIDEFBC ADEFBC ADEFBC ABC 0.0 @ 0 1.0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 1 3.0
  44. 44. AGHIDEFBC ADEFBC ADEFGHIBC ABC 0.0 @ 0 1.0 DEF 1.0 @ 1 2.0 GHI 1.0 @ 1 3.0
  45. 45. AGHIDEFBC ADEFBC AGHIDEFBC ABC 0.0 @ 0 1.0 DEF 1.0 @ 1 2.0 GHI 2.0 @ 0 3.0
  46. 46. Lamport Timestamps
  47. 47. A → B A happens before B →
  48. 48. if: A → B then: C(A) < C(B) →
  49. 49. Sending: clock += 1; let timestamp = clock; send(message, clock); Receiving: let (message, timestamp) = receive(); clock = max(clock, timestamp) + 1;
  50. 50. AGHIDEFBC ADEFBC ADEFBC ABC 0.0 @ 0 1.0 DEF 1.0 @ 1 2.0 2 1 Lamport TimestampsGHI 1.0 @ 1 3.0
  51. 51. AGHIDEFBC ADEFBC AGHIDEFBC ABC 0.0 @ 0 1.0 DEF 1.0 @ 1 2.0 2 1 Lamport TimestampsGHI 1.0 @ 1 3.0
  52. 52. Deletions
  53. 53. 1.0 @ 0 HI 2.0 @ 0 2.0 @ 4 DEFG 1.1 @ 0 A 1.0 @ 1 JKL BC 3.0 @ 0 MNO
  54. 54. 1.0 @ 0 HI 2.0 @ 0 2.0 @ 4 DEFG 1.1 @ 0 A 1.0 @ 1 JKL BC 3.0 @ 0 MNO
  55. 55. 1.0 @ 0 HI 2.0 @ 0 2.0 @ 4 DEFG 1.1 @ 0 A 1.0 @ 1 JKL BC 3.0 @ 0 MNO 2.0 @ 1 1.0 @ 2 start end
  56. 56. 1.0 @ 0 HI 2.0 @ 0 2.0 @ 4 DEFG 1.1 @ 0 A 1.0 @ 1 JKL BC 3.0 @ 0 MNOPQRS 1.2 @ 0 2.0 @ 1 1.0 @ 2 endstart
  57. 57. 1.0 @ 0 HI 2.0 @ 0 2.0 @ 4 DEFG 1.1 @ 0 A 1.0 @ 1 JKL BC 3.0 @ 0 MNO max sequence numbers in range { 1: 1, 2: 0, 3: 0 }
  58. 58. 1.0 @ 0 HI 2.0 @ 0 2.0 @ 4 DEFG 1.1 @ 0 A 1.0 @ 1 JKL BC 3.0 @ 0 MNOPQRS 1.2 @ 0 max sequence numbers in range { 1: 1, 2: 0, 3: 0 }
  59. 59. 1.0 @ 0 HI 2.0 @ 0 2.0 @ 4 EFG 1.1 @ 0 A JKL 3.0 @ 0 MNO 1.0 @ 1 B 1.0 @ 2 CD 2.0 @ 1 PQRS 1.2 @ 0 ☠ ☠ ☠ ☠ ☠ Deleted fragments are “tombstoned” 2.1 2.1 2.1 2.1 2.1
  60. 60. Undo and Redo
  61. 61. Undo Count: 2Fragment Deletion Deletion Undo Count: 2Undo Count: 1
  62. 62. Undo Count: 2Fragment Deletion Deletion Undo Count: 2Undo Count: 1
  63. 63. Undo Count: 2Fragment Deletion Deletion Undo Count: 2Undo Count: 1
  64. 64. Undo Count: 2Fragment Deletion Deletion Undo Count: 2Undo Count: 1
  65. 65. Undo Count: 2Fragment Deletion Deletion Undo Count: 2Undo Count: 1
  66. 66. Efficiently Locating Fragments
  67. 67. 1.0 @ 0 EF 1.1 @ 0 AB JKL 3.0 @ 0 MNO 2.0 @ 5 I 1.0 @ 2 C 2.0 @ 1 PQRS 1.2 @ 0 Insert “X” at 12 D 2.0 @ 0 2 0 2 3 4 2 3 0 1 GH 2.0 @ 3
  68. 68. 1.0 @ 0 EF 1.1 @ 0 AB JKL 3.0 @ 0 MNO 2.0 @ 5 I 1.0 @ 2 C 2.0 @ 1 PQRS 1.2 @ 0 Insert “X” at 12 D 2.0 @ 0 2 0 2 3 4 2 3 0 1 0 GH 2.0 @ 3
  69. 69. 1.0 @ 0 EF 1.1 @ 0 AB JKL 3.0 @ 0 MNO 2.0 @ 5 I 1.0 @ 2 C 2.0 @ 1 PQRS 1.2 @ 0 Insert “X” at 12 D 2.0 @ 0 2 0 2 3 4 2 3 0 1 2 GH 2.0 @ 3
  70. 70. 1.0 @ 0 EF 1.1 @ 0 AB JKL 3.0 @ 0 MNO 2.0 @ 5 I 1.0 @ 2 C 2.0 @ 1 PQRS 1.2 @ 0 Insert “X” at 12 D 2.0 @ 0 2 0 2 3 4 2 3 0 1 2 GH 2.0 @ 3
  71. 71. 1.0 @ 0 EF 1.1 @ 0 AB JKL 3.0 @ 0 MNO 2.0 @ 5 I 1.0 @ 2 C 2.0 @ 1 PQRS 1.2 @ 0 Insert “X” at 12 D 2.0 @ 0 2 0 2 3 4 2 3 0 1 4 GH 2.0 @ 3
  72. 72. 1.0 @ 0 EF 1.1 @ 0 AB JKL 3.0 @ 0 MNO 2.0 @ 5 I 1.0 @ 2 C 2.0 @ 1 PQRS 1.2 @ 0 Insert “X” at 12 D 2.0 @ 0 2 0 2 3 4 2 3 0 1 7 GH 2.0 @ 3
  73. 73. 1.0 @ 0 EF 1.1 @ 0 AB JKL 3.0 @ 0 MNO 2.0 @ 5 I 1.0 @ 2 C 2.0 @ 1 PQRS 1.2 @ 0 Insert “X” at 12 D 2.0 @ 0 2 0 2 3 4 2 3 0 1 11 GH 2.0 @ 3
  74. 74. 1.0 @ 0 EF 1.1 @ 0 AB JKL 3.0 @ 0 MNO 2.0 @ 5 I 1.0 @ 2 C 2.0 @ 1 PQRS 1.2 @ 0 Local: Insert “X” at 12 Remote: Insert “X” at 2.0 @ 4 D 2.0 @ 0 2 0 2 3 4 3 0 1 11 2 GH 2.0 @ 3
  75. 75. Insert “X” at 12 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 1 0 2 GH 2.0 @ 3 44 9 17
  76. 76. Insert “X” at 12 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 170
  77. 77. Insert “X” at 12 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 174
  78. 78. Insert “X” at 12 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 13 Insert “X” at 12 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 4
  79. 79. Insert “X” at 12 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 7
  80. 80. Insert “X” at 12 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 11
  81. 81. Insert “X” at 2.0 @ 4 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 11
  82. 82. 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 ? ? ? ? ? ? ? ?? ? [8, 3] ? ? Insert “X” at 2.0 @ 4Insert “X” at 2.0 @ 4 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17
  83. 83. 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 ? ? ? ? ? ? ? ?? ? ? ? ? Insert “X” at 2.0 @ 4
  84. 84. Fragment Identifiers Totally-Ordered
  85. 85. Fragment Identifiers Dense Totally-Ordered
  86. 86. Integers? 1 < 2 ✔ 1 < ? < 2 ✗
  87. 87. Floats? 1.1 < 1.2 ✔ 10-308 < ? < 2 × 10-308 ✗
  88. 88. Strings A < B ✔ A < AB < B ✔
  89. 89. 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 [1] [1,2] [2] [5] [8] [9] [11] [15][8,3] [2] [8,3] [15] [15] Insert “X” at 2.0 @ 4
  90. 90. DEFGHI 2.0 @ 0
  91. 91. DEFGH 2.0 @ 0 2.0 @ 5 I DEFGHI 2.0 @ 0
  92. 92. D 2.0 @ 0 EFGH 2.0 @ 1 2.0 @ 5 I DEFGH 2.0 @ 0 2.0 @ 5 I DEFGHI 2.0 @ 0
  93. 93. D 2.0 @ 0 EF 2.0 @ 1 2.0 @ 5 IGH 2.0 @ 3 D 2.0 @ 0 EFGH 2.0 @ 1 2.0 @ 5 I DEFGH 2.0 @ 0 2.0 @ 5 I DEFGHI 2.0 @ 0
  94. 94. Insertion Split Tree 1.0 @ 0 1.0 @ 2 1.1 @ 0 1.2 @ 0 2.0 @ 0 2.0 @ 1 3.0 @ 0 1.1 @ 0 2.0 @ 1 3.0 @ 0 3.0 @ 0 [1] [2] [9] [8] [1, 2] [2] [5][11] 2.0 @ 5 2.0 @ 3 [8, 3]
  95. 95. Insert “X” at 2.0 @ 4 1.0 @ 0 1.0 @ 2 1.1 @ 0 1.2 @ 0 2.0 @ 0 2.0 @ 1 3.0 @ 0 1.1 @ 0 2.0 @ 1 3.0 @ 0 3.0 @ 0 [1] [2] [9] [8] [1, 2] [2] [5][11] 2.0 @ 5 2.0 @ 3 [8, 3]
  96. 96. Insert “X” at 2.0 @ 4 1.0 @ 0 1.0 @ 2 1.1 @ 0 1.2 @ 0 2.0 @ 0 2.0 @ 1 3.0 @ 0 1.1 @ 0 2.0 @ 1 3.0 @ 0 3.0 @ 0 [1] [2] [9] [8] [1, 2] [2] [5][11] 2.0 @ 5 2.0 @ 3 [8, 3]
  97. 97. Insert “X” at 2.0 @ 4 1.0 @ 0 1.0 @ 2 1.1 @ 0 1.2 @ 0 2.0 @ 0 2.0 @ 1 3.0 @ 0 1.1 @ 0 2.0 @ 1 3.0 @ 0 3.0 @ 0 [1] [2] [9] [8] [1, 2] [2] [5][11] 2.0 @ 5 2.0 @ 3 [8, 3]
  98. 98. Insert “X” at 2.0 @ 4 1.0 @ 0 1.0 @ 2 1.1 @ 0 1.2 @ 0 2.0 @ 0 2.0 @ 1 3.0 @ 0 1.1 @ 0 2.0 @ 1 3.0 @ 0 3.0 @ 0 [1] [2] [9] [8] [1, 2] [2] [5][11] 2.0 @ 5 2.0 @ 3 [8, 3]
  99. 99. Insert “X” at [8, 3] @ 1 1.0 @ 0 1.0 @ 2 1.1 @ 0 1.2 @ 0 2.0 @ 0 2.0 @ 1 3.0 @ 0 1.1 @ 0 2.0 @ 1 3.0 @ 0 3.0 @ 0 [1] [2] [9] [8] [1, 2] [2] [5][11] 2.0 @ 5 2.0 @ 3 [8, 3]
  100. 100. 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 [1] [1,2] [2] [5] [8] [9] [11] [15][8,3] [2] [8,3] [15] [15] Insert “X” at [8, 3] @ 1
  101. 101. 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 [1] [1,2] [2] [5] [8] [9] [11] [15][8,3] [2] [8,3] [15] [15] Insert “X” at [8, 3] @ 1
  102. 102. 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 [1] [1,2] [2] [5] [8] [9] [11] [15][8,3] [2] [8,3] [15] [15] Insert “X” at [8, 3] @ 1
  103. 103. 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 [1] [1,2] [2] [5] [8] [9] [11] [15][8,3] [2] [8,3] [15] [15] Insert “X” at [8, 3] @ 1
  104. 104. 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 [1] [1,2] [2] [5] [8] [9] [11] [15][8,3] [2] [8,3] [15] [15] Insert “X” at [8, 3] @ 1
  105. 105. 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 [1] [1,2] [2] [5] [8] [9] [11] [15][8,3] [2] [8,3] [15] [15] Insert “X” at [8, 3] @ 1
  106. 106. 1.0 @ 0 AB 2 D 2.0 @ 0 0 EF 2.0 @ 1 2 JKL 3.0 @ 0 3 PQRS 1.2 @ 0 4 1.1 @ 0 MNO 3 2.0 @ 5 I 0 1.0 @ 2 C 12 GH 2.0 @ 3 44 9 17 [1] [1,2] [2] [5] [8] [9] [11] [15][8,3] [2] [8,3] [15] [15] Insert “X” at [8, 3] @ 1
  107. 107. Insert “X” at 2.0 @ 4 1.0 @ 0 AB 2 D 2.0 @ 0 0 E F 2.0 @ 1 2 J K L 3.0 @ 0 3 P Q R S 1.2 @ 0 4 1.1 @ 0 M N O 3 2.0 @ 5 I 0 1.0 @ 2 C 12 G H 2.0 @ 3 44 9 17
  108. 108. Insert “X” at 2.0 @ 4 1.0 @ 0 AB 2 D 2.0 @ 0 0 E F 2.0 @ 1 2 J K L 3.0 @ 0 3 P Q R S 1.2 @ 0 4 1.1 @ 0 M N O 3 2.0 @ 5 I 0 1.0 @ 2 C 12 G H 2.0 @ 3 44 9 17 18 1 G 2.0 @ 3 1 H 2.0 @ 4 1 X 3.1 @ 0 10
  109. 109. Foreground Thread Background Thread Buffer (v1)
  110. 110. Foreground Thread Background Thread Buffer (v1) Snapshot (v1)
  111. 111. Foreground Thread Background Thread Buffer (v1) Snapshot (v1) Long-Running Analysis…
  112. 112. Foreground Thread Background Thread Buffer (v1) Snapshot (v1) Long-Running Analysis…Changes Buffer (v50)
  113. 113. Foreground Thread Background Thread Buffer (v1) Snapshot (v1) Long-Running Analysis… Anchors Changes Buffer (v50)
  114. 114. Foreground Thread Background Thread Buffer (v1) Snapshot (v1) Long-Running Analysis… Anchors Changes Buffer (v50)
  115. 115. Foreground Thread Background Thread Buffer (v1) Snapshot (v1) Changes Operations Changes Buffer (v50)
  116. 116. enum Tree<T: Item> { Resident(Arc<Node<T >>), NonResident(NodeId), }
  117. 117. Modeling the File System
  118. 118. Timeline 1.5 Site 1
  119. 119. Timeline 1.5 Timeline 1.5 Site 1 Site 2
  120. 120. Timeline 1.5 Timeline 1.5 Site 1 Site 2 Timeline 2.21
  121. 121. Timeline 1.5 Timeline 1.5 Site 1 Site 2 Timeline 2.21
  122. 122. Timeline 1.5 Timeline 1.5 Site 1 Site 2 Timeline 2.21
  123. 123. Timeline 1.5 Timeline 1.5 Site 1 Site 2 Timeline 2.21
  124. 124. https://github.com/atom/eon
  125. 125. Watch the video with slide synchronization on InfoQ.com! https://www.infoq.com/presentations/ github-crdt

×