1: \subsection{Failure of Fingers}
2: \begin{figure}[t]
3: \centering
4: \includegraphics[width=9cm, height=7cm]{fk_trans.eps}
5: % \vspace*{-0.4cm}
6: \caption{Changes in $F_k$, the number of failed $fin_k$ pointers, due to joins, failures and stabilizations.}
7: \label{fig:fk-trans}
8: \end{figure}
9:
10: We now turn to estimating the fraction of finger pointers
11: which point to failed nodes. As we will see this is an important
12: quantity for predicting lookups, since failed fingers cause timeouts
13: and increase the lookup length. However, we only need to consider
14: fingers pointing to {\it dead} nodes.
15: Unlike members of the successor list, {\it alive} fingers even if outdated,
16: always bring a query closer to the destination and do not
17: affect consistency or substantially even the lookup length.
18: Therefore we consider fingers in only two states, alive
19: or dead (failed). By our implementation of the stabilization protocol (see Sections \ref{sec:stab} and \ref{sec:fingers}),
20: fingers and successors are stabilized entirely
21: independently of each other to simplify the analysis.
22: Thus even though the first finger is
23: also always the first successor, this information is not used by the node
24: in updating the finger. Fingers of nodes far apart
25: are independent of each other. Fingers of adjacent nodes can be correlated
26: and we take this into account. The only assumption in this section is
27: in connection with the join protocol as explained below.
28:
29: Let $f_k(r,\alpha)$ denote the fraction of nodes whose $k^{th}$
30: finger points to a failed node and $F_k(r,\alpha)$ denote the
31: respective number. For notational simplicity, we write these as simply
32: $F_k$ and $f_k$. We can predict this function for any $k$ by again
33: estimating the gain and loss terms for this quantity, caused by a
34: join, failure or stabilization event, and keeping only the most
35: relevant terms. These are listed in Table \ref{tab:f} and illustrated
36: in Fig. \ref{fig:fk-trans}
37:
38: \begin{table}
39: \caption{The relevant gain and loss terms for $F_k$, the number of nodes whose $k{th}$ fingers are pointing to a failed node for $k > 1$.}
40: \label{tab:f}
41: \centering
42: \begin{tabular}{|l|l|} \hline
43: $F_k(t+\Delta t)$ & \minorchange{Probability of Occurence} \\ %\hline
44: % $= F_1(t)+1$ & $c_1=(\lambda_f \minorchange{N} \Delta t)(1-f_1)^2$
45: % \\ %\hline
46: % $= F_1(t)-1$ & $c_2= \frac{(1-\alpha)}{{\cal M}}(\lambda_s \minorchange{N} \Delta t){f_1}$ \\ \hline
47: %$= F_1(t)$ & $1 - (c_1 + c_2)$\\ \hline
48: $= F_k(t)+1$ & $c_{3.1}=(\lambda_j \minorchange{N} \Delta t) \sum_{i=1}^{k}p_{\minorchange{\it join}}(i,k)f_i$
49: \\ %\hline
50: $= F_k(t)-1$ & $c_{3.2}= (1-\alpha)\frac{1}{{\cal M}}f_k (\lambda_s \minorchange{N} \Delta t)$ \\ %\hline
51: $= F_k(t)+1$ & $c_{3.3}= (1-f_k)^2 [1-p_{1}(k)] (\lambda_f \minorchange{N} \Delta t)$ \\ %\hline
52: $= F_k(t)+2$ & $c_{3.4}= (1-f_k)^2 (p_{1}(k)-p_{2}(k)) (\lambda_f \minorchange{N} \Delta t)$ \\ %\hline
53: $= F_k(t)+3$ & $c_{3.5}= (1-f_k)^2 (p_{2}(k)-p_{3}(k)) (\lambda_f \minorchange{N} \Delta t)$ \\ %\hline
54: $= F_k(t)$ & $1 - (c_{3.1} + c_{3.2} + c_{3.3}+ c_{3.4}+ c_{3.5})$\\ \hline
55: \end{tabular}
56: \end{table}
57:
58: %As mentioned before though $fin_1$ is always also $s_1$,
59: %since we stabilize fingers and successors entirely independent of each other,
60: %$f_1 \neq w_1-d_1 $.
61: %Consider the gain and loss terms for $F_1$ first. A join process does not
62: %change this number at all, hence we need only consider a
63: %stabilization or failure event. A failure event decreases
64: %$F_1$ by one at rate $c_1$ if \emph{both} the node that fails as
65: %well as the node pointing its $fin_1$ pointer to it were
66: %correct to begin with. (If
67: %only any one of these was correct and the other failed,
68: %the number does not change).
69:
70: A join event can play a role here by increasing the
71: number of $F_k$ pointers if the successor of the joinee had a failed
72: $i^{th}$ pointer (occurs with probability $f_i$) and the joinee replicated this from the successor as the joinee's
73: \minorchange{$k^{th}$} pointer.
74: (occurs with probability $p_{\minorchange{\it join}}(i,k)$
75: from property~\ref{prop:copy}). For large enough $k$,
76: this probability is one only for $p_{\minorchange{\it join}}(k,k)$, that
77: is, the new joinee mostly only replicates the successor's $k$th pointer
78: as its own \minorchange{$k^{th}$} pointer. This is what we consider here.
79:
80: A stabilization evicts a failed pointer if there was one to begin with.
81: The stabilization rate is divided by ${\cal M}$, since a node stabilizes
82: any one finger randomly, every time it decides to stabilize a finger
83: at rate $(1-\alpha)\lambda_s$.
84:
85: Given a node $n$ with an alive $k^{th}$ finger (occurs
86: with probability $1-f_k$), when the node pointed
87: to by that finger fails, the number of failed $k^{th}$ fingers ($F_k$) increases.
88: The amount of this increase depends on the number of immediate predecessors of $n$ that were
89: pointing to the failed node with their $k^{th}$ finger. That number of predecessors could be $0$, $1$, $2$,.. etc.
90: Using property~\ref{prop:share} the respective probabilities of those cases are: $1-p_{1}(k)$, $p_{1}(k)-p_{2}(k)$, $p_{2}(k)-p_{3}(k)$,... etc.
91:
92:
93: Solving for $f_k$ in the steady state, we get:
94: \begin{equation}
95: \begin{split}
96: &f_k = \frac {
97: \left[2 \tilde{P}_{rep}(k)+2-p_{\minorchange{\it join}}(k)+ \frac{r(1-\alpha)}{{\cal M}} \right]}
98: {2(1+\tilde{P}_{rep}(k))}\\
99: &- \frac{
100: \sqrt{ \left[2 \tilde{P}_{rep}(k) + 2 - p_{\minorchange{\it join}}(k)+ \frac{r(1-\alpha)}{{\cal M}} \right]^2
101: - 4(1+\tilde{P}_{rep}(k))^2}
102: }
103: {2(1+\tilde{P}_{rep}(k))}
104: \end{split}
105: \label{eq:fk}
106: \end{equation}
107: where $\tilde{P}_{rep}(k) = \Sigma p_i(k)$.
108: In practice, it is enough to keep the first three terms in this sum.
109: To first order in $\frac{1}{r}$ we have, in analogy to (\ref{eq:wk-leading}),
110: \begin{equation}
111: \label{eq:fk-leading}
112: f_k \approx \frac {(1+\tilde{P}_{rep}(k)){\cal M}}{(1-\alpha)r}
113: \end{equation}
114: This expression simply says that the fraction of dead fingers
115: is inversely proportional to the rate of finger stabilizations,
116: $(1-\alpha)r$, and proportional to how many fingers there are
117: to stabilize, ${\cal M}$, with the proportionality factor
118: $(1+\tilde{P}_{rep}(k))$ depending only on $\rho$.
119:
120: To sum up, the computation of the fraction of dead $k^{th}$ finger
121: pointers is analogous to the calculation of the fraction of
122: wrong first successor pointer, albeit a bit more involved. No
123: recursion is involved, in contrast to the calculation of the
124: fraction of wrong higher successor pointers.
125: The above expressions, (\ref{eq:fk}) match very well with the simulation results (Fig. \ref{fig:w}).
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142: