[ https://issues.apache.org/jira/browse/GEODE-5645?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
ASF GitHub Bot updated GEODE-5645: ---------------------------------- Labels: pull-request-available (was: ) > Client cache misses invalidate > ------------------------------ > > Key: GEODE-5645 > URL: https://issues.apache.org/jira/browse/GEODE-5645 > Project: Geode > Issue Type: Bug > Components: client queues > Reporter: Bruce Schuchardt > Priority: Major > Labels: pull-request-available > > In a test with four clients and four servers with the clients performing > concurrent operations on the same keys one of the clients missed an > "invalidate" event and ended up being inconsistent. > There was a cache entry in the servers sitting at version 2. Client4 is the > cache that ends up being inconsistent by way of its subscription feed. > client1 does v3 invalidate with server1 > client2 does v4 update with server2 > client3 does v5 invalidate with server3 > server4 receives v3 invalidate and informs clients > client4 gets v3 invalidate through subscription > server4 receives v5 invalidate and ignores it because its already invalidated > server4 receives v4 update from server2 > server4 throws concurrency conflict exception for v4 update > client4 gets v4 update (applied as a create) from server4 through subscription > Clients with queues on other servers get the ops in order and end up with an > invalidated entry. > client4 does not get the final invalidate event and is inconsistent wrt other > clients and the servers. > With fine level logging the log statement that shows the problem happening is > this: > {noformat} > mapInvalidate: Entry already invalid: 'Object_1683' > {noformat} > Where Object_1683 is the key for the entry we're dealing with. > The code doing this is in AbstractRegionMap's invalidate() method: > {code} > if (oldRe.isInvalid()) { > // was already invalid, do not invoke listeners or > increment stat > if (isDebugEnabled) { > logger.debug("mapInvalidate: Entry already invalid: > '{}'", > event.getKey()); > } > processVersionTag(oldRe, event); > try { > oldRe.setValue(owner, oldRe.getValueInVM(owner)); > // OFFHEAP noop setting > > // an already invalid to > > // invalid; No need to > > // call > > // prepareValueForCache > > // since it is an > > // invalid token. > } catch (RegionClearedException e) { > // that's okay - when writing an invalid into a > disk, the > // region has been cleared (including this token) > } > {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005)