@fluidframework/container-runtime 0.57.2 → 0.58.1000
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/batchTracker.d.ts +26 -0
- package/dist/batchTracker.d.ts.map +1 -0
- package/dist/batchTracker.js +59 -0
- package/dist/batchTracker.js.map +1 -0
- package/dist/containerRuntime.d.ts +2 -1
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +63 -27
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.js +1 -1
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStores.js +1 -1
- package/dist/dataStores.js.map +1 -1
- package/dist/garbageCollection.d.ts +1 -0
- package/dist/garbageCollection.d.ts.map +1 -1
- package/dist/garbageCollection.js +6 -4
- package/dist/garbageCollection.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +1 -6
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/runningSummarizer.d.ts +1 -1
- package/dist/runningSummarizer.d.ts.map +1 -1
- package/dist/runningSummarizer.js +1 -1
- package/dist/runningSummarizer.js.map +1 -1
- package/dist/summarizer.d.ts +3 -4
- package/dist/summarizer.d.ts.map +1 -1
- package/dist/summarizer.js +8 -9
- package/dist/summarizer.js.map +1 -1
- package/dist/summaryGenerator.d.ts +1 -1
- package/dist/summaryGenerator.d.ts.map +1 -1
- package/dist/summaryGenerator.js +1 -1
- package/dist/summaryGenerator.js.map +1 -1
- package/dist/summaryManager.d.ts +2 -6
- package/dist/summaryManager.d.ts.map +1 -1
- package/dist/summaryManager.js +4 -10
- package/dist/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +26 -0
- package/lib/batchTracker.d.ts.map +1 -0
- package/lib/batchTracker.js +54 -0
- package/lib/batchTracker.js.map +1 -0
- package/lib/containerRuntime.d.ts +2 -1
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +63 -27
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.js +2 -2
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStores.js +1 -1
- package/lib/dataStores.js.map +1 -1
- package/lib/garbageCollection.d.ts +1 -0
- package/lib/garbageCollection.d.ts.map +1 -1
- package/lib/garbageCollection.js +4 -2
- package/lib/garbageCollection.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +1 -6
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/runningSummarizer.d.ts +1 -1
- package/lib/runningSummarizer.d.ts.map +1 -1
- package/lib/runningSummarizer.js +1 -1
- package/lib/runningSummarizer.js.map +1 -1
- package/lib/summarizer.d.ts +3 -4
- package/lib/summarizer.d.ts.map +1 -1
- package/lib/summarizer.js +8 -9
- package/lib/summarizer.js.map +1 -1
- package/lib/summaryGenerator.d.ts +1 -1
- package/lib/summaryGenerator.d.ts.map +1 -1
- package/lib/summaryGenerator.js +1 -1
- package/lib/summaryGenerator.js.map +1 -1
- package/lib/summaryManager.d.ts +2 -6
- package/lib/summaryManager.d.ts.map +1 -1
- package/lib/summaryManager.js +5 -11
- package/lib/summaryManager.js.map +1 -1
- package/package.json +15 -15
- package/src/batchTracker.ts +80 -0
- package/src/containerRuntime.ts +84 -31
- package/src/dataStoreContext.ts +2 -2
- package/src/dataStores.ts +1 -1
- package/src/garbageCollection.ts +11 -10
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +4 -8
- package/src/runningSummarizer.ts +3 -3
- package/src/summarizer.ts +8 -8
- package/src/summaryGenerator.ts +2 -2
- package/src/summaryManager.ts +5 -20
package/src/dataStores.ts
CHANGED
|
@@ -194,7 +194,7 @@ export class DataStores implements IDisposable {
|
|
|
194
194
|
if (this.alreadyProcessed(attachMessage.id)) {
|
|
195
195
|
// TODO: dataStoreId may require a different tag from PackageData #7488
|
|
196
196
|
const error = new DataCorruptionError(
|
|
197
|
-
"
|
|
197
|
+
"Duplicate DataStore created with existing id",
|
|
198
198
|
{
|
|
199
199
|
...extractSafePropertiesFromMessage(message),
|
|
200
200
|
dataStoreId: {
|
package/src/garbageCollection.ts
CHANGED
|
@@ -69,7 +69,7 @@ const writeAtRootKey = "Fluid.GarbageCollection.WriteDataAtRoot";
|
|
|
69
69
|
const runSessionExpiry = "Fluid.GarbageCollection.RunSessionExpiry";
|
|
70
70
|
|
|
71
71
|
const defaultDeleteTimeoutMs = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
72
|
-
const defaultSessionExpiryDurationMs = 30 * 24 * 60 * 60 * 1000; // 30 days
|
|
72
|
+
export const defaultSessionExpiryDurationMs = 30 * 24 * 60 * 60 * 1000; // 30 days
|
|
73
73
|
|
|
74
74
|
/** The statistics of the system state after a garbage collection run. */
|
|
75
75
|
export interface IGCStats {
|
|
@@ -545,17 +545,18 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
545
545
|
// used in the container.
|
|
546
546
|
if (this.shouldRunGC) {
|
|
547
547
|
this.initializeBaseStateP.catch((error) => {
|
|
548
|
-
|
|
549
|
-
error
|
|
548
|
+
const dpe = DataProcessingError.wrapIfUnrecognized(
|
|
549
|
+
error,
|
|
550
550
|
"FailedToInitializeGC",
|
|
551
|
-
{
|
|
552
|
-
gcEnabled: this.gcEnabled,
|
|
553
|
-
runSweep: this.shouldRunSweep,
|
|
554
|
-
writeAtRoot: this._writeDataAtRoot,
|
|
555
|
-
testMode: this.testMode,
|
|
556
|
-
sessionExpiry: this.sessionExpiryTimeoutMs,
|
|
557
|
-
},
|
|
558
551
|
);
|
|
552
|
+
dpe.addTelemetryProperties({
|
|
553
|
+
gcEnabled: this.gcEnabled,
|
|
554
|
+
runSweep: this.shouldRunSweep,
|
|
555
|
+
writeAtRoot: this._writeDataAtRoot,
|
|
556
|
+
testMode: this.testMode,
|
|
557
|
+
sessionExpiry: this.sessionExpiryTimeoutMs,
|
|
558
|
+
});
|
|
559
|
+
throw dpe;
|
|
559
560
|
});
|
|
560
561
|
}
|
|
561
562
|
}
|
package/src/packageVersion.ts
CHANGED
|
@@ -339,15 +339,11 @@ export class PendingStateManager implements IDisposable {
|
|
|
339
339
|
// The clientSequenceNumber of the incoming message must match that of the pending message.
|
|
340
340
|
if (pendingState.clientSequenceNumber !== message.clientSequenceNumber) {
|
|
341
341
|
// Close the container because this could indicate data corruption.
|
|
342
|
-
const error =
|
|
342
|
+
const error = DataProcessingError.create(
|
|
343
|
+
"pending local message clientSequenceNumber mismatch",
|
|
343
344
|
"unexpectedAckReceived",
|
|
344
|
-
|
|
345
|
-
{
|
|
346
|
-
clientId: message.clientId,
|
|
347
|
-
sequenceNumber: message.sequenceNumber,
|
|
348
|
-
clientSequenceNumber: message.clientSequenceNumber,
|
|
349
|
-
expectedClientSequenceNumber: pendingState.clientSequenceNumber,
|
|
350
|
-
},
|
|
345
|
+
message,
|
|
346
|
+
{ expectedClientSequenceNumber: pendingState.clientSequenceNumber },
|
|
351
347
|
);
|
|
352
348
|
|
|
353
349
|
this.containerRuntime.closeFn(error);
|
package/src/runningSummarizer.ts
CHANGED
|
@@ -51,7 +51,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
51
51
|
configuration: ISummaryConfiguration,
|
|
52
52
|
submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,
|
|
53
53
|
heuristicData: ISummarizeHeuristicData,
|
|
54
|
-
raiseSummarizingError: (
|
|
54
|
+
raiseSummarizingError: (errorMessage: string) => void,
|
|
55
55
|
summaryCollection: SummaryCollection,
|
|
56
56
|
cancellationToken: ISummaryCancellationToken,
|
|
57
57
|
stopSummarizerCallback: (reason: SummarizerStopReason) => void,
|
|
@@ -101,7 +101,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
101
101
|
private readonly configuration: ISummaryConfiguration,
|
|
102
102
|
private readonly submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,
|
|
103
103
|
private readonly heuristicData: ISummarizeHeuristicData,
|
|
104
|
-
private readonly raiseSummarizingError: (
|
|
104
|
+
private readonly raiseSummarizingError: (errorMessage: string) => void,
|
|
105
105
|
private readonly summaryCollection: SummaryCollection,
|
|
106
106
|
private readonly cancellationToken: ISummaryCancellationToken,
|
|
107
107
|
private readonly stopSummarizerCallback: (reason: SummarizerStopReason) => void,
|
|
@@ -131,7 +131,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
131
131
|
this.pendingAckTimer = new PromiseTimer(
|
|
132
132
|
maxAckWaitTime,
|
|
133
133
|
() => {
|
|
134
|
-
this.raiseSummarizingError("
|
|
134
|
+
this.raiseSummarizingError("Pending summary ack not received in time");
|
|
135
135
|
// Note: summarizeCount (from ChildLogger definition) may be 0,
|
|
136
136
|
// since this code path is hit when RunningSummarizer first starts up,
|
|
137
137
|
// before this instance has kicked off a new summarize run.
|
package/src/summarizer.ts
CHANGED
|
@@ -46,20 +46,19 @@ export class SummarizingWarning extends LoggingError implements ISummarizingWarn
|
|
|
46
46
|
|
|
47
47
|
constructor(
|
|
48
48
|
errorMessage: string,
|
|
49
|
-
readonly fluidErrorCode: string,
|
|
50
49
|
readonly logged: boolean = false,
|
|
51
50
|
) {
|
|
52
51
|
super(errorMessage);
|
|
53
52
|
}
|
|
54
53
|
|
|
55
|
-
static wrap(error: any,
|
|
56
|
-
const newErrorFn = (errMsg: string) => new SummarizingWarning(errMsg,
|
|
54
|
+
static wrap(error: any, logged: boolean = false, logger: ITelemetryLogger) {
|
|
55
|
+
const newErrorFn = (errMsg: string) => new SummarizingWarning(errMsg, logged);
|
|
57
56
|
return wrapErrorAndLog<SummarizingWarning>(error, newErrorFn, logger);
|
|
58
57
|
}
|
|
59
58
|
}
|
|
60
59
|
|
|
61
60
|
export const createSummarizingWarning =
|
|
62
|
-
(
|
|
61
|
+
(errorMessage: string, logged: boolean) => new SummarizingWarning(errorMessage, logged);
|
|
63
62
|
|
|
64
63
|
/**
|
|
65
64
|
* Summarizer is responsible for coordinating when to generate and send summaries.
|
|
@@ -144,7 +143,7 @@ export class Summarizer extends EventEmitter implements ISummarizer {
|
|
|
144
143
|
return await this.runCore(onBehalfOf, options);
|
|
145
144
|
} catch (error) {
|
|
146
145
|
this.stop("summarizerException");
|
|
147
|
-
throw SummarizingWarning.wrap(error,
|
|
146
|
+
throw SummarizingWarning.wrap(error, false /* logged */, this.logger);
|
|
148
147
|
} finally {
|
|
149
148
|
this.dispose();
|
|
150
149
|
this.runtime.closeFn();
|
|
@@ -257,9 +256,10 @@ export class Summarizer extends EventEmitter implements ISummarizer {
|
|
|
257
256
|
summaryTime: Date.now(),
|
|
258
257
|
} as const,
|
|
259
258
|
),
|
|
260
|
-
(
|
|
259
|
+
(errorMessage: string) => {
|
|
261
260
|
if (!this._disposed) {
|
|
262
|
-
this.
|
|
261
|
+
this.logger.sendErrorEvent({ eventName: "summarizingError" },
|
|
262
|
+
createSummarizingWarning(errorMessage, true));
|
|
263
263
|
}
|
|
264
264
|
},
|
|
265
265
|
this.summaryCollection,
|
|
@@ -356,7 +356,7 @@ export class Summarizer extends EventEmitter implements ISummarizer {
|
|
|
356
356
|
return builder.build();
|
|
357
357
|
}
|
|
358
358
|
catch (error) {
|
|
359
|
-
throw SummarizingWarning.wrap(error,
|
|
359
|
+
throw SummarizingWarning.wrap(error, false /* logged */, this.logger);
|
|
360
360
|
}
|
|
361
361
|
};
|
|
362
362
|
|
package/src/summaryGenerator.ts
CHANGED
|
@@ -152,7 +152,7 @@ export class SummaryGenerator {
|
|
|
152
152
|
private readonly pendingAckTimer: IPromiseTimer,
|
|
153
153
|
private readonly heuristicData: ISummarizeHeuristicData,
|
|
154
154
|
private readonly submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,
|
|
155
|
-
private readonly raiseSummarizingError: (
|
|
155
|
+
private readonly raiseSummarizingError: (errorMessage: string) => void,
|
|
156
156
|
private readonly successfulSummaryCallback: () => void,
|
|
157
157
|
private readonly summaryWatcher: Pick<IClientSummaryWatcher, "watchSummary">,
|
|
158
158
|
private readonly logger: ITelemetryLogger,
|
|
@@ -394,7 +394,7 @@ export class SummaryGenerator {
|
|
|
394
394
|
const message = summaryNack?.message;
|
|
395
395
|
const retryAfterSeconds = summaryNack?.retryAfter;
|
|
396
396
|
|
|
397
|
-
const error = new LoggingError(`summaryNack: ${message}`, { retryAfterSeconds });
|
|
397
|
+
const error = new LoggingError(`Received summaryNack: ${message}`, { retryAfterSeconds });
|
|
398
398
|
logger.sendErrorEvent(
|
|
399
399
|
{ eventName: "SummaryNack", ...summarizeTelemetryProps, retryAfterSeconds }, error);
|
|
400
400
|
|
package/src/summaryManager.ts
CHANGED
|
@@ -4,16 +4,14 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { IDisposable, IEvent, IEventProvider, ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
7
|
-
import {
|
|
7
|
+
import { assert } from "@fluidframework/common-utils";
|
|
8
8
|
import { ChildLogger, PerformanceEvent } from "@fluidframework/telemetry-utils";
|
|
9
9
|
import { DriverErrorType } from "@fluidframework/driver-definitions";
|
|
10
|
-
import { createSummarizingWarning } from "./summarizer";
|
|
11
10
|
import { ISummarizerClientElection } from "./summarizerClientElection";
|
|
12
11
|
import { IThrottler } from "./throttler";
|
|
13
12
|
import {
|
|
14
13
|
ISummarizer,
|
|
15
14
|
ISummarizerOptions,
|
|
16
|
-
ISummarizingWarning,
|
|
17
15
|
SummarizerStopReason,
|
|
18
16
|
} from "./summarizerTypes";
|
|
19
17
|
import { SummaryCollection } from "./summaryCollection";
|
|
@@ -60,10 +58,6 @@ export interface IConnectedState extends IEventProvider<IConnectedEvents> {
|
|
|
60
58
|
readonly clientId: string | undefined;
|
|
61
59
|
}
|
|
62
60
|
|
|
63
|
-
export interface ISummaryManagerEvents extends IEvent {
|
|
64
|
-
(event: "summarizerWarning", listener: (warning: ISummarizingWarning) => void);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
61
|
export interface ISummaryManagerConfig {
|
|
68
62
|
initialDelayMs: number;
|
|
69
63
|
opsToBypassInitialDelay: number;
|
|
@@ -74,7 +68,7 @@ export interface ISummaryManagerConfig {
|
|
|
74
68
|
* It observes changes in calculated summarizer and reacts to changes by either creating summarizer client or
|
|
75
69
|
* stopping existing summarizer client.
|
|
76
70
|
*/
|
|
77
|
-
export class SummaryManager
|
|
71
|
+
export class SummaryManager implements IDisposable {
|
|
78
72
|
private readonly logger: ITelemetryLogger;
|
|
79
73
|
private readonly opsToBypassInitialDelay: number;
|
|
80
74
|
private readonly initialDelayMs: number;
|
|
@@ -105,7 +99,6 @@ export class SummaryManager extends TypedEventEmitter<ISummaryManagerEvents> imp
|
|
|
105
99
|
}: Readonly<Partial<ISummaryManagerConfig>> = {},
|
|
106
100
|
private readonly summarizerOptions?: Readonly<Partial<ISummarizerOptions>>,
|
|
107
101
|
) {
|
|
108
|
-
super();
|
|
109
102
|
|
|
110
103
|
this.logger = ChildLogger.create(
|
|
111
104
|
parentLogger,
|
|
@@ -219,8 +212,6 @@ export class SummaryManager extends TypedEventEmitter<ISummaryManagerEvents> imp
|
|
|
219
212
|
assert(this.state === SummaryManagerState.Starting, 0x263 /* "Expected: starting" */);
|
|
220
213
|
this.state = SummaryManagerState.Running;
|
|
221
214
|
|
|
222
|
-
summarizer.on("summarizingError",
|
|
223
|
-
(warning: ISummarizingWarning) => this.emit("summarizerWarning", warning));
|
|
224
215
|
this.summarizer = summarizer;
|
|
225
216
|
|
|
226
217
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
@@ -238,8 +229,8 @@ export class SummaryManager extends TypedEventEmitter<ISummaryManagerEvents> imp
|
|
|
238
229
|
// we ignore blindly, so try to narrow signature we are looking for - skip logging
|
|
239
230
|
// error only if this client should no longer be a summarizer (which in practice
|
|
240
231
|
// means it also lost connection), and error happened on load (we do not have summarizer).
|
|
241
|
-
// We could
|
|
242
|
-
// but that does not seem to be necessary.
|
|
232
|
+
// We could annotate the error raised in Container.load where the container closed during load with no error
|
|
233
|
+
// and check for that case here, but that does not seem to be necessary.
|
|
243
234
|
if (this.getShouldSummarizeState().shouldSummarize || this.summarizer !== undefined) {
|
|
244
235
|
// Report any failure as an error unless it was due to cancellation (like "disconnected" error)
|
|
245
236
|
// If failure happened on container load, we may not yet realized that socket disconnected, so check
|
|
@@ -251,7 +242,6 @@ export class SummaryManager extends TypedEventEmitter<ISummaryManagerEvents> imp
|
|
|
251
242
|
category,
|
|
252
243
|
},
|
|
253
244
|
error);
|
|
254
|
-
this.emit("summarizerWarning", error);
|
|
255
245
|
|
|
256
246
|
// Note that summarizer may keep going (like doing last summary).
|
|
257
247
|
// Ideally we await stopping process, but this code path is due to a bug
|
|
@@ -296,12 +286,6 @@ export class SummaryManager extends TypedEventEmitter<ISummaryManagerEvents> imp
|
|
|
296
286
|
private async delayBeforeCreatingSummarizer(): Promise<boolean> {
|
|
297
287
|
// throttle creation of new summarizer containers to prevent spamming the server with websocket connections
|
|
298
288
|
let delayMs = this.startThrottler.getDelay();
|
|
299
|
-
if (delayMs > 0 && delayMs > this.startThrottler.maxDelayMs) {
|
|
300
|
-
this.emit(
|
|
301
|
-
"summarizerWarning",
|
|
302
|
-
createSummarizingWarning("summaryManagerCreateSummarizerMaxThrottleDelay", false),
|
|
303
|
-
);
|
|
304
|
-
}
|
|
305
289
|
|
|
306
290
|
// We have been elected the summarizer. Some day we may be able to summarize with a live document but for
|
|
307
291
|
// now we play it safe and launch a second copy.
|
|
@@ -309,6 +293,7 @@ export class SummaryManager extends TypedEventEmitter<ISummaryManagerEvents> imp
|
|
|
309
293
|
eventName: "CreatingSummarizer",
|
|
310
294
|
throttlerDelay: delayMs,
|
|
311
295
|
initialDelay: this.initialDelayMs,
|
|
296
|
+
startThrottlerMaxDelayMs: this.startThrottler.maxDelayMs,
|
|
312
297
|
opsSinceLastAck: this.summaryCollection.opsSinceLastAck,
|
|
313
298
|
opsToBypassInitialDelay: this.opsToBypassInitialDelay,
|
|
314
299
|
});
|