diff --git a/server/wsproxy/mastersvrmgr.cc b/server/wsproxy/mastersvrmgr.cc index c57ed44..5a8a08c 100644 --- a/server/wsproxy/mastersvrmgr.cc +++ b/server/wsproxy/mastersvrmgr.cc @@ -41,8 +41,11 @@ void MasterSvrMgr::_SS_MS_ResponseTargetServer(f8::MsgHdr& hdr, const ss::SS_MS_ f8::MsgHdr* context_hdr = GetHdrByContextId(msg.context_id()); if (context_hdr) { if (msg.error_code() == 0) { - std::string key = msg.host() + ":" + a8::XValue(msg.port()).GetString(); - TargetConn* conn = TargetConnMgr::Instance()->GetConnByKey(key); + TargetConn* conn = TargetConnMgr::Instance()->RecreateTargetConn( + msg.host(), + msg.port() + ); + assert(conn); if (conn) { conn->ForwardClientMsg(hdr); } diff --git a/server/wsproxy/target_conn_mgr.cc b/server/wsproxy/target_conn_mgr.cc index 0b0e300..2df7128 100644 --- a/server/wsproxy/target_conn_mgr.cc +++ b/server/wsproxy/target_conn_mgr.cc @@ -40,3 +40,21 @@ TargetConn* TargetConnMgr::GetConnById(int instance_id) return itr != id_hash_.end() ? itr->second : nullptr; } +TargetConn* TargetConnMgr::RecreateTargetConn(const std::string& host, int port) +{ + std::string key = host + ":" + a8::XValue(port).GetString(); + TargetConn* conn = GetConnByKey(key); + if (conn) { + return conn; + } + while (GetConnById(++curr_id_)) {}; + int instance_id = curr_id_; + std::string remote_ip = host; + int remote_port = port; + + conn->Init(instance_id, remote_ip, remote_port); + id_hash_[conn->instance_id] = conn; + key_hash_[key] = conn; + conn->Open(); + return conn; +} diff --git a/server/wsproxy/target_conn_mgr.h b/server/wsproxy/target_conn_mgr.h index ef8d742..d939be7 100644 --- a/server/wsproxy/target_conn_mgr.h +++ b/server/wsproxy/target_conn_mgr.h @@ -14,9 +14,10 @@ class TargetConnMgr : public a8::Singleton TargetConn* GetConnByKey(const std::string& key); TargetConn* GetConnById(int instance_id); + TargetConn* RecreateTargetConn(const std::string& host, int port); private: - + unsigned short curr_id_ = 1000; std::map key_hash_; std::map id_hash_; };