@Test public void testClientEventIsUpdatedWithCurrentEntryVersionTagAfterSearchConcurrencyException() { DistributedRegion region = prepare(true); EntryEventImpl event = createDummyEvent(region); region.basicInvalidate(event); VersionTag tag = createVersionTag(true); RegionEntry re = mock(RegionEntry.class); VersionStamp stamp = mock(VersionStamp.class); doReturn(re).when(region).getRegionEntry(any()); when(re.getVersionStamp()).thenReturn(stamp); when(stamp.asVersionTag()).thenReturn(tag); createSearchLoad(); doThrow(new ConcurrentCacheModificationException()).when(region) .basicPutEntry(any(EntryEventImpl.class), anyLong()); KeyInfo ki = new KeyInfo(event.getKey(), null, null); region.findObjectInSystem(ki, false, null, false, null, false, false, null, event, false); assertNotNull("ClientEvent version tag is not set with region version tag.", event.getVersionTag()); }
/** * This method is called when a miss from a get ends up finding an object through a cache loader * or from a server. In that case we want to make sure that we don't move this bucket while * putting the value in the ache. * * @see LocalRegion#basicPutEntry(EntryEventImpl, long) */ @Override protected RegionEntry basicPutEntry(final EntryEventImpl event, final long lastModified) throws TimeoutException, CacheWriterException { boolean locked = lockKeysAndPrimary(event); try { if (getPartitionedRegion().isParallelWanEnabled()) { handleWANEvent(event); } event.setInvokePRCallbacks(true); forceSerialized(event); return super.basicPutEntry(event, lastModified); } finally { if (locked) { releaseLockForKeysAndPrimary(event); } } }
private void putNewValueInRegion(boolean isCreate, EntryEventImpl clientEvent, long lastModified, EntryEventImpl event) { RegionEntry re = null; // Set eventId. Required for interested clients. event.setNewEventId(cache.getDistributedSystem()); long startPut = CachePerfStats.getStatTime(); validateKey(event.getKey()); // this next step also distributes the object to other processes, if necessary try { re = basicPutEntry(event, lastModified); // Update client event with latest version tag from re. if (re != null && clientEvent != null) { clientEvent.setVersionTag(event.getVersionTag()); } if (!isTX()) { getCachePerfStats().endPut(startPut, event.isOriginRemote()); } } catch (ConcurrentCacheModificationException e) { // the cache was modified while we were searching for this entry and // the netsearch result was elided. Return the current value from the cache updateEventWithCurrentRegionEntry(event, clientEvent); } catch (CacheWriterException cwe) { if (logger.isDebugEnabled()) { logger.debug("findObjectInSystem: writer exception putting entry {} : {}", event, cwe); } } if (isCreate) { recordMiss(re, event.getKey()); } }