Драйвер Mongodb Java: убить запущенную аггегацию - PullRequest
2 голосов
/ 16 июня 2020

Я пытаюсь программно остановить операцию агрегирования сегментированного кластера. Операция запускается из драйвера Java mon go,

Я нашел способ убить его, это бросить команду killSessions с идентификатором сеанса.

Что я делаю правильно получить идентификатор сеанса:

MongoClient mongoClient = ....
mongoClient.startSession()

//call the aggregation stuff..

Этот поток продолжает работать, и из другого потока я использую объект mongoClient, чтобы получить сеанс сервера и убить его:

BsonDocument serverSession = clientSession.getServerSession().getIdentifier();
BsonBinary value = serverSession.get("id").asBinary();

Затем я оберните value внутри одноэлементной коллекции документа [{ id: value}] и вызовите $killsessions с этим параметром. Я запускаю его поверх mon go admin db.

Результат возвращает мне { ok: 1.0 }, но поток с операцией продолжает работать и правильно завершается на сервере Результат агрегации записан в новую коллекцию на этапе $out, поэтому кажется, что это не влияет на сеанс сервера.

Как я могу программно убить все операции, выполняемые в агрегации? (как на стороне клиента, так и на стороне сервера).

Ответы [ 3 ]

1 голос
/ 16 июня 2020

Так как он мне нужен для уничтожения длительных процессов, я решил использовать следующую команду для однозначной идентификации сеанса, который нужно убить.

db.adminCommand({"currentOp": true, "secs_running": {$gte: 100}})

получить идентификатор из результата (суммирование inprog содержит только Выполняется 1 операция, так как операции не выполняются более 100 секунд,

{ "inprog": [{ "lsid": {here_is_the_session_id}, otherFields...}, otherInProgOps...], otherFields....}

, а затем передать поле lsid (которое содержит id и uid) to killSessions:

b.adminCommand( { killSessions: [ {here_goes_lsid} ] } )

Для более уверенного метода получения sessionId можно проверить другие поля массива inprog

1 голос
/ 16 июня 2020

После того, как вы запустите конвейер, он будет запущен в процессе вашего Mon go. sessions - это способ гарантировать согласованность операций чтения / записи. не способ убить запущенные запросы.

Вы хотите использовать killOp , получите идентификатор операции, используя currentOp .

0 голосов
/ 16 июня 2020

killSessions работает в моем тестировании: обычный поиск , агрегация .

Убедитесь, что вы убиваете сеанс, который используется в операции, убедитесь, что операция выполняется когда вы завершаете сеанс (вы можете завершить сеанс до начала операции, которая будет отключена), убедитесь, что вы правильно прошли сеанс.

Если у вас все еще есть проблемы, предоставьте воспроизводимый образец кода.

killSessions ничего не возвращает, поэтому, насколько я могу судить, нет способа определить, действительно ли он что-то сделал. Но сервер регистрирует, когда убивает операции. 4.4 логи:

{"t":{"$date":"2020-06-16T15:55:06.872-04:00"},"s":"I",  "c":"QUERY",    "id":20528,   "ctx":"threa
d60247","msg":"Killing cursor as part of killing session(s)","attr":{"cursorId":7290821057815339751
}}
{"t":{"$date":"2020-06-16T16:01:29.350-04:00"},"s":"I",  "c":"COMMAND",  "id":20706,   "ctx":"thread60247","msg":"Killing op as part of killing session","attr":{"opId":18212677,"lsid":{"id":{"$uuid":"8f5474a5-8001-469b-87d4-692563f2dc0e"},"uid":{"$binary":{"base64":"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=","subType":"0"}}}}}
...