diff options
author | Eliot Horowitz <eliot@10gen.com> | 2014-03-13 17:19:40 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2014-03-14 09:32:48 -0400 |
commit | 55a6a0d284e0921a877020592857b3abf6c6cb73 (patch) | |
tree | 1aa2af6c9fe85280aecf6a3347d596cffb5d9602 | |
parent | 8dd9cf06d7df65baf16eac7725e837c8303eef07 (diff) | |
download | mongo-55a6a0d284e0921a877020592857b3abf6c6cb73.tar.gz |
SERVER-12956: on startup, remove half built indexes
-rw-r--r-- | src/mongo/db/db.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/namespace_details.cpp | 26 | ||||
-rw-r--r-- | src/mongo/db/namespace_details.h | 1 |
3 files changed, 32 insertions, 0 deletions
diff --git a/src/mongo/db/db.cpp b/src/mongo/db/db.cpp index 24c6bc62c55..046101a29bf 100644 --- a/src/mongo/db/db.cpp +++ b/src/mongo/db/db.cpp @@ -77,6 +77,7 @@ namespace mongo { extern int diagLogging; extern unsigned lenForNewNsFiles; extern int lockFile; + extern bool checkNsFilesOnLoad; extern string repairpath; static void setupSignalHandlers(); @@ -321,6 +322,8 @@ namespace mongo { Client::GodScope gs; LOG(1) << "enter repairDatabases (to check pdfile version #)" << endl; + checkNsFilesOnLoad = false; // we are mainly just checking the header - don't scan the whole .ns file for every db here. + Lock::GlobalWrite lk; vector< string > dbNames; getDatabaseNames( dbNames ); @@ -404,6 +407,8 @@ namespace mongo { cc().shutdown(); dbexit( EXIT_CLEAN ); } + + checkNsFilesOnLoad = true; } void clearTmpFiles() { diff --git a/src/mongo/db/namespace_details.cpp b/src/mongo/db/namespace_details.cpp index 0fc7bdf5eb5..382522bb50a 100644 --- a/src/mongo/db/namespace_details.cpp +++ b/src/mongo/db/namespace_details.cpp @@ -122,6 +122,29 @@ namespace mongo { } #endif + void NamespaceDetails::onLoad(const Namespace& k) { + + if( k.isExtra() ) { + /* overflow storage for indexes - so don't treat as a NamespaceDetails object. */ + return; + } + + if( indexBuildsInProgress ) { + verify( Lock::isW() ); // TODO(erh) should this be per db? + if( indexBuildsInProgress ) { + log() << "indexBuildsInProgress was " << indexBuildsInProgress << " for " << k + << ", indicating an abnormal db shutdown" << endl; + getDur().writingInt( indexBuildsInProgress ) = 0; + } + } + } + + static void namespaceOnLoadCallback(const Namespace& k, NamespaceDetails& v) { + v.onLoad(k); + } + + bool checkNsFilesOnLoad = true; + NOINLINE_DECL void NamespaceIndex::_init() { verify( !ht ); @@ -174,6 +197,9 @@ namespace mongo { verify( len <= 0x7fffffff ); ht = new HashTable<Namespace,NamespaceDetails>(p, (int) len, "namespace index"); + if( checkNsFilesOnLoad ) + ht->iterAll(namespaceOnLoadCallback); + } static void namespaceGetNamespacesCallback( const Namespace& k , NamespaceDetails& v , void * extra ) { diff --git a/src/mongo/db/namespace_details.h b/src/mongo/db/namespace_details.h index 0e7e324da67..3f381605250 100644 --- a/src/mongo/db/namespace_details.h +++ b/src/mongo/db/namespace_details.h @@ -405,6 +405,7 @@ namespace mongo { /** Make all linked Extra objects writeable as well */ NamespaceDetails *writingWithExtra(); + void onLoad( const Namespace& k ); private: DiskLoc _alloc(const char *ns, int len); void maybeComplain( const char *ns, int len ) const; |