We ran into an assertion failure in Cache::getPCache(), and I did a little investigation. The assertion verifies that the PrefixCache for the given prefix exists before we use it.
The prefix-cache is made on the first access of that prefix, in the code to take ownership of a prefix. Looking at the code for Ownership::takeOwnership(), I think if there are two 'simultaneous' requests for the same prefix (2 concurrent takeOwnership() fcns running), one will be allowed to continue (and access the prefix via the prefix-cache I presume), while the other one is still getting ownership. Look at the code near the top of that function. It checks for existence of ownedPrefixes[p], and if it doesn't exist yet it creates it atomically. The next call sees it ... then ... assumes the prefix is already owned?
Needs further investigation. Either need to prove this works the way it's supposed to (ie, find out what prevents another caller from returning before a prefix is owned), or need to find the real culprit & fix it.