1: \subsection{Failure of Fingers}
2: \begin{figure*}
3: \centering
4: % \includegraphics[height=9cm, angle=270]{wd}
5: % \includegraphics[height=9cm, angle=270]{i}
6: \includegraphics[height=9cm, angle=270]{f}
7: \includegraphics[height=9cm, angle=270]{l}
8:
9: %\begin{table}[t]
10: %\centering
11: \vspace*{-0.3cm}
12: \caption{Theory and Simulation for $f_k(r,\alpha)$, and $L(r,\alpha)$}
13: \label{fig:w}
14: \end{figure*}
15:
16: \begin{figure}[t]
17: \centering
18: \includegraphics{fk_trans.eps}
19: \vspace*{-0.4cm}
20: \caption{Changes in $F_k$, the number of failed $fin_k$ pointers, due to joins, failures and stabilizations.}
21: \label{fig:fk-trans}
22: \end{figure}
23:
24: We now turn to estimating the fraction of finger pointers
25: which point to failed nodes. As we will see this is an important
26: quantity for predicting lookups. Unlike members of the successor list,
27: alive fingers even if outdated, always bring a query closer to the destination and do not
28: affect consistency. Therefore we consider fingers in only two states, alive
29: or dead (failed).
30:
31: Let $f_k(r,\alpha)$ denote the fraction of nodes having their $k^{th}$
32: finger pointing to a failed node and $F_k(r,\alpha)$ denote the
33: respective number. For notational simplicity, we write these as simply
34: $F_k$ and $f_k$. We can predict this function for any $k$ by again
35: estimating the gain and loss terms for this quantity, caused by a
36: join, failure or stabilization event, and keeping only the most
37: relevant terms. These are listed in table \ref{tab:f}.
38:
39: \begin{table}
40: \centering
41: \begin{tabular}{|l|l|} \hline
42: $F_k(t+\Delta t)$ & Rate of Change \\ %\hline
43: % $= F_1(t)+1$ & $c_1=(\lambda_f \Delta t)(1-f_1)^2$
44: % \\ %\hline
45: % $= F_1(t)-1$ & $c_2= \frac{(1-\alpha)}{{\cal M}}(\lambda_s \Delta t){f_1}$ \\ \hline
46: %$= F_1(t)$ & $1 - (c_1 + c_2)$\\ \hline
47: $= F_k(t)+1$ & $c_1=(\lambda_j \Delta t)p_{\mathrm join}(k)f_k$
48: \\ %\hline
49: $= F_k(t)-1$ & $c_2= (1-\alpha)\frac{1}{{\cal M}}f_k (\lambda_s \Delta t)$ \\ %\hline
50: $= F_k(t)+1$ & $c_3= (1-f_k)^2 [1-p_{1}(k)] (\lambda_f \Delta t)$ \\ %\hline
51: $= F_k(t)+2$ & $c_4= (1-f_k)^2 (p_{1}(k)-p_{2}(k)) (\lambda_f \Delta t)$ \\ %\hline
52: $= F_k(t)+3$ & $c_5= (1-f_k)^2 (p_{2}(k)-p_{3}(k)) (\lambda_f \Delta t)$ \\ %\hline
53: $= F_k(t)$ & $1 - (c_1 + c_2 + c_3+ c_4+ c_5)$\\ \hline
54: \end{tabular}
55: \caption{Some of 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$.}
56: \label{tab:f}
57: \end{table}
58:
59: %As mentioned before though $fin_1$ is always also $s_1$,
60: %since we stabilize fingers and successors entirely independent of each other,
61: %$f_1 \neq w_1-d_1 $.
62: %Consider the gain and loss terms for $F_1$ first. A join process does not
63: %change this number at all, hence we need only consider a
64: %stabilization or failure event. A failure event decreases
65: %$F_1$ by one at rate $c_1$ if \emph{both} the node that fails as
66: %well as the node pointing its $fin_1$ pointer to it were
67: %correct to begin with. (If
68: %only any one of these was correct and the other failed,
69: %the number does not change).
70:
71: A join event can play a role here by increasing the
72: number of $F_k$ pointers if the successor of the joinee had a failed
73: $k^{th}$ pointer (occurs with probability $f_k$) and the joinee replicated this from the successor
74: (occurs with probability $p_{\mathrm join}(k)$ from property~\ref{prop:copy}).
75:
76: A stabilization evicts a failed pointer if there was one to begin with.
77: The stabilization rate is divided by ${\cal M}$, since a node stabilizes
78: any one finger randomly, every time it decides to stabilize a finger
79: at rate $(1-\alpha)\lambda_s$.
80:
81: Given a node $n$ with an alive $k^{th}$ finger (occurs
82: with probability $1-f_k$), when the node pointed
83: to by that finger fails, the number of failed $k^{th}$ fingers ($F_k$) increases.
84: The amount of this increase depends on the number of immediate predecessors of $n$ that were
85: pointing to the failed node with their $k^{th}$ finger. That number of predecessors could be $0$, $1$, $2$,.. etc.
86: 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.
87:
88: Solving for $f_k$ in the steady state, we get:
89: \begin{equation}
90: \begin{split}
91: &f_k = \frac {
92: \left[2 \tilde{P}_{rep}(k)+2-p_{\mathrm join}(k)+ \frac{r(1-\alpha)}{{\cal M}} \right]}
93: {2(1+\tilde{P}_{rep}(k))}\\
94: &- \frac{
95: \sqrt{ \left[2 \tilde{P}_{rep}(k) + 2 - p_{\mathrm join}(k)+ \frac{r(1-\alpha)}{{\cal M}} \right]^2
96: - 4(1+\tilde{P}_{rep}(k))^2}
97: }
98: {2(1+\tilde{P}_{rep}(k))}
99: \end{split}
100: \end{equation}
101:
102: where $\tilde{P}_{rep}(k) = \Sigma p_i(k)$. In principle its enough to keep
103: even three terms in the sum. The above expressions match very well with the simulation
104: results (figure \ref{fig:w}).
105:
106:
107:
108:
109:
110:
111:
112:
113:
114: