1
This commit is contained in:
parent
4ebe45d2f1
commit
68882934b5
@ -2,6 +2,7 @@
|
||||
|
||||
#include <a8/mutable_xobject.h>
|
||||
#include <a8/timer.h>
|
||||
#include <a8/udplog.h>
|
||||
|
||||
#include "svrmgr.h"
|
||||
#include "app.h"
|
||||
@ -43,28 +44,40 @@ void SvrMgr::_SS_IM_ReportServerInfo(f8::MsgHdr& hdr, const ss::SS_IM_ReportServ
|
||||
{
|
||||
std::string key = msg.ip() + ":" + a8::XValue(msg.port()).GetString();
|
||||
|
||||
auto itr = node_key_hash_.find(key);
|
||||
if (itr != node_key_hash_.end()) {
|
||||
if (itr->second.online_num != msg.online_num() ||
|
||||
itr->second.servicing != msg.servicing()
|
||||
SvrNode* svr = GetNodeByKey(key);
|
||||
if (svr) {
|
||||
if (svr->online_num != msg.online_num() ||
|
||||
svr->servicing != msg.servicing()
|
||||
) {
|
||||
itr->second.online_num = msg.online_num();
|
||||
itr->second.servicing = msg.servicing();
|
||||
svr->online_num = msg.online_num();
|
||||
svr->servicing = msg.servicing();
|
||||
RearrangeNode();
|
||||
}
|
||||
itr->second.last_active_tick = a8::XGetTickCount();
|
||||
svr->last_active_tick = a8::XGetTickCount();
|
||||
if (svr->instance_id != msg.instance_id()) {
|
||||
a8::UdpLog::Instance()->Warning
|
||||
(
|
||||
"report server info %s %d %d",
|
||||
{
|
||||
key,
|
||||
svr->instance_id,
|
||||
msg.instance_id()
|
||||
});
|
||||
}
|
||||
} else {
|
||||
SvrNode svr;
|
||||
svr.key = key;
|
||||
svr.node_idx = App::Instance()->NewUuid();
|
||||
svr.instance_id = msg.instance_id();
|
||||
svr.online_num = msg.online_num();
|
||||
svr.ip = msg.ip();
|
||||
svr.port = msg.port();
|
||||
svr.servicing = msg.servicing();
|
||||
svr.last_active_tick = a8::XGetTickCount();
|
||||
svr = new SvrNode;
|
||||
svr->socket_handle = hdr.socket_handle;
|
||||
svr->key = key;
|
||||
svr->node_idx = App::Instance()->NewUuid();
|
||||
svr->instance_id = msg.instance_id();
|
||||
svr->online_num = msg.online_num();
|
||||
svr->ip = msg.ip();
|
||||
svr->port = msg.port();
|
||||
svr->servicing = msg.servicing();
|
||||
svr->last_active_tick = a8::XGetTickCount();
|
||||
node_key_hash_[key] = svr;
|
||||
node_sorted_list_.push_back(&node_key_hash_[key]);
|
||||
socket_hash_[hdr.socket_handle] = svr;
|
||||
node_sorted_list_.push_back(svr);
|
||||
RearrangeNode();
|
||||
}
|
||||
|
||||
@ -79,11 +92,11 @@ void SvrMgr::___GSList(f8::JsonHttpRequest* request)
|
||||
|
||||
for (auto& pair : node_key_hash_) {
|
||||
a8::MutableXObject* node = a8::MutableXObject::NewObject();
|
||||
node->SetVal("instance_id", pair.second.instance_id);
|
||||
node->SetVal("online_num", pair.second.online_num);
|
||||
node->SetVal("ip", pair.second.ip);
|
||||
node->SetVal("port", pair.second.port);
|
||||
node->SetVal("servicing", pair.second.servicing);
|
||||
node->SetVal("instance_id", pair.second->instance_id);
|
||||
node->SetVal("online_num", pair.second->online_num);
|
||||
node->SetVal("ip", pair.second->ip);
|
||||
node->SetVal("port", pair.second->port);
|
||||
node->SetVal("servicing", pair.second->servicing);
|
||||
node_list->Push(*node);
|
||||
delete node;
|
||||
}
|
||||
@ -167,8 +180,8 @@ void SvrMgr::ClearTimeOutNode()
|
||||
{
|
||||
std::vector<SvrNode*> time_out_nodes;
|
||||
for (auto& pair : node_key_hash_) {
|
||||
if (a8::XGetTickCount() - pair.second.last_active_tick > 1000 * 3) {
|
||||
time_out_nodes.push_back(&pair.second);
|
||||
if (a8::XGetTickCount() - pair.second->last_active_tick > 1000 * 3) {
|
||||
time_out_nodes.push_back(pair.second);
|
||||
}
|
||||
}
|
||||
for (SvrNode* node : time_out_nodes) {
|
||||
@ -181,6 +194,20 @@ void SvrMgr::ClearTimeOutNode()
|
||||
}
|
||||
}
|
||||
node_key_hash_.erase(node->key);
|
||||
socket_hash_.erase(node->socket_handle);
|
||||
delete node;
|
||||
}
|
||||
RearrangeNode();
|
||||
}
|
||||
|
||||
SvrNode* SvrMgr::GetNodeByKey(const std::string& key)
|
||||
{
|
||||
auto itr = node_key_hash_.find(key);
|
||||
return itr != node_key_hash_.end() ? itr->second : nullptr;
|
||||
}
|
||||
|
||||
SvrNode* SvrMgr::GetNodeBySocket(int socket_handle)
|
||||
{
|
||||
auto itr = socket_hash_.find(socket_handle);
|
||||
return itr != socket_hash_.end() ? itr->second : nullptr;
|
||||
}
|
||||
|
@ -5,6 +5,7 @@
|
||||
struct SvrNode
|
||||
{
|
||||
std::string key;
|
||||
int socket_handle = 0;
|
||||
long long node_idx = 0;
|
||||
int instance_id = 0;
|
||||
int online_num = 0;
|
||||
@ -12,6 +13,13 @@ struct SvrNode
|
||||
int port = 0;
|
||||
bool servicing = false;
|
||||
long long last_active_tick = 0;
|
||||
|
||||
list_head human_list;
|
||||
|
||||
SvrNode()
|
||||
{
|
||||
INIT_LIST_HEAD(&human_list);
|
||||
}
|
||||
};
|
||||
|
||||
class SvrMgr : public a8::Singleton<SvrMgr>
|
||||
@ -37,9 +45,12 @@ class SvrMgr : public a8::Singleton<SvrMgr>
|
||||
SvrNode* AllocNode();
|
||||
void RearrangeNode();
|
||||
void ClearTimeOutNode();
|
||||
SvrNode* GetNodeByKey(const std::string& key);
|
||||
SvrNode* GetNodeBySocket(int socket_handle);
|
||||
|
||||
private:
|
||||
|
||||
std::map<std::string, SvrNode> node_key_hash_;
|
||||
std::map<std::string, SvrNode*> node_key_hash_;
|
||||
std::map<int, SvrNode*> socket_hash_;
|
||||
std::vector<SvrNode*> node_sorted_list_;
|
||||
};
|
||||
|
@ -8,3 +8,33 @@ struct PerfMonitor
|
||||
long long in_data_size = 0;
|
||||
long long read_count = 0;
|
||||
};
|
||||
|
||||
struct BaseUserData
|
||||
{
|
||||
std::string account_id;
|
||||
std::string nickname;
|
||||
std::string avatar_url;
|
||||
int sex = 0;
|
||||
int online = 0;
|
||||
long long group_id = 0;
|
||||
|
||||
long long user_value1 = 0;
|
||||
long long user_value2 = 0;
|
||||
long long user_value3 = 0;
|
||||
|
||||
long long data_version1 = 0;
|
||||
};
|
||||
|
||||
struct Friend
|
||||
{
|
||||
BaseUserData base_data;
|
||||
unsigned int crc32_code = 0;
|
||||
|
||||
list_head human_entry;
|
||||
struct SvrNode* svr_node = nullptr;
|
||||
|
||||
Friend()
|
||||
{
|
||||
INIT_LIST_HEAD(&human_entry);
|
||||
}
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user