1
|
1 \chapter{TreeVNC のリファクタリング}
|
|
2
|
|
3 \section{動的な port 番号の指定}
|
|
4 TreeVNCは複雑な分散アルゴリズムを用いたシステムであり、
|
|
5 デバッグを行う環境を整える必要がある。
|
|
6
|
|
7 従来のTreeVNCでは、固定port番号を複数利用していた。
|
|
8 port番号は一意なので、1台で複数のTreeVNCを立ち上げることができない。
|
|
9
|
|
10 動的にport番号を割り当てることで、
|
|
11 1つのnodeに対して複数のTreeVNCを起動することを可能にした。
|
|
12 最低限のソケットポートを開けることによって、
|
|
13 メモリの使用量を抑えることにも繋がる。
|
|
14
|
4
|
15 以下に、動的に port 番号を割り当てているソースコードを記述する。
|
|
16
|
|
17 % selectPort する箇所を記述する
|
|
18
|
|
19 \begin{lstlisting}[caption=オプション--fixSize,label=fixsize]
|
|
20 public int selectPort(int p) {
|
|
21 int port = p;
|
|
22 while (true) {
|
|
23 try {
|
|
24 servSock = new ServerSocket(port);
|
|
25 acceptPort = port;
|
|
26 myAddress = "127.0.0.1";
|
|
27 nets.getNetworkInterfaces();
|
|
28 break;
|
|
29 } catch (BindException e) {
|
|
30 port++;
|
|
31 continue;
|
|
32 } catch (SocketException e) {
|
|
33 e.printStackTrace();
|
|
34 } catch (IOException e) {
|
|
35 e.printStackTrace();
|
|
36 }
|
|
37 }
|
|
38 System.out.println("accept port = " + port);
|
|
39 return port;
|
|
40 }
|
|
41 \end{lstlisting}
|
|
42
|
|
43
|
3
|
44 % messageの説明にportにどんな関係があるのかとから
|
1
|
45 以前は固定port番号を使用しmessageの通信を行っていたが、
|
|
46 一意なportを割り当てられているnodeが通信を行うことによって、
|
|
47 どのport番号が使用されているかを意識する必要がなくなった。
|
|
48
|
4
|
49 \newpage
|
1
|
50
|
3
|
51 \section{QUALITYモードとSPEEDモード}
|
|
52
|
|
53 高解像度のまま拡大・縮小の処理を行うと、
|
|
54 PCのスペックによって描画処理に時間がかかってしまうことがある。
|
|
55 授業中に TreeVNC を使用する際、
|
|
56 拡大・縮小をしてしまうと描画処理が重くなり遅延が生じていた。
|
|
57
|
|
58 画像描画処理には、品質優先( QUALITY モード)・スピード優先( SPEED モード)がある。
|
|
59 今まで TreeVNC は基本的に QUALITY モードを設定していた。
|
|
60
|
|
61 どちらのモードを使用するかをビューワから変更出来るようにした。
|
|
62 これにより、描画処理の遅延を解決することができた。
|
1
|
63
|
|
64
|
4
|
65 \section{ホスト切り替え時の挙動の修正}
|
|
66 画面の切り替えを行う際、新しいホスト側の画面に生じた
|
|
67 ビデオフィードバックが他のユーザに配信されてしまう問題があった。
|
|
68
|
|
69 ホストの切り替えの際、
|
|
70 新しいホスト側のviewerを閉じることで問題を解決した。
|
|
71
|
|
72
|
|
73 \newpage
|
|
74
|
|
75
|
1
|
76 \section{Tree の構成の変更}
|
|
77
|
|
78 従来のTreeVNCは、クライアントの接続する木構造が単一であった。
|
|
79 そのため、ネットワークインターフェースが違うクライアントが
|
|
80 同じ木に混在している状況が生じた。
|
|
81 速度の遅いクライアントが木に存在すると、
|
|
82 そのクライアント以下の通信速度が遅くなってしまう。
|
|
83
|
|
84 この問題を解決するために、
|
|
85 図\ref{fig:multinetworktree}の様に、ネットワークインターフェース別に
|
|
86 木構造を形成するように設計した。
|
|
87
|
|
88 TreeVNCは、rootがnodeListというリストを保持し、木構造を管理している。
|
|
89 複数のネットワークインターフェースで木構造を形成する場合、
|
|
90 このnodeListをネットワークインターフェース毎に作成しておく。
|
|
91 新しいnodeを接続する際、nodeのネットワークインターフェースを取得し、
|
|
92 どのnodeListに登録されるかが決まる。
|
|
93 こうすることによって、TreeVNCを複数のネットワークインターフェイス別に
|
|
94 木構造を構成することができる。
|
|
95
|
|
96 \begin{figure}[htpd]
|
|
97 \begin{center}
|
|
98 \includegraphics[scale=0.4]{./images/chapter3/MultiNetworkTree.pdf}
|
|
99 \end{center}
|
|
100 \caption{Multi Network Tree}
|
|
101 \label{fig:multinetworktree}
|
|
102 \end{figure}
|
|
103
|
|
104
|
3
|
105 \newpage
|
|
106
|
1
|
107 \section{切断時の検知方法の変更}
|
|
108
|
3
|
109 接続していたクライアントとの接続が切れた際の検知方法を変更した。
|
|
110
|
|
111 root は nodeList という TreeVNC のネットワークトポロジーを管理するためのリストを持っている。
|
|
112 root は TreeVNC の接続処理の全てを担っている。
|
|
113 %node が切断された場合、 root は TreeVNC の木構造を崩さないように切断を検知し、
|
|
114 %木構造を崩さないよう、 node 同士の接続を再構成しなければならない。
|
|
115 node の接続が切れた場合、代わりとなる node の接続が必要となるため root に知らせなければならない。
|
|
116
|
|
117 変更前は、lostParent という検知方法を採用していた。
|
|
118 この方法は、親となる node の接続が切れた場合、
|
|
119 子となる node から root に対して lostParent message を送信する。
|
|
120 これにより root は lostParent を検知し、代替 node の接続を行う。
|
|
121
|
4
|
122 以下に、lostParent の検知・再接続方法を記述する。
|
|
123
|
|
124 \begin{itemize}
|
|
125 \item 親 node の接続が切れる
|
|
126 \item 切れた親 node に接続していた子 node が root に LOST\_PARENT message を送信する
|
|
127 \item root が nodeList の更新を行う
|
|
128 \item 切れた親 node の代わりに、nodeList の最後尾 node を配置する
|
|
129 \item 親 node を失った子 node は、新しい親 node に接続する
|
|
130 \end{itemize}
|
|
131
|
3
|
132 この方法では、子のいない末端の node の接続が切れた際に root にメッセージが送信されない。
|
|
133 root は切断を検知できないと、nodeList の更新を行うことができない。
|
|
134 nodeList が正しく更新されない場合、図\ref{fig:lostparent}のように、
|
|
135 新しい node を既に切断されている node に接続しようと試み、失敗してしまう。
|
1
|
136
|
|
137 \begin{figure}[htpd]
|
|
138 \begin{center}
|
3
|
139 \includegraphics[scale=0.7]{./images/chapter3/lostParent.pdf}
|
1
|
140 \end{center}
|
|
141 \caption{lostParent}
|
|
142 \label{fig:lostparent}
|
|
143 \end{figure}
|
|
144
|
4
|
145 \newpage
|
|
146
|
3
|
147 末端 node の切断が検知できない問題を解決するために、
|
|
148 lostChild という検知方法に変更した。
|
|
149
|
4
|
150 TreeVNC は、画像データ(framebufferUpdate)が MulticastQueue という Queue に蓄積される。
|
3
|
151 node はこの Queue から画像データを取得し、描画している。
|
|
152 lostChild の検出方法は、この MulticastQueue を使用している。
|
|
153 ある一定時間、MulticastQueue から画像データが取得されない場合、
|
4
|
154 その node との接続が切れたと判断することができる。
|
|
155
|
|
156 以下に、lostChild の検知・再接続方法を記述する。
|
3
|
157
|
4
|
158 \begin{itemize}
|
|
159 \item 子 node の切断を検知した node が root へ LOST\_CHILD message を送信する(図\ref{fig:lostchild1}中, 1:)
|
|
160 \item LOST\_CHILD message を受け取った root は nodeList の更新を行う(図\ref{fig:lostchild1}中, 2:)
|
|
161 \item 切断した node を nodeList から消し、nodeList の最後尾の node に切断した node number を割り当てる
|
|
162 \item root は最後尾の node に、切断した子 node が接続していた親 node に接続する様に CONNECT\_TO message を送信する(図\ref{fig:lostchild1}中, 3:)
|
|
163 \item 最後尾の node が子 node を失った親 node へ接続しに行く(図\ref{fig:lostchild1}中, 4:)
|
|
164 \end{itemize}
|
3
|
165
|
1
|
166 \begin{figure}[htpd]
|
|
167 \begin{center}
|
3
|
168 \includegraphics[scale=0.7]{./images/chapter3/lostChild1.pdf}
|
1
|
169 \end{center}
|
3
|
170 \caption{lostChild を検知・再接続}
|
1
|
171 \label{fig:lostchild1}
|
|
172 \end{figure}
|
|
173
|
4
|
174 \newpage
|
|
175
|
|
176 lostChild を検知することより、
|
|
177 切断されてしまった全ての node を検知することができるので、
|
|
178 nodeList の更新が正しく行われる。
|
|
179
|
|
180 新しい node からの接続要求 WHERE\_TO\_CONNECT message に対して、
|
|
181 適切な node への接続を提供することができる(図\ref{fig:lostchild2}中, 1,2:)。
|
|
182
|
1
|
183 \begin{figure}[htpd]
|
|
184 \begin{center}
|
3
|
185 \includegraphics[scale=0.7]{./images/chapter3/lostChild2.pdf}
|
1
|
186 \end{center}
|
3
|
187 \caption{新 node の接続}
|
1
|
188 \label{fig:lostchild2}
|
|
189 \end{figure}
|
|
190
|