From a400648dd9f1c16cba1ed9b0bd933002713591f9 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 8 Oct 2020 19:08:29 +0800 Subject: [PATCH] 1 --- server/rankserver/guildmgr.cc | 78 +++++++++++++++++++++++++++++++++++ server/rankserver/guildmgr.h | 6 +++ 2 files changed, 84 insertions(+) diff --git a/server/rankserver/guildmgr.cc b/server/rankserver/guildmgr.cc index a167b92..14fdf39 100644 --- a/server/rankserver/guildmgr.cc +++ b/server/rankserver/guildmgr.cc @@ -1,6 +1,7 @@ #include "precompile.h" #include +#include #include "guildmgr.h" #include "typeconvert.h" @@ -19,6 +20,7 @@ void GuildMgr::Init() for (int i = 0; i < mysql_cluster_conf->Size(); ++i) { int instance_id = mysql_cluster_conf->At(i)->At("instance_id")->AsXValue(); pending_db_hash_[instance_id] = 0; + sync_db_hash_[instance_id] = App::Instance()->nowtime; LoadGuild(instance_id, 0); } } @@ -336,8 +338,66 @@ void GuildMgr::LoadGuild(int instance_id, long long last_idx) instance_id); } +void GuildMgr::SyncGuild(int instance_id) +{ + DBEngine::Instance()->ExecAsyncQuery + ( + *JsonDataMgr::Instance()->GetMysqlConf(instance_id), + "SELECT idx, gameid, guild_id, guild_name, guild_lv, guild_exp, guild_badge, guild_notice, " + " guild_declaration, owner_id, owner_name, owner_avatar_url, " + " creator_id, creator_name, creator_avatar_url, guild_status, " + " join_unlimited, join_cond1, join_cond2, createtime, modifytime, channel " + "FROM `guild` WHERE modifytime > %d;", + { + sync_db_hash_[instance_id] + }, + a8::XParams() + .SetSender(instance_id), + [] (a8::XParams& param, const f8::DataSet* data_set) + { + int instance_id = param.sender; + if (data_set && !data_set->empty()) { + int last_sync_time = GuildMgr::Instance()->sync_db_hash_[instance_id]; + for (auto& row : *data_set) { + cs::MFGuildBasic* guild = new cs::MFGuildBasic; + guild->set_guild_id(a8::XValue(row[2])); + guild->set_guild_name(row[3]); + guild->set_guild_lv(a8::XValue(row[4])); + guild->set_guild_exp(a8::XValue(row[5])); + guild->set_guild_badge(a8::XValue(row[6])); + guild->set_guild_declaration(row[8]); + guild->set_owner_id(row[9]); + guild->set_owner_name(row[10]); + guild->set_owner_avatar_url(row[11]); + guild->set_join_unlimited(a8::XValue(row[13])); + guild->set_join_cond1(a8::XValue(row[14])); + guild->set_join_cond2(a8::XValue(row[15])); + guild->set__gameid(a8::XValue(row[1])); + guild->set__channel(a8::XValue(row[18])); + GuildMgr::Instance()->AddGuild(guild); + if (a8::XValue(row[17]).GetInt64() > last_sync_time) { + last_sync_time = a8::XValue(row[17]); + } + delete guild; + } + if (last_sync_time > GuildMgr::Instance()->sync_db_hash_[instance_id]) { + GuildMgr::Instance()->sync_db_hash_[instance_id] = last_sync_time; + } + } + }, + [] (a8::XParams& param, int error_code, const std::string& error_msg) + { + abort(); + }, + instance_id); +} + void GuildMgr::OnOneDBDone(int instance_id) { + if (pending_db_hash_.find(instance_id) == pending_db_hash_.end() || + pending_db_hash_[instance_id] == 1) { + abort(); + } pending_db_hash_[instance_id] = 1; load_done_ = true; for (auto& pair : pending_db_hash_) { @@ -350,6 +410,7 @@ void GuildMgr::OnOneDBDone(int instance_id) if (load_done_) { a8::UdpLog::Instance()->Debug("all db done guild_num:%d", {guild_hash_.size()}); GenGuildRank(); + InstallSyncGuildTimer(); } } @@ -461,3 +522,20 @@ bool GuildMgr::CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b) } return a->guild_id() > b->guild_id(); } + +void GuildMgr::InstallSyncGuildTimer() +{ + auto mysql_cluster_conf = JsonDataMgr::Instance()->GetMysqlClusterConf(); + for (int i = 0; i < mysql_cluster_conf->Size(); ++i) { + int instance_id = mysql_cluster_conf->At(i)->At("instance_id")->AsXValue(); + a8::Timer::Instance()->AddRepeatTimerAndAttach + (1000 * 60, + a8::XParams() + .SetSender(instance_id), + [] (const a8::XParams& param) + { + GuildMgr::Instance()->SyncGuild(param.sender); + }, + &timer_attacher_.timer_list_); + } +} diff --git a/server/rankserver/guildmgr.h b/server/rankserver/guildmgr.h index 5612aa2..3b94fef 100644 --- a/server/rankserver/guildmgr.h +++ b/server/rankserver/guildmgr.h @@ -1,5 +1,7 @@ #pragma once +#include + namespace cs { class MFGuildBasic; @@ -26,16 +28,20 @@ class GuildMgr : public a8::Singleton std::vector* GetGuildRank(int gameid); void AddGuild(cs::MFGuildBasic* guild); void LoadGuild(int instance_id, long long last_idx); + void SyncGuild(int instance_id); void OnOneDBDone(int instance_id); void RefreshGuild(long long guild_id); void GenGuildRank(); void ResortRank(std::vector& rank_list); void UpdateRank(std::vector& rank_list, cs::MFGuildBasic* guild); bool CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b); + void InstallSyncGuildTimer(); private: + a8::TimerAttacher timer_attacher_; bool load_done_ = false; std::map pending_db_hash_; + std::map sync_db_hash_; std::map guild_hash_; std::map> sorted_game_guild_list_; };