[
https://issues.jboss.org/browse/ISPN-2103?page=com.atlassian.jira.plugin....
]
Pedro Ruivo commented on ISPN-2103:
-----------------------------------
Hey guys,
I need an opinion. I've changed the code to make the locking mode to handle the
conflicts. However, when a transaction starts and the map does not exists, what behavior
do you prefer?
1) throw ISE.
2) create a new map.
Concurrent access after removal of an AtomicMap should NOT result in
an IllegalStateException when accessed by other threads
----------------------------------------------------------------------------------------------------------------------------
Key: ISPN-2103
URL:
https://issues.jboss.org/browse/ISPN-2103
Project: Infinispan
Issue Type: Bug
Components: Core
Affects Versions: 5.1.5.FINAL
Reporter: Adrian Nistor
Assignee: Pedro Ruivo
ISPN-1121 introduces an IllegalStateException that is being thrown from AtomicMap methods
once the map handle has become stale (ie. removed from cache). In case of concurrent
access, the exception is thrown to all threads not just to the thread that performed the
removal. This was fine-ish in older versions of Infinispan before introduction of
optimistic and pessimistic locking but it should be reconsidered now because:
1. It interferes/overlaps with transaction isolation. We should rely on the selected
locking scheme (OL/PL) to detect conflicts between transactions and report the problem
accordingly. Especially if the stale map is used just for reading - this should be allowed
to work rather than stop it.
2. This exception is pretty disruptive and awkward to handle. All methods of an AtomicMap
can result in this exception and the current thread has to be prepared for handling it if
other threads remove the map. Not much transaction isolation.
3. Since the TreeCache is backed by AtomicMap nearly all Tree API can throw this.
The proposed fix consists of:
1. removing AtomicHashMap.removed flag and AtomicHashMap.markRemoved() method.
2. revising AtomicHashMapProxy.assertValid() method to check only if the map is null (ie.
removed) but no longer use the removed flag.
3. revising ReadCommittedEntry.commit() method to no longer call markRemoved() method.
The consequences of these changes are:
1. Any further access to a stale map results in IllegalStateException ONLY in the thread
that performed the removal. This thread 'knows' the map is stale so it is fine to
punish it. Other threads remain unaffected until lock acquisition or commit is performed
(depending on locking model).
2. Other threads can continue to use the previously obtained map handle for reads without
danger of getting an exception.
3. If a write operation is done on the map, the results depend on the locking model:
3.1 optimistic locking + write skew check: a WriteSkewException will stop the commit
during prepare
3.2 optimistic locking, no write skew check: the write is committed and the work of
the transaction that removed the map is overwritten. The map is effectively revived.
3.3 pessimistic locking: same as 3.2
Please note 3.2 and 3.3 work the same as for normal values (not atomic maps).
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)