All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.scalecube.cluster.membership.MembershipRecord Maven / Gradle / Ivy

There is a newer version: 2.7.1
Show newest version
package io.scalecube.cluster.membership;

import static com.google.common.base.Preconditions.checkArgument;
import static io.scalecube.cluster.membership.MemberStatus.DEAD;
import static io.scalecube.cluster.membership.MemberStatus.SUSPECT;

import io.scalecube.cluster.Member;
import io.scalecube.transport.Address;

import javax.annotation.Nonnull;
import javax.annotation.concurrent.Immutable;

/**
 * Cluster membership record which represents member, status, and incarnation.
 */
@Immutable
final class MembershipRecord {

  private final Member member;
  private final MemberStatus status;
  private final int incarnation;

  /**
   * Instantiates new instance of membership record with given member, status and incarnation.
   */
  public MembershipRecord(Member member, MemberStatus status, int incarnation) {
    checkArgument(member != null);
    checkArgument(status != null);
    this.member = member;
    this.status = status;
    this.incarnation = incarnation;
  }

  @Nonnull
  public Member member() {
    return member;
  }

  @Nonnull
  public String id() {
    return member.id();
  }

  @Nonnull
  public Address address() {
    return member.address();
  }

  @Nonnull
  public MemberStatus status() {
    return status;
  }

  public boolean isAlive() {
    return status == MemberStatus.ALIVE;
  }

  public boolean isSuspect() {
    return status == MemberStatus.SUSPECT;
  }

  public boolean isDead() {
    return status == MemberStatus.DEAD;
  }

  public int incarnation() {
    return incarnation;
  }

  /**
   * Checks either this record overrides given record.
   *
   * @param r0 existing record in membership table
   * @return true if this record overrides exiting; false otherwise
   */
  public boolean isOverrides(MembershipRecord r0) {
    if (r0 == null) {
      return true;
    }
    checkArgument(this.member.equals(r0.member), "Can't compare records for different members");
    if (r0.status == DEAD) {
      return false;
    }
    if (status == DEAD) {
      return true;
    }
    if (incarnation == r0.incarnation) {
      return (status != r0.status) && (status == SUSPECT);
    } else {
      return incarnation > r0.incarnation;
    }
  }

  @Override
  public String toString() {
    return "{m: " + member + ", s: " + status + ", inc: " + incarnation + '}';
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy