summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/dump.cpp9
-rw-r--r--tools/restore.cpp14
-rw-r--r--tools/tool.cpp20
-rw-r--r--tools/tool.h23
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;
+ };
}