diff options
Diffstat (limited to 'src/mongo/db/commands/current_op.cpp')
-rw-r--r-- | src/mongo/db/commands/current_op.cpp | 177 |
1 files changed, 89 insertions, 88 deletions
diff --git a/src/mongo/db/commands/current_op.cpp b/src/mongo/db/commands/current_op.cpp index d28cb91874e..5107a43d5c5 100644 --- a/src/mongo/db/commands/current_op.cpp +++ b/src/mongo/db/commands/current_op.cpp @@ -48,114 +48,115 @@ namespace mongo { - class CurrentOpCommand : public Command { - public: - - CurrentOpCommand() : Command("currentOp") {} +class CurrentOpCommand : public Command { +public: + CurrentOpCommand() : Command("currentOp") {} + + bool isWriteCommandForConfigServer() const final { + return false; + } + + bool slaveOk() const final { + return true; + } + + bool adminOnly() const final { + return true; + } + + Status checkAuthForCommand(ClientBasic* client, + const std::string& dbname, + const BSONObj& cmdObj) final { + bool isAuthorized = AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( + ResourcePattern::forClusterResource(), ActionType::inprog); + return isAuthorized ? Status::OK() : Status(ErrorCodes::Unauthorized, "Unauthorized"); + } + + bool run(OperationContext* txn, + const std::string& db, + BSONObj& cmdObj, + int options, + std::string& errmsg, + BSONObjBuilder& result) final { + const bool includeAll = cmdObj["$all"].trueValue(); + + // Filter the output + BSONObj filter; + { + BSONObjBuilder b; + BSONObjIterator i(cmdObj); + invariant(i.more()); + i.next(); // skip {currentOp: 1} which is required to be the first element + while (i.more()) { + BSONElement e = i.next(); + if (str::equals("$all", e.fieldName())) { + continue; + } - bool isWriteCommandForConfigServer() const final { return false; } + b.append(e); + } + filter = b.obj(); + } - bool slaveOk() const final { return true; } + const WhereCallbackReal whereCallback(txn, db); + const Matcher matcher(filter, whereCallback); - bool adminOnly() const final { return true; } + BSONArrayBuilder inprogBuilder(result.subarrayStart("inprog")); - Status checkAuthForCommand(ClientBasic* client, - const std::string& dbname, - const BSONObj& cmdObj) final { + for (ServiceContext::LockedClientsCursor cursor(txn->getClient()->getServiceContext()); + Client* client = cursor.next();) { + invariant(client); - bool isAuthorized = AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( - ResourcePattern::forClusterResource(), - ActionType::inprog); - return isAuthorized ? Status::OK() : Status(ErrorCodes::Unauthorized, "Unauthorized"); - } + stdx::lock_guard<Client> lk(*client); + const OperationContext* opCtx = client->getOperationContext(); - bool run(OperationContext* txn, - const std::string& db, - BSONObj& cmdObj, - int options, - std::string& errmsg, - BSONObjBuilder& result) final { - - const bool includeAll = cmdObj["$all"].trueValue(); - - // Filter the output - BSONObj filter; - { - BSONObjBuilder b; - BSONObjIterator i(cmdObj); - invariant(i.more()); - i.next(); // skip {currentOp: 1} which is required to be the first element - while (i.more()) { - BSONElement e = i.next(); - if (str::equals("$all", e.fieldName())) { - continue; - } - - b.append(e); - } - filter = b.obj(); + if (!includeAll) { + // Skip over inactive connections. + if (!opCtx) + continue; } - const WhereCallbackReal whereCallback(txn, db); - const Matcher matcher(filter, whereCallback); - - BSONArrayBuilder inprogBuilder(result.subarrayStart("inprog")); - - for (ServiceContext::LockedClientsCursor cursor(txn->getClient()->getServiceContext()); - Client* client = cursor.next();) { + BSONObjBuilder infoBuilder; - invariant(client); + // The client information + client->reportState(infoBuilder); - stdx::lock_guard<Client> lk(*client); - const OperationContext* opCtx = client->getOperationContext(); - - if (!includeAll) { - // Skip over inactive connections. - if (!opCtx) - continue; + // Operation context specific information + infoBuilder.appendBool("active", static_cast<bool>(opCtx)); + if (opCtx) { + infoBuilder.append("opid", opCtx->getOpID()); + if (opCtx->isKillPending()) { + infoBuilder.append("killPending", true); } - BSONObjBuilder infoBuilder; - - // The client information - client->reportState(infoBuilder); + CurOp::get(opCtx)->reportState(&infoBuilder); - // Operation context specific information - infoBuilder.appendBool("active", static_cast<bool>(opCtx)); - if (opCtx) { - infoBuilder.append("opid", opCtx->getOpID()); - if (opCtx->isKillPending()) { - infoBuilder.append("killPending", true); - } - - CurOp::get(opCtx)->reportState(&infoBuilder); - - // LockState - Locker::LockerInfo lockerInfo; - opCtx->lockState()->getLockerInfo(&lockerInfo); - fillLockerInfo(lockerInfo, infoBuilder); - } + // LockState + Locker::LockerInfo lockerInfo; + opCtx->lockState()->getLockerInfo(&lockerInfo); + fillLockerInfo(lockerInfo, infoBuilder); + } - infoBuilder.done(); + infoBuilder.done(); - const BSONObj info = infoBuilder.obj(); + const BSONObj info = infoBuilder.obj(); - if (includeAll || matcher.matches(info)) { - inprogBuilder.append(info); - } + if (includeAll || matcher.matches(info)) { + inprogBuilder.append(info); } + } - inprogBuilder.done(); - - if (lockedForWriting()) { - result.append("fsyncLock", true); - result.append("info", - "use db.fsyncUnlock() to terminate the fsync write/snapshot lock"); - } + inprogBuilder.done(); - return true; + if (lockedForWriting()) { + result.append("fsyncLock", true); + result.append("info", + "use db.fsyncUnlock() to terminate the fsync write/snapshot lock"); } - } currentOpCommand; + return true; + } + +} currentOpCommand; } // namespace mongo |