| name | audit-reentrancy |
| description | Analyze user callbacks for re-entrancy defects (deadlock, corruption) |
| context | fork |
| agent | auditor |
| disable-model-invocation | true |
Analyze the cache for defects caused by user callbacks re-entering the cache.
User-provided callbacks:
- CacheLoader.load(key) / loadAll(keys)
- CacheLoader.reload(key, oldValue)
- Weigher.weigh(key, value)
- Expiry.expireAfterCreate / expireAfterUpdate / expireAfterRead
- RemovalListener.onRemoval(key, value, cause)
- EvictionListener (synchronous variant)
- Mapping functions passed to compute, computeIfAbsent, merge
For each callback:
- List every lock held at the point the callback is invoked.
Include: evictionLock, CHM bin lock, synchronized(node), any other.
- Determine what happens if the callback calls EACH of these cache
methods: get, put, remove, compute, computeIfAbsent, size, clear,
cleanUp, asMap().entrySet().
- For each (callback, cache method) pair where locks are held:
- Can it deadlock? (Same lock re-acquired? Lock ordering violated?)
- Can it corrupt state? (Re-entering a method mid-mutation?)
- Can it observe partially-constructed state?
- If the cache defends against re-entrancy (e.g., by deferring work),
explain the mechanism and verify it is complete.
For each defect: state the callback, re-entrant method, locks involved,
call stack, and observable incorrect behavior.