void ServiceContext::killAllUserOperations(const OperationContext* txn, ErrorCodes::Error killCode) { for (LockedClientsCursor cursor(this); Client* client = cursor.next();) { if (!client->isFromUserConnection()) { // Don't kill system operations. continue; } stdx::lock_guard<Client> lk(*client); OperationContext* toKill = client->getOperationContext(); // Don't kill ourself. if (toKill && toKill->getOpID() != txn->getOpID()) { killOperation(toKill, killCode); } } }
void ServiceContext::setKillAllOperations() { stdx::lock_guard<stdx::mutex> clientLock(_mutex); // Ensure that all newly created operation contexts will immediately be in the interrupted state _globalKill.store(true); // Interrupt all active operations for (auto&& client : _clients) { stdx::lock_guard<Client> lk(*client); auto opCtxToKill = client->getOperationContext(); if (opCtxToKill) { killOperation(opCtxToKill, ErrorCodes::InterruptedAtShutdown); } } // Notify any listeners who need to reach to the server shutting down for (const auto listener : _killOpListeners) { try { listener->interruptAll(); } catch (...) { std::terminate(); } } }