Skip to content

Commit 2ed854e

Browse files
committed
fix(ecs): don't seed lastSentData from incoming CRDT updates
1 parent 2cfa673 commit 2ed854e

3 files changed

Lines changed: 13 additions & 6 deletions

File tree

packages/@dcl/ecs/src/engine/lww-element-set-component-definition.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,10 @@ export function createUpdateLwwFromCrdt(
171171
if (msg.type === CrdtMessageType.PUT_COMPONENT || msg.type === CrdtMessageType.PUT_COMPONENT_NETWORK) {
172172
const buf = new ReadWriteByteBuffer(msg.data!)
173173
data.set(entity, schema.deserialize(buf))
174-
lastSentData.set(entity, new Uint8Array(msg.data!))
174+
// do NOT seed lastSentData from an INCOMING message!!!!
175+
// seeding it from received bytes makes the engine
176+
// believe it already sent this state, which kills valid re-broadcasting 🧨
177+
lastSentData.delete(entity)
175178
} else {
176179
data.delete(entity)
177180
lastSentData.delete(entity)

test/ecs/crdt-unchanged-mutable.spec.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { Engine, Entity } from '../../packages/@dcl/ecs/src/engine'
22
import { Schemas } from '../../packages/@dcl/ecs/src/schemas'
3-
import { CrdtMessageType, PutComponentMessageBody, DeleteComponentMessageBody } from '../../packages/@dcl/ecs/src/serialization/crdt/types'
3+
import {
4+
CrdtMessageType,
5+
PutComponentMessageBody,
6+
DeleteComponentMessageBody
7+
} from '../../packages/@dcl/ecs/src/serialization/crdt/types'
48
import { ReadWriteByteBuffer } from '../../packages/@dcl/ecs/src/serialization/ByteBuffer'
59

610
const PositionSchema = {
@@ -146,7 +150,7 @@ describe('CRDT message suppression for unchanged mutables', () => {
146150
expect((changeMessages[0] as PutComponentMessageBody).timestamp).toBe(2)
147151
})
148152

149-
it('should update snapshot after receiving remote CRDT update', () => {
153+
it('should re-emit local state after receiving a remote CRDT update', () => {
150154
const engine = Engine()
151155
const entity = engine.addEntity()
152156
const Position = engine.defineComponent('position-test-7', PositionSchema)
@@ -167,10 +171,10 @@ describe('CRDT message suppression for unchanged mutables', () => {
167171
timestamp: 10
168172
})
169173

170-
// getMutable without change after remote update
171174
Position.getMutable(entity)
172175
const messages = Array.from(Position.getCrdtUpdates())
173-
expect(messages).toHaveLength(0)
176+
expect(messages).toHaveLength(1)
177+
expect(messages[0].type).toBe(CrdtMessageType.PUT_COMPONENT)
174178
})
175179

176180
it('should correctly handle multiple getMutable calls per tick', () => {

test/ecs/customComponent.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ describe('test CRDT flow E2E', () => {
278278
componentId: int8A.componentId,
279279
entityId: entityA,
280280
type: CrdtMessageType.DELETE_COMPONENT,
281-
timestamp: 6
281+
timestamp: 7
282282
},
283283
{
284284
direction: 'a->b',

0 commit comments

Comments
 (0)