Ошибка диапазона узла MongoDB: превышен максимальный размер стека вызовов

#javascript #node.js #mongodb #recursion #stack

Вопрос:

Я выполняю bulk upsert задание с помощью an orderedBulkOperation .

Это для очень большого списка документов. Он нормально работал в облаке около года.

Однако за последние пару недель я получил RangeError: Maximum call stack size exceeded .

Похоже, размер стека вызовов узла был превышен.

  /var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/utils.js:691
 throw error;
 RangeError: Maximum call stack size exceeded
 at ServerSessionPool.acquire (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/sessions.js:623:12)
 at ClientSession.get serverSession [as serverSession] (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/sessions.js:113:47)
 at /var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/sessions.js:148:19
 at maybePromise (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/utils.js:685:3)
 at ClientSession.endSession (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/sessions.js:130:12)
 at Cursor._endSession (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/cursor.js:392:15)
 at done (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/cursor.js:448:16)
 at /var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/cursor.js:536:11
 at /var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/utils.js:688:9
 at /var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/operations/execute_operation.js:82:7
 at maybePromise (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/utils.js:685:3)
 at executeOperation (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/operations/execute_operation.js:34:10)
 at Cursor._initializeCursor (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/cursor.js:534:7)
 at Cursor._initializeCursor (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/cursor.js:186:11)
 at Object.callback (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/cursor.js:439:14)
 at processWaitQueue (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/sdam/topology.js:1049:21)
 at NativeTopology.selectServer (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/sdam/topology.js:449:5)
 at executeWithServerSelection (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/operations/execute_operation.js:131:12)
 at /var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/operations/execute_operation.js:70:9
 at maybePromise (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/utils.js:685:3)
 at executeOperation (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/operations/execute_operation.js:34:10)
 at Cursor._initializeCursor (/var/app/current/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/cursor.js:534:7)
 

это полная трассировка стека. Последние пару раз был очень похожий след. Похоже, размер стека превышен из-за рекурсивного вызова и отсутствия базы рекурсии.

Я не могу воспроизвести эту проблему локально, и трудно понять, что именно нарушает это.

Есть какие-нибудь идеи? Спасибо

Комментарии:

1. Похоже, у вас правильный диагноз. Я не знаю, как эти инструменты используют рекурсию, но мне кажется, что в этом есть что-то не так. Я бы не ожидал, что массовое обновление будет глубоко рекурсивным. Если вы не можете просто разделить обновление на более мелкие фрагменты, то, вероятно, вам придется пройти через этот стек вызовов, чтобы увидеть, что происходит.

2. мм…жесткий bc я не могу воспроизвести, и, похоже, это происходит только на Prod (даже не на сцене). Ничего не найдено в журналах Mongo (имеет смысл, если это клиент, который выходит из строя). Мой драйвер node mongo обновился с 3.1.1 до 3.9. Однако в списках изменений есть много изменений. Возможно, стоит просто заменить устаревшее remove на delete и посмотреть, как это решит проблему. Быстрее, чем рефакторинг всего процесса и применение фрагментации

3. Спорадические проблемы-это самое худшее. Я бы определенно внес изменения, предложенные в списках изменений. Или, если у вас есть A/B-среды, попробуйте откатить их до более ранней версии и, если это вообще возможно, зеркально отразите вызовы, чтобы они выполняли одни и те же входные данные. Но довольно часто это просто невозможно, и опять же, это сложная работа с кодом. К сожалению, у меня нет новостей получше.

4. Цените отзывы и идеи. Теперь я вижу, что обновления Mongo выбирают значение useUnifiedTopology true. Некоторые краткие исследования по этому варианту дают множество терминов, похожих на приведенную выше трассировку стека. Но — я не хочу просто выставлять это ложным и надеяться на лучшее, ха-ха