aozhiwei 7eac337db4 1
2019-05-31 11:42:59 +08:00

89 lines
2.2 KiB
C++

#include "precompile.h"
#include <a8/mutable_xobject.h>
#include "gsmgr.h"
#include "GGListener.h"
void GSMgr::Init()
{
}
void GSMgr::UnInit()
{
}
void GSMgr::_SS_WSP_RequestTargetServer(f8::MsgHdr& hdr, const ss::SS_WSP_RequestTargetServer& msg)
{
ss::SS_MS_ResponseTargetServer respmsg;
respmsg.set_context_id(msg.context_id());
GSNode* node = GetNodeByTeamId(msg.team_id());
if (node) {
respmsg.set_host(node->ip);
respmsg.set_port(node->port);
} else {
node = AllocNode();
if (node) {
team_hash_[msg.team_id()] = node;
} else {
respmsg.set_error_code(1);
respmsg.set_error_msg("无法分配节点");
}
}
GGListener::Instance()->SendProxyMsg(hdr.socket_handle, respmsg);
}
void GSMgr::___GSReport(f8::JsonHttpRequest* request)
{
std::string ip = request->request.Get("ip");
int port = request->request.Get("port");
int online_num = request->request.Get("online_num");
int room_num = request->request.Get("room_num");
int instance_id = request->request.Get("instance_id");
int node_id = request->request.Get("node_id");
std::string key = ip + a8::XValue(port).GetString();
auto itr = node_key_hash_.find(key);
if (itr != node_key_hash_.end()) {
itr->second.online_num = online_num;
itr->second.room_num = room_num;
} else {
GSNode gs;
gs.node_id = node_id;
gs.instance_id = instance_id;
gs.online_num = online_num;
gs.room_num = room_num;
gs.ip = ip;
gs.port = port;
node_key_hash_[key] = gs;
}
request->resp_xobj->SetVal("errcode", 0);
request->resp_xobj->SetVal("errmsg", "");
}
GSNode* GSMgr::GetNodeByTeamId(const std::string& team_id)
{
auto itr = team_hash_.find(team_id);
return itr != team_hash_.end() ? itr->second : nullptr;
}
GSNode* GSMgr::AllocNode()
{
std::array<GSNode*, 5> nodes = {};
size_t i = 0;
for (auto& pair : node_desc_hash_) {
nodes[i] = &pair.second;
++i;
if (i >= nodes.size()) {
break;
}
}
if (i <= 0) {
return nullptr;
}
return nodes[rand() % i];
}