diff options
author | Eliot Horowitz <eliot@10gen.com> | 2011-12-24 15:33:26 -0500 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2011-12-24 15:33:45 -0500 |
commit | ae1ecd9c786911f9f1f0242f0f7d702b3e5dfeba (patch) | |
tree | 92f8e1649e6f080b251ff5f1763679a72eb59b34 /src/mongo/db/curop.cpp | |
parent | dfa4cd7e2cf109b072440155fabc08a93c8045a0 (diff) | |
download | mongo-ae1ecd9c786911f9f1f0242f0f7d702b3e5dfeba.tar.gz |
bulk move of code to src/ SERVER-4551
Diffstat (limited to 'src/mongo/db/curop.cpp')
-rw-r--r-- | src/mongo/db/curop.cpp | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/src/mongo/db/curop.cpp b/src/mongo/db/curop.cpp new file mode 100644 index 00000000000..3cc452b46cc --- /dev/null +++ b/src/mongo/db/curop.cpp @@ -0,0 +1,173 @@ +/** +* Copyright (C) 2009 10gen Inc. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License, version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "pch.h" +#include "curop.h" +#include "database.h" + +namespace mongo { + + // todo : move more here + + CurOp::CurOp( Client * client , CurOp * wrapped ) : + _client(client), + _wrapped(wrapped) + { + if ( _wrapped ) + _client->_curOp = this; + _start = _checkpoint = 0; + _active = false; + _reset(); + _op = 0; + // These addresses should never be written to again. The zeroes are + // placed here as a precaution because currentOp may be accessed + // without the db mutex. + memset(_ns, 0, sizeof(_ns)); + } + + void CurOp::_reset() { + _command = false; + _lockType = 0; + _dbprofile = 0; + _end = 0; + _waitingForLock = false; + _message = ""; + _progressMeter.finished(); + _killed = false; + _numYields = 0; + } + + void CurOp::reset() { + _reset(); + _start = _checkpoint = 0; + _opNum = _nextOpNum++; + _ns[0] = 0; + _debug.reset(); + _query.reset(); + _active = true; // this should be last for ui clarity + } + + void CurOp::reset( const HostAndPort& remote, int op ) { + reset(); + if( _remote != remote ) { + // todo : _remote is not thread safe yet is used as such! + _remote = remote; + } + _op = op; + } + + ProgressMeter& CurOp::setMessage( const char * msg , unsigned long long progressMeterTotal , int secondsBetween ) { + if ( progressMeterTotal ) { + if ( _progressMeter.isActive() ) { + cout << "about to assert, old _message: " << _message << " new message:" << msg << endl; + assert( ! _progressMeter.isActive() ); + } + _progressMeter.reset( progressMeterTotal , secondsBetween ); + } + else { + _progressMeter.finished(); + } + _message = msg; + return _progressMeter; + } + + + BSONObj CurOp::info() { + if( ! cc().getAuthenticationInfo()->isAuthorized("admin") ) { + BSONObjBuilder b; + b.append("err", "unauthorized"); + return b.obj(); + } + return infoNoauth(); + } + + CurOp::~CurOp() { + if ( _wrapped ) { + scoped_lock bl(Client::clientsMutex); + _client->_curOp = _wrapped; + } + _client = 0; + } + + void CurOp::enter( Client::Context * context ) { + ensureStarted(); + setNS( context->ns() ); + _dbprofile = context->_db ? context->_db->profile : 0; + } + + void CurOp::leave( Client::Context * context ) { + unsigned long long now = curTimeMicros64(); + Top::global.record( _ns , _op , _lockType , now - _checkpoint , _command ); + _checkpoint = now; + } + + BSONObj CurOp::infoNoauth() { + BSONObjBuilder b; + b.append("opid", _opNum); + bool a = _active && _start; + b.append("active", a); + if ( _lockType ) + b.append("lockType" , _lockType > 0 ? "write" : "read" ); + b.append("waitingForLock" , _waitingForLock ); + + if( a ) { + b.append("secs_running", elapsedSeconds() ); + } + + b.append( "op" , opToString( _op ) ); + + b.append("ns", _ns); + + _query.append( b , "query" ); + + if( !_remote.empty() ) { + b.append("client", _remote.toString()); + } + + if ( _client ) { + b.append( "desc" , _client->desc() ); + if ( _client->_threadId.size() ) + b.append( "threadId" , _client->_threadId ); + if ( _client->_connectionId ) + b.appendNumber( "connectionId" , _client->_connectionId ); + } + + if ( ! _message.empty() ) { + if ( _progressMeter.isActive() ) { + StringBuilder buf(128); + buf << _message.toString() << " " << _progressMeter.toString(); + b.append( "msg" , buf.str() ); + BSONObjBuilder sub( b.subobjStart( "progress" ) ); + sub.appendNumber( "done" , (long long)_progressMeter.done() ); + sub.appendNumber( "total" , (long long)_progressMeter.total() ); + sub.done(); + } + else { + b.append( "msg" , _message.toString() ); + } + } + + if( killed() ) + b.append("killed", true); + + b.append( "numYields" , _numYields ); + + return b.obj(); + } + + AtomicUInt CurOp::_nextOpNum; + +} |