Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Event to MergeTree and Sequence on Local Segment Op Ack #5045

Merged
merged 8 commits into from
Feb 4, 2021
48 changes: 18 additions & 30 deletions lerna-package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

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