summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2010-03-16 15:43:57 -0400
committerMathias Stearn <mathias@10gen.com>2010-03-16 15:55:13 -0400
commit7cff2409906a30fa0662aef8f560b08830328a86 (patch)
tree1bd2ba9c2802087f65a54079e476aa8a824251a4
parent5476c8a13e421fd7432fe6b1076d5328c93842ea (diff)
downloadmongo-7cff2409906a30fa0662aef8f560b08830328a86.tar.gz
Clean up and plug leak in snapshot thread SERVER-768
-rw-r--r--db/stats/snapshots.cpp51
-rw-r--r--db/stats/snapshots.h21
-rw-r--r--db/stats/top.cpp4
-rw-r--r--db/stats/top.h4
4 files changed, 39 insertions, 41 deletions
diff --git a/db/stats/snapshots.cpp b/db/stats/snapshots.cpp
index 7fc6bbdc0da..3ac2a1fa629 100644
--- a/db/stats/snapshots.cpp
+++ b/db/stats/snapshots.cpp
@@ -25,50 +25,49 @@
handles snapshotting performance metrics and other such things
*/
namespace mongo {
-
- SnapshotData::SnapshotData()
- : _created ( curTimeMicros64() ) ,
- _globalUsage( Top::global.getGlobalData() )
- {
+ void SnapshotData::takeSnapshot(){
+ _created = curTimeMicros64();
+ _globalUsage = Top::global.getGlobalData();
_totalWriteLockedTime = dbMutex.info().getTimeLocked();
_usage = Top::global.cloneMap();
}
- SnapshotDelta::SnapshotDelta( SnapshotData * older , SnapshotData * newer )
+ SnapshotDelta::SnapshotDelta( const SnapshotData& older , const SnapshotData& newer )
: _older( older ) , _newer( newer )
{
- assert( _newer->_created > _older->_created );
- _elapsed = _newer->_created - _older->_created;
+ assert( _newer._created > _older._created );
+ _elapsed = _newer._created - _older._created;
}
Top::CollectionData SnapshotDelta::globalUsageDiff(){
- return Top::CollectionData( _older->_globalUsage , _newer->_globalUsage );
+ return Top::CollectionData( _older._globalUsage , _newer._globalUsage );
}
Top::UsageMap SnapshotDelta::collectionUsageDiff(){
Top::UsageMap u;
- for ( Top::UsageMap::iterator i=_newer->_usage.begin(); i != _newer->_usage.end(); i++ ){
- u[i->first] = Top::CollectionData( _older->_usage[i->first] , i->second );
+ for ( Top::UsageMap::const_iterator i=_newer._usage.begin(); i != _newer._usage.end(); i++ ){
+ Top::UsageMap::const_iterator j = _older._usage.find(i->first);
+ if (j != _older._usage.end())
+ u[i->first] = Top::CollectionData( j->second , i->second );
}
return u;
}
- Snapshots::Snapshots(){
- _n = 100;
- _snapshots = new SnapshotData*[_n];
- for ( int i=0; i<_n; i++ )
- _snapshots[i] = 0;
- _loc = 0;
- _stored = 0;
- }
+ Snapshots::Snapshots(int n)
+ : _n(n)
+ , _snapshots(new SnapshotData[n])
+ , _loc(0)
+ , _stored(0)
+ {}
- void Snapshots::add( SnapshotData * s ){
+ const SnapshotData* Snapshots::takeSnapshot(){
scoped_lock lk(_lock);
_loc = ( _loc + 1 ) % _n;
- _snapshots[_loc] = s;
+ _snapshots[_loc].takeSnapshot();
if ( _stored < _n )
_stored++;
+ return &_snapshots[_loc];
}
auto_ptr<SnapshotDelta> Snapshots::computeDelta( int numBack ){
@@ -79,7 +78,7 @@ namespace mongo {
return p;
}
- SnapshotData* Snapshots::getPrev( int numBack ){
+ const SnapshotData& Snapshots::getPrev( int numBack ){
int x = _loc - numBack;
if ( x < 0 )
x += _n;
@@ -109,19 +108,17 @@ namespace mongo {
long long numLoops = 0;
- SnapshotData * prev = 0;
+ const SnapshotData* prev = 0;
while ( ! inShutdown() ){
try {
- SnapshotData * s = new SnapshotData();
-
- statsSnapshots.add( s );
+ const SnapshotData* s = statsSnapshots.takeSnapshot();
if ( prev ){
unsigned long long elapsed = s->_created - prev->_created;
if ( cmdLine.cpu ){
- SnapshotDelta d( prev , s );
+ SnapshotDelta d( *prev , *s );
log() << "cpu: elapsed:" << (elapsed/1000) <<" writelock: " << (int)(100*d.percentWriteLocked()) << "%" << endl;
}
diff --git a/db/stats/snapshots.h b/db/stats/snapshots.h
index 9fde41ac1ee..542318aaee6 100644
--- a/db/stats/snapshots.h
+++ b/db/stats/snapshots.h
@@ -34,7 +34,7 @@ namespace mongo {
* i.e. all counters at a given time
*/
class SnapshotData {
- SnapshotData();
+ void takeSnapshot();
unsigned long long _created;
Top::CollectionData _globalUsage;
@@ -43,6 +43,7 @@ namespace mongo {
friend class SnapshotThread;
friend class SnapshotDelta;
+ friend class Snapshots;
};
/**
@@ -50,10 +51,10 @@ namespace mongo {
*/
class SnapshotDelta {
public:
- SnapshotDelta( SnapshotData * older , SnapshotData * newer );
+ SnapshotDelta( const SnapshotData& older , const SnapshotData& newer );
unsigned long long start() const {
- return _older->_created;
+ return _older._created;
}
unsigned long long elapsed() const {
@@ -61,7 +62,7 @@ namespace mongo {
}
unsigned long long timeInWriteLock() const {
- return _newer->_totalWriteLockedTime - _older->_totalWriteLockedTime;
+ return _newer._totalWriteLockedTime - _older._totalWriteLockedTime;
}
double percentWriteLocked() const {
double e = (double) elapsed();
@@ -73,21 +74,21 @@ namespace mongo {
Top::UsageMap collectionUsageDiff();
private:
- SnapshotData * _older;
- SnapshotData * _newer;
+ const SnapshotData& _older;
+ const SnapshotData& _newer;
unsigned long long _elapsed;
};
class Snapshots {
public:
- Snapshots();
+ Snapshots(int n=100);
- void add( SnapshotData * s );
+ const SnapshotData* takeSnapshot();
int numDeltas() const { return _stored-1; }
- SnapshotData* getPrev( int numBack = 0 );
+ const SnapshotData& getPrev( int numBack = 0 );
auto_ptr<SnapshotDelta> computeDelta( int numBack = 0 );
@@ -95,7 +96,7 @@ namespace mongo {
private:
mongo::mutex _lock;
int _n;
- SnapshotData** _snapshots;
+ boost::scoped_array<SnapshotData> _snapshots;
int _loc;
int _stored;
};
diff --git a/db/stats/top.cpp b/db/stats/top.cpp
index 93d29ed3baf..1d4f670db95 100644
--- a/db/stats/top.cpp
+++ b/db/stats/top.cpp
@@ -23,14 +23,14 @@
namespace mongo {
- Top::UsageData::UsageData( UsageData& older , UsageData& newer )
+ Top::UsageData::UsageData( const UsageData& older , const UsageData& newer )
: time(newer.time-older.time) ,
count(newer.count-older.count)
{
}
- Top::CollectionData::CollectionData( CollectionData& older , CollectionData& newer )
+ Top::CollectionData::CollectionData( const CollectionData& older , const CollectionData& newer )
: total( older.total , newer.total ) ,
readLock( older.readLock , newer.readLock ) ,
writeLock( older.writeLock , newer.writeLock ) ,
diff --git a/db/stats/top.h b/db/stats/top.h
index eaf8a12cad5..66240aeef42 100644
--- a/db/stats/top.h
+++ b/db/stats/top.h
@@ -32,7 +32,7 @@ namespace mongo {
class UsageData {
public:
UsageData() : time(0) , count(0){}
- UsageData( UsageData& older , UsageData& newer );
+ UsageData( const UsageData& older , const UsageData& newer );
long long time;
long long count;
@@ -48,7 +48,7 @@ namespace mongo {
* constructs a diff
*/
CollectionData(){}
- CollectionData( CollectionData& older , CollectionData& newer );
+ CollectionData( const CollectionData& older , const CollectionData& newer );
UsageData total;