summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2014-03-13 17:19:40 -0400
committerEliot Horowitz <eliot@10gen.com>2014-03-14 09:32:48 -0400
commit55a6a0d284e0921a877020592857b3abf6c6cb73 (patch)
tree1aa2af6c9fe85280aecf6a3347d596cffb5d9602
parent8dd9cf06d7df65baf16eac7725e837c8303eef07 (diff)
downloadmongo-55a6a0d284e0921a877020592857b3abf6c6cb73.tar.gz
SERVER-12956: on startup, remove half built indexes
-rw-r--r--src/mongo/db/db.cpp5
-rw-r--r--src/mongo/db/namespace_details.cpp26
-rw-r--r--src/mongo/db/namespace_details.h1
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;