По сути, все, что я делаю, - это агрегирование данных, а затем преобразование их в массив. Этот процесс работает около 2000-4000 раз, пока не произойдет зависание, которое невозможно восстановить. Вот мой фрагмент кода:
try {
res = await db.collection("palStats").aggregate([...],
{ maxTimeMS: 5000, allowDiskUse: true }
);
debug("#### AGG COMPLETE");
} catch (error) {
debug("AGGREGATION error=============>", error, res);
}
try {
res = await Timeout.wrap(res.toArray(), 10000, "toArray time out");
} catch (error) {
debug("toArray error =================>", error, res);
}
Array.isArray(res)
? null
: debug("response toArray fail ===============>", res);
res = Array.isArray(res) ? res : null;
if (res != null) {
debug("####toArray worked###");
res.forEach(i => (i["modeType"] = i.mode[0]));
debug("###for each passed###");
}
return res;
Нет сообщений об ошибках, вызов просто зависает до истечения времени ожидания (3600 секунд). По истечении времени ожидания Mongo не может быть восстановлен, и новые подключения не могут быть открыты.
Сначала я думал, что это агрегация, но я сузил его до зависания при вызове toArray ().
В настоящее время я использую Mongo 4.0.9, но я попробовал почти все другие версии 4 без удачи.
Я поместил курсор в область сбоя агрегации и сравнил его с проходящим курсором, но я не могу найти никакой разницы, которая была бы существенной.
Различия в курсоре агрегации:
У проходящего курсора есть init: false и session: null?
Сбой:
21:00: session: ClientSession {
21:00: _events: [Object: null prototype],
21:00: _eventsCount: 1,
21:00: _maxListeners: undefined,
21:00: topology: [Server],
21:00: sessionPool: [ServerSessionPool],
21:00: hasEnded: false,
21:00: serverSession: [ServerSession],
21:00: clientOptions: undefined,
21:00: supports: [Object],
21:00: clusterTime: null,
21:00: operationTime: null,
21:00: explicit: false,
21:00: owner: [Circular],
21:00: defaultTransactionOptions: {},
21:00: transaction: [Transaction]
21:00: }
21:00: },
21:00: init: true,