diff options
Diffstat (limited to 'db/repl/rs_config.cpp')
-rw-r--r-- | db/repl/rs_config.cpp | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/db/repl/rs_config.cpp b/db/repl/rs_config.cpp index 85c9a46..371507d 100644 --- a/db/repl/rs_config.cpp +++ b/db/repl/rs_config.cpp @@ -302,9 +302,8 @@ namespace mongo { clear(); int level = 2; DEV level = 0; - //log(0) << "replSet load config from: " << h.toString() << rsLog; - auto_ptr<DBClientCursor> c; + BSONObj cfg; int v = -5; try { if( h.isSelf() ) { @@ -337,13 +336,28 @@ namespace mongo { } v = -4; - ScopedConn conn(h.toString()); - v = -3; - c = conn->query(rsConfigNs); - if( c.get() == 0 ) { - version = v; return; + unsigned long long count = 0; + try { + ScopedConn conn(h.toString()); + v = -3; + cfg = conn.findOne(rsConfigNs, Query()).getOwned(); + count = conn.count(rsConfigNs); + } + catch ( DBException& e) { + if ( !h.isSelf() ) { + throw; + } + + // on startup, socket is not listening yet + DBDirectClient cli; + cfg = cli.findOne( rsConfigNs, Query() ).getOwned(); + count = cli.count(rsConfigNs); } - if( !c->more() ) { + + if( count > 1 ) + uasserted(13109, str::stream() << "multiple rows in " << rsConfigNs << " not supported host: " << h.toString()); + + if( cfg.isEmpty() ) { version = EMPTYCONFIG; return; } @@ -355,9 +369,7 @@ namespace mongo { return; } - BSONObj o = c->nextSafe(); - uassert(13109, "multiple rows in " + rsConfigNs + " not supported", !c->more()); - from(o); + from(cfg); checkRsConfig(); _ok = true; log(level) << "replSet load config ok from " << (h.isSelf() ? "self" : h.toString()) << rsLog; |