Failed UNavigationObjectRepository::GetNavigationElementForUObject check on UE_MT_SCOPED_READ_ACCESS(NavElementAccessDetector)

As best I can tell this stack grabs a write lock in UNavigationObjectRepository::RegisterNavRelevantObjectInternal then later when waiting for some static mesh dependencies re-enters the same code and attempts to use this same function which seems to be all sorts of trouble.

Happens when loading a specific map of ours in the editor. Cannot provide the map, unsure what subset would provide a minimal reproduction.

This is in 5.5.4 and already has the fix from this thread:

[Content removed]

Stack:

[Inline Frame] UnrealEditor-NavigationSystem.dll!FRWAccessDetector::AcquireReadAccess() Line 73 C++ [Inline Frame] UnrealEditor-NavigationSystem.dll!TScopedReaderAccessDetector<FRWAccessDetector>::{ctor}(FRWAccessDetector &) Line 229 C++ [Inline Frame] UnrealEditor-NavigationSystem.dll!MakeScopedReaderAccessDetector(FRWAccessDetector &) Line 243 C++ UnrealEditor-NavigationSystem.dll!UNavigationObjectRepository::GetNavigationElementForUObject(const UObject * NavRelevantObject) Line 170 C++ UnrealEditor-NavigationSystem.dll!UNavigationObjectRepository::RegisterNavRelevantObjectInternal(const INavRelevantInterface & NavRelevantInterface, const UObject & NavRelevantObject, UNavigationObjectRepository::ENotifyOnSuccess NotifyOnSuccess) Line 82 C++ [Inline Frame] UnrealEditor-NavigationSystem.dll!UNavigationObjectRepository::UpdateNavigationElementForUObject(const INavRelevantInterface &) Line 191 C++ UnrealEditor-NavigationSystem.dll!UNavigationSystemV1::UpdateNavRelevantObjectInNavOctreeStatic(const INavRelevantInterface & InNavRelevantObject, const UObject & InObject, UNavigationSystemV1 * InNavigationSystem, TFunctionRef<void __cdecl(UNavigationSystemV1 &,TSharedRef<FNavigationElement const ,1> const &)> InCallback) Line 3685 C++ UnrealEditor-NavigationSystem.dll!UNavigationSystemV1::UpdateComponentInNavOctree(UActorComponent & Comp) Line 3772 C++ [Inline Frame] UnrealEditor-Engine.dll!TDelegate<void __cdecl(UActorComponent &),FDefaultDelegateUserPolicy>::Execute(UActorComponent &) Line 613 C++ UnrealEditor-Engine.dll!FNavigationSystem::UpdateComponentData(UActorComponent & Comp) Line 266 C++ UnrealEditor-Engine.dll!UActorComponent::CreatePhysicsState(bool bAllowDeferral) Line 1767 C++ UnrealEditor-Engine.dll!UStaticMeshComponent::PostStaticMeshCompilation() Line 3381 C++ UnrealEditor-Engine.dll!FStaticMeshCompilingManager::PostCompilation(UStaticMesh * StaticMesh) Line 304 C++ UnrealEditor-Engine.dll!FStaticMeshCompilingManager::FinishCompilation::__l22::<lambda_2>::operator()(AsyncCompilationHelpers::ICompilable * Object) Line 416 C++ [Inline Frame] UnrealEditor-Engine.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::FFunctionRefStoragePolicy,void __cdecl(AsyncCompilationHelpers::ICompilable *)>::operator()(AsyncCompilationHelpers::ICompilable * <Params_0>) Line 470 C++ UnrealEditor-Engine.dll!AsyncCompilationHelpers::FinishCompilation(TFunctionRef<AsyncCompilationHelpers::ICompilable & __cdecl(int)> Getter, int Num, const FText & AssetType, const FLogCategoryBase & LogCategory, TFunctionRef<void __cdecl(AsyncCompilationHelpers::ICompilable *)> PostCompileSingle) Line 165 C++ UnrealEditor-Engine.dll!FStaticMeshCompilingManager::FinishCompilation(TArrayView<UStaticMesh * const,int> InStaticMeshes) Line 407 C++ UnrealEditor-Engine.dll!UStaticMesh::WaitUntilAsyncPropertyReleased(EStaticMeshAsyncProperties AsyncProperties) Line 3978 C++ [Inline Frame] UnrealEditor-Engine.dll!UStaticMesh::GetBodySetup() Line 1048 C++ UnrealEditor-Engine.dll!UStaticMeshComponent::GetBodySetup() Line 1218 C++ UnrealEditor-NavigationSystem.dll!UNavModifierComponent::CalculateBounds() Line 154 C++ UnrealEditor-NavigationSystem.dll!UNavModifierComponent::CalcAndCacheBounds() Line 221 C++ UnrealEditor-NavigationSystem.dll!UNavRelevantComponent::GetNavigationBounds() Line 78 C++ UnrealEditor-Engine.dll!FNavigationElement::InitializeFromInterface(const INavRelevantInterface * NavRelevantInterface) Line 87 C++ UnrealEditor-Engine.dll!FNavigationElement::FNavigationElement(const INavRelevantInterface & NavRelevant, unsigned __int64 SubElementId) Line 64 C++ [Inline Frame] UnrealEditor-Engine.dll!SharedPointerInternals::TIntrusiveReferenceController<FNavigationElement const ,1>::{ctor}(const INavRelevantInterface &) Line 414 C++ [Inline Frame] UnrealEditor-Engine.dll!SharedPointerInternals::NewIntrusiveReferenceController(const INavRelevantInterface &) Line 465 C++ [Inline Frame] UnrealEditor-Engine.dll!MakeShared(const INavRelevantInterface &) Line 2252 C++ UnrealEditor-Engine.dll!FNavigationElement::CreateFromNavRelevantInterface(const INavRelevantInterface & NavRelevantInterface) Line 144 C++ UnrealEditor-NavigationSystem.dll!UNavigationObjectRepository::RegisterNavRelevantObjectInternal(const INavRelevantInterface & NavRelevantInterface, const UObject & NavRelevantObject, UNavigationObjectRepository::ENotifyOnSuccess NotifyOnSuccess) Line 85 C++ [Inline Frame] UnrealEditor-NavigationSystem.dll!UNavigationObjectRepository::UpdateNavigationElementForUObject(const INavRelevantInterface &) Line 191 C++ UnrealEditor-NavigationSystem.dll!UNavigationSystemV1::UpdateNavRelevantObjectInNavOctreeStatic(const INavRelevantInterface & InNavRelevantObject, const UObject & InObject, UNavigationSystemV1 * InNavigationSystem, TFunctionRef<void __cdecl(UNavigationSystemV1 &,TSharedRef<FNavigationElement const ,1> const &)> InCallback) Line 3685 C++ UnrealEditor-NavigationSystem.dll!UNavigationSystemV1::UpdateActorAndComponentsInNavOctree::__l2::<lambda_1>::operator()(AActor & ActorToUpdate) Line 3831 C++ UnrealEditor-NavigationSystem.dll!UNavigationSystemV1::UpdateActorAndComponentsInNavOctree(AActor & Actor, bool bUpdateAttachedActors) Line 3865 C++ [Inline Frame] UnrealEditor-Engine.dll!TDelegate<void __cdecl(AActor &),FDefaultDelegateUserPolicy>::Execute(AActor &) Line 613 C++ UnrealEditor-Engine.dll!FNavigationSystem::OnActorRegistered(AActor & Actor) Line 273 C++ UnrealEditor-Engine.dll!AActor::PostRegisterAllComponents() Line 3689 C++ UnrealEditor-Engine.dll!AActor::IncrementalRegisterComponents(int NumComponentsToRegister, FRegisterComponentContext * Context) Line 5623 C++ UnrealEditor-Engine.dll!ULevel::IncrementalRegisterComponents(bool bPreRegisterComponents, int NumComponentsToUpdate, FRegisterComponentContext * Context) Line 1814 C++ UnrealEditor-Engine.dll!ULevel::IncrementalUpdateComponents(int NumComponentsToUpdate, bool bRerunConstructionScripts, FRegisterComponentContext * Context) Line 1733 C++ UnrealEditor-Engine.dll!UWorld::AddToWorld(ULevel * Level, const UE::Math::TTransform<double> & LevelTransform, bool bConsiderTimeLimit, FNetLevelVisibilityTransactionId TransactionId, ULevelStreaming * InOwningLevelStreaming) Line 3344 C++ UnrealEditor-Engine.dll!ULevelStreaming::UpdateStreamingState(bool & bOutUpdateAgain, bool & bOutRedetermineTarget) Line 1052 C++ [Inline Frame] UnrealEditor-Engine.dll!FStreamingLevelPrivateAccessor::UpdateStreamingState(ULevelStreaming *) Line 791 C++ UnrealEditor-Engine.dll!UWorld::UpdateLevelStreaming() Line 4420 C++ UnrealEditor-Engine.dll!UWorld::FlushLevelStreaming(EFlushLevelStreamingType FlushType) Line 4685 C++ UnrealEditor-UnrealEd.dll!UEditorEngine::Map_Load(const wchar_t * Str, FOutputDevice & Ar) Line 2692 C++ UnrealEditor-UnrealEd.dll!UEditorEngine::HandleMapCommand(const wchar_t * Str, FOutputDevice & Ar, UWorld * InWorld) Line 6213 C++

Are you also not using DDC or ZenStore? Is there a certain actor or class of actors that are involved in this registration crash? Is there anything special to their setup such as child actors or multiple static mesh components? If you add that actor(s) to another map, does it also trigger this crash?

-James

No worries! I am thankful for all the debugging and info you have been able to supply thus far! We have made a couple other changes to address some issues of the navigation refactor. I am not sure if any of these are likely to also help with the issue you had been experiencing. If you do run into any of it again, please let us know. Our goal is to never have a crash regardless of cache status. They can just be tricky to narrow down what is triggering the recursive calls.

I have a DDC of which is local only, no shared DDC.

Not yet using ZenStore.

This was on our branch where we upgrade the engine and am actively updating to 5.4.4, so it is entirely likely I did not have various things cached yet.

Haven’t seen it again (because of caching?) so unsure about the specific actor/classes involved in registering this crash.

When I have time I can try clearing my DDC and reproducing to see if I can gather more information to answer your actor questions. I am sad I didn’t think to note the specific actor for me to just look up now :frowning: