Skip to content

Commit de226b2

Browse files
Add Event to MergeTree and Sequence on Local Segment Op Ack (#5045) (#5054)
Emit a new maintenance event, ACKNOWLEDGED when the op is round tripped from the server and the local segment is ack
1 parent ff7f9e6 commit de226b2

File tree

5 files changed

+30
-6
lines changed

5 files changed

+30
-6
lines changed

packages/dds/merge-tree/src/mergeTree.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,7 +1300,8 @@ export class MergeTree {
13001300
this.mergeTreeMaintenanceCallback({
13011301
operation: MergeTreeMaintenanceType.UNLINK,
13021302
deltaSegments: [{ segment }],
1303-
});
1303+
},
1304+
undefined);
13041305
}
13051306

13061307
segment.parent = undefined;
@@ -1325,7 +1326,8 @@ export class MergeTree {
13251326
this.mergeTreeMaintenanceCallback({
13261327
operation: MergeTreeMaintenanceType.APPEND,
13271328
deltaSegments: [{ segment: prevSegment! }, { segment }],
1328-
});
1329+
},
1330+
undefined);
13291331
}
13301332
segment.parent = undefined;
13311333
segment.trackingCollection.trackingGroups.forEach((tg) => tg.unlink(segment));
@@ -1881,6 +1883,8 @@ export class MergeTree {
18811883
if (verboseOps) {
18821884
console.log(`segment group has ${pendingSegmentGroup.segments.length} segments`);
18831885
}
1886+
1887+
const deltaSegments: IMergeTreeSegmentDelta[] = [];
18841888
pendingSegmentGroup.segments.map((pendingSegment) => {
18851889
overwrite = !pendingSegment.ack(pendingSegmentGroup, opArgs, this) || overwrite;
18861890
if (MergeTree.options.zamboniSegments) {
@@ -1889,7 +1893,19 @@ export class MergeTree {
18891893
if (!nodesToUpdate.includes(pendingSegment.parent!)) {
18901894
nodesToUpdate.push(pendingSegment.parent!);
18911895
}
1896+
deltaSegments.push({
1897+
segment:pendingSegment,
1898+
});
18921899
});
1900+
if(this.mergeTreeMaintenanceCallback) {
1901+
this.mergeTreeMaintenanceCallback(
1902+
{
1903+
deltaSegments,
1904+
operation: MergeTreeMaintenanceType.ACKNOWLEDGED,
1905+
},
1906+
opArgs,
1907+
);
1908+
}
18931909
const clientId = this.collabWindow.clientId;
18941910
for (const node of nodesToUpdate) {
18951911
this.blockUpdatePathLengths(node, seq, clientId, overwrite);
@@ -2227,7 +2243,8 @@ export class MergeTree {
22272243
this.mergeTreeMaintenanceCallback({
22282244
operation: MergeTreeMaintenanceType.SPLIT,
22292245
deltaSegments: [{ segment }, { segment: next }],
2230-
});
2246+
},
2247+
undefined);
22312248
}
22322249

22332250
return { next };

packages/dds/merge-tree/src/mergeTreeDeltaCallback.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ export const enum MergeTreeMaintenanceType {
2525
* b) The segment's tracking collection is empty (e.g., not being tracked for undo/redo).
2626
*/
2727
UNLINK = -3,
28+
/**
29+
* Notification that a local change has been acknowledged by the server.
30+
* This means that it has made the round trip to the server and has had a sequence number assigned.
31+
*/
32+
ACKNOWLEDGED = -4,
2833
}
2934

3035
export type MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationType | MergeTreeMaintenanceType;
@@ -70,4 +75,4 @@ export type MergeTreeDeltaCallback =
7075
export interface IMergeTreeMaintenanceCallbackArgs extends IMergeTreeDeltaCallbackArgs<MergeTreeMaintenanceType> { }
7176

7277
export type MergeTreeMaintenanceCallback =
73-
(MaintenanceArgs: IMergeTreeMaintenanceCallbackArgs) => void;
78+
(MaintenanceArgs: IMergeTreeMaintenanceCallbackArgs, opArgs: IMergeTreeDeltaOpArgs | undefined) => void;

packages/dds/merge-tree/src/test/mergeTree.markRangeRemoved.deltaCallback.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ describe("MergeTree", () => {
8888
[MergeTreeDeltaType.REMOVE]: 1,
8989
[MergeTreeMaintenanceType.SPLIT]: 2,
9090
[MergeTreeMaintenanceType.UNLINK]: 1,
91+
[MergeTreeMaintenanceType.ACKNOWLEDGED]: 1,
9192
});
9293
});
9394

packages/dds/sequence/src/sequence.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ export abstract class SharedSegmentSequence<T extends MergeTree.ISegment>
144144
break;
145145
case "maintenance":
146146
if (!this.client.mergeTreeMaintenanceCallback) {
147-
this.client.mergeTreeMaintenanceCallback = (args) => {
148-
this.emit("maintenance", new SequenceMaintenanceEvent(args, this.client), this);
147+
this.client.mergeTreeMaintenanceCallback = (args, opArgs) => {
148+
this.emit("maintenance", new SequenceMaintenanceEvent(opArgs, args, this.client), this);
149149
};
150150
}
151151
break;

packages/dds/sequence/src/sequenceDeltaEvent.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ export class SequenceDeltaEvent extends SequenceEvent<MergeTreeDeltaOperationTyp
126126
*/
127127
export class SequenceMaintenanceEvent extends SequenceEvent<MergeTreeMaintenanceType> {
128128
constructor(
129+
public readonly opArgs: IMergeTreeDeltaOpArgs | undefined,
129130
deltaArgs: IMergeTreeMaintenanceCallbackArgs,
130131
mergeTreeClient: Client,
131132
) {

0 commit comments

Comments
 (0)