View Javadoc

1   /*
2    * Copyright (c) 1998-2002 The Jgroup Team.
3    *
4    * This program is free software; you can redistribute it and/or modify
5    * it under the terms of the GNU Lesser General Public License version 2 as
6    * published by the Free Software Foundation.
7    *
8    * This program is distributed in the hope that it will be useful,
9    * but WITHOUT ANY WARRANTY; without even the implied warranty of
10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11   * GNU Lesser General Public License for more details.
12   *
13   * You should have received a copy of the GNU Lesser General Public License
14   * along with this program; if not, write to the Free Software
15   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16   *
17   */
18  
19  package jgroup.core;
20  
21  import java.io.Externalizable;
22  
23  import jgroup.relacs.types.LocalId;
24  import net.jini.jeri.Endpoint;
25  
26  /**
27   *  A class implementing this interface uniquely identify a member
28   *  object in a group. <p>
29   *
30   *  A member identifier is composed by three parts:
31   *  <UL>
32   *  <LI> an IP address, uniquely identifying the machine hosting the
33   *  member; </LI>
34   *  <LI> the incarnation time of the Jgroup subsystem hosting the
35   *  member, i.e. the time at which the Jgroup subsystem was created;
36   *  </LI>
37   *  <LI> a member counter, which is used to distinguish multiple members
38   *  running in the same Java virtual machine. </LI>
39   *  </UL>
40   *
41   *  When created, a Jgroup subsytem takes control over some UDP
42   *  communication port.  Given the UDP specification, it is impossible
43   *  that two Jgroup subsystem share the same port in the same machine.
44   *  In this way, it is possible to discover if a remote Jgroup subsystem
45   *  has crashed and then recovered; in this case, their incarnation
46   *  times differ (the more recent is greater than the older).
47   *
48   *  When a <code>MemberId</code> is created, its IP address and its
49   *  incarnation time are set equal to each member id created in that
50   *  Java virtual machine.  So, the identifiers of members hosted in the
51   *  same Java virtual machine differs only for the member counter. <p>
52   *
53   *  Member ids may be compared in the following ways:
54   *  <UL>
55   *  <LI> two <code>MembersId</code>s are equal (method <tt>equals</tt>)
56   *  if and only if they have the same IP address, the same incarnation
57   *  time and the same member counter; </LI>
58   *  <LI> two <code>MembersId</code>s are <i>neighbours</i> (method
59   *  <tt>isNeighbour</tt>) if and only if they have the same IP address
60   *  and the same incarnation time; i.e., if they are hosted in the same
61   *  virtual machine;</LI>
62   *  <LI> a <code>MembersId</code> is <i>newer</i> than another
63   *  <code>MembersId</code> (method <tt>isNewer</tt>) if and only if
64   *  their IP addresses are the same and the incarnation time of the
65   *  former id is greater than the incarnation time of the latter id; in
66   *  other words, if the Java virtual machine hosting the latter member
67   *  id has crashed (freeing the control over the UDP port) and then
68   *  recovered. </LI>
69   *  </UL>
70   *
71   *  @author Alberto Montresor
72   *  @author Hein Meling
73   *  @author Marcin Solarski
74   *  @since Jgroup 0.9
75   */
76  public interface MemberId
77    extends Externalizable, Comparable<MemberId>
78  {
79  
80    /**
81     *  Returns the EndPoint (IP, port) of the java virtual machine
82     *  hosting this member.
83     */
84    public EndPoint getEndPoint();
85  
86    /**
87     * Returns the TcpEndpoint of this member.
88     */
89    public Endpoint getTcpEndpoint();
90  
91    /**
92     *  Returns a LocalId object used to distinguish this particular
93     *  member from other members of the same group hosted in
94     *  the same Java virtual machine.
95     */
96    public LocalId getLocalId();
97  
98    /**
99     *  Returns the canonical hostname associated with the
100    *  JVM on which the member is running.
101    */
102   public String getCanonicalHostName();
103 
104   /**
105    *  Returns the server port associated with this member host.
106    *  The server port is computed deterministically, based on the
107    *  the host port number and the member number.
108    */
109   public int getServerPort();
110 
111   /**
112    * Returns true if and only if the IP addresses of this member id and
113    * the specified id are the same, and the incarnation time of the former
114    * is greater than the incarnation time of the latter; in other words,
115    * if the Java virtual machine hosting the specified member id has crashed
116    * and then recovered.
117    */
118   public boolean isNewer(MemberId id);
119 
120   /**
121    * Returns true if and only if this member id and the specified member id
122    * have the same IP address and the same incarnation time; i.e., if they
123    * are hosted in the same virtual machine.
124    */
125   public boolean isNeighbour(MemberId id);
126   
127 } // END MemberId