Fix 1st time infinite start after server creation failure

This commit is contained in:
Benau 2021-02-19 10:25:46 +08:00
parent b6fd98675a
commit 39c42c3f0c
2 changed files with 11 additions and 12 deletions

View File

@ -1405,7 +1405,7 @@ void ServerLobby::asynchronousUpdate()
Log::warn("ServerLobby", "Trying auto server recovery."); Log::warn("ServerLobby", "Trying auto server recovery.");
// For auto server recovery wait 3 seconds for next try // For auto server recovery wait 3 seconds for next try
m_last_unsuccess_poll_time = StkTime::getMonoTimeMs() + 3000; m_last_unsuccess_poll_time = StkTime::getMonoTimeMs() + 3000;
registerServer(); registerServer(false/*first_time*/);
} }
switch (m_state.load()) switch (m_state.load())
@ -1454,7 +1454,7 @@ void ServerLobby::asynchronousUpdate()
// this thread, because there is no need for the protocol manager // this thread, because there is no need for the protocol manager
// to react to any requests before the server is registered. // to react to any requests before the server is registered.
if (m_server_registering.expired() && m_server_id_online.load() == 0) if (m_server_registering.expired() && m_server_id_online.load() == 0)
registerServer(); registerServer(true/*first_time*/);
if (m_server_registering.expired()) if (m_server_registering.expired())
{ {
@ -1467,11 +1467,6 @@ void ServerLobby::asynchronousUpdate()
m_registered_for_once_only = true; m_registered_for_once_only = true;
m_state = WAITING_FOR_START_GAME; m_state = WAITING_FOR_START_GAME;
} }
else
{
// Exit now if failed to register to stk addons
m_state = ERROR_LEAVE;
}
} }
break; break;
} }
@ -2255,13 +2250,14 @@ void ServerLobby::update(int ticks)
* ProtocolManager thread). The information about this client is added * ProtocolManager thread). The information about this client is added
* to the table 'server'. * to the table 'server'.
*/ */
void ServerLobby::registerServer() void ServerLobby::registerServer(bool first_time)
{ {
// ======================================================================== // ========================================================================
class RegisterServerRequest : public Online::XMLRequest class RegisterServerRequest : public Online::XMLRequest
{ {
private: private:
std::weak_ptr<ServerLobby> m_server_lobby; std::weak_ptr<ServerLobby> m_server_lobby;
bool m_first_time;
protected: protected:
virtual void afterOperation() virtual void afterOperation()
{ {
@ -2297,15 +2293,18 @@ void ServerLobby::registerServer()
} }
Log::error("ServerLobby", "%s", Log::error("ServerLobby", "%s",
StringUtils::wideToUtf8(getInfo()).c_str()); StringUtils::wideToUtf8(getInfo()).c_str());
// Exit now if failed to register to stk addons for first time
if (m_first_time)
sl->m_state.store(ERROR_LEAVE);
} }
public: public:
RegisterServerRequest(std::shared_ptr<ServerLobby> sl) RegisterServerRequest(std::shared_ptr<ServerLobby> sl, bool first_time)
: XMLRequest(Online::RequestManager::HTTP_MAX_PRIORITY), : XMLRequest(Online::RequestManager::HTTP_MAX_PRIORITY),
m_server_lobby(sl) {} m_server_lobby(sl), m_first_time(first_time) {}
}; // RegisterServerRequest }; // RegisterServerRequest
auto request = std::make_shared<RegisterServerRequest>( auto request = std::make_shared<RegisterServerRequest>(
std::dynamic_pointer_cast<ServerLobby>(shared_from_this())); std::dynamic_pointer_cast<ServerLobby>(shared_from_this()), first_time);
NetworkConfig::get()->setServerDetails(request, "create"); NetworkConfig::get()->setServerDetails(request, "create");
const SocketAddress& addr = STKHost::get()->getPublicAddress(); const SocketAddress& addr = STKHost::get()->getPublicAddress();
request->addParameter("address", addr.getIP() ); request->addParameter("address", addr.getIP() );

View File

@ -263,7 +263,7 @@ private:
// Track(s) votes // Track(s) votes
void handlePlayerVote(Event *event); void handlePlayerVote(Event *event);
void playerFinishedResult(Event *event); void playerFinishedResult(Event *event);
void registerServer(); void registerServer(bool first_time);
void finishedLoadingWorldClient(Event *event); void finishedLoadingWorldClient(Event *event);
void finishedLoadingLiveJoinClient(Event *event); void finishedLoadingLiveJoinClient(Event *event);
void kickHost(Event* event); void kickHost(Event* event);