/** * Test Method: Get the DistributedMember identifier for the vm containing a key * * @param key the key to look for * @return The ID of the DistributedMember holding the key, or null if there is no current mapping * for the key */ public DistributedMember getMemberOwning(Object key) { int bucketId = PartitionedRegionHelper.getHashKey(this, null, key, null, null); return getNodeForBucketRead(bucketId); }
/** * If a bucket is local, try to fetch the value from it */ public Object getFromLocalBucket(int bucketId, final Object key, final Object aCallbackArgument, boolean disableCopyOnRead, boolean preferCD, ClientProxyMembershipID requestingClient, EntryEventImpl clientEvent, boolean returnTombstones) throws ForceReattemptException, PRLocallyDestroyedException { Object obj; // try reading locally. InternalDistributedMember readNode = getNodeForBucketRead(bucketId); if (readNode == null) { return null; // fixes 51657 } if (readNode.equals(getMyId()) && null != (obj = this.dataStore.getLocally(bucketId, key, aCallbackArgument, disableCopyOnRead, preferCD, requestingClient, clientEvent, returnTombstones, true))) { if (logger.isTraceEnabled()) { logger.trace("getFromBucket: Getting key {} ({}) locally - success", key, key.hashCode()); } return obj; } return null; }
/** * Gets the Node for reading or performing a load from a specific bucketId. * * @return the member from which to read or load * @since GemFire 5.7 */ private InternalDistributedMember getNodeForBucketReadOrLoad(int bucketId) { InternalDistributedMember targetNode; if (!this.haveCacheLoader) { targetNode = getNodeForBucketRead(bucketId); } else { targetNode = getNodeForBucketWrite(bucketId, null /* retryTimeKeeper */); } if (targetNode == null) { this.checkShutdown(); // Fix for bug#37207 targetNode = createBucket(bucketId, 0 /* size */, null /* retryTimeKeeper */); } return targetNode; }
@Test public void getBucketNodeForReadOrWriteReturnsSecondaryNodeWhenClientEventIsNotPresent() throws Exception { int bucketId = 0; InternalDistributedMember primaryMember = mock(InternalDistributedMember.class); InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class); PartitionedRegion spyPR = spy(partitionedRegion); doReturn(primaryMember).when(spyPR).getNodeForBucketWrite(eq(bucketId), isNull()); doReturn(secondaryMember).when(spyPR).getNodeForBucketRead(eq(bucketId)); InternalDistributedMember memberForRegisterInterestRead = spyPR.getBucketNodeForReadOrWrite(bucketId, null); assertThat(memberForRegisterInterestRead).isSameAs(secondaryMember); verify(spyPR, times(1)).getNodeForBucketRead(anyInt()); }
@Test public void getBucketNodeForReadOrWriteReturnsSecondaryNodeForNonRegisterInterest() throws Exception { int bucketId = 0; InternalDistributedMember primaryMember = mock(InternalDistributedMember.class); InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class); EntryEventImpl clientEvent = mock(EntryEventImpl.class); when(clientEvent.getOperation()).thenReturn(Operation.GET); PartitionedRegion spyPR = spy(partitionedRegion); doReturn(primaryMember).when(spyPR).getNodeForBucketWrite(eq(bucketId), isNull()); doReturn(secondaryMember).when(spyPR).getNodeForBucketRead(eq(bucketId)); InternalDistributedMember memberForRegisterInterestRead = spyPR.getBucketNodeForReadOrWrite(bucketId, clientEvent); assertThat(memberForRegisterInterestRead).isSameAs(secondaryMember); verify(spyPR, times(1)).getNodeForBucketRead(anyInt()); }
@Test public void getBucketNodeForReadOrWriteReturnsSecondaryNodeWhenClientEventOperationIsNotPresent() throws Exception { int bucketId = 0; InternalDistributedMember primaryMember = mock(InternalDistributedMember.class); InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class); EntryEventImpl clientEvent = mock(EntryEventImpl.class); when(clientEvent.getOperation()).thenReturn(null); PartitionedRegion spyPR = spy(partitionedRegion); doReturn(primaryMember).when(spyPR).getNodeForBucketWrite(eq(bucketId), isNull()); doReturn(secondaryMember).when(spyPR).getNodeForBucketRead(eq(bucketId)); InternalDistributedMember memberForRegisterInterestRead = spyPR.getBucketNodeForReadOrWrite(bucketId, null); assertThat(memberForRegisterInterestRead).isSameAs(secondaryMember); verify(spyPR, times(1)).getNodeForBucketRead(anyInt()); }
@Test public void getBucketNodeForReadOrWriteReturnsPrimaryNodeForRegisterInterest() throws Exception { int bucketId = 0; InternalDistributedMember primaryMember = mock(InternalDistributedMember.class); InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class); EntryEventImpl clientEvent = mock(EntryEventImpl.class); when(clientEvent.getOperation()).thenReturn(Operation.GET_FOR_REGISTER_INTEREST); PartitionedRegion spyPR = spy(partitionedRegion); doReturn(primaryMember).when(spyPR).getNodeForBucketWrite(eq(bucketId), isNull()); doReturn(secondaryMember).when(spyPR).getNodeForBucketRead(eq(bucketId)); InternalDistributedMember memberForRegisterInterestRead = spyPR.getBucketNodeForReadOrWrite(bucketId, clientEvent); assertThat(memberForRegisterInterestRead).isSameAs(primaryMember); verify(spyPR, times(1)).getNodeForBucketWrite(anyInt(), any()); }
@Test public void updateBucketMapsForInterestRegistrationWithSetOfKeysFetchesPrimaryBucketsForRead() { Integer[] bucketIds = new Integer[] {0, 1}; InternalDistributedMember primaryMember = mock(InternalDistributedMember.class); InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class); PartitionedRegion spyPR = spy(partitionedRegion); doReturn(primaryMember).when(spyPR).getNodeForBucketWrite(anyInt(), isNull()); doReturn(secondaryMember).when(spyPR).getNodeForBucketRead(anyInt()); HashMap<InternalDistributedMember, HashSet<Integer>> nodeToBuckets = new HashMap<InternalDistributedMember, HashSet<Integer>>(); Set buckets = Arrays.stream(bucketIds).collect(Collectors.toCollection(HashSet::new)); spyPR.updateNodeToBucketMap(nodeToBuckets, buckets); verify(spyPR, times(2)).getNodeForBucketWrite(anyInt(), isNull()); }
@Test public void updateBucketMapsForInterestRegistrationWithAllKeysFetchesPrimaryBucketsForRead() { Integer[] bucketIds = new Integer[] {0, 1}; InternalDistributedMember primaryMember = mock(InternalDistributedMember.class); InternalDistributedMember secondaryMember = mock(InternalDistributedMember.class); PartitionedRegion spyPR = spy(partitionedRegion); doReturn(primaryMember).when(spyPR).getNodeForBucketWrite(anyInt(), isNull()); doReturn(secondaryMember).when(spyPR).getNodeForBucketRead(anyInt()); HashMap<InternalDistributedMember, HashMap<Integer, HashSet>> nodeToBuckets = new HashMap<InternalDistributedMember, HashMap<Integer, HashSet>>(); HashSet buckets = Arrays.stream(bucketIds).collect(Collectors.toCollection(HashSet::new)); HashMap<Integer, HashSet> bucketKeys = new HashMap<>(); bucketKeys.put(Integer.valueOf(0), buckets); spyPR.updateNodeToBucketMap(nodeToBuckets, bucketKeys); verify(spyPR, times(1)).getNodeForBucketWrite(anyInt(), isNull()); }
bucketId = (Integer) bucketIds[whichBucket]; InternalDistributedMember member = partitionedRegion.getNodeForBucketRead(bucketId); if (member != null) { if (member.equals(partitionedRegion.getMyId())) {
public InternalDistributedMember getOrCreateNodeForBucketRead(int bucketId) { InternalDistributedMember targetNode = getNodeForBucketRead(bucketId); if (targetNode != null) { return targetNode; } try { return createBucket(bucketId, 0, null); } catch (PartitionedRegionStorageException e) { // try not to throw a PRSE if the cache is closing or this region was // destroyed during createBucket() (bug 36574) this.checkReadiness(); if (this.cache.isClosed()) { throw new RegionDestroyedException(toString(), getFullPath()); } throw e; } }
nod = getNodeForBucketRead(buck); if (nod != null && nod.equals(oldNode)) { if (snoozer.overMaximum()) {