diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/dump.cpp | 9 | ||||
-rw-r--r-- | tools/restore.cpp | 14 | ||||
-rw-r--r-- | tools/tool.cpp | 20 | ||||
-rw-r--r-- | tools/tool.h | 23 |
4 files changed, 55 insertions, 11 deletions
diff --git a/tools/dump.cpp b/tools/dump.cpp index 0c47c8cbb13..ff354f725e4 100644 --- a/tools/dump.cpp +++ b/tools/dump.cpp @@ -41,16 +41,17 @@ public: out.open( outputFile.string().c_str() ); uassert( "couldn't open file" , out.good() ); + ProgressMeter m( conn( true ).count( coll.c_str() ) ); + auto_ptr<DBClientCursor> cursor = conn( true ).query( coll.c_str() , Query().snapshot() , 0 , 0 , 0 , Option_SlaveOk | Option_NoCursorTimeout ); - int num = 0; while ( cursor->more() ) { BSONObj obj = cursor->next(); out.write( obj.objdata() , obj.objsize() ); - num++; + m.hit(); } - cout << "\t\t " << num << " objects" << endl; + cout << "\t\t " << m.done() << " objects" << endl; out.close(); } @@ -61,7 +62,7 @@ public: create_directories( outdir ); string sns = db + ".system.namespaces"; - + auto_ptr<DBClientCursor> cursor = conn( true ).query( sns.c_str() , Query() , 0 , 0 , 0 , Option_SlaveOk | Option_NoCursorTimeout ); while ( cursor->more() ) { BSONObj obj = cursor->next(); diff --git a/tools/restore.cpp b/tools/restore.cpp index de7270ab0d4..65a156548a8 100644 --- a/tools/restore.cpp +++ b/tools/restore.cpp @@ -126,11 +126,10 @@ public: long long read = 0; long long num = 0; - int msgDelay = (int)(1000 * ( 1 + ( fileLength / ( 1024.0 * 1024 * 400 ) ) ) ); - log(1) << "\t msg delay: " << msgDelay << endl; - const int BUF_SIZE = 1024 * 1024 * 5; char * buf = (char*)malloc( BUF_SIZE ); + + ProgressMeter m( fileLength ); while ( read < fileLength ) { file.read( buf , 4 ); @@ -145,12 +144,13 @@ public: read += o.objsize(); num++; - if ( ( logLevel > 0 && num < 10 ) || ! ( num % msgDelay ) ) - out() << "read " << read << "/" << fileLength << " bytes so far. (" << (int)( (read * 100) / fileLength) << "%) " << num << " objects" << endl; + m.hit( o.objsize() ); } - + free( buf ); - out() << "\t " << num << " objects" << endl; + + uassert( "counts don't match" , m.done() == fileLength ); + out() << "\t " << m.hits() << " objects" << endl; } }; diff --git a/tools/tool.cpp b/tools/tool.cpp index 8aa1cfaac98..bf2d6158d2a 100644 --- a/tools/tool.cpp +++ b/tools/tool.cpp @@ -13,6 +13,26 @@ using namespace mongo; namespace po = boost::program_options; +mongo::ProgressMeter::ProgressMeter( long long total , int secondsBetween ) + : _total( total ) , _secondsBetween( secondsBetween ) , _done(0) , _hits(0) , _lastTime( time(0) ){ + +} + +void mongo::ProgressMeter::hit( int n ){ + _done += n; + _hits++; + if ( _hits % 100 ) + return; + + int t = time(0); + if ( t - _lastTime < _secondsBetween ) + return; + + int per = (int)( ( (double)_done * 100.0 ) / (double)_total ); + cout << "\t\t" << _done << "/" << _total << "\t" << per << "%" << endl; + _lastTime = t; +} + mongo::Tool::Tool( string name , string defaultDB , string defaultCollection ) : _name( name ) , _db( defaultDB ) , _coll( defaultCollection ) , _conn(0), _paired(false) { diff --git a/tools/tool.h b/tools/tool.h index a398ed5a6d8..b7fec8ec44c 100644 --- a/tools/tool.h +++ b/tools/tool.h @@ -84,4 +84,27 @@ namespace mongo { }; + class ProgressMeter { + public: + ProgressMeter( long long total , int secondsBetween = 3 ); + + void hit( int n = 1 ); + + long long done(){ + return _done; + } + + long long hits(){ + return _hits; + } + + private: + + long long _total; + int _secondsBetween; + + long long _done; + long long _hits; + int _lastTime; + }; } |