@resolveio/server-lib 22.2.23 → 22.2.25
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.
|
@@ -52,6 +52,7 @@ export declare class SubscriptionManager {
|
|
|
52
52
|
private _fullResyncPromise;
|
|
53
53
|
private readonly RESUME_TOKEN_COLLECTION;
|
|
54
54
|
private readonly RESUME_TOKEN_SAVE_INTERVAL_MS;
|
|
55
|
+
private readonly RESUME_TOKEN_AUTO_HEAL_RETRY_THRESHOLD;
|
|
55
56
|
private latencyBuffer;
|
|
56
57
|
private _latencyFlushInProgress;
|
|
57
58
|
private _latencyFlushPending;
|
|
@@ -164,6 +164,7 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
164
164
|
this._fullResyncPromise = null;
|
|
165
165
|
this.RESUME_TOKEN_COLLECTION = 'subscription-manager-resume-tokens';
|
|
166
166
|
this.RESUME_TOKEN_SAVE_INTERVAL_MS = 5000;
|
|
167
|
+
this.RESUME_TOKEN_AUTO_HEAL_RETRY_THRESHOLD = 2;
|
|
167
168
|
// Buffer to store throttled latency updates with timestamps
|
|
168
169
|
this.latencyBuffer = new Map();
|
|
169
170
|
this._latencyFlushInProgress = false;
|
|
@@ -1984,7 +1985,7 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
1984
1985
|
// Watch (tail) Mongo's operation log on the entire database (all insert/modify/delete will trigger this function)
|
|
1985
1986
|
SubscriptionManager.prototype.tailOpLog = function (resumeToken) {
|
|
1986
1987
|
return __awaiter(this, void 0, void 0, function () {
|
|
1987
|
-
var watchDatabases, pipeline, lastResumeToken_1,
|
|
1988
|
+
var watchDatabases, pipeline, lastResumeToken_1, startedWithResumeToken_1, sawChangeEvent_1, resumeTokenInvalidated_1, streamStartedAtMs_1, error_8, innerError_1, error_9;
|
|
1988
1989
|
var _this = this;
|
|
1989
1990
|
return __generator(this, function (_a) {
|
|
1990
1991
|
switch (_a.label) {
|
|
@@ -2035,14 +2036,17 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
2035
2036
|
},
|
|
2036
2037
|
},
|
|
2037
2038
|
];
|
|
2038
|
-
|
|
2039
|
+
startedWithResumeToken_1 = false;
|
|
2040
|
+
sawChangeEvent_1 = false;
|
|
2041
|
+
resumeTokenInvalidated_1 = false;
|
|
2042
|
+
streamStartedAtMs_1 = Date.now();
|
|
2039
2043
|
if (!resumeToken) return [3 /*break*/, 20];
|
|
2040
2044
|
lastResumeToken_1 = resumeToken;
|
|
2041
2045
|
_a.label = 4;
|
|
2042
2046
|
case 4:
|
|
2043
2047
|
_a.trys.push([4, 5, , 19]);
|
|
2044
2048
|
this._oplog$ = resolveio_server_app_1.ResolveIOServer.getMongoConnection().watch(pipeline, { resumeAfter: resumeToken, fullDocument: 'updateLookup' });
|
|
2045
|
-
|
|
2049
|
+
startedWithResumeToken_1 = true;
|
|
2046
2050
|
return [3 /*break*/, 19];
|
|
2047
2051
|
case 5:
|
|
2048
2052
|
error_8 = _a.sent();
|
|
@@ -2079,7 +2083,7 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
2079
2083
|
case 14:
|
|
2080
2084
|
_a.trys.push([14, 15, , 18]);
|
|
2081
2085
|
this._oplog$ = resolveio_server_app_1.ResolveIOServer.getMongoConnection().watch(pipeline, { fullDocument: 'updateLookup' });
|
|
2082
|
-
|
|
2086
|
+
startedWithResumeToken_1 = false;
|
|
2083
2087
|
return [3 /*break*/, 18];
|
|
2084
2088
|
case 15:
|
|
2085
2089
|
innerError_1 = _a.sent();
|
|
@@ -2112,12 +2116,14 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
2112
2116
|
return [2 /*return*/];
|
|
2113
2117
|
case 25: throw error_9;
|
|
2114
2118
|
case 26:
|
|
2115
|
-
console.log(new Date(), 'oplog started',
|
|
2119
|
+
console.log(new Date(), 'oplog started', startedWithResumeToken_1 ? '(resumeAfter)' : '');
|
|
2116
2120
|
this._oplog$.on('change', function (doc) { return __awaiter(_this, void 0, void 0, function () {
|
|
2117
2121
|
var collection, fullDocument, docId, flag, dependencyFlag;
|
|
2118
2122
|
return __generator(this, function (_a) {
|
|
2119
2123
|
switch (_a.label) {
|
|
2120
2124
|
case 0:
|
|
2125
|
+
sawChangeEvent_1 = true;
|
|
2126
|
+
this._oplogRetryCount = 0;
|
|
2121
2127
|
if (!doc.ns) return [3 /*break*/, 14];
|
|
2122
2128
|
if (this._enableDebug) {
|
|
2123
2129
|
console.log(new Date(), 'Oplog Hit', doc.ns);
|
|
@@ -2221,6 +2227,7 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
2221
2227
|
return [2 /*return*/];
|
|
2222
2228
|
case 5:
|
|
2223
2229
|
if (!this.isResumeTokenInvalid(error)) return [3 /*break*/, 7];
|
|
2230
|
+
resumeTokenInvalidated_1 = true;
|
|
2224
2231
|
return [4 /*yield*/, this.clearResumeToken()];
|
|
2225
2232
|
case 6:
|
|
2226
2233
|
_a.sent();
|
|
@@ -2247,15 +2254,34 @@ var SubscriptionManager = /** @class */ (function () {
|
|
|
2247
2254
|
});
|
|
2248
2255
|
}); });
|
|
2249
2256
|
this._oplog$.on('close', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
2257
|
+
var retryThresholdReached, shouldAutoHealResumeToken;
|
|
2250
2258
|
return __generator(this, function (_a) {
|
|
2251
2259
|
switch (_a.label) {
|
|
2252
2260
|
case 0:
|
|
2253
2261
|
console.log(new Date(), 'oplog close');
|
|
2254
|
-
this.
|
|
2262
|
+
retryThresholdReached = this._oplogRetryCount >= this.RESUME_TOKEN_AUTO_HEAL_RETRY_THRESHOLD;
|
|
2263
|
+
shouldAutoHealResumeToken = startedWithResumeToken_1
|
|
2264
|
+
&& !!lastResumeToken_1
|
|
2265
|
+
&& !sawChangeEvent_1
|
|
2266
|
+
&& (resumeTokenInvalidated_1 || retryThresholdReached);
|
|
2267
|
+
if (!shouldAutoHealResumeToken) return [3 /*break*/, 2];
|
|
2268
|
+
return [4 /*yield*/, this.clearResumeToken()];
|
|
2269
|
+
case 1:
|
|
2270
|
+
_a.sent();
|
|
2271
|
+
lastResumeToken_1 = null;
|
|
2272
|
+
if (!resumeTokenInvalidated_1) {
|
|
2273
|
+
this.queueFullResync('oplog-resume-token-auto-heal');
|
|
2274
|
+
}
|
|
2275
|
+
console.log(new Date(), 'Sub Manager', 'Auto-healed stale oplog resume token', { retryCount: this._oplogRetryCount, streamLifetimeMs: Date.now() - streamStartedAtMs_1 });
|
|
2276
|
+
_a.label = 2;
|
|
2277
|
+
case 2:
|
|
2278
|
+
if (lastResumeToken_1) {
|
|
2279
|
+
this.queueResumeTokenSave(lastResumeToken_1, { force: true });
|
|
2280
|
+
}
|
|
2255
2281
|
this._oplog$.removeAllListeners();
|
|
2256
2282
|
this._oplog$ = null;
|
|
2257
2283
|
return [4 /*yield*/, this.tailOpLog(lastResumeToken_1)];
|
|
2258
|
-
case
|
|
2284
|
+
case 3:
|
|
2259
2285
|
_a.sent();
|
|
2260
2286
|
return [2 /*return*/];
|
|
2261
2287
|
}
|