A race to "children loaded" flag in CacheLoadedInterceptor.loadChildren()
-------------------------------------------------------------------------
Key: JBCACHE-1556
URL:
https://jira.jboss.org/jira/browse/JBCACHE-1556
Project: JBoss Cache
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: Cache loaders, Transactions
Affects Versions: 3.2.1.GA
Reporter: Krzysztof Sobolewski
Assignee: Manik Surtani
Attachments: ChildrenLoadingRaceTest-fix.diff, ChildrenLoadingRaceTest.java
We found a race in CacheLoaderInterceptor.loadChildren() that goes like this:
1) There is a node /a with evicted children /a/a and /a/b; the node itself is *not*
evicted
2) Transaction T1 wants to get the children list of /a
3) Transaction T2 wants to get the children list of /a
4) T1 gets to loadChildren() for /a, notices that the children are not loaded and proceeds
to load them
4a) T1 loads the children and sets "children loaded" flag to true, but holds the
names themselves in its context [this depends on isolation level, I guess]
5) T2 gets to the same point and sees that "children loaded" flag is set, so it
skips loading
6a) T1 correctly returns "a" and "b"
6b) T2 returns whatever was in memory at that point [in the attached test it's
"a", but I would expect empty set]
I fixed it by acquiring a lock on the parent node, forcing both transactions to serialize
the access (but not preventing from loading the children twice).
The patch depends on the one proposed for JBCACHE-1553 (it's in the same place and
they interact in non-trivial way)
Also note that the "lock parent for child insert remove" config option does not
affect the result of the test.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira