summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/current_op.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/commands/current_op.cpp')
-rw-r--r--src/mongo/db/commands/current_op.cpp177
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