void ReplSource::forceResync( const char *requester ) { BSONObj info; { dbtemprelease t; if (!oplogReader.connect(hostName, _me)) { msgassertedNoTrace( 14051 , "unable to connect to resync"); } /* todo use getDatabaseNames() method here */ bool ok = oplogReader.conn()->runCommand( "admin", BSON( "listDatabases" << 1 ), info ); massert( 10385 , "Unable to get database list", ok ); } BSONObjIterator i( info.getField( "databases" ).embeddedObject() ); while( i.moreWithEOO() ) { BSONElement e = i.next(); if ( e.eoo() ) break; string name = e.embeddedObject().getField( "name" ).valuestr(); if ( !e.embeddedObject().getBoolField( "empty" ) ) { if ( name != "local" ) { if ( only.empty() || only == name ) { resyncDrop( name.c_str(), requester ); } } } } syncedTo = OpTime(); addDbNextPass.clear(); save(); }
LinuxProc( ProcessId pid ) { char name[128]; sprintf( name , "/proc/%d/stat" , pid.asUInt32() ); FILE * f = fopen( name , "r"); if ( ! f ) { stringstream ss; ss << "couldn't open [" << name << "] " << errnoWithDescription(); string s = ss.str(); // help the assert# control uasserted( 13538 , s.c_str() ); msgassertedNoTrace( 13538 , s.c_str() ); } int found = fscanf(f, "%d %127s %c " "%d %d %d %d %d " "%lu %lu %lu %lu %lu " "%lu %lu %ld %ld " /* utime stime cutime cstime */ "%ld %ld " "%ld " "%ld " "%lu " /* start_time */ "%lu " "%ld " // rss "%lu %" KLF "u %" KLF "u %" KLF "u %" KLF "u %" KLF "u " /* "%*s %*s %*s %*s " "%"KLF"u %*lu %*lu " "%d %d " "%lu %lu" */ , &_pid, _comm, &_state, &_ppid, &_pgrp, &_session, &_tty, &_tpgid, &_flags, &_min_flt, &_cmin_flt, &_maj_flt, &_cmaj_flt, &_utime, &_stime, &_cutime, &_cstime, &_priority, &_nice, &_nlwp, &_alarm, &_start_time, &_vsize, &_rss, &_rss_rlim, &_start_code, &_end_code, &_start_stack, &_kstk_esp, &_kstk_eip /* &_wchan, &_exit_signal, &_processor, &_rtprio, &_sched */ ); if ( found == 0 ) { cout << "system error: reading proc info" << endl; } fclose( f ); }
virtual void recoverFromYield() { if ( _cc && !ClientCursor::recoverFromYield( _yieldData ) ) { _c.reset(); _cc.reset(); if ( _capped ) { msgassertedNoTrace( 13338, str::stream() << "capped cursor overrun: " << qp().ns() ); } else if ( qp().mustAssertOnYieldFailure() ) { msgassertedNoTrace( 15892, str::stream() << "QueryOptimizerCursorOp::recoverFromYield() failed to recover" ); } else { // we don't fail query since we're fine with returning partial data if collection dropped // also, see SERVER-2454 } } else { if ( _posBeforeYield != currLoc() ) { // If the yield advanced our position, the next next() will be a no op. _mustAdvance = false; } } }
/** * Returns true if the operation can continue. */ bool handleError(OperationContext* txn, const DBException& ex, const ParsedWriteOp& wholeOp, WriteResult* out) { LastError::get(txn->getClient()).setLastError(ex.getCode(), ex.getInfo().msg); auto& curOp = *CurOp::get(txn); curOp.debug().exceptionInfo = ex.getInfo(); if (ErrorCodes::isInterruption(ErrorCodes::Error(ex.getCode()))) { throw; // These have always failed the whole batch. } if (ErrorCodes::isStaleShardingError(ErrorCodes::Error(ex.getCode()))) { auto staleConfigException = dynamic_cast<const SendStaleConfigException*>(&ex); if (!staleConfigException) { // We need to get extra info off of the SCE, but some common patterns can result in the // exception being converted to a Status then rethrown as a UserException, losing the // info we need. It would be a bug if this happens so we want to detect it in testing, // but it isn't severe enough that we should bring down the server if it happens in // production. dassert(staleConfigException); msgassertedNoTrace(35475, str::stream() << "Got a StaleConfig error but exception was the wrong type: " << demangleName(typeid(ex))); } ShardingState::get(txn) ->onStaleShardVersion(txn, wholeOp.ns, staleConfigException->getVersionReceived()); out->staleConfigException = stdx::make_unique<SendStaleConfigException>(*staleConfigException); return false; } out->results.emplace_back(ex.toStatus()); return wholeOp.continueOnError; }
void msgassertedNoTrace(int msgid, const std::string& msg) { msgassertedNoTrace(msgid, msg.c_str()); }
ReplSetConfig::ReplSetConfig(const HostAndPort& h) { clear(); int level = 2; DEV level = 0; BSONObj cfg; int v = -5; try { if( h.isSelf() ) { ; } else { /* first, make sure other node is configured to be a replset. just to be safe. */ string setname = cmdLine.ourSetName(); BSONObj cmd = BSON( "replSetHeartbeat" << setname ); int theirVersion; BSONObj info; log() << "trying to contact " << h.toString() << rsLog; bool ok = requestHeartbeat(setname, "", h.toString(), info, -2, theirVersion); if( info["rs"].trueValue() ) { // yes, it is a replicate set, although perhaps not yet initialized } else { if( !ok ) { log() << "replSet TEMP !ok heartbeating " << h.toString() << " on cfg load" << rsLog; if( !info.isEmpty() ) log() << "replSet info " << h.toString() << " : " << info.toString() << rsLog; return; } { stringstream ss; ss << "replSet error: member " << h.toString() << " is not in --replSet mode"; msgassertedNoTrace(13260, ss.str().c_str()); // not caught as not a user exception - we want it not caught //for python err# checker: uassert(13260, "", false); } } } v = -4; unsigned long long count = 0; try { ScopedConn conn(h.toString()); v = -3; cfg = conn.findOne(rsConfigNs, Query()).getOwned(); count = conn.count(rsConfigNs); } catch ( DBException& ) { if ( !h.isSelf() ) { throw; } // on startup, socket is not listening yet DBDirectClient cli; cfg = cli.findOne( rsConfigNs, Query() ).getOwned(); count = cli.count(rsConfigNs); } if( count > 1 ) uasserted(13109, str::stream() << "multiple rows in " << rsConfigNs << " not supported host: " << h.toString()); if( cfg.isEmpty() ) { version = EMPTYCONFIG; return; } version = -1; } catch( DBException& e) { version = v; log(level) << "replSet load config couldn't get from " << h.toString() << ' ' << e.what() << rsLog; return; } from(cfg); checkRsConfig(); _ok = true; log(level) << "replSet load config ok from " << (h.isSelf() ? "self" : h.toString()) << rsLog; }
void FileAllocator::checkFailure() { if (_failed) { // we want to log the problem (diskfull.js expects it) but we do not want to dump a stack tracke msgassertedNoTrace( 12520, "new file allocation failure" ); } }
void msgassertedNoTraceWithStatus(int msgid, const Status& status) { msgassertedNoTrace(msgid, status.toString()); }