diff options
author | Eliot Horowitz <eliot@10gen.com> | 2011-03-31 08:48:05 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2011-03-31 08:48:05 -0400 |
commit | c3da625d6a839a885189abd079f8e81785ee975a (patch) | |
tree | 5b7f490a292bdcf4aba5883b7796ce5648b08fcb /s/commands_public.cpp | |
parent | c2956f1d8bb27837349bf42556b0b4e948cb2a6d (diff) | |
download | mongo-c3da625d6a839a885189abd079f8e81785ee975a.tar.gz |
put indexSizes and other missing fields in sharded collstats SERVER-2752
Diffstat (limited to 's/commands_public.cpp')
-rw-r--r-- | s/commands_public.cpp | 101 |
1 files changed, 74 insertions, 27 deletions
diff --git a/s/commands_public.cpp b/s/commands_public.cpp index 5b1ecaf33ca..bfb91a784fb 100644 --- a/s/commands_public.cpp +++ b/s/commands_public.cpp @@ -463,9 +463,13 @@ namespace mongo { cm->getAllShards(servers); BSONObjBuilder shardStats; + map<string,long long> counts; + map<string,long long> indexSizes; + /* long long count=0; long long size=0; long long storageSize=0; + */ int nindexes=0; bool warnedAboutIndexes = false; for ( set<Shard>::iterator i=servers.begin(); i!=servers.end(); i++ ) { @@ -476,39 +480,82 @@ namespace mongo { return false; } conn.done(); - - count += res["count"].numberLong(); - size += res["size"].numberLong(); - storageSize += res["storageSize"].numberLong(); - - int myIndexes = res["nindexes"].numberInt(); - - if ( nindexes == 0 ) { - nindexes = myIndexes; - } - else if ( nindexes == myIndexes ) { - // no-op - } - else { - // hopefully this means we're building an index - - if ( myIndexes > nindexes ) - nindexes = myIndexes; - - if ( ! warnedAboutIndexes ) { - result.append( "warning" , "indexes don't all match - ok if ensureIndex is running" ); - warnedAboutIndexes = true; + + BSONObjIterator j( res ); + while ( j.more() ) { + BSONElement e = j.next(); + + if ( str::equals( e.fieldName() , "ns" ) || + str::equals( e.fieldName() , "ok" ) || + str::equals( e.fieldName() , "avgObjSize" ) || + str::equals( e.fieldName() , "lastExtentSize" ) || + str::equals( e.fieldName() , "paddingFactor" ) ) { + continue; + } + else if ( str::equals( e.fieldName() , "count" ) || + str::equals( e.fieldName() , "size" ) || + str::equals( e.fieldName() , "storageSize" ) || + str::equals( e.fieldName() , "numExtents" ) || + str::equals( e.fieldName() , "totalIndexSize" ) ) { + counts[e.fieldName()] += e.numberLong(); + } + else if ( str::equals( e.fieldName() , "indexSizes" ) ) { + BSONObjIterator k( e.Obj() ); + while ( k.more() ) { + BSONElement temp = k.next(); + indexSizes[temp.fieldName()] += temp.numberLong(); + } } + else if ( str::equals( e.fieldName() , "flags" ) ) { + if ( ! result.hasField( e.fieldName() ) ) + result.append( e ); + } + else if ( str::equals( e.fieldName() , "nindexes" ) ) { + int myIndexes = e.numberInt(); + + if ( nindexes == 0 ) { + nindexes = myIndexes; + } + else if ( nindexes == myIndexes ) { + // no-op + } + else { + // hopefully this means we're building an index + + if ( myIndexes > nindexes ) + nindexes = myIndexes; + + if ( ! warnedAboutIndexes ) { + result.append( "warning" , "indexes don't all match - ok if ensureIndex is running" ); + warnedAboutIndexes = true; + } + } + } + else { + warning() << "mongos collstats doesn't know about: " << e.fieldName() << endl; + } + } - shardStats.append(i->getName(), res); } result.append("ns", fullns); - result.appendNumber("count", count); - result.appendNumber("size", size); - result.append ("avgObjSize", double(size) / double(count)); - result.appendNumber("storageSize", storageSize); + + for ( map<string,long long>::iterator i=counts.begin(); i!=counts.end(); ++i ) + result.appendNumber( i->first , i->second ); + + { + BSONObjBuilder ib( result.subobjStart( "indexSizes" ) ); + for ( map<string,long long>::iterator i=indexSizes.begin(); i!=indexSizes.end(); ++i ) + ib.appendNumber( i->first , i->second ); + ib.done(); + } + + if ( counts["count"] > 0 ) + result.append("avgObjSize", (double)counts["size"] / (double)counts["count"] ); + else + result.append( "avgObjSize", 0.0 ); + result.append("nindexes", nindexes); result.append("nchunks", cm->numChunks()); |