/** * Choose a member to sync from. * * The initalSync option is an object with 1 k/v pair: * * "state" : 1|2 * "name" : "host" * "_id" : N * "optime" : t * * All except optime are exact matches. "optime" will find a secondary with * an optime >= to the optime given. */ const Member* ReplSetImpl::getMemberToSyncTo() { BSONObj sync = myConfig().initialSync; bool secondaryOnly = false, isOpTime = false; char *name = 0; int id = -1; OpTime optime; StateBox::SP sp = box.get(); assert( !sp.state.primary() ); // wouldn't make sense if we were. // if it exists, we've already checked that these fields are valid in // rs_config.cpp if ( !sync.isEmpty() ) { if (sync.hasElement("state")) { if (sync["state"].Number() == 1) { if (sp.primary) { sethbmsg( str::stream() << "syncing to primary: " << sp.primary->fullName(), 0); return const_cast<Member*>(sp.primary); } else { sethbmsg("couldn't clone from primary"); return NULL; } } else { secondaryOnly = true; } } if (sync.hasElement("name")) { name = (char*)sync["name"].valuestr(); } if (sync.hasElement("_id")) { id = (int)sync["_id"].Number(); } if (sync.hasElement("optime")) { isOpTime = true; optime = sync["optime"]._opTime(); } } for( Member *m = head(); m; m = m->next() ) { if (!m->hbinfo().up() || (m->state() != MemberState::RS_SECONDARY && m->state() != MemberState::RS_PRIMARY) || (secondaryOnly && m->state() != MemberState::RS_SECONDARY) || (id != -1 && (int)m->id() != id) || (name != 0 && strcmp(name, m->fullName().c_str()) != 0) || (isOpTime && optime >= m->hbinfo().opTime)) { continue; } sethbmsg( str::stream() << "syncing to: " << m->fullName(), 0); return const_cast<Member*>(m); } sethbmsg( str::stream() << "couldn't find a member matching the sync criteria: " << "\nstate? " << (secondaryOnly ? "2" : "none") << "\nname? " << (name ? name : "none") << "\n_id? " << id << "\noptime? " << optime.toStringPretty() ); return NULL; }
HealthData::HealthData(Member& trainee) : membershipID(trainee.getMembershipID()), height(trainee.getHeight()), weight(trainee.getWeight()) { }
static int delegate_handler( Member* member, CAtom* atom, PyObject* value ) { Member* delegate = member_cast( member->setattr_context ); return delegate->setattr( atom, value ); }
Member* ReplSetImpl::getMemberToSyncTo() { lock lk(this); bool buildIndexes = true; // if we have a target we've requested to sync from, use it if (_forceSyncTarget) { Member* target = _forceSyncTarget; _forceSyncTarget = 0; sethbmsg( str::stream() << "syncing to: " << target->fullName() << " by request", 0); return target; } // wait for 2N pings before choosing a sync target if (_cfg) { int needMorePings = config().members.size()*2 - HeartbeatInfo::numPings; if (needMorePings > 0) { OCCASIONALLY log() << "waiting for " << needMorePings << " pings from other members before syncing" << endl; return NULL; } buildIndexes = myConfig().buildIndexes; } // find the member with the lowest ping time that has more data than me // Find primary's oplog time. Reject sync candidates that are more than // MAX_SLACK_TIME seconds behind. OpTime primaryOpTime; static const unsigned maxSlackDurationSeconds = 10 * 60; // 10 minutes const Member* primary = box.getPrimary(); if (primary) primaryOpTime = primary->hbinfo().opTime; else // choose a time that will exclude no candidates, since we don't see a primary primaryOpTime = OpTime(maxSlackDurationSeconds, 0); if ( primaryOpTime.getSecs() < maxSlackDurationSeconds ) { // erh - I think this means there was just a new election // and we don't yet know the new primary's optime primaryOpTime = OpTime(maxSlackDurationSeconds, 0); } OpTime oldestSyncOpTime(primaryOpTime.getSecs() - maxSlackDurationSeconds, 0); Member *closest = 0; time_t now = 0; // Make two attempts. The first attempt, we ignore those nodes with // slave delay higher than our own. The second attempt includes such // nodes, in case those are the only ones we can reach. // This loop attempts to set 'closest'. for (int attempts = 0; attempts < 2; ++attempts) { for (Member *m = _members.head(); m; m = m->next()) { if (!m->hbinfo().up()) continue; // make sure members with buildIndexes sync from other members w/indexes if (buildIndexes && !m->config().buildIndexes) continue; if (!m->state().readable()) continue; if (m->state() == MemberState::RS_SECONDARY) { // only consider secondaries that are ahead of where we are if (m->hbinfo().opTime <= lastOpTimeWritten) continue; // omit secondaries that are excessively behind, on the first attempt at least. if (attempts == 0 && m->hbinfo().opTime < oldestSyncOpTime) continue; } // omit nodes that are more latent than anything we've already considered if (closest && (m->hbinfo().ping > closest->hbinfo().ping)) continue; if ( attempts == 0 && myConfig().slaveDelay < m->config().slaveDelay ) { continue; // skip this one in the first attempt } map<string,time_t>::iterator vetoed = _veto.find(m->fullName()); if (vetoed != _veto.end()) { // Do some veto housekeeping if (now == 0) { now = time(0); } // if this was on the veto list, check if it was vetoed in the last "while". // if it was, skip. if (vetoed->second >= now) { if (time(0) % 5 == 0) { log() << "replSet not trying to sync from " << (*vetoed).first << ", it is vetoed for " << ((*vetoed).second - now) << " more seconds" << rsLog; } continue; } _veto.erase(vetoed); // fall through, this is a valid candidate now } // This candidate has passed all tests; set 'closest' closest = m; } if (closest) break; // no need for second attempt } if (!closest) { return NULL; } sethbmsg( str::stream() << "syncing to: " << closest->fullName(), 0); return closest; }
void ConditionEventListener::handleEvent(ExecutionContext*, Event* event) { if (!m_animation) return; m_animation->handleConditionEvent(event, m_condition); }
void ReplSetImpl::_summarizeStatus(BSONObjBuilder& b) const { vector<BSONObj> v; const Member *_self = this->_self; assert( _self ); // add self { BSONObjBuilder bb; bb.append("_id", (int) _self->id()); bb.append("name", _self->fullName()); bb.append("health", 1.0); bb.append("state", (int) box.getState().s); bb.append("stateStr", box.getState().toString()); bb.appendTimestamp("optime", lastOpTimeWritten.asDate()); bb.appendDate("optimeDate", lastOpTimeWritten.getSecs() * 1000LL); string s = _self->lhb(); if( !s.empty() ) bb.append("errmsg", s); bb.append("self", true); v.push_back(bb.obj()); } Member *m =_members.head(); while( m ) { BSONObjBuilder bb; bb.append("_id", (int) m->id()); bb.append("name", m->fullName()); double h = m->hbinfo().health; bb.append("health", h); bb.append("state", (int) m->state().s); if( h == 0 ) { // if we can't connect the state info is from the past and could be confusing to show bb.append("stateStr", "(not reachable/healthy)"); } else { bb.append("stateStr", m->state().toString()); } bb.append("uptime", (unsigned) (m->hbinfo().upSince ? (time(0)-m->hbinfo().upSince) : 0)); bb.appendTimestamp("optime", m->hbinfo().opTime.asDate()); bb.appendDate("optimeDate", m->hbinfo().opTime.getSecs() * 1000LL); bb.appendTimeT("lastHeartbeat", m->hbinfo().lastHeartbeat); bb.append("ping", m->hbinfo().ping); string s = m->lhb(); if( !s.empty() ) bb.append("errmsg", s); v.push_back(bb.obj()); m = m->next(); } sort(v.begin(), v.end()); b.append("set", name()); b.appendTimeT("date", time(0)); b.append("myState", box.getState().s); if (_currentSyncTarget) { b.append("syncingTo", _currentSyncTarget->fullName()); } b.append("members", v); if( replSetBlind ) b.append("blind",true); // to avoid confusion if set...normally never set except for testing. }
int viewLodging(Member & member) //예약확인 { system("clear"); RoomList rl; int memnum; memnum = member.getMNumber(); fileIO::loadBookUser(rl, memnum); Room a = rl.getFirstRoom(); int size = rl.getSize(); int y,m,d,p, r, l, person; int x = 1; cout << "******************************************************************************" <<endl; cout << " 나의 예약 현황" <<endl; cout << "******************************************************************************" <<endl; if( size > 0 ) { y = a.getMYear(); m = a.getMMonth(); d = a.getMDay(); p = a.getMPeriod(); r = a.getRNumber(); person = a.getMPerson(); l = a.getLNumber(); cout << " Hotel Number : " << l <<endl; cout << " RNUMBER : " << r << endl; cout << " HEAD COUNT : " << person << endl; cout << " DATE : "<< y << " " << m << " " << d << "부터 " << p << "일 동안" << endl; cout << "----------------------------------------------------------------------------" <<endl; } while ( x < size ) { Room b = rl.getNextRoom(); y = b.getMYear(); m = b.getMMonth(); d = b.getMDay(); p = b.getMPeriod(); r = b.getRNumber(); l = a.getLNumber(); cout << " Hotel Number : " << l <<endl; cout << " RNUMBER : " << r << endl; cout << " HEAD COUNT : " << person << endl; cout << " DATE : "<< y << " " << m << " " << d << "부터 " << p << "일 동안" << endl; cout << "----------------------------------------------------------------------------" <<endl; x++; } cin.ignore(1024, '\n'); }
bool Consensus::aMajoritySeemsToBeUp() const { int vUp = rs._self->config().votes; for( Member *m = rs.head(); m; m=m->next() ) vUp += m->hbinfo().up() ? m->config().votes : 0; return vUp * 2 > _totalVotes(); }
void ReplSetImpl::_getTargets(list<Target>& L, int& configVersion) { configVersion = config().version; for( Member *m = head(); m; m=m->next() ) if( m->hbinfo().maybeUp() ) L.push_back( Target(m->fullName()) ); }
static int delegate_handler( Member* member, CAtom* atom ) { Member* delegate = member_cast( member->delattr_context ); return delegate->delattr( atom ); }
/** @param reconf true if this is a reconfiguration and not an initial load of the configuration. @return true if ok; throws if config really bad; false if config doesn't include self */ bool ReplSetImpl::initFromConfig(ReplSetConfig& c, bool reconf) { /* NOTE: haveNewConfig() writes the new config to disk before we get here. So we cannot error out at this point, except fatally. Check errors earlier. */ lock lk(this); if( getLastErrorDefault || !c.getLastErrorDefaults.isEmpty() ) { // see comment in dbcommands.cpp for getlasterrordefault getLastErrorDefault = new BSONObj( c.getLastErrorDefaults ); } list<const ReplSetConfig::MemberCfg*> newOnes; bool additive = reconf; { unsigned nfound = 0; int me = 0; for( vector<ReplSetConfig::MemberCfg>::iterator i = c.members.begin(); i != c.members.end(); i++ ) { const ReplSetConfig::MemberCfg& m = *i; if( m.h.isSelf() ) { nfound++; me++; if( !reconf || (_self && _self->id() == (unsigned) m._id) ) ; else { log() << "replSet " << _self->id() << ' ' << m._id << rsLog; assert(false); } } else if( reconf ) { const Member *old = findById(m._id); if( old ) { nfound++; assert( (int) old->id() == m._id ); if( old->config() == m ) { additive = false; } } else { newOnes.push_back(&m); } } } if( me == 0 ) { // log() << "replSet config : " << _cfg->toString() << rsLog; log() << "replSet error self not present in the repl set configuration:" << rsLog; log() << c.toString() << rsLog; uasserted(13497, "replSet error self not present in the configuration"); } uassert( 13302, "replSet error self appears twice in the repl set configuration", me<=1 ); if( reconf && config().members.size() != nfound ) additive = false; } _cfg = new ReplSetConfig(c); assert( _cfg->ok() ); assert( _name.empty() || _name == _cfg->_id ); _name = _cfg->_id; assert( !_name.empty() ); if( additive ) { log() << "replSet info : additive change to configuration" << rsLog; for( list<const ReplSetConfig::MemberCfg*>::const_iterator i = newOnes.begin(); i != newOnes.end(); i++ ) { const ReplSetConfig::MemberCfg* m = *i; Member *mi = new Member(m->h, m->_id, m, false); /** we will indicate that new members are up() initially so that we don't relinquish our primary state because we can't (transiently) see a majority. they should be up as we check that new members are up before getting here on reconfig anyway. */ mi->get_hbinfo().health = 0.1; _members.push(mi); startHealthTaskFor(mi); } return true; } // start with no members. if this is a reconfig, drop the old ones. _members.orphanAll(); endOldHealthTasks(); int oldPrimaryId = -1; { const Member *p = box.getPrimary(); if( p ) oldPrimaryId = p->id(); } forgetPrimary(); setSelfTo(0); for( vector<ReplSetConfig::MemberCfg>::iterator i = _cfg->members.begin(); i != _cfg->members.end(); i++ ) { const ReplSetConfig::MemberCfg& m = *i; Member *mi; if( m.h.isSelf() ) { assert( _self == 0 ); mi = new Member(m.h, m._id, &m, true); setSelfTo(mi); if( (int)mi->id() == oldPrimaryId ) box.setSelfPrimary(mi); } else { mi = new Member(m.h, m._id, &m, false); _members.push(mi); startHealthTaskFor(mi); if( (int)mi->id() == oldPrimaryId ) box.setOtherPrimary(mi); } } return true; }
/** @param reconf true if this is a reconfiguration and not an initial load of the configuration. @return true if ok; throws if config really bad; false if config doesn't include self */ bool ReplSetImpl::initFromConfig(ReplSetConfig& c, bool reconf) { /* NOTE: haveNewConfig() writes the new config to disk before we get here. So we cannot error out at this point, except fatally. Check errors earlier. */ lock lk(this); if( getLastErrorDefault || !c.getLastErrorDefaults.isEmpty() ) { // see comment in dbcommands.cpp for getlasterrordefault getLastErrorDefault = new BSONObj( c.getLastErrorDefaults ); } list<const ReplSetConfig::MemberCfg*> newOnes; // additive short-cuts the new config setup. If we are just adding a // node/nodes and nothing else is changing, this is additive. If it's // not a reconfig, we're not adding anything bool additive = reconf; { unsigned nfound = 0; int me = 0; for( vector<ReplSetConfig::MemberCfg>::iterator i = c.members.begin(); i != c.members.end(); i++ ) { const ReplSetConfig::MemberCfg& m = *i; if( m.h.isSelf() ) { me++; } if( reconf ) { if (m.h.isSelf() && (!_self || (int)_self->id() != m._id)) { log() << "self doesn't match: " << m._id << rsLog; assert(false); } const Member *old = findById(m._id); if( old ) { nfound++; assert( (int) old->id() == m._id ); if( old->config() != m ) { additive = false; } } else { newOnes.push_back(&m); } } } if( me == 0 ) { _members.orphanAll(); // hbs must continue to pick up new config // stop sync thread box.set(MemberState::RS_STARTUP, 0); // go into holding pattern log() << "replSet error self not present in the repl set configuration:" << rsLog; log() << c.toString() << rsLog; return false; } uassert( 13302, "replSet error self appears twice in the repl set configuration", me<=1 ); // if we found different members that the original config, reload everything if( reconf && config().members.size() != nfound ) additive = false; } _cfg = new ReplSetConfig(c); assert( _cfg->ok() ); assert( _name.empty() || _name == _cfg->_id ); _name = _cfg->_id; assert( !_name.empty() ); // this is a shortcut for simple changes if( additive ) { log() << "replSet info : additive change to configuration" << rsLog; for( list<const ReplSetConfig::MemberCfg*>::const_iterator i = newOnes.begin(); i != newOnes.end(); i++ ) { const ReplSetConfig::MemberCfg* m = *i; Member *mi = new Member(m->h, m->_id, m, false); /** we will indicate that new members are up() initially so that we don't relinquish our primary state because we can't (transiently) see a majority. they should be up as we check that new members are up before getting here on reconfig anyway. */ mi->get_hbinfo().health = 0.1; _members.push(mi); startHealthTaskFor(mi); } return true; } // start with no members. if this is a reconfig, drop the old ones. _members.orphanAll(); endOldHealthTasks(); int oldPrimaryId = -1; { const Member *p = box.getPrimary(); if( p ) oldPrimaryId = p->id(); } forgetPrimary(); // not setting _self to 0 as other threads use _self w/o locking int me = 0; // For logging string members = ""; for( vector<ReplSetConfig::MemberCfg>::iterator i = _cfg->members.begin(); i != _cfg->members.end(); i++ ) { const ReplSetConfig::MemberCfg& m = *i; Member *mi; members += ( members == "" ? "" : ", " ) + m.h.toString(); if( m.h.isSelf() ) { assert( me++ == 0 ); mi = new Member(m.h, m._id, &m, true); setSelfTo(mi); if( (int)mi->id() == oldPrimaryId ) box.setSelfPrimary(mi); } else { mi = new Member(m.h, m._id, &m, false); _members.push(mi); startHealthTaskFor(mi); if( (int)mi->id() == oldPrimaryId ) box.setOtherPrimary(mi); } } if( me == 0 ) { log() << "replSet warning did not detect own host in full reconfig, members " << members << " config: " << c << rsLog; } return true; }
void SecurityManager::loadMembers() { if (isSql()) { loadSqlMembers(); return; } const char *path = "serverdb/members.txt"; const char *backup = "serverdb/members.backup.txt"; { QDir d; d.mkdir("serverdb"); } if (!QFile::exists(path) && QFile::exists(backup)) { QFile::rename(backup, path); } memberFile.setFileName(path); if (!memberFile.open(QFile::ReadWrite)) { throw QObject::tr("Error: cannot open the file that contains the members (%1)").arg(path); } int pos = memberFile.pos(); while (!memberFile.atEnd()) { QByteArray arr = memberFile.readLine(); QString s = QString::fromUtf8(arr.constData(), std::max(0,arr.length()-1)); //-1 to remove the \n QStringList ls = s.split('%'); if (ls.size() >= 6 && isValid(ls[0])) { Member m (ls[0], ls[1].trimmed(), ls[2][0].toLatin1() - '0', ls[2][1] == '1', ls[3].trimmed().toLatin1(), ls[4].trimmed().toLatin1(), ls[5].trimmed()); if (ls.size() >= 7) { m.ban_expire_time = ls[6].toInt(); } m.filepos = pos; members[ls[0]] = m; /* Update pos for next iteration */ pos = memberFile.pos(); if (m.isBanned()) { bannedIPs.insert(m.ip, m.ban_expire_time); bannedMembers.insert(m.name.toLower(), std::pair<QString, int>(m.ip, m.ban_expire_time)); } if (m.authority() > 0) { authed.insert(m.name); } playersByIp.insert(m.ip, m.name); } lastPlace = memberFile.pos(); } //We also clean up the file by rewritting it with only the valid contents QFile temp (backup); if (!temp.open(QFile::WriteOnly | QFile::Truncate)) throw QObject::tr("Impossible to change %1").arg(backup); pos = temp.pos(); for(auto it = members.begin(); it != members.end(); ++it) { Member &m = it->second; m.write(&temp); m.filepos = pos; pos = temp.pos(); } lastPlace = temp.pos(); temp.flush(); memberFile.remove(); if (!temp.rename(path)) { throw QObject::tr("Error: cannot rename the file that contains the members (%1 -> %2)").arg(backup).arg(path); } temp.rename(path); if (!memberFile.open(QFile::ReadWrite)) { throw QObject::tr("Error: cannot reopen the file that contains the members (%1)").arg(path); } }
/// Given a Reflex::Member object, return the id for the configurable (name or id, if it is a string). /// non-string ids are used for the persistency (DataObjects) inline std::string getId(const Member & m) { return (m.Properties().HasProperty("id") && (m.Properties().PropertyValue("id").TypeInfo() == typeid(std::string))) ? m.Properties().PropertyAsString("id") : m.Properties().PropertyAsString("name") ; }
int Msm::epoll_pollin(int fd) { LOG(LOG_DEBUG, "socket: %d EPOLLIN event.", fd); char buf[1024]; memset(buf, 0, sizeof(buf)); // int rc = recv(events[n].data.fd, buf, sizeof(buf)-1, 0); struct msghdr msghdr; struct iovec iov; memset(&msghdr, 0, sizeof(msghdr)); iov.iov_base = buf; iov.iov_len = sizeof(buf); msghdr.msg_iov = &iov; msghdr.msg_iovlen = 1; int rc = recvmsg(fd, &msghdr, 0); if (rc == -1) { LOG(LOG_ERROR, "socket: %d recvmsg failed: %s", fd, strerror(errno)); return -1; } else if (rc == 0) { LOG(LOG_ERROR, "socket: %d recvmsg 0, socket is closed by user.", fd); if (get_member_byfd(fd) != NULL) { logout(get_member_byfd(fd)->get_id()); } return -1; } LOG(LOG_DEBUG, "socket: %d recvmsg:\n%s", fd, buf); Json::Value root; Json::Reader reader; if (reader.parse(buf, root, false) == false) { LOG(LOG_DEBUG, "json parse failed."); return -1; } if (epoll_closefd_before(root["action"].asString(), fd, root["user_id"].asString()) < 0) return -1; msm_msg_t msm_msg; msm_msg.sockfd = fd; msm_msg.root = root; msm_msg.msm = this; actions_handle.find(root["action"].asString())->second(msm_msg); #if 0 if (root["action"] == "login") { login(root["user_id"].asString(), root["user_name"].asString(), fd); // send_test(root["from"].asString()); } else if (root["action"] == "logout") { logout(root["user_id"].asString()); } else if (root["action"] == "heartbeat") { } else if (root["action"] == "askmeeting") { create_meeting(root["meeting_id"].asString(), root["meeting_name"].asString()); get_meeting(root["meeting_id"].asString())->add_member(get_member(root["user_id"].asString())); get_meeting(root["meeting_id"].asString())->set_admin(root["user_id"].asString()); } else if (root["action"] == "adduser") { if (get_meeting(root["meeting_id"].asString()) != NULL) { if (get_member(root["users"].asString()) == NULL) { Member *m = new Member(root["users"].asString(), "Unkown"); m->set_offline(); register_member(m); } get_meeting(root["meeting_id"].asString())->add_member(get_member(root["users"].asString())); } } else if (root["action"] == "leavemeeting") { Meeting *meeting = get_meeting(root["meeting_id"].asString()); if (meeting != NULL) { Member *m = get_member(root["user_id"].asString()); if (m->get_id() != meeting->get_admin()) { meeting->del_member(m); } else { destroy_meeting(meeting->get_id()); } } } else { } #endif epoll_closefd_after(root["action"].asString(), fd, root["user_id"].asString()); dump_members(); dump_meetings(); return 0; }
/************************************************************* * another kind of function that return a set ************************************************************/ std::vector<QueryTuple*> SetFunFactory::funInstance(XSchema* _pSch, std::string& _cubeName, SetTypesec _typesec, std::vector<std::string>& theVector, FunParam *param) { int size = theVector.size(); XCube* pCube = _pSch->getCube(_cubeName); vector<QueryMember*> QmemVector; vector<QueryTuple*> QtupleVector; string dimName = ""; string hieName = ""; Dimension* pDim = NULL; Hierarchy* pHie = NULL; if (isDimHie(theVector.at(0))) { vector<string> temp = distinct(theVector.at(0)); dimName = temp.at(0); pDim = pCube->getDimension(temp.at(0)); assert(pDim); hieName = temp.at(1); pHie = pDim->getHierarchy(temp.at(1)); assert(pHie); } else { dimName = theVector.at(0); pDim = pCube->getDimension(theVector.at(0)); assert(pDim); pHie = pDim->getDefaultHierarchy(); } assert(pHie); hieName = pHie->getName(); //首先把Member从数据库中load出来 pHie->LoadMembers(); switch(_typesec) { //函数Members的处理对象 //对于[Time].[Time].[1995].[Q1].[Month].Members //theVector中应依次存有string:Time, Time, 1995, Q1, Month case Members: if (size == 0 ) { cout<<"error! please input query information..."<<endl; } else if (size == 1) //由于现在还不支持多个Hierarchy,所以size 为1、2结果是一样的 { if ((theVector.at(0) == "Measures")||(theVector.at(0) == "measures")) { //元数据现在还没有支持默认度量,先以第一个度量为默认的 vector<Measure*> vecMea = pCube->getMeasures(); vector<Measure*>::iterator meaIterator; if (!vecMea.empty()) { for (meaIterator = vecMea.begin(); meaIterator < vecMea.end(); meaIterator++) { std::auto_ptr<QueryMember>pMem(new QueryMember); pMem->setHierarchyName("Measures"); pMem->setLevelName("Measures"); pMem->setVal((*meaIterator)->getName()); QmemVector.push_back(pMem.release()); std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector)); QmemVector.pop_back(); QtupleVector.push_back(pTuple.release()); } } return QtupleVector; } else { string hierarcyName = pHie->getName(); vector<string> vecLevelName; // vector< vector<string> > memNameInLevels;//用于存储每个Level上成员名字的vector vector<Level*> vecLevel = pHie->getLeveles(); Member* temp = (vecLevel.at(0)->getMembers()).at(0);//获取第一个级别第一个成员 getDescendants(temp,dimName,hieName,QtupleVector); // 获取该成员的所有后代 pHie->CleanMembers(); return QtupleVector; } } else if (size == 2) { Level* pLevel = pHie->getLevel(theVector.at(1)); vector<Member *> memVector1 = pLevel->getMembers(); if (memVector1.empty()) { cout<<"empty member vector,do not get the members from database"<<endl; } else { vector<Member*>::iterator theIterator; QueryMember *pMem; for (theIterator = memVector1.begin(); theIterator < memVector1.end(); theIterator++) { pMem = DwMemToQryMem(*theIterator,dimName,hieName); QmemVector.push_back(pMem); std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector)); QmemVector.pop_back(); QtupleVector.push_back(pTuple.release()); } pHie->CleanMembers(); return QtupleVector; } } else if(size >= 3) // [Time.Time].[Month].[Day].Members { cout<<"Members funtion error,too much member"<<endl; return 0; } break; //函数AllMembers,参考SQL Server联机丛书 //返回包含指定维度或级别的所有成员的集合,包括计算成员。 //注:暂时不考虑计算成员的处理,此时功能和Members功能差不多 case AllMembers: if (size == 0 ) { cout<<"error! please input the query information!"<<endl; } else { if (size == 1) { std::auto_ptr<QueryMember>pMem(new QueryMember); pMem->setVal("All"); pMem->setDimensionName(dimName); // add by eason pMem->setHierarchyName(hieName); pMem->setLevelName("All"); QmemVector.push_back(pMem.release()); std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector)); QmemVector.pop_back(); QtupleVector.push_back(pTuple.release()); return QtupleVector; } else if(size == 2)//[Time].[Quarter].AllMembers { pHie->LoadMembers(); //首先把Member从数据库中load出来 add by eason Level* pLevel = pHie->getLevel(theVector.at(size-1)); vector<Member*> memVector = pLevel->getMembers(); vector<Member*>::iterator theIterator; QueryMember *pMem; for (theIterator = memVector.begin(); theIterator < memVector.end(); theIterator++) { pMem = DwMemToQryMem(*theIterator,dimName,hieName); QmemVector.push_back(pMem); std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector)); QmemVector.pop_back(); QtupleVector.push_back(pTuple.release()); } pHie->CleanMembers(); return QtupleVector; } else //[Time].[Year].[Month].AllMembers { cout<<"AllMembers funtion error,too much member"<<endl; return 0; } } break; case Children: { //注:JPivot里面是不可能出现这种情况的 //因为一旦出现,JPivot会自动转化成加一个CurrentMember函数 //如:[Time].Children会自动转变成[Time].CurrentMember.Children bool isall = false; if (size == 1) { cout<<"error! invalid using of Children"<<endl; } else { vector<Level*> levelVec = pHie->getLeveles(); Member* mem = levelVec.at(0)->getMember(theVector.at(1), 0); for (int i = 1; i < size-1; i++) { mem = levelVec.at(i)->getMember(theVector.at(i+1), mem); } vector<Member*> memVec = mem->getChildrenMember(); vector<Member*>::iterator memIterator; QueryMember * ptr; for (memIterator = memVec.begin(); memIterator < memVec.end(); memIterator++) { ptr = DwMemToQryMem(*memIterator,dimName,hieName); QmemVector.push_back(ptr); std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector)); QmemVector.pop_back(); QtupleVector.push_back(pTuple.release()); } pHie->CleanMembers(); return QtupleVector; } break; } //下一个函数起点 case Siblings: if(size >= 2){ vector<Level*> levelVec = pHie->getLeveles(); Level *pLevel = levelVec.at(0); Member* temp = levelVec.at(0)->getMember(theVector.at(1), 0); for (int i = 1; i < size-1; i++) { temp = levelVec.at(i)->getMember(theVector.at(i+1), temp); pLevel = levelVec.at(i); //兄弟成员所在的level } Member* pMem = temp->getParent(); vector<Member *> memVec; if(!pMem) //不存在父成员,如Time.1998 { memVec = pLevel->getMembers(); } else { memVec = pMem->getChildrenMember(); } vector<Member *>::iterator memIterator; QueryMember *ptr; for(memIterator = memVec.begin();memIterator != memVec.end();memIterator++) { ptr = DwMemToQryMem(*memIterator,dimName,hieName); QmemVector.push_back(ptr); std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector)); QmemVector.pop_back(); QtupleVector.push_back(pTuple.release()); } pHie->CleanMembers(); return QtupleVector; } else { cout<<"Siblings funtion error,too less member"<<endl; return 0; } break; case Descendants: { Level *ancLevel; //先代成员所在的level Level *decLevel; //后代成员所在的level vector<Level*> levelVec = pHie->getLeveles(); Member* ancMember = levelVec.at(0)->getMember(theVector.at(1), 0); //定位目标成员 for (int i = 1; i < size-1; i++) { ancMember = levelVec.at(i)->getMember(theVector.at(i+1), ancMember); ancLevel = levelVec.at(i); } if(param->getHasIntParam() || param->getHasStrParam()) { if(param->getHasIntParam()) //如果包含数字型参数 { int num = param->getIntParam(); decLevel = ancLevel; if(num>0) { // 定位目标级别 for(int j=0;j<num;j++) { decLevel = decLevel ->getChildLevel(); assert(decLevel); //不存在该级别 } } } if(param->getHasStrParam()) //如果包含字符型参数 { char *str = param->getStrParam(); // 定位目标级别 decLevel = pHie->getLevel(str); assert(decLevel); //不存在该级别 } vector<Member *> _mem = decLevel->getMembers(); vector<QueryMember*> QmemVector; QueryMember* ancMem = DwMemToQryMem(ancMember,dimName,hieName); QueryMember* decMem; for(int i = 0; i< _mem.size(); i++) { decMem = DwMemToQryMem(_mem.at(i),dimName,hieName); //此处仍可改进,没必要遍历级别上的所有成员 if(isAncestor(ancMem, decMem)) { QmemVector.push_back(decMem); std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector)); QmemVector.pop_back(); QtupleVector.push_back(pTuple.release()); } } } else //如果不含参数 { getDescendants(ancMember,dimName,hieName,QtupleVector); } pHie->CleanMembers(); return QtupleVector; } break; case Ascendants: { vector<Level*> levelVec = pHie->getLeveles(); Member* decMember = levelVec.at(0)->getMember(theVector.at(1), 0); //定位目标成员 for (int i = 1; i < size-1; i++) { decMember = levelVec.at(i)->getMember(theVector.at(i+1), decMember); assert(decMember); } vector<QueryMember*> QmemVector; QueryMember * ancQryMem; Member* ancMember = decMember ; while(ancMember) { ancQryMem = DwMemToQryMem(ancMember,dimName,hieName); QmemVector.push_back(ancQryMem); std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector)); QmemVector.pop_back(); QtupleVector.push_back(pTuple.release()); ancMember = ancMember->getParent(); } pHie->CleanMembers(); return QtupleVector; } break; } }
void ReplSetImpl::_summarizeAsHtml(stringstream& s) const { s << table(0, false); s << tr("Set name:", _name); s << tr("Majority up:", elect.aMajoritySeemsToBeUp()?"yes":"no" ); s << _table(); const char *h[] = {"Member", "<a title=\"member id in the replset config\">id</a>", "Up", "<a title=\"length of time we have been continuously connected to the other member with no reconnects (for self, shows uptime)\">cctime</a>", "<a title=\"when this server last received a heartbeat response - includes error code responses\">Last heartbeat</a>", "Votes", "Priority", "State", "Messages", "<a title=\"how up to date this server is. this value polled every few seconds so actually lag is typically much lower than value shown here.\">optime</a>", "<a title=\"Clock skew in seconds relative to this server. Informational; server clock variances will make the diagnostics hard to read, but otherwise are benign..\">skew</a>", 0 }; s << table(h); /* this is to sort the member rows by their ordinal _id, so they show up in the same order on all the different web ui's; that is less confusing for the operator. */ map<int,string> mp; string myMinValid; try { readlocktry lk("local.replset.minvalid", 300); if( lk.got() ) { BSONObj mv; if( Helpers::getSingleton("local.replset.minvalid", mv) ) { myMinValid = "minvalid:" + mv["ts"]._opTime().toString(); } } else myMinValid = "."; } catch(...) { myMinValid = "exception fetching minvalid"; } const Member *_self = this->_self; assert(_self); { stringstream s; /* self row */ s << tr() << td(_self->fullName() + " (me)") << td(_self->id()) << td("1") << //up td(ago(started)) << td("") << // last heartbeat td(ToString(_self->config().votes)) << td(ToString(_self->config().priority)) << td( stateAsHtml(box.getState()) + (_self->config().hidden?" (hidden)":"") ); s << td( _hbmsg ); stringstream q; q << "/_replSetOplog?_id=" << _self->id(); s << td( a(q.str(), myMinValid, theReplSet->lastOpTimeWritten.toString()) ); s << td(""); // skew s << _tr(); mp[_self->hbinfo().id()] = s.str(); } Member *m = head(); while( m ) { stringstream s; m->summarizeMember(s); mp[m->hbinfo().id()] = s.str(); m = m->next(); } for( map<int,string>::const_iterator i = mp.begin(); i != mp.end(); i++ ) s << i->second; s << _table(); }
bool JoinMembers::init() { CCLayer::init(); this->setTouchEnabled(true); schedule(schedule_selector(JoinMembers::update)); goalPoint = ccp(240, 160); Member* findingUser = new Member(); findingUser->initWithFile("search_finding.png"); findingUser->autorelease(); findingUser->setPosition(ccp(240, 225 + 20.f)); findingUser->goalPoint = findingUser->getPosition(); findingUser->startPoint = findingUser->getPosition(); findingUser->runAction(CCRepeatForever::create(CCSequence::createWithTwoActions(CCFadeOut::create(1.f), CCFadeIn ::create(1.f)))); // findingUser->isGoal = true; addChild(findingUser); members.push_back(findingUser); allUser = new Member(); allUser->initWithFile("search_user.png"); allUser->setPosition(ccp(240, 176 + 20.f)); allUser->goalPoint = allUser->getPosition(); allUser->startPoint = allUser->getPosition(); addChild(allUser); // allUser->isGoal = true; members.push_back(allUser); Member* me = new Member(); me->initWithFile("search_me.png"); me->autorelease(); // me->setScale(2.f); // me->isGoal = true; me->setPosition(ccp(240, 145 + 20.f)); me->goalPoint = me->getPosition(); me->startPoint = me->getPosition(); addChild(me); members.push_back(me); CCSprite* flag = CCSprite::createWithSpriteFrameName((NSDefault::getCountry() + ".png").c_str()); flag->setPosition(ccp(28, 22)); me->addChild(flag); CCLabelTTF* userName = CCLabelTTF::create(NSDefault::getUserName().c_str(), defaultFont, 13.f); userName->setColor(ccc3(0,0,0)); me->addChild(userName); userName->setAnchorPoint(ccp(0.f, 0.5f)); userName->setPosition(ccp(55, 21)); Member* progressBack = new Member(); progressBack->initWithFile("search_back.png"); progressBack->autorelease(); progressBack->setPosition(ccp(240, 202 + 20.f)); progressBack->startPoint = progressBack->goalPoint = progressBack->getPosition(); addChild(progressBack); members.push_back(progressBack); progress = CCProgressTimer::create(CCSprite::create("search_front.png")); progress->setBarChangeRate(ccp(1, 0)); progress->setMidpoint(ccp(0, 0.5f)); progress->setType(CCProgressTimerType::kCCProgressTimerTypeBar); progress->setPosition(ccp(240, 202 + 20.f)); progress->setPercentage(0.f); addChild(progress); return true; }
int bookRoom(Lodging &lodging, Member & member) { cout << endl <<endl << endl; cout << "RESERVATION START" << endl; string y, m, d, peri, per,r; int year, month, day, period, person, rnumber, user; int checkerror; cout << " ROOM NUMBER : "; getline(cin, r); cout << endl; rnumber = atoi(r.c_str()); cout << " PERSON : "; getline(cin, per); person = atoi(per.c_str()); cout << endl; cout << " YEAR : " ; getline(cin, y); year = atoi(y.c_str()); cout << endl; cout << " MONTH : "; getline(cin, m); month = atoi(m.c_str()); cout << endl; cout << " DAY : "; getline(cin, d); day = atoi(d.c_str()); cout << endl; cout << " PERIOD : "; getline(cin, peri); period = atoi(peri.c_str()); cout << endl; user =member.getMNumber(); checkerror = fileIO::saveBook(lodging.getLNumber(), rnumber, year, month, day, period, person, user); if ( checkerror == -1 ) { cin.ignore(1024, '\n'); cout << "FAIL" <<endl; cin.ignore(1024, '\n'); } else { system("clear"); cin.ignore(1024, '\n'); cout << "******************************************************************************" <<endl; cout << " RESERVATION COMPLETE" << endl; cout << "******************************************************************************" <<endl; cout << endl << endl << endl; cout << " Go to MAIN MENU" << endl; cin.ignore(1024, '\n'); return 3; } }
void ReplSetImpl::_summarizeStatus(BSONObjBuilder& b) const { vector<BSONObj> v; const Member *_self = this->_self; verify( _self ); MemberState myState = box.getState(); // add self { BSONObjBuilder bb; bb.append("_id", (int) _self->id()); bb.append("name", _self->fullName()); bb.append("health", 1.0); bb.append("state", (int)myState.s); bb.append("stateStr", myState.toString()); bb.append("uptime", (unsigned)(time(0) - cmdLine.started)); if (!_self->config().arbiterOnly) { bb.appendTimestamp("optime", lastOpTimeWritten.asDate()); bb.appendDate("optimeDate", lastOpTimeWritten.getSecs() * 1000LL); } int maintenance = _maintenanceMode; if (maintenance) { bb.append("maintenanceMode", maintenance); } if (theReplSet) { string s = theReplSet->hbmsg(); if( !s.empty() ) bb.append("errmsg", s); } bb.append("self", true); v.push_back(bb.obj()); } Member *m =_members.head(); while( m ) { BSONObjBuilder bb; bb.append("_id", (int) m->id()); bb.append("name", m->fullName()); double h = m->hbinfo().health; bb.append("health", h); bb.append("state", (int) m->state().s); if( h == 0 ) { // if we can't connect the state info is from the past and could be confusing to show bb.append("stateStr", "(not reachable/healthy)"); } else { bb.append("stateStr", m->state().toString()); } bb.append("uptime", (unsigned) (m->hbinfo().upSince ? (time(0)-m->hbinfo().upSince) : 0)); if (!m->config().arbiterOnly) { bb.appendTimestamp("optime", m->hbinfo().opTime.asDate()); bb.appendDate("optimeDate", m->hbinfo().opTime.getSecs() * 1000LL); } bb.appendTimeT("lastHeartbeat", m->hbinfo().lastHeartbeat); bb.append("pingMs", m->hbinfo().ping); string s = m->lhb(); if( !s.empty() ) bb.append("errmsg", s); if (m->hbinfo().authIssue) { bb.append("authenticated", false); } v.push_back(bb.obj()); m = m->next(); } sort(v.begin(), v.end()); b.append("set", name()); b.appendTimeT("date", time(0)); b.append("myState", myState.s); const Member *syncTarget = _currentSyncTarget; if ( syncTarget && (myState != MemberState::RS_PRIMARY) && (myState != MemberState::RS_SHUNNED) ) { b.append("syncingTo", syncTarget->fullName()); } b.append("members", v); if( replSetBlind ) b.append("blind",true); // to avoid confusion if set...normally never set except for testing. }
int checkBook(const Lodging & lodging) { Room r; RoomList rltemp; RoomList rl = lodging.getRoomList(); int size = rl.getSize(); Calendar cal = Calendar(true); int x = 1; cout << " ****************************************************************************** " << endl << " 숙 박 업 소 관 리 프 로 그 램 " << endl << " ****************************************************************************** " << endl << endl; cout << setw(15) << ""; int m, d; for( int plus = 0; plus < 7 ; plus++) //1주 분량의 날짜 { m = cal.getMonth(); d = cal.getDay(); cout << setw(2) << m << "/" << setw(2) << d << " "; cal.addOneDay(); } cout << endl; cout << "------------------------------------------------------------" <<endl; if(size > 0) { cal = Calendar(true); r = rl.getFirstRoom(); cout << setw(11) << r.getRNumber() << "호| "; for ( int plus = 0 ; plus < 7 ; plus ++) { Room b; int k; fileIO::loadBookLodging(rltemp, r.getLNumber(), cal.getYear(), cal.getMonth(), cal.getDay(), 1); b = rltemp.searchRoom(r.getRNumber()); k = b.getRNumber(); if (k == -1) cout << " O "; else cout << " X "; cal.addOneDay(); } cout << endl; } while ( x < size ) { cal = Calendar(true); r = rl.getNextRoom(); cout << setw(11) << r.getRNumber() << "호| "; for(int plus = 0; plus < 7; plus++) { Room b; int k; fileIO::loadBookLodging(rltemp, r.getLNumber(), cal.getYear(), cal.getMonth(), cal.getDay(), 1); b = rltemp.searchRoom(r.getRNumber()); k = b.getRNumber(); if (k == -1) cout << " O "; else cout << " X "; cal.addOneDay(); } x++; cout << endl; } cal = Calendar(true); x = 1; cout << endl << " 오늘의 예약 | 인원 | 기간 | 연 락 처 | 이 름 " << endl << "------------------------------------------------------------" <<endl; if(size > 0) { r = rl.getFirstRoom(); cout << setw(11) << r.getRNumber() << "호| "; int k; Member m = fileIO::getBookUser(r.getLNumber(), r.getRNumber(), cal.getYear(), cal.getMonth(), cal.getDay()); k = m.getMNumber(); if (k == -1) cout << " 오늘의 예약이 없습니다."; else cout << setw(4) << m.getSPerson() << " | " << setw(4) << m.getSPeriod() << " | " << setw(16) << m.getTelephone() << " | " << m.getName(); cout << endl; } while ( x < size ) { r = rl.getNextRoom(); cout << setw(11) << r.getRNumber() << "호| "; Room b; int k; Member m = fileIO::getBookUser(r.getLNumber(), r.getRNumber(), cal.getYear(), cal.getMonth(), cal.getDay()); k = m.getMNumber(); if (k == -1) cout << " 오늘의 예약이 없습니다."; else cout << setw(4) << m.getSPerson() << " | " << setw(4) << m.getSPeriod() << " | " << setw(16) << m.getTelephone() << " | " << m.getName(); x++; cout << endl; } x = 1; cout << endl << " 오늘의 룸서비스 : "; if(size > 0) { r = rl.getFirstRoom(); if(fileIO::getBookRoomStatus(r.getLNumber(), r.getRNumber(), cal.getYear(), cal.getMonth(), cal.getDay()) == 1) cout << r.getRNumber() << "호, "; } while ( x < size ) { r = rl.getNextRoom(); if(fileIO::getBookRoomStatus(r.getLNumber(), r.getRNumber(), cal.getYear(), cal.getMonth(), cal.getDay()) == 1) cout << r.getRNumber() << "호, "; x++; } cout << endl; keyIO::getch(); return M_MENU; }
LIBSBML_CPP_NAMESPACE_USE int main(int argc,char** argv){ // // Creates an SBMLNamespaces object with the given SBML level, version // package name, package version. // // (NOTE) By defualt, the name of package (i.e. "groups") will be used // if the arugment for the prefix is missing or empty. Thus the argument // for the prefix can be added as follows: // // SBMLNamespaces sbmlns(3,1,"groups",1,"GROUP"); // SBMLNamespaces sbmlns(3,1,"groups",1); // // (NOTES) The above code creating an SBMLNamespaces object can be replaced // with one of the following other styles. // // (1) Creates an SBMLNamespace object with a SBML core namespace and then // adds a groups package namespace to the object. // // SBMLNamespaces sbmlns(3,1); // sbmlns.addPkgNamespace("groups",1); // // OR // // SBMLNamespaces sbmlns(3,1); // sbmlns.addNamespace(GroupsExtension::XmlnsL3V1V1,"groups"); // // (2) Creates a GroupsPkgNamespaces object (SBMLNamespace derived class for // groups package. The class is basically used for createing an SBase derived // objects defined in the groups package) with the given SBML level, version, // and package version // // GroupsPkgNamespaces sbmlns(3,1,1); // // create the document SBMLDocument *document = new SBMLDocument(&sbmlns); // create the Model Model* model=document->createModel(); // create the Compartment Compartment* compartment = model->createCompartment(); compartment->setId("cytosol"); compartment->setConstant(true); compartment=model->createCompartment(); compartment->setId("mitochon"); compartment->setConstant(true); // create the Species Species* species = model->createSpecies(); species->setId("ATPc"); species->setCompartment("cytosol"); species->setInitialConcentration(1); species->setHasOnlySubstanceUnits(false); species->setBoundaryCondition(false); species->setConstant(false); species = model->createSpecies(); species->setId("ATPm"); species->setCompartment("mitochon"); species->setInitialConcentration(2); species->setHasOnlySubstanceUnits(false); species->setBoundaryCondition(false); species->setConstant(false); // create the Groups // // Get a GroupsModelPlugin object plugged in the model object. // // The type of the returned value of SBase::getPlugin() function is SBasePlugin*, and // thus the value needs to be casted for the corresponding derived class. // GroupsModelPlugin* mplugin = static_cast<GroupsModelPlugin*>(model->getPlugin("groups")); // // Creates a Group object via GroupsModelPlugin object. // Group* group = mplugin->createGroup(); group->setId("ATP"); group->setKind(GROUP_KIND_CLASSIFICATION); group->setSBOTerm("SBO:0000252"); Member* member = group->createMember(); member->setIdRef("ATPc"); member = group->createMember(); member->setIdRef("ATPm"); writeSBML(document,"groups_example1.xml"); delete document; }
virtual bool run(OperationContext* txn, const string& , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) { if( replSetBlind ) { if (theReplSet) { errmsg = str::stream() << theReplSet->selfFullName() << " is blind"; } return false; } MONGO_FAIL_POINT_BLOCK(rsDelayHeartbeatResponse, delay) { const BSONObj& data = delay.getData(); sleepsecs(data["delay"].numberInt()); } /* we don't call ReplSetCommand::check() here because heartbeat checks many things that are pre-initialization. */ if( !replSet ) { errmsg = "not running with --replSet"; return false; } /* we want to keep heartbeat connections open when relinquishing primary. tag them here. */ { AbstractMessagingPort *mp = cc().port(); if( mp ) mp->tag |= ScopedConn::keepOpen; } if( cmdObj["pv"].Int() != 1 ) { errmsg = "incompatible replset protocol version"; return false; } { string s = string(cmdObj.getStringField("replSetHeartbeat")); if (replSettings.ourSetName() != s) { errmsg = "repl set names do not match"; log() << "replSet set names do not match, our cmdline: " << replSettings.replSet << rsLog; log() << "replSet s: " << s << rsLog; result.append("mismatch", true); return false; } } result.append("rs", true); if( cmdObj["checkEmpty"].trueValue() ) { result.append("hasData", replHasDatabases()); } if( (theReplSet == 0) || (theReplSet->startupStatus == ReplSetImpl::LOADINGCONFIG) ) { string from( cmdObj.getStringField("from") ); if( !from.empty() ) { scoped_lock lck( replSettings.discoveredSeeds_mx ); replSettings.discoveredSeeds.insert(from); } result.append("hbmsg", "still initializing"); return true; } if( theReplSet->name() != cmdObj.getStringField("replSetHeartbeat") ) { errmsg = "repl set names do not match (2)"; result.append("mismatch", true); return false; } result.append("set", theReplSet->name()); MemberState currentState = theReplSet->state(); result.append("state", currentState.s); if (currentState == MemberState::RS_PRIMARY) { result.appendDate("electionTime", theReplSet->getElectionTime().asDate()); } result.append("e", theReplSet->iAmElectable()); result.append("hbmsg", theReplSet->hbmsg()); result.append("time", (long long) time(0)); result.appendDate("opTime", theReplSet->lastOpTimeWritten.asDate()); const Member *syncTarget = replset::BackgroundSync::get()->getSyncTarget(); if (syncTarget) { result.append("syncingTo", syncTarget->fullName()); } int v = theReplSet->config().version; result.append("v", v); if( v > cmdObj["v"].Int() ) result << "config" << theReplSet->config().asBson(); Member* from = NULL; if (cmdObj.hasField("fromId")) { if (v == cmdObj["v"].Int()) { from = theReplSet->getMutableMember(cmdObj["fromId"].Int()); } } if (!from) { from = theReplSet->findByName(cmdObj.getStringField("from")); if (!from) { return true; } } // if we thought that this node is down, let it know if (!from->hbinfo().up()) { result.append("stateDisagreement", true); } // note that we got a heartbeat from this node theReplSet->mgr->send(stdx::bind(&ReplSet::msgUpdateHBRecv, theReplSet, from->hbinfo().id(), time(0))); return true; }
Status LegacyReplicationCoordinator::processHeartbeat(const ReplSetHeartbeatArgs& args, ReplSetHeartbeatResponse* response) { if (args.getProtocolVersion() != 1) { return Status(ErrorCodes::BadValue, "incompatible replset protocol version"); } { if (_settings.ourSetName() != args.getSetName()) { log() << "replSet set names do not match, our cmdline: " << _settings.replSet << rsLog; log() << "replSet s: " << args.getSetName() << rsLog; response->noteMismatched(); return Status(ErrorCodes::BadValue, "repl set names do not match"); } } response->noteReplSet(); if( (theReplSet == 0) || (theReplSet->startupStatus == ReplSetImpl::LOADINGCONFIG) ) { if (!args.getSenderHost().empty()) { scoped_lock lck( _settings.discoveredSeeds_mx ); _settings.discoveredSeeds.insert(args.getSenderHost().toString()); } response->setHbMsg("still initializing"); return Status::OK(); } if (theReplSet->name() != args.getSetName()) { response->noteMismatched(); return Status(ErrorCodes::BadValue, "repl set names do not match (2)"); } response->setSetName(theReplSet->name()); MemberState currentState = theReplSet->state(); response->setState(currentState.s); if (currentState == MemberState::RS_PRIMARY) { response->setElectionTime(theReplSet->getElectionTime().asDate()); } response->setElectable(theReplSet->iAmElectable()); response->setHbMsg(theReplSet->hbmsg()); response->setTime((long long) time(0)); response->setOpTime(theReplSet->lastOpTimeWritten.asDate()); const Member *syncTarget = BackgroundSync::get()->getSyncTarget(); if (syncTarget) { response->setSyncingTo(syncTarget->fullName()); } int v = theReplSet->config().version; response->setVersion(v); if (v > args.getConfigVersion()) { ReplicaSetConfig config; fassert(18635, config.initialize(theReplSet->config().asBson())); response->setConfig(config); } Member* from = NULL; if (v == args.getConfigVersion() && args.getSenderId() != -1) { from = theReplSet->getMutableMember(args.getSenderId()); } if (!from) { from = theReplSet->findByName(args.getSenderHost().toString()); if (!from) { return Status::OK(); } } // if we thought that this node is down, let it know if (!from->hbinfo().up()) { response->noteStateDisagreement(); } // note that we got a heartbeat from this node theReplSet->mgr->send(stdx::bind(&ReplSet::msgUpdateHBRecv, theReplSet, from->hbinfo().id(), time(0))); return Status::OK(); }
int main() { try { seal::PluginManager::get()->initialise(); using ROOT::Reflex::Type; using ROOT::Reflex::Member; // const Class * simple = Class::forName("NavigationTests::Simple"); Type simple = Type::byTypeInfo(typeid(NavigationTests::Simple)); for (size_t i=0; i<simple.dataMemberCount(); i++) { Member m = simple.dataMember(i); std::cout << m.name() << " " << m.type().name() << std::endl; } std::stringstream file; { NavigationTests::Simple s; s.a=3.14; s.b=sqrt(3.); s.j=12; NavigationTests::Compound c; c.q = 99; c.name="Me"; c.i=-45; c.a=s; c.b=s; c.b.b=sqrt(5); c.v.push_back(s); c.v.push_back(s); c.m[1]="one"; c.m[10]="ten"; c.m[5]="five"; c.m[20]="2ten"; // std::sstream file("bha.txt"); boost::archive::text_oarchive oa(file); { ROOT::Reflex::Object rc(simple, (void*)(&s)); oa << rc; } { ROOT::Reflex::Object rc(Type::byTypeInfo(typeid(c)), (void*)(&c)); oa << rc; } //file.close(); std::cout << s.a << " " << s.b << " " << s.j << std::endl; std::cout << c.q << " " << c.name << " " << c.v.size() << " " << c.a.a << " " << c.a.b << " " << c.a.j << std::endl; std::cout << c.m[1] << " " << c.m[5] << " " << c.m[10] << " " << c.m[20] << std::endl; } std::cout << file.str() << std::endl; { NavigationTests::Simple s; NavigationTests::Compound c; // std::ifstream file("bha.txt"); boost::archive::text_iarchive oa(file); { ROOT::Reflex::Object rc(simple, (void*)(&s)); oa >> rc; } { ROOT::Reflex::Object rc(Type::byTypeInfo(typeid(c)), (void*)(&c)); oa >> rc; } // file.close(); std::cout << s.a << " " << s.b << " " << s.j << std::endl; std::cout << c.q << " "<< c.name << " " << c.v.size() << " " << c.a.a << " " << c.a.b << " " << c.a.j << std::endl; std::cout << c.v[0].a << " " << c.v[0].b << " " << c.v[0].j << std::endl; std::cout << c.m[1] << " " << c.m[5] << " " << c.m[10] << " " << c.m[20] << std::endl; } } catch (std::exception & ex) { std::cout << "error!!!" << ex.what() << std::endl; } return 0; };
static PyObject* delegate_handler( Member* member, CAtom* atom, PyObject* oldvalue, PyObject* newvalue ) { Member* delegate = member_cast( member->post_validate_context ); return delegate->post_validate( atom, oldvalue, newvalue ); }
// @param reconf true if this is a reconfiguration and not an initial load of the configuration. // @return true if ok; throws if config really bad; false if config doesn't include self bool ReplSetImpl::initFromConfig(OperationContext* txn, ReplSetConfig& c, bool reconf) { // NOTE: haveNewConfig() writes the new config to disk before we get here. So // we cannot error out at this point, except fatally. Check errors earlier. lock lk(this); if (!getLastErrorDefault.isEmpty() || !c.getLastErrorDefaults.isEmpty()) { getLastErrorDefault = c.getLastErrorDefaults; } list<ReplSetConfig::MemberCfg*> newOnes; // additive short-cuts the new config setup. If we are just adding a // node/nodes and nothing else is changing, this is additive. If it's // not a reconfig, we're not adding anything bool additive = reconf; bool updateConfigs = false; { unsigned nfound = 0; int me = 0; for (vector<ReplSetConfig::MemberCfg>::iterator i = c.members.begin(); i != c.members.end(); i++) { ReplSetConfig::MemberCfg& m = *i; if (isSelf(m.h)) { me++; } if (reconf) { const Member *old = findById(m._id); if (old) { nfound++; verify((int) old->id() == m._id); if (!old->config().isSameIgnoringTags(m)) { additive = false; } if (!updateConfigs && old->config() != m) { updateConfigs = true; } } else { newOnes.push_back(&m); } } } if (me == 0) { // we're not in the config -- we must have been removed if (state().removed()) { // already took note of our ejection from the set // so just sit tight and poll again return false; } _members.orphanAll(); // kill off rsHealthPoll threads (because they Know Too Much about our past) endOldHealthTasks(); // close sockets to force clients to re-evaluate this member MessagingPort::closeAllSockets(0); // take note of our ejection changeState(MemberState::RS_REMOVED); // go into holding pattern log() << "replSet info self not present in the repl set configuration:" << rsLog; log() << c.toString() << rsLog; loadConfig(txn); // redo config from scratch return false; } uassert(13302, "replSet error self appears twice in the repl set configuration", me<=1); // if we found different members that the original config, reload everything if (reconf && config().members.size() != nfound) additive = false; } // If we are changing chaining rules, we don't want this to be an additive reconfig so that // the primary can step down and the sync targets change. // TODO: This can be removed once SERVER-5208 is fixed. if (reconf && config().chainingAllowed() != c.chainingAllowed()) { additive = false; } _cfg = new ReplSetConfig(c); // config() is same thing but const, so we use that when we can for clarity below dassert(&config() == _cfg); verify(config().ok()); verify(_name.empty() || _name == config()._id); _name = config()._id; verify(!_name.empty()); { // Hack to force ReplicationCoordinatorImpl to have a config. // TODO(spencer): rm this once the ReplicationCoordinatorImpl can load its own config. HybridReplicationCoordinator* replCoord = dynamic_cast<HybridReplicationCoordinator*>(getGlobalReplicationCoordinator()); fassert(18648, replCoord); replCoord->setImplConfigHack(_cfg); } // this is a shortcut for simple changes if (additive) { log() << "replSet info : additive change to configuration" << rsLog; if (updateConfigs) { // we have new configs for existing members, so we need to repopulate _members // with the most recent configs _members.orphanAll(); // for logging string members = ""; // not setting _self to 0 as other threads use _self w/o locking int me = 0; for(vector<ReplSetConfig::MemberCfg>::const_iterator i = config().members.begin(); i != config().members.end(); i++) { const ReplSetConfig::MemberCfg& m = *i; Member *mi; members += (members == "" ? "" : ", ") + m.h.toString(); if (isSelf(m.h)) { verify(me++ == 0); mi = new Member(m.h, m._id, &m, true); setSelfTo(mi); } else { mi = new Member(m.h, m._id, &m, false); _members.push(mi); } } // trigger a handshake to update the syncSource of our writeconcern information syncSourceFeedback.forwardSlaveHandshake(); } // add any new members for (list<ReplSetConfig::MemberCfg*>::const_iterator i = newOnes.begin(); i != newOnes.end(); i++) { ReplSetConfig::MemberCfg *m = *i; Member *mi = new Member(m->h, m->_id, m, false); // we will indicate that new members are up() initially so that we don't relinquish // our primary state because we can't (transiently) see a majority. they should be // up as we check that new members are up before getting here on reconfig anyway. mi->get_hbinfo().health = 0.1; _members.push(mi); startHealthTaskFor(mi); } // if we aren't creating new members, we may have to update the // groups for the current ones _cfg->updateMembers(_members); return true; } // start with no members. if this is a reconfig, drop the old ones. _members.orphanAll(); endOldHealthTasks(); int oldPrimaryId = -1; { const Member *p = box.getPrimary(); if (p) oldPrimaryId = p->id(); } forgetPrimary(txn); // not setting _self to 0 as other threads use _self w/o locking int me = 0; // For logging string members = ""; for (vector<ReplSetConfig::MemberCfg>::const_iterator i = config().members.begin(); i != config().members.end(); i++) { const ReplSetConfig::MemberCfg& m = *i; Member *mi; members += (members == "" ? "" : ", ") + m.h.toString(); if (isSelf(m.h)) { verify(me++ == 0); mi = new Member(m.h, m._id, &m, true); if (!reconf) { log() << "replSet I am " << m.h.toString() << rsLog; } setSelfTo(mi); if ((int)mi->id() == oldPrimaryId) box.setSelfPrimary(mi); } else { mi = new Member(m.h, m._id, &m, false); _members.push(mi); if ((int)mi->id() == oldPrimaryId) box.setOtherPrimary(mi); } } if (me == 0){ log() << "replSet warning did not detect own host in full reconfig, members " << members << " config: " << c << rsLog; } else { // Do this after we've found ourselves, since _self needs // to be set before we can start the heartbeat tasks for (Member *mb = _members.head(); mb; mb=mb->next()) { startHealthTaskFor(mb); } } return true; }
bool Member::operator!=(Member const& member) { CHECK(Position() != EmptyPosition(), Position()); return Position() != member.Position(); }
Status ReplSetImpl::forceSyncFrom(const string& host, BSONObjBuilder* result) { lock lk(this); // initial sanity check if (iAmArbiterOnly()) { return Status(ErrorCodes::NotSecondary, "arbiters don't sync"); } if (box.getState().primary()) { return Status(ErrorCodes::NotSecondary, "primaries don't sync"); } if (_self != NULL && host == _self->fullName()) { return Status(ErrorCodes::InvalidOptions, "I cannot sync from myself"); } // find the member we want to sync from Member *newTarget = 0; for (Member *m = _members.head(); m; m = m->next()) { if (m->fullName() == host) { newTarget = m; break; } } // do some more sanity checks if (!newTarget) { // this will also catch if someone tries to sync a member from itself, as _self is not // included in the _members list. return Status(ErrorCodes::NodeNotFound, "could not find member in replica set"); } if (newTarget->config().arbiterOnly) { return Status(ErrorCodes::InvalidOptions, "I cannot sync from an arbiter"); } if (!newTarget->config().buildIndexes && myConfig().buildIndexes) { return Status(ErrorCodes::InvalidOptions, "I cannot sync from a member who does not build indexes"); } if (newTarget->hbinfo().authIssue) { return Status(ErrorCodes::Unauthorized, "not authorized to communicate with " + newTarget->fullName()); } if (newTarget->hbinfo().health == 0) { return Status(ErrorCodes::HostUnreachable, "I cannot reach the requested member"); } if (newTarget->hbinfo().opTime.getSecs()+10 < lastOpTimeWritten.getSecs()) { log() << "attempting to sync from " << newTarget->fullName() << ", but its latest opTime is " << newTarget->hbinfo().opTime.getSecs() << " and ours is " << lastOpTimeWritten.getSecs() << " so this may not work" << rsLog; result->append("warning", "requested member is more than 10 seconds behind us"); // not returning false, just warning } // record the previous member we were syncing from const Member *prev = BackgroundSync::get()->getSyncTarget(); if (prev) { result->append("prevSyncTarget", prev->fullName()); } // finally, set the new target _forceSyncTarget = newTarget; return Status::OK(); }
Member& define_global_member(context* c,const char* name,Fn fn,type<Member> const&) { Member* m = new Member(name,fn); m->create(c); c->global()->insert(name,m); return *m; }