//------------------------------------------------------------------------------------- void Baseappmgr::reqCreateBaseAnywhereFromDBIDQueryBestBaseappID(Network::Channel* pChannel, MemoryStream& s) { Components::ComponentInfos* cinfos = Components::getSingleton().findComponent(pChannel); // 此时肯定是在运行状态中,但有可能在等待创建space // 所以初始化进度没有完成, 在只有一个baseapp的情况下如果这 // 里不进行设置将是一个相互等待的状态 if (cinfos) cinfos->state = COMPONENT_STATE_RUN; updateBestBaseapp(); if (bestBaseappID_ == 0 && numLoadBalancingApp() == 0) { ERROR_MSG(fmt::format("Baseappmgr::reqCreateBaseAnywhereFromDBIDQueryBestBaseappID: Unable to allocate baseapp for load balancing! baseappSize={}.\n", baseapps_.size())); } Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(BaseappInterface::onGetCreateBaseAnywhereFromDBIDBestBaseappID); (*pBundle) << bestBaseappID_; (*pBundle).append((char*)s.data() + s.rpos(), (int)s.length()); cinfos->pChannel->send(pBundle); s.done(); }
//------------------------------------------------------------------------------------- void Baseappmgr::reqCreateBaseAnywhere(Network::Channel* pChannel, MemoryStream& s) { Components::ComponentInfos* cinfos = Components::getSingleton().findComponent(pChannel); // 此时肯定是在运行状态中,但有可能在等待创建space // 所以初始化进度没有完成, 在只有一个baseapp的情况下如果这 // 里不进行设置将是一个相互等待的状态 if(cinfos) cinfos->state = COMPONENT_STATE_RUN; updateBestBaseapp(); if (bestBaseappID_ == 0 && numLoadBalancingApp() == 0) { ERROR_MSG(fmt::format("Baseappmgr::reqCreateBaseAnywhere: Unable to allocate baseapp for load balancing! baseappSize={}.\n", baseapps_.size())); } cinfos = Components::getSingleton().findComponent(BASEAPP_TYPE, bestBaseappID_); if (cinfos == NULL || cinfos->pChannel == NULL || cinfos->state != COMPONENT_STATE_RUN) { Network::Bundle* pBundle = Network::Bundle::createPoolObject(); ForwardItem* pFI = new AppForwardItem(); pFI->pBundle = pBundle; (*pBundle).newMessage(BaseappInterface::onCreateBaseAnywhere); (*pBundle).append((char*)s.data() + s.rpos(), (int)s.length()); s.done(); int runstate = -1; if (cinfos) runstate = (int)cinfos->state; WARNING_MSG(fmt::format("Baseappmgr::reqCreateBaseAnywhere: not found baseapp({}, runstate={}, pChannel={}), message is buffered.\n", bestBaseappID_, runstate, (cinfos && cinfos->pChannel ? cinfos->pChannel->c_str() : "NULL"))); pFI->pHandler = NULL; forward_anywhere_baseapp_messagebuffer_.push(pFI); return; } //DEBUG_MSG("Baseappmgr::reqCreateBaseAnywhere: %s opsize=%d, selBaseappIdx=%d.\n", // pChannel->c_str(), s.opsize(), currentBaseappIndex); Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(BaseappInterface::onCreateBaseAnywhere); (*pBundle).append((char*)s.data() + s.rpos(), (int)s.length()); cinfos->pChannel->send(pBundle); s.done(); // 预先将实体数量增加 std::map< COMPONENT_ID, Baseapp >::iterator baseapps_iter = baseapps_.find(bestBaseappID_); if (baseapps_iter != baseapps_.end()) { baseapps_iter->second.incNumEntities(); } }
//------------------------------------------------------------------------------------- void Baseappmgr::updateBaseapp(Network::Channel* pChannel, COMPONENT_ID componentID, ENTITY_ID numBases, ENTITY_ID numProxices, float load, uint32 flags) { Baseapp& baseapp = baseapps_[componentID]; baseapp.load(load); baseapp.numProxices(numProxices); baseapp.numBases(numBases); baseapp.flags(flags); updateBestBaseapp(); }
//------------------------------------------------------------------------------------- void Baseappmgr::onChannelDeregister(Mercury::Channel * pChannel) { // Èç¹ûÊÇappËÀÍöÁË if(pChannel->isInternal()) { Components::ComponentInfos* cinfo = Components::getSingleton().findComponent(pChannel); if(cinfo) { std::map< COMPONENT_ID, Baseapp >::iterator iter = baseapps_.find(cinfo->cid); if(iter != baseapps_.end()) { WARNING_MSG(boost::format("Baseappmgr::onChannelDeregister: erase baseapp[%1%], currsize=%2%\n") % cinfo->cid % (baseapps_.size() - 1)); baseapps_.erase(iter); updateBestBaseapp(); } } } ServerApp::onChannelDeregister(pChannel); }
//------------------------------------------------------------------------------------- void Baseappmgr::onChannelDeregister(Network::Channel * pChannel) { // 如果是app死亡了 if(pChannel->isInternal()) { Components::ComponentInfos* cinfo = Components::getSingleton().findComponent(pChannel); if(cinfo) { cinfo->state = COMPONENT_STATE_STOP; std::map< COMPONENT_ID, Baseapp >::iterator iter = baseapps_.find(cinfo->cid); if(iter != baseapps_.end()) { WARNING_MSG(fmt::format("Baseappmgr::onChannelDeregister: erase baseapp[{}], currsize={}\n", cinfo->cid, (baseapps_.size() - 1))); baseapps_.erase(iter); updateBestBaseapp(); } } } ServerApp::onChannelDeregister(pChannel); }
//------------------------------------------------------------------------------------- void Baseappmgr::registerPendingAccountToBaseapp(Network::Channel* pChannel, MemoryStream& s) { std::string loginName; std::string accountName; std::string password; std::string datas; DBID entityDBID; uint32 flags; uint64 deadline; COMPONENT_TYPE componentType; s >> loginName >> accountName >> password >> entityDBID >> flags >> deadline >> componentType; s.readBlob(datas); Components::ComponentInfos* cinfos = Components::getSingleton().findComponent(pChannel); if(cinfos == NULL || cinfos->pChannel == NULL) { ERROR_MSG("Baseappmgr::registerPendingAccountToBaseapp: not found loginapp!\n"); return; } pending_logins_[loginName] = cinfos->cid; updateBestBaseapp(); if (bestBaseappID_ == 0 && numLoadBalancingApp() == 0) { ERROR_MSG(fmt::format("Baseappmgr::registerPendingAccountToBaseapp: Unable to allocate baseapp for load balancing! baseappSize={}, accountName={}.\n", baseapps_.size(), loginName)); } ENTITY_ID eid = 0; cinfos = Components::getSingleton().findComponent(BASEAPP_TYPE, bestBaseappID_); if (cinfos == NULL || cinfos->pChannel == NULL || cinfos->state != COMPONENT_STATE_RUN) { Network::Bundle* pBundle = Network::Bundle::createPoolObject(); ForwardItem* pFI = new AppForwardItem(); pFI->pBundle = pBundle; (*pBundle).newMessage(BaseappInterface::registerPendingLogin); (*pBundle) << loginName << accountName << password << eid << entityDBID << flags << deadline << componentType; pBundle->appendBlob(datas); int runstate = -1; if (cinfos) runstate = (int)cinfos->state; WARNING_MSG(fmt::format("Baseappmgr::registerPendingAccountToBaseapp: not found baseapp({}, runstate={}, pChannel={}), message is buffered.\n", bestBaseappID_, runstate, (cinfos && cinfos->pChannel ? cinfos->pChannel->c_str() : "NULL"))); pFI->pHandler = NULL; forward_anywhere_baseapp_messagebuffer_.push(pFI); return; } std::map< COMPONENT_ID, Baseapp >::iterator baseapps_iter = baseapps_.find(bestBaseappID_); DEBUG_MSG(fmt::format("Baseappmgr::registerPendingAccountToBaseapp:{}. allocBaseapp={}, numEntities={}.\n", accountName, bestBaseappID_, (bestBaseappID_ > 0 ? baseapps_iter->second.numEntities() : 0))); Network::Bundle* pBundle = Network::Bundle::createPoolObject(); (*pBundle).newMessage(BaseappInterface::registerPendingLogin); (*pBundle) << loginName << accountName << password << eid << entityDBID << flags << deadline << componentType; pBundle->appendBlob(datas); cinfos->pChannel->send(pBundle); // 预先将实体数量增加 if (baseapps_iter != baseapps_.end()) { baseapps_iter->second.incNumProxices(); } }