In a situation when a member(f.ex member2) is isolated and the rpc registrations
are removed from the node(member1) we can still have our bucket store populated
by buckets from the remaining node(member-3) which might not have received
the memberUnreachable message yet leadig to stale routing of an rpc to
member-2.
This patch adds bucket filtering based on the currently present peers
so that we only accept Buckets that we can see.
Change-Id: I92c1e063f4754aca829bd73df4518f859e1d8497
Signed-off-by: Tomas Cere <tcere@cisco.com>
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.base.Verify;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.base.Verify;
+import com.google.common.collect.Maps;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
* @param member who went down
*/
private void receiveMemberRemoveOrUnreachable(final Member member) {
* @param member who went down
*/
private void receiveMemberRemoveOrUnreachable(final Member member) {
+ LOG.debug("Received memberDown or Unreachable: {}", member);
+
//if its self, then stop itself
if (selfAddress.equals(member.address())) {
getContext().stop(getSelf());
//if its self, then stop itself
if (selfAddress.equals(member.address())) {
getContext().stop(getSelf());
* @param member the member to add
*/
private void receiveMemberUpOrReachable(final Member member) {
* @param member the member to add
*/
private void receiveMemberUpOrReachable(final Member member) {
+ LOG.debug("Received memberUp or reachable: {}", member);
+
//ignore up notification for self
if (selfAddress.equals(member.address())) {
return;
//ignore up notification for self
if (selfAddress.equals(member.address())) {
return;
*/
@VisibleForTesting
void updateRemoteBuckets(final Map<Address, ? extends Bucket<?>> buckets) {
*/
@VisibleForTesting
void updateRemoteBuckets(final Map<Address, ? extends Bucket<?>> buckets) {
- bucketStore.updateRemoteBuckets(buckets);
+ // filter this so we only handle buckets for known peers
+ bucketStore.updateRemoteBuckets(Maps.filterKeys(buckets, peers::containsKey));