When an entry is updated, InternalEntryFactoryImpl tries to reuse the existing InternalCacheEntry instance instead of creating a new one. The condition is that both the new and the old entry have the same implementation implementation: immortal, immortal w/ external metadata, transient, transient w/ metadata etc.
Because MetadataImmortalCacheEntry extends ImmortalCacheEntry, that logic is broken: when an immortal entry with external metadata is replaced with a new entry without external metadata, the external metadata is not removed.
This impacts the anchored keys module, which I am changing to store the key location in the metadata (currently it is stored as a value, and it is broken with BINARY/OFF_HEAP storage). When a node leaves and an entry located on the leaver is updated, the key is written on the newest joiner. The joiner already has a local entry with RemoteMetadata, and is trying to write a value without any metadata.