Mutable custom versioning is broken from 5.5 -> 5.6

In 5.6, a handful of new entries in `FCustomizableObjectCustomVersion` were added, including `SetDisplayNamePropertyAsPinNameOfTableNodes`. Looking back at the history, `SetDisplayNamePropertyAsPinNameOfTableNodes` was added originally in https://github.com/EpicGames/UnrealEngine/commit/18e3992548c3c84be378ad90a82b646488c85018\. Then `FixedNoPinsInRerouteNodes` was added in https://github.com/EpicGames/UnrealEngine/commit/52ad8a3f1a67676925c5b2359dd9690758171177\.

In 5.5 `FixedNoPinsInRerouteNodes` was cherry picked into the release, but `SetDisplayNamePropertyAsPinNameOfTableNodes` wasn’t. This is important, because 5.5 shipped with `FixedNoPinsInRerouteNodes` set to a value of `76`. When 5.6 came along and included all of the new versions, `SetDisplayNamePropertyAsPinNameOfTableNodes` was merged into its original slot with a value of `76` as well. This meant that all licensees that went from 5.5 -> 5.6 ended up skipping the `SetDisplayNamePropertyAsPinNameOfTableNodes` fixup and now have invalid/corrupt content. The issue is that you can’t even open the content to recreate the broken pieces because it trips asserts and ensures.

I simply reordered these two enum values and it fixes the issue.

Steps to Reproduce

  1. Serialize with 5.5
  2. Open them in 5.6

Thanks for raising this. You can switch it, but we’ll investigate to ensure there aren’t any worse issues by doing so.

You can follow along here: https://issues.unrealengine.com/issue/UE-330656

Dustin

Hi Bill.

Yep, in your case, you can simply reorder them, and it will work without much issue. I was able to repro the “SetDisplayNamePropertyAsPinNameOfTableNodes” backwards compatibility step not being run, but that raised some warnings but no asserts. It would be nice if you could provide us with a log or more info about those assets/errors, as they may not be caused by the same issue.

[Image Removed]

I will make changes to the 5.7 release so the code that you are seeing skipped gets run either way. But, for your case, swapping them arround will do the trick.

Have a nice day, and sorry for the inconvenience.

Daniel Moreno

Sorry for the delayed response. I can confirm that its definitely fine after the swap - which I did around the time I opened this post. As for the issue we were seeing:

Logs:

LogMutable: Display: Compiling Customizable Object CO_Human_Ref for platform WindowsClient and optimization level "Maximum".
Mutable: Error: Couldn't find the column [] in the data table's struct.   CO_Human_Ref  (Node  DT_Human_Body DT_Human_Body - Data Table )
Mutable: Error: Couldn't find a default value in the data table's struct for the column . The default value is null or not a Material Instance.   CO_Human_Ref  (Node  MI_Master_Human_Body_Default Mesh Section )
Mutable: Error: Couldn't find the column [] in the data table's struct.   CO_Human_Ref  (Node  DT_Human_Head DT_Human_Head - Data Table )
Mutable: Error: Couldn't find a default value in the data table's struct for the column . The default value is null or not a Material Instance.   CO_Human_Ref  (Node  MI_Master_Human_Head_Default Mesh Section )
LogSkeletalMesh: Display: Waiting for skinned assets to be ready 0/1 (SK_Wearables_Struct_Ref) ...
Mutable: Error: Couldn't find the column [] in the data table's struct.   CO_Master_Wearables_Under  (Node  DT_Master_Wearable_Under FSTRUCT_Wearables_SK1_Clip4_MI4_Under - Script Struct )
Mutable: Error: Couldn't find a default value in the data table's struct for the column . The default value is null or not a Material Instance.   CO_Master_Wearables_Under  (Node  MI_Master_Wearables_Default Mesh Section )
Mutable: Error: Couldn't find a default value in the data table's struct for the column . The default value is null or not a Material Instance.   CO_Master_Wearables_Under  (Node  MI_Master_Wearables_Default Mesh Section )
LogCore: Error: 'UStruct::IsChildOf' was called with a null 'this' pointer - this is no longer supported.
LogOutputDevice: Error: 
 
Script Stack (0 frames) :
 
LogWindows: Error: appError called: Assertion failed: IsThisNotNull(this, "UStruct::IsChildOf") [File:Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp] [Line: 2758]

Callstack:

Assertion failed: IsThisNotNull(this, “UStruct::IsChildOf”) [File:Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp] [Line: 2758]

Called from Cast (Casts.h:161)

[Image Removed]

Hi again, Bill.

No worries at all. Yep, your crash seems to be directly related to the error in the backwards compatibility code. And as previously stated, I have pushed a fix to 5.7.

Have a nice day!