Skip to content

Instantly share code, notes, and snippets.

@jimpick
Created November 1, 2018 02:00
Show Gist options
  • Save jimpick/57b0f1898d223b5e41620f0f0cf94a51 to your computer and use it in GitHub Desktop.
Save jimpick/57b0f1898d223b5e41620f0f0cf94a51 to your computer and use it in GitHub Desktop.
join problems - using ormap to store maddrs in peer-star-app membership CRDT
const CRDT = require('delta-crdts')
const ORMap = CRDT('ormap')
const membersPinner = ORMap('peer-zbe')
membersPinner.applySub('zbe', 'mvreg', 'write', [ 'maddr/zbe' ])
console.log('pinner 1', membersPinner.value())
console.log('pinner 1 state()', membersPinner.state())
console.log('pinner 1 state().state.get("zbe")', membersPinner.state().state.get('zbe'))
console.log()
const membersFirefox = ORMap('peer-in5')
membersFirefox.applySub('zbe', 'mvreg', 'write', [ 'maddr/zbe' ])
membersFirefox.applySub('kst', 'mvreg', 'write', [ 'maddr/kst' ])
membersFirefox.applySub('in5', 'mvreg', 'write', [ 'maddr/in5' ])
console.log('firefox 1', membersFirefox.value())
console.log('firefox 1 state()', membersFirefox.state())
console.log('firefox 1 state().state.get("zbe")', membersFirefox.state().state.get('zbe'))
console.log('firefox 1 state().state.get("kst")', membersFirefox.state().state.get('kst'))
console.log('firefox 1 state().state.get("in5")', membersFirefox.state().state.get('in5'))
console.log('\nJoin Firefox -> Pinner\n')
membersPinner.apply(membersFirefox.state())
console.log('pinner 2', membersPinner.value())
console.log('pinner 2 state()', membersPinner.state())
console.log('pinner 2 state().state.get("zbe")', membersPinner.state().state.get('zbe'))
console.log('pinner 2 state().state.get("kst")', membersPinner.state().state.get('kst'))
console.log('pinner 2 state().state.get("in5")', membersPinner.state().state.get('in5'))
console.log('')
console.log('pinner 2 value().zbe', membersPinner.value().zbe)
console.log('pinner 2 [...value().zbe]', [...membersPinner.value().zbe])
console.log('pinner 2 [...value().zbe][0] === [...value().zbe][1]',
[...membersPinner.value().zbe][0] ===
[...membersPinner.value().zbe][1]
)
pinner 1 { zbe: Set { [ 'maddr/zbe' ] } }
pinner 1 state() DotMap {
cc:
CausalContext { cc: Map { 'peer-zbe' => 1 }, dc: CustomSet { _refs: Map {} } },
state:
Map { 'zbe' => DotSet { ds: [Map], cc: null, type: 'mvreg' } },
type: undefined }
pinner 1 state().state.get("zbe") DotSet {
ds: Map { '["peer-zbe",1]' => [ 'maddr/zbe' ] },
cc: null,
type: 'mvreg' }
firefox 1 { zbe: Set { [ 'maddr/zbe' ] },
kst: Set { [ 'maddr/kst' ] },
in5: Set { [ 'maddr/in5' ] } }
firefox 1 state() DotMap {
cc:
CausalContext { cc: Map { 'peer-in5' => 3 }, dc: CustomSet { _refs: Map {} } },
state:
Map {
'zbe' => DotSet { ds: [Map], cc: null, type: 'mvreg' },
'kst' => DotSet { ds: [Map], cc: null, type: 'mvreg' },
'in5' => DotSet { ds: [Map], cc: null, type: 'mvreg' } },
type: undefined }
firefox 1 state().state.get("zbe") DotSet {
ds: Map { '["peer-in5",1]' => [ 'maddr/zbe' ] },
cc: null,
type: 'mvreg' }
firefox 1 state().state.get("kst") DotSet {
ds: Map { '["peer-in5",2]' => [ 'maddr/kst' ] },
cc: null,
type: 'mvreg' }
firefox 1 state().state.get("in5") DotSet {
ds: Map { '["peer-in5",3]' => [ 'maddr/in5' ] },
cc: null,
type: 'mvreg' }
Join Firefox -> Pinner
pinner 2 { zbe: Set { [ 'maddr/zbe' ], [ 'maddr/zbe' ] },
kst: Set { [ 'maddr/kst' ] },
in5: Set { [ 'maddr/in5' ] } }
pinner 2 state() DotMap {
cc:
CausalContext {
cc: Map { 'peer-zbe' => 1, 'peer-in5' => 3 },
dc: CustomSet { _refs: Map {} } },
state:
Map {
'zbe' => DotSet { ds: [Map], cc: null, type: 'mvreg' },
'kst' => DotSet { ds: [Map], cc: null, type: 'mvreg' },
'in5' => DotSet { ds: [Map], cc: null, type: 'mvreg' } },
type: undefined }
pinner 2 state().state.get("zbe") DotSet {
ds:
Map {
'["peer-zbe",1]' => [ 'maddr/zbe' ],
'["peer-in5",1]' => [ 'maddr/zbe' ] },
cc: null,
type: 'mvreg' }
pinner 2 state().state.get("kst") DotSet {
ds: Map { '["peer-in5",2]' => [ 'maddr/kst' ] },
cc: null,
type: 'mvreg' }
pinner 2 state().state.get("in5") DotSet {
ds: Map { '["peer-in5",3]' => [ 'maddr/in5' ] },
cc: null,
type: 'mvreg' }
pinner 2 value().zbe Set { [ 'maddr/zbe' ], [ 'maddr/zbe' ] }
pinner 2 [...value().zbe] [ [ 'maddr/zbe' ], [ 'maddr/zbe' ] ]
pinner 2 [...value().zbe][0] === [...value().zbe][1] false
@jimpick
Copy link
Author

jimpick commented Nov 1, 2018

I observed a problem with the membership CRDT in peer-star-app...

In this example, when joining the membership CRDT (received over gossip) from Firefox to the Pinner, the Set for the 'zbe' peer has duplicate values. Because arrays are objects, they aren't equal, so Set keeps two versions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment