DeadlockDetect: Provide more information for debugging.
This commit is contained in:
parent
23f5e605a1
commit
a52de8e8cd
@ -601,6 +601,27 @@ bool cPluginManager::CallHookEntityChangedWorld(cEntity & a_Entity, cWorld & a_W
|
||||
|
||||
bool cPluginManager::CallHookExecuteCommand(cPlayer * a_Player, const AStringVector & a_Split, const AString & a_EntireCommand, CommandResult & a_Result)
|
||||
{
|
||||
// Output the command being executed to log (for troubleshooting deadlocks-in-commands):
|
||||
auto world = a_Player->GetWorld();
|
||||
AString worldName;
|
||||
Int64 worldAge;
|
||||
if (world != nullptr)
|
||||
{
|
||||
worldName = world->GetName();
|
||||
worldAge = world->GetWorldAge();
|
||||
}
|
||||
else
|
||||
{
|
||||
worldName = "<no world>";
|
||||
worldAge = 0;
|
||||
}
|
||||
LOG("Player %s is executing command \"%s\" in world \"%s\" at world age %lld.",
|
||||
a_Player->GetName().c_str(),
|
||||
a_EntireCommand.c_str(),
|
||||
worldName.c_str(),
|
||||
worldAge
|
||||
);
|
||||
|
||||
FIND_HOOK(HOOK_EXECUTE_COMMAND);
|
||||
VERIFY_HOOK;
|
||||
|
||||
|
@ -121,7 +121,7 @@ void cDeadlockDetect::CheckWorldAge(const AString & a_WorldName, Int64 a_Age)
|
||||
WorldAge.m_NumCyclesSame += 1;
|
||||
if (WorldAge.m_NumCyclesSame > (m_IntervalSec * 1000) / CYCLE_MILLISECONDS)
|
||||
{
|
||||
DeadlockDetected();
|
||||
DeadlockDetected(a_WorldName, a_Age);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -135,9 +135,11 @@ void cDeadlockDetect::CheckWorldAge(const AString & a_WorldName, Int64 a_Age)
|
||||
|
||||
|
||||
|
||||
void cDeadlockDetect::DeadlockDetected(void)
|
||||
void cDeadlockDetect::DeadlockDetected(const AString & a_WorldName, Int64 a_WorldAge)
|
||||
{
|
||||
LOGERROR("Deadlock detected, aborting the server");
|
||||
LOGERROR("Deadlock detected: world %s has been stuck at age %lld. Aborting the server.",
|
||||
a_WorldName.c_str(), static_cast<long long>(a_WorldAge)
|
||||
);
|
||||
ASSERT(!"Deadlock detected");
|
||||
abort();
|
||||
}
|
||||
|
@ -59,8 +59,10 @@ protected:
|
||||
/** Checks if the world's age has changed, updates the world's stats; calls DeadlockDetected() if deadlock detected */
|
||||
void CheckWorldAge(const AString & a_WorldName, Int64 a_Age);
|
||||
|
||||
/** Called when a deadlock is detected. Aborts the server. */
|
||||
NORETURN void DeadlockDetected(void);
|
||||
/** Called when a deadlock is detected in a world. Aborts the server.
|
||||
a_WorldName is the name of the world whose age has triggered the detection.
|
||||
a_WorldAge is the age (in ticks) in which the world is stuck. */
|
||||
NORETURN void DeadlockDetected(const AString & a_WorldName, Int64 a_WorldAge);
|
||||
} ;
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user