summaryrefslogtreecommitdiff
path: root/src/mongo/db/stats
diff options
context:
space:
mode:
authorGeert Bosch <geert@mongodb.com>2016-02-10 14:08:01 -0500
committerGeert Bosch <geert@mongodb.com>2016-02-10 18:25:44 -0500
commitf8dadcefeef7e738d7063ae2df57b9c856b402da (patch)
treeb8a1c8d80d77d1ab10e102e2e113dee7d613c52b /src/mongo/db/stats
parentc424db4c199a003aa852337b23d19444f26b6745 (diff)
downloadmongo-f8dadcefeef7e738d7063ae2df57b9c856b402da.tar.gz
SERVER-21859: ServerStatus should report clients queued on global/ticket lock
Diffstat (limited to 'src/mongo/db/stats')
-rw-r--r--src/mongo/db/stats/lock_server_status_section.cpp42
1 files changed, 14 insertions, 28 deletions
diff --git a/src/mongo/db/stats/lock_server_status_section.cpp b/src/mongo/db/stats/lock_server_status_section.cpp
index e320fe04930..c6cde40d0ad 100644
--- a/src/mongo/db/stats/lock_server_status_section.cpp
+++ b/src/mongo/db/stats/lock_server_status_section.cpp
@@ -28,6 +28,8 @@
#include "mongo/platform/basic.h"
+#include <valarray>
+
#include "mongo/db/client.h"
#include "mongo/db/commands/server_status.h"
#include "mongo/db/concurrency/lock_stats.h"
@@ -48,36 +50,18 @@ public:
}
virtual BSONObj generateSection(OperationContext* txn, const BSONElement& configElement) const {
- int numTotal = 0;
- int numWriteLocked = 0;
- int numReadLocked = 0;
- int numWaitingRead = 0;
- int numWaitingWrite = 0;
+ std::valarray<int> clientStatusCounts(5);
// This returns the blocked lock states
for (ServiceContext::LockedClientsCursor cursor(txn->getClient()->getServiceContext());
Client* client = cursor.next();) {
invariant(client);
- ++numTotal;
stdx::unique_lock<Client> uniqueLock(*client);
const OperationContext* opCtx = client->getOperationContext();
- if (opCtx == NULL)
- continue;
-
- if (opCtx->lockState()->isWriteLocked()) {
- numWriteLocked++;
-
- if (opCtx->lockState()->getWaitingResource().isValid()) {
- numWaitingWrite++;
- }
- } else if (opCtx->lockState()->isReadLocked()) {
- numReadLocked++;
-
- if (opCtx->lockState()->getWaitingResource().isValid()) {
- numWaitingRead++;
- }
- }
+ auto state = opCtx ? opCtx->lockState()->getClientState() : Locker::kInactive;
+ invariant(state < sizeof(clientStatusCounts));
+ clientStatusCounts[state]++;
}
// Construct the actual return value out of the mutex
@@ -88,18 +72,20 @@ public:
{
BSONObjBuilder currentQueueBuilder(ret.subobjStart("currentQueue"));
- currentQueueBuilder.append("total", numWaitingRead + numWaitingWrite);
- currentQueueBuilder.append("readers", numWaitingRead);
- currentQueueBuilder.append("writers", numWaitingWrite);
+ currentQueueBuilder.append("total",
+ clientStatusCounts[Locker::kQueuedReader] +
+ clientStatusCounts[Locker::kQueuedWriter]);
+ currentQueueBuilder.append("readers", clientStatusCounts[Locker::kQueuedReader]);
+ currentQueueBuilder.append("writers", clientStatusCounts[Locker::kQueuedWriter]);
currentQueueBuilder.done();
}
{
BSONObjBuilder activeClientsBuilder(ret.subobjStart("activeClients"));
- activeClientsBuilder.append("total", numTotal);
- activeClientsBuilder.append("readers", numReadLocked);
- activeClientsBuilder.append("writers", numWriteLocked);
+ activeClientsBuilder.append("total", clientStatusCounts.sum());
+ activeClientsBuilder.append("readers", clientStatusCounts[Locker::kActiveReader]);
+ activeClientsBuilder.append("writers", clientStatusCounts[Locker::kActiveWriter]);
activeClientsBuilder.done();
}