My web application is having some race conditions. I dived deep into StorageCache class. I believe I have found the cause:
itemResultCache, attributesResultCache and ldapQueryResults are shared across all threads.
In a web application, StorageCache object is a singleton and shared across all threads. But itemResultCache, attributesResultCache and ldapQueryResults are really meant to be used only by one thread (single call).
In my case, when CheckAccess->storeApplicationItemValidation is called, the following two lines are executed:
this.itemResultCache = Hashtable.Synchronized(new Hashtable());
this.attributesResultCache = Hashtable.Synchronized(new Hashtable());
After that, all the threads are looking at two empty caches. All the data is lost.
Suggestion: Make these cache objects to be thread data or CallContext data.
It's an urgent issue on our side, please let me know your time line ASAP. I may need do some custom coding.