FreePastry/docs/javadoc/rice/pastry/standard/ConsistentJoinProtocol.html

769 lines
40 KiB
HTML
Raw Normal View History

2019-05-13 16:45:05 +04:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_07) on Fri Mar 13 20:01:36 CET 2009 -->
<TITLE>
ConsistentJoinProtocol (Rice Pastry - API Specifications)
</TITLE>
<META NAME="date" CONTENT="2009-03-13">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="ConsistentJoinProtocol (Rice Pastry - API Specifications)";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="class-use/ConsistentJoinProtocol.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
Rice Pastry API</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../rice/pastry/standard/ConsistentJoinMsg.html" title="class in rice.pastry.standard"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.CJPDeserializer.html" title="class in rice.pastry.standard"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../index.html?rice/pastry/standard/ConsistentJoinProtocol.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="ConsistentJoinProtocol.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;<A HREF="#nested_class_summary">NESTED</A>&nbsp;|&nbsp;<A HREF="#field_summary">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;<A HREF="#field_detail">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== -->
<H2>
<FONT SIZE="-1">
rice.pastry.standard</FONT>
<BR>
Class ConsistentJoinProtocol</H2>
<PRE>
java.lang.Object
<IMG SRC="../../../resources/inherit.gif" ALT="extended by "><A HREF="../../../rice/pastry/client/PastryAppl.html" title="class in rice.pastry.client">rice.pastry.client.PastryAppl</A>
<IMG SRC="../../../resources/inherit.gif" ALT="extended by "><A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html" title="class in rice.pastry.standard">rice.pastry.standard.StandardJoinProtocol</A>
<IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>rice.pastry.standard.ConsistentJoinProtocol</B>
</PRE>
<DL>
<DT><B>All Implemented Interfaces:</B> <DD>java.util.Observer, <A HREF="../../../rice/pastry/join/JoinProtocol.html" title="interface in rice.pastry.join">JoinProtocol</A>, <A HREF="../../../rice/pastry/NodeSetListener.html" title="interface in rice.pastry">NodeSetListener</A>, <A HREF="../../../rice/selector/LoopObserver.html" title="interface in rice.selector">LoopObserver</A></DD>
</DL>
<DL>
<DT><B>Direct Known Subclasses:</B> <DD><A HREF="../../../rice/pastry/socket/nat/rendezvous/RendezvousJoinProtocol.html" title="class in rice.pastry.socket.nat.rendezvous">RendezvousJoinProtocol</A></DD>
</DL>
<HR>
<DL>
<DT><PRE>public class <B>ConsistentJoinProtocol</B><DT>extends <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html" title="class in rice.pastry.standard">StandardJoinProtocol</A><DT>implements java.util.Observer, <A HREF="../../../rice/pastry/NodeSetListener.html" title="interface in rice.pastry">NodeSetListener</A>, <A HREF="../../../rice/selector/LoopObserver.html" title="interface in rice.selector">LoopObserver</A></DL>
</PRE>
<P>
Does not setReady until contacting entire leafset which gossips new members.
Provides consistency as long as checkLiveness() never incorrectly reports a node faulty.
Based on MSR-TR-2003-94. The difference is that our assumption that checkLiveness() is much stronger
because we are using DSR rather than checking ourself.
Another difference is that we are unwilling to pull nodes from our leafset without checkingLiveness() ourself.
<P>
<P>
<DL>
<DT><B>Author:</B></DT>
<DD>Jeff Hoye</DD>
</DL>
<HR>
<P>
<!-- ======== NESTED CLASS SUMMARY ======== -->
<A NAME="nested_class_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Nested Class Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>static&nbsp;class</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.CJPDeserializer.html" title="class in rice.pastry.standard">ConsistentJoinProtocol.CJPDeserializer</A></B></CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
</TABLE>
&nbsp;<A NAME="nested_classes_inherited_from_class_rice.pastry.standard.StandardJoinProtocol"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Nested classes/interfaces inherited from class rice.pastry.standard.<A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html" title="class in rice.pastry.standard">StandardJoinProtocol</A></B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><A HREF="../../../rice/pastry/standard/StandardJoinProtocol.SJPDeserializer.html" title="class in rice.pastry.standard">StandardJoinProtocol.SJPDeserializer</A></CODE></TD>
</TR>
</TABLE>
&nbsp;
<!-- =========== FIELD SUMMARY =========== -->
<A NAME="field_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Field Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>protected &nbsp;int</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#MAX_NUM_TO_HEAR_FROM">MAX_NUM_TO_HEAR_FROM</A></B></CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The number of nodes needed to hear from to go live, can be up to the LeafSet.maxSize()</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>protected &nbsp;int</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#MAX_TIME_TO_BE_SCHEDULED">MAX_TIME_TO_BE_SCHEDULED</A></B></CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This variable is set to prevent the process from going to sleep or not
being scheduled for too long.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;int</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#RETRY_INTERVAL">RETRY_INTERVAL</A></B></CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Will retry sending ConsistentJoinMsg to all neighbors who have not responded
on this interval.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>protected &nbsp;boolean</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#tryingToGoReady">tryingToGoReady</A></B></CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Suppresses sendTheMessage() if we are not ready to do this part of the join process,
or we are already done.</TD>
</TR>
</TABLE>
&nbsp;<A NAME="fields_inherited_from_class_rice.pastry.standard.StandardJoinProtocol"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Fields inherited from class rice.pastry.standard.<A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html" title="class in rice.pastry.standard">StandardJoinProtocol</A></B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#joinEvent">joinEvent</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#leafSet">leafSet</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#localHandle">localHandle</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#routeTable">routeTable</A></CODE></TD>
</TR>
</TABLE>
&nbsp;<A NAME="fields_inherited_from_class_rice.pastry.client.PastryAppl"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Fields inherited from class rice.pastry.client.<A HREF="../../../rice/pastry/client/PastryAppl.html" title="class in rice.pastry.client">PastryAppl</A></B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><A HREF="../../../rice/pastry/client/PastryAppl.html#address">address</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#deserializer">deserializer</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#instance">instance</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#logger">logger</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#options">options</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#receiver">receiver</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#thePastryNode">thePastryNode</A></CODE></TD>
</TR>
</TABLE>
&nbsp;
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<A NAME="constructor_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Constructor Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#ConsistentJoinProtocol(rice.pastry.PastryNode, rice.pastry.NodeHandle, rice.pastry.routing.RoutingTable, rice.pastry.leafset.LeafSet, rice.pastry.ReadyStrategy)">ConsistentJoinProtocol</A></B>(<A HREF="../../../rice/pastry/PastryNode.html" title="class in rice.pastry">PastryNode</A>&nbsp;ln,
<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&nbsp;lh,
<A HREF="../../../rice/pastry/routing/RoutingTable.html" title="class in rice.pastry.routing">RoutingTable</A>&nbsp;rt,
<A HREF="../../../rice/pastry/leafset/LeafSet.html" title="class in rice.pastry.leafset">LeafSet</A>&nbsp;ls,
<A HREF="../../../rice/pastry/ReadyStrategy.html" title="interface in rice.pastry">ReadyStrategy</A>&nbsp;nextReadyStrategy)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#ConsistentJoinProtocol(rice.pastry.PastryNode, rice.pastry.NodeHandle, rice.pastry.routing.RoutingTable, rice.pastry.leafset.LeafSet, rice.pastry.ReadyStrategy, rice.p2p.commonapi.rawserialization.MessageDeserializer)">ConsistentJoinProtocol</A></B>(<A HREF="../../../rice/pastry/PastryNode.html" title="class in rice.pastry">PastryNode</A>&nbsp;ln,
<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&nbsp;lh,
<A HREF="../../../rice/pastry/routing/RoutingTable.html" title="class in rice.pastry.routing">RoutingTable</A>&nbsp;rt,
<A HREF="../../../rice/pastry/leafset/LeafSet.html" title="class in rice.pastry.leafset">LeafSet</A>&nbsp;ls,
<A HREF="../../../rice/pastry/ReadyStrategy.html" title="interface in rice.pastry">ReadyStrategy</A>&nbsp;nextReadyStrategy,
<A HREF="../../../rice/p2p/commonapi/rawserialization/MessageDeserializer.html" title="interface in rice.p2p.commonapi.rawserialization">MessageDeserializer</A>&nbsp;md)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor takes in the usual suspects.</TD>
</TR>
</TABLE>
&nbsp;
<!-- ========== METHOD SUMMARY =========== -->
<A NAME="method_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Method Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#addToLeafSet(rice.pastry.NodeHandle)">addToLeafSet</A></B>(<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&nbsp;nh)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Observes all NodeHandles added to LeafSet</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;int</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#delayInterest()">delayInterest</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Part of the LoopObserver interface.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#destroy()">destroy</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Called when PastryNode is destroyed.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#loopTime(int)">loopTime</A></B>(int&nbsp;loopTime)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If it took longer than the time to detect faultiness, then other nodes
may believe we are faulty.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#nodeSetUpdate(rice.pastry.NodeSetEventSource, rice.pastry.NodeHandle, boolean)">nodeSetUpdate</A></B>(<A HREF="../../../rice/pastry/NodeSetEventSource.html" title="interface in rice.pastry">NodeSetEventSource</A>&nbsp;set,
<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&nbsp;handle,
boolean&nbsp;added)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#otherNodesMaySuspectFaulty(int)">otherNodesMaySuspectFaulty</A></B>(int&nbsp;timeNotScheduled)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call this if there is an event such that you may have
not received messages for long enough for other nodes
to call you faulty.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#receiveMessage(rice.pastry.messaging.Message)">receiveMessage</A></B>(<A HREF="../../../rice/pastry/messaging/Message.html" title="class in rice.pastry.messaging">Message</A>&nbsp;msg)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Handle the CJM as in the MSR-TR</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#requestFromEveryoneWeHaventHeardFrom()">requestFromEveryoneWeHaventHeardFrom</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#sendTheMessage(rice.pastry.NodeHandle, boolean)">sendTheMessage</A></B>(<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&nbsp;nh,
boolean&nbsp;reply)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sends a consistent join protocol message.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>protected &nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#setReady()">setReady</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This is where we start out, when the StandardJoinProtocol would call
setReady();</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#update(java.util.Observable, java.lang.Object)">update</A></B>(java.util.Observable&nbsp;arg0,
java.lang.Object&nbsp;arg)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Can be PastryNode updates, leafset updates, or nodehandle updates.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;java.util.Collection&lt;<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&gt;</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.html#whoDoWeNeedAResponseFrom()">whoDoWeNeedAResponseFrom</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Returns all members of the leafset that are not in gotResponse</TD>
</TR>
</TABLE>
&nbsp;<A NAME="methods_inherited_from_class_rice.pastry.standard.StandardJoinProtocol"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Methods inherited from class rice.pastry.standard.<A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html" title="class in rice.pastry.standard">StandardJoinProtocol</A></B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#broadcastRows(rice.pastry.join.JoinRequest)">broadcastRows</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#completeJoin(rice.pastry.join.JoinRequest)">completeJoin</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#deliverWhenNotReady()">deliverWhenNotReady</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#getAddress()">getAddress</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#getJoinRequest(rice.pastry.NodeHandle, rice.Continuation)">getJoinRequest</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#getOptions(rice.pastry.join.JoinRequest, java.util.Map)">getOptions</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#handleInitiateJoin(rice.pastry.join.InitiateJoin)">handleInitiateJoin</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#handleIntermediateHop(rice.pastry.routing.RouteMessage)">handleIntermediateHop</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#handleJoinRequest(rice.pastry.join.JoinRequest)">handleJoinRequest</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#initiateJoin(java.util.Collection)">initiateJoin</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#messageForAppl(rice.pastry.messaging.Message)">messageForAppl</A>, <A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#respondToJoiner(rice.pastry.join.JoinRequest)">respondToJoiner</A></CODE></TD>
</TR>
</TABLE>
&nbsp;<A NAME="methods_inherited_from_class_rice.pastry.client.PastryAppl"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Methods inherited from class rice.pastry.client.<A HREF="../../../rice/pastry/client/PastryAppl.html" title="class in rice.pastry.client">PastryAppl</A></B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><A HREF="../../../rice/pastry/client/PastryAppl.html#accept(rice.p2p.commonapi.appsocket.AppSocketReceiver)">accept</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#canReceiveSocket()">canReceiveSocket</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#connect(rice.p2p.commonapi.NodeHandle, rice.p2p.commonapi.appsocket.AppSocketReceiver, int)">connect</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#enrouteMessage(rice.pastry.messaging.Message, rice.pastry.Id, rice.pastry.NodeHandle, rice.pastry.routing.SendOptions)">enrouteMessage</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#finishReceiveSocket(rice.p2p.commonapi.appsocket.AppSocket)">finishReceiveSocket</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#getDeserializer()">getDeserializer</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#getLeafSet()">getLeafSet</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#getNodeHandle()">getNodeHandle</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#getNodeId()">getNodeId</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#getRoutingTable()">getRoutingTable</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#isClosest(rice.pastry.Id)">isClosest</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#leafSetChange(rice.pastry.NodeHandle, boolean)">leafSetChange</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#notifyReady()">notifyReady</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#receiveMessageInternal(rice.pastry.messaging.RawMessageDelivery)">receiveMessageInternal</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#register()">register</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#routeMsg(rice.pastry.Id, rice.pastry.messaging.Message, rice.pastry.routing.SendOptions)">routeMsg</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#routeMsg(rice.pastry.Id, rice.pastry.messaging.Message, rice.pastry.routing.SendOptions, rice.p2p.commonapi.DeliveryNotification)">routeMsg</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#routeMsgDirect(rice.pastry.NodeHandle, rice.pastry.messaging.Message, rice.pastry.routing.SendOptions)">routeMsgDirect</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#routeSetChange(rice.pastry.NodeHandle, boolean)">routeSetChange</A>, <A HREF="../../../rice/pastry/client/PastryAppl.html#setDeserializer(rice.p2p.commonapi.rawserialization.MessageDeserializer)">setDeserializer</A></CODE></TD>
</TR>
</TABLE>
&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
</TR>
</TABLE>
&nbsp;
<P>
<!-- ============ FIELD DETAIL =========== -->
<A NAME="field_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Field Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="MAX_TIME_TO_BE_SCHEDULED"><!-- --></A><H3>
MAX_TIME_TO_BE_SCHEDULED</H3>
<PRE>
protected final int <B>MAX_TIME_TO_BE_SCHEDULED</B></PRE>
<DL>
<DD>This variable is set to prevent the process from going to sleep or not
being scheduled for too long.
<P>
<DL>
</DL>
</DL>
<HR>
<A NAME="MAX_NUM_TO_HEAR_FROM"><!-- --></A><H3>
MAX_NUM_TO_HEAR_FROM</H3>
<PRE>
protected final int <B>MAX_NUM_TO_HEAR_FROM</B></PRE>
<DL>
<DD>The number of nodes needed to hear from to go live, can be up to the LeafSet.maxSize()
<P>
<DL>
<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#rice.pastry.standard.ConsistentJoinProtocol.MAX_NUM_TO_HEAR_FROM">Constant Field Values</A></DL>
</DL>
<HR>
<A NAME="tryingToGoReady"><!-- --></A><H3>
tryingToGoReady</H3>
<PRE>
protected boolean <B>tryingToGoReady</B></PRE>
<DL>
<DD>Suppresses sendTheMessage() if we are not ready to do this part of the join process,
or we are already done.
<P>
<DL>
</DL>
</DL>
<HR>
<A NAME="RETRY_INTERVAL"><!-- --></A><H3>
RETRY_INTERVAL</H3>
<PRE>
public final int <B>RETRY_INTERVAL</B></PRE>
<DL>
<DD>Will retry sending ConsistentJoinMsg to all neighbors who have not responded
on this interval. Only necessary if somehow the message was dropped.
<P>
<DL>
</DL>
</DL>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<A NAME="constructor_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Constructor Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="ConsistentJoinProtocol(rice.pastry.PastryNode, rice.pastry.NodeHandle, rice.pastry.routing.RoutingTable, rice.pastry.leafset.LeafSet, rice.pastry.ReadyStrategy)"><!-- --></A><H3>
ConsistentJoinProtocol</H3>
<PRE>
public <B>ConsistentJoinProtocol</B>(<A HREF="../../../rice/pastry/PastryNode.html" title="class in rice.pastry">PastryNode</A>&nbsp;ln,
<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&nbsp;lh,
<A HREF="../../../rice/pastry/routing/RoutingTable.html" title="class in rice.pastry.routing">RoutingTable</A>&nbsp;rt,
<A HREF="../../../rice/pastry/leafset/LeafSet.html" title="class in rice.pastry.leafset">LeafSet</A>&nbsp;ls,
<A HREF="../../../rice/pastry/ReadyStrategy.html" title="interface in rice.pastry">ReadyStrategy</A>&nbsp;nextReadyStrategy)</PRE>
<DL>
</DL>
<HR>
<A NAME="ConsistentJoinProtocol(rice.pastry.PastryNode, rice.pastry.NodeHandle, rice.pastry.routing.RoutingTable, rice.pastry.leafset.LeafSet, rice.pastry.ReadyStrategy, rice.p2p.commonapi.rawserialization.MessageDeserializer)"><!-- --></A><H3>
ConsistentJoinProtocol</H3>
<PRE>
public <B>ConsistentJoinProtocol</B>(<A HREF="../../../rice/pastry/PastryNode.html" title="class in rice.pastry">PastryNode</A>&nbsp;ln,
<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&nbsp;lh,
<A HREF="../../../rice/pastry/routing/RoutingTable.html" title="class in rice.pastry.routing">RoutingTable</A>&nbsp;rt,
<A HREF="../../../rice/pastry/leafset/LeafSet.html" title="class in rice.pastry.leafset">LeafSet</A>&nbsp;ls,
<A HREF="../../../rice/pastry/ReadyStrategy.html" title="interface in rice.pastry">ReadyStrategy</A>&nbsp;nextReadyStrategy,
<A HREF="../../../rice/p2p/commonapi/rawserialization/MessageDeserializer.html" title="interface in rice.p2p.commonapi.rawserialization">MessageDeserializer</A>&nbsp;md)</PRE>
<DL>
<DD>Constructor takes in the usual suspects.
<P>
<DL>
<DT><B>Parameters:</B><DD><CODE>ln</CODE> - <DD><CODE>lh</CODE> - <DD><CODE>rt</CODE> - <DD><CODE>ls</CODE> - <DD><CODE>nextReadyStrategy</CODE> - if non-null, will call nextRenderStrategy.start() when complete<DD><CODE>md</CODE> - </DL>
</DL>
<!-- ============ METHOD DETAIL ========== -->
<A NAME="method_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Method Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="setReady()"><!-- --></A><H3>
setReady</H3>
<PRE>
protected void <B>setReady</B>()</PRE>
<DL>
<DD>This is where we start out, when the StandardJoinProtocol would call
setReady();
<P>
<DD><DL>
<DT><B>Overrides:</B><DD><CODE><A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#setReady()">setReady</A></CODE> in class <CODE><A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html" title="class in rice.pastry.standard">StandardJoinProtocol</A></CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="addToLeafSet(rice.pastry.NodeHandle)"><!-- --></A><H3>
addToLeafSet</H3>
<PRE>
public void <B>addToLeafSet</B>(<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&nbsp;nh)</PRE>
<DL>
<DD>Observes all NodeHandles added to LeafSet
<P>
<DD><DL>
</DL>
</DD>
<DD><DL>
<DT><B>Parameters:</B><DD><CODE>nh</CODE> - the nodeHandle to add</DL>
</DD>
</DL>
<HR>
<A NAME="requestFromEveryoneWeHaventHeardFrom()"><!-- --></A><H3>
requestFromEveryoneWeHaventHeardFrom</H3>
<PRE>
public void <B>requestFromEveryoneWeHaventHeardFrom</B>()</PRE>
<DL>
<DD><DL>
</DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="otherNodesMaySuspectFaulty(int)"><!-- --></A><H3>
otherNodesMaySuspectFaulty</H3>
<PRE>
public void <B>otherNodesMaySuspectFaulty</B>(int&nbsp;timeNotScheduled)</PRE>
<DL>
<DD>Call this if there is an event such that you may have
not received messages for long enough for other nodes
to call you faulty.
This method will call PastryNode.setReady(false) which will
stop delivering messages, and then via the observer pattern
will call this.update(PN, FALSE) which will call setReady()
which will begin the join process again.
<P>
<DD><DL>
</DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="whoDoWeNeedAResponseFrom()"><!-- --></A><H3>
whoDoWeNeedAResponseFrom</H3>
<PRE>
public java.util.Collection&lt;<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&gt; <B>whoDoWeNeedAResponseFrom</B>()</PRE>
<DL>
<DD>Returns all members of the leafset that are not in gotResponse
<P>
<DD><DL>
</DL>
</DD>
<DD><DL>
<DT><B>Returns:</B><DD></DL>
</DD>
</DL>
<HR>
<A NAME="receiveMessage(rice.pastry.messaging.Message)"><!-- --></A><H3>
receiveMessage</H3>
<PRE>
public void <B>receiveMessage</B>(<A HREF="../../../rice/pastry/messaging/Message.html" title="class in rice.pastry.messaging">Message</A>&nbsp;msg)</PRE>
<DL>
<DD>Handle the CJM as in the MSR-TR
<P>
<DD><DL>
<DT><B>Overrides:</B><DD><CODE><A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html#receiveMessage(rice.pastry.messaging.Message)">receiveMessage</A></CODE> in class <CODE><A HREF="../../../rice/pastry/standard/StandardJoinProtocol.html" title="class in rice.pastry.standard">StandardJoinProtocol</A></CODE></DL>
</DD>
<DD><DL>
<DT><B>Parameters:</B><DD><CODE>msg</CODE> - the message that was received.</DL>
</DD>
</DL>
<HR>
<A NAME="sendTheMessage(rice.pastry.NodeHandle, boolean)"><!-- --></A><H3>
sendTheMessage</H3>
<PRE>
public void <B>sendTheMessage</B>(<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&nbsp;nh,
boolean&nbsp;reply)</PRE>
<DL>
<DD>Sends a consistent join protocol message.
<P>
<DD><DL>
</DL>
</DD>
<DD><DL>
<DT><B>Parameters:</B><DD><CODE>nh</CODE> - <DD><CODE>reply</CODE> - if the reason we are sending this message is just as a response</DL>
</DD>
</DL>
<HR>
<A NAME="nodeSetUpdate(rice.pastry.NodeSetEventSource, rice.pastry.NodeHandle, boolean)"><!-- --></A><H3>
nodeSetUpdate</H3>
<PRE>
public void <B>nodeSetUpdate</B>(<A HREF="../../../rice/pastry/NodeSetEventSource.html" title="interface in rice.pastry">NodeSetEventSource</A>&nbsp;set,
<A HREF="../../../rice/pastry/NodeHandle.html" title="class in rice.pastry">NodeHandle</A>&nbsp;handle,
boolean&nbsp;added)</PRE>
<DL>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../rice/pastry/NodeSetListener.html#nodeSetUpdate(rice.pastry.NodeSetEventSource, rice.pastry.NodeHandle, boolean)">nodeSetUpdate</A></CODE> in interface <CODE><A HREF="../../../rice/pastry/NodeSetListener.html" title="interface in rice.pastry">NodeSetListener</A></CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="update(java.util.Observable, java.lang.Object)"><!-- --></A><H3>
update</H3>
<PRE>
public void <B>update</B>(java.util.Observable&nbsp;arg0,
java.lang.Object&nbsp;arg)</PRE>
<DL>
<DD>Can be PastryNode updates, leafset updates, or nodehandle updates.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE>update</CODE> in interface <CODE>java.util.Observer</CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="delayInterest()"><!-- --></A><H3>
delayInterest</H3>
<PRE>
public int <B>delayInterest</B>()</PRE>
<DL>
<DD>Part of the LoopObserver interface. Used to detect if
we may have been found faulty by other nodes.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../rice/selector/LoopObserver.html#delayInterest()">delayInterest</A></CODE> in interface <CODE><A HREF="../../../rice/selector/LoopObserver.html" title="interface in rice.selector">LoopObserver</A></CODE></DL>
</DD>
<DD><DL>
<DT><B>Returns:</B><DD>the minimum loop time we are interested in being notified about.</DL>
</DD>
</DL>
<HR>
<A NAME="loopTime(int)"><!-- --></A><H3>
loopTime</H3>
<PRE>
public void <B>loopTime</B>(int&nbsp;loopTime)</PRE>
<DL>
<DD>If it took longer than the time to detect faultiness, then other nodes
may believe we are faulty. So we best rejoin.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../rice/selector/LoopObserver.html#loopTime(int)">loopTime</A></CODE> in interface <CODE><A HREF="../../../rice/selector/LoopObserver.html" title="interface in rice.selector">LoopObserver</A></CODE></DL>
</DD>
<DD><DL>
<DT><B>Parameters:</B><DD><CODE>loopTime</CODE> - the time it took to do a single selection loop.</DL>
</DD>
</DL>
<HR>
<A NAME="destroy()"><!-- --></A><H3>
destroy</H3>
<PRE>
public void <B>destroy</B>()</PRE>
<DL>
<DD><B>Description copied from class: <CODE><A HREF="../../../rice/pastry/client/PastryAppl.html#destroy()">PastryAppl</A></CODE></B></DD>
<DD>Called when PastryNode is destroyed. Can be overloaded by applications.
<P>
<DD><DL>
<DT><B>Overrides:</B><DD><CODE><A HREF="../../../rice/pastry/client/PastryAppl.html#destroy()">destroy</A></CODE> in class <CODE><A HREF="../../../rice/pastry/client/PastryAppl.html" title="class in rice.pastry.client">PastryAppl</A></CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="class-use/ConsistentJoinProtocol.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
Rice Pastry API</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../rice/pastry/standard/ConsistentJoinMsg.html" title="class in rice.pastry.standard"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../rice/pastry/standard/ConsistentJoinProtocol.CJPDeserializer.html" title="class in rice.pastry.standard"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../index.html?rice/pastry/standard/ConsistentJoinProtocol.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="ConsistentJoinProtocol.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;<A HREF="#nested_class_summary">NESTED</A>&nbsp;|&nbsp;<A HREF="#field_summary">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;<A HREF="#field_detail">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
<i>Copyright &#169; 2001-2005 - Rice Pastry.</i>
</BODY>
</HTML>