@Override public boolean hasAffinity(K key) { DistributionManager dist = this.cache.getAdvancedCache().getDistributionManager(); if (dist != null) { DataLocality locality = dist.getLocality(key); return locality.isLocal() || locality.isUncertain(); } return true; }
/** * This method retrieves an entry from a remote cache and optionally stores it in L1 (if L1 is * enabled). * * <p>This method only works if a) this is a locally originating invocation and b) the entry in * question is not local to the current cache instance and c) the entry is not in L1. If either of * a, b or c does not hold true, this method returns a null and doesn't do anything. * * @param ctx invocation context * @param key key to retrieve * @return value of a remote get, or null * @throws Throwable if there are problems */ private Object remoteGetAndStoreInL1(InvocationContext ctx, Object key, boolean isWrite) throws Throwable { DataLocality locality = dm.getLocality(key); if (ctx.isOriginLocal() && !locality.isLocal() && isNotInL1(key)) { return realRemoteGet(ctx, key, true, isWrite); } else { // maybe we are still rehashing as a joiner? ISPN-258 if (locality.isUncertain()) { if (trace) log.tracef( "Key %s is mapped to local node %s, but a rehash is in progress so may need to look elsewhere", key, rpcManager.getAddress()); // try a remote lookup all the same return realRemoteGet(ctx, key, false, isWrite); } else { if (trace) log.tracef( "Not doing a remote get for key %s since entry is mapped to current node (%s), or is in L1. Owners are %s", key, rpcManager.getAddress(), dm.locate(key)); } } return null; }