diff options
author | Eliot Horowitz <eliot@10gen.com> | 2014-10-27 08:41:54 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2014-10-27 08:41:54 -0400 |
commit | 1efcb9b092f218178bbc78ca4bf5f7c1a720ffb8 (patch) | |
tree | 93923726e168616c2d41d1170b18e1aa51fa3980 /src | |
parent | f863b0bf23bd2a0c573f0a3cfbf603a492f1741d (diff) | |
download | mongo-1efcb9b092f218178bbc78ca4bf5f7c1a720ffb8.tar.gz |
SERVER-15683: add optional filter to currentOpCtx command
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/clientlistplugin.cpp | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/src/mongo/db/clientlistplugin.cpp b/src/mongo/db/clientlistplugin.cpp index 3300e2b5d22..a1b7abb373e 100644 --- a/src/mongo/db/clientlistplugin.cpp +++ b/src/mongo/db/clientlistplugin.cpp @@ -33,12 +33,12 @@ #include "mongo/db/commands.h" #include "mongo/db/curop.h" #include "mongo/db/global_environment_experiment.h" +#include "mongo/db/matcher/expression_parser.h" #include "mongo/db/operation_context.h" #include "mongo/db/dbwebserver.h" #include "mongo/util/mongoutils/html.h" #include "mongo/util/stringutils.h" - namespace mongo { class OperationsDataBuilder : public GlobalEnvironmentExperiment::ProcessOperationContext { @@ -122,6 +122,10 @@ namespace { class CommandHelper : public GlobalEnvironmentExperiment::ProcessOperationContext { public: + CommandHelper( MatchExpression* me ) + : matcher( me ) { + } + virtual void processOpContext(OperationContext* txn) { BSONObjBuilder b; if ( txn->getClient() ) @@ -136,15 +140,25 @@ namespace { } if ( txn->recoveryUnit() ) txn->recoveryUnit()->reportState( &b ); - array.append( b.obj() ); + + BSONObj obj = b.obj(); + + if ( matcher && !matcher->matchesBSON( obj ) ) { + return; + } + + array.append( obj ); } BSONArrayBuilder array; + MatchExpression* matcher; }; class CurrentOpContexts : public Command { public: - CurrentOpContexts() : Command( "currentOpCtx" ) { } + CurrentOpContexts() + : Command( "currentOpCtx" ) { + } virtual bool isWriteCommandForConfigServer() const { return false; } @@ -158,13 +172,24 @@ namespace { BSONObjBuilder& result, bool fromRepl) { - CommandHelper helper; + scoped_ptr<MatchExpression> filter; + if ( cmdObj["filter"].isABSONObj() ) { + StatusWithMatchExpression res = + MatchExpressionParser::parse( cmdObj["filter"].Obj() ); + if ( !res.isOK() ) { + return appendCommandStatus( result, res.getStatus() ); + } + filter.reset( res.getValue() ); + } + + CommandHelper helper( filter.get() ); getGlobalEnvironment()->forEachOperationContext(&helper); result.appendArray( "operations", helper.array.arr() ); return true; } + } currentOpContexts; } // namespace |