Skip to content

Commit

Permalink
Add Event to MergeTree and Sequence on Local Segment Op Ack (#5045) (#…
Browse files Browse the repository at this point in the history
…5054)

Emit a new maintenance event, ACKNOWLEDGED when the op is round tripped from the server and the local segment is ack
  • Loading branch information
anthony-murphy committed Feb 5, 2021
1 parent ff7f9e6 commit de226b2
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 6 deletions.
23 changes: 20 additions & 3 deletions packages/dds/merge-tree/src/mergeTree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1300,7 +1300,8 @@ export class MergeTree {
this.mergeTreeMaintenanceCallback({
operation: MergeTreeMaintenanceType.UNLINK,
deltaSegments: [{ segment }],
});
},
undefined);
}

segment.parent = undefined;
Expand All @@ -1325,7 +1326,8 @@ export class MergeTree {
this.mergeTreeMaintenanceCallback({
operation: MergeTreeMaintenanceType.APPEND,
deltaSegments: [{ segment: prevSegment! }, { segment }],
});
},
undefined);
}
segment.parent = undefined;
segment.trackingCollection.trackingGroups.forEach((tg) => tg.unlink(segment));
Expand Down Expand Up @@ -1881,6 +1883,8 @@ export class MergeTree {
if (verboseOps) {
console.log(`segment group has ${pendingSegmentGroup.segments.length} segments`);
}

const deltaSegments: IMergeTreeSegmentDelta[] = [];
pendingSegmentGroup.segments.map((pendingSegment) => {
overwrite = !pendingSegment.ack(pendingSegmentGroup, opArgs, this) || overwrite;
if (MergeTree.options.zamboniSegments) {
Expand All @@ -1889,7 +1893,19 @@ export class MergeTree {
if (!nodesToUpdate.includes(pendingSegment.parent!)) {
nodesToUpdate.push(pendingSegment.parent!);
}
deltaSegments.push({
segment:pendingSegment,
});
});
if(this.mergeTreeMaintenanceCallback) {
this.mergeTreeMaintenanceCallback(
{
deltaSegments,
operation: MergeTreeMaintenanceType.ACKNOWLEDGED,
},
opArgs,
);
}
const clientId = this.collabWindow.clientId;
for (const node of nodesToUpdate) {
this.blockUpdatePathLengths(node, seq, clientId, overwrite);
Expand Down Expand Up @@ -2227,7 +2243,8 @@ export class MergeTree {
this.mergeTreeMaintenanceCallback({
operation: MergeTreeMaintenanceType.SPLIT,
deltaSegments: [{ segment }, { segment: next }],
});
},
undefined);
}

return { next };
Expand Down
7 changes: 6 additions & 1 deletion packages/dds/merge-tree/src/mergeTreeDeltaCallback.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ export const enum MergeTreeMaintenanceType {
* b) The segment's tracking collection is empty (e.g., not being tracked for undo/redo).
*/
UNLINK = -3,
/**
* Notification that a local change has been acknowledged by the server.
* This means that it has made the round trip to the server and has had a sequence number assigned.
*/
ACKNOWLEDGED = -4,
}

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

export type MergeTreeMaintenanceCallback =
(MaintenanceArgs: IMergeTreeMaintenanceCallbackArgs) => void;
(MaintenanceArgs: IMergeTreeMaintenanceCallbackArgs, opArgs: IMergeTreeDeltaOpArgs | undefined) => void;
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ describe("MergeTree", () => {
[MergeTreeDeltaType.REMOVE]: 1,
[MergeTreeMaintenanceType.SPLIT]: 2,
[MergeTreeMaintenanceType.UNLINK]: 1,
[MergeTreeMaintenanceType.ACKNOWLEDGED]: 1,
});
});

Expand Down
4 changes: 2 additions & 2 deletions packages/dds/sequence/src/sequence.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,8 @@ export abstract class SharedSegmentSequence<T extends MergeTree.ISegment>
break;
case "maintenance":
if (!this.client.mergeTreeMaintenanceCallback) {
this.client.mergeTreeMaintenanceCallback = (args) => {
this.emit("maintenance", new SequenceMaintenanceEvent(args, this.client), this);
this.client.mergeTreeMaintenanceCallback = (args, opArgs) => {
this.emit("maintenance", new SequenceMaintenanceEvent(opArgs, args, this.client), this);
};
}
break;
Expand Down
1 change: 1 addition & 0 deletions packages/dds/sequence/src/sequenceDeltaEvent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ export class SequenceDeltaEvent extends SequenceEvent<MergeTreeDeltaOperationTyp
*/
export class SequenceMaintenanceEvent extends SequenceEvent<MergeTreeMaintenanceType> {
constructor(
public readonly opArgs: IMergeTreeDeltaOpArgs | undefined,
deltaArgs: IMergeTreeMaintenanceCallbackArgs,
mergeTreeClient: Client,
) {
Expand Down

0 comments on commit de226b2

Please sign in to comment.