comparison rep-verify-sigos.ind @ 3:f1214f4b5933

figure
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 26 Mar 2009 10:31:47 +0900
parents ac15ac2df491
children 8e30bfb5deb6
comparison
equal deleted inserted replaced
2:ac15ac2df491 3:f1214f4b5933
22 複数人が同じテキストを共有して編集するプロトコルは、 22 複数人が同じテキストを共有して編集するプロトコルは、
23 さまざまなものが提案されているが、汎用エディタに実装 23 さまざまなものが提案されているが、汎用エディタに実装
24 する前堤のプロトコルはほとんどない。Remote Editing Protocol 24 する前堤のプロトコルはほとんどない。Remote Editing Protocol
25 では、複数のSession Managerと、リング状のSession の上に 25 では、複数のSession Managerと、リング状のSession の上に
26 編集コマンドを循環させる方法を取っている。 26 編集コマンドを循環させる方法を取っている。
27
28 <center><img src="fig/editor_to_editor2.pdf" alt="REPでの相互接続"></center>
27 29
28 この方法を採用した理由はいくつがある。 30 この方法を採用した理由はいくつがある。
29 集中サーバを用いない\underline{分散実装}が一つの前堤になっている。 31 集中サーバを用いない\underline{分散実装}が一つの前堤になっている。
30 Session Manager 自体が分散していて、Session Manager は、 32 Session Manager 自体が分散していて、Session Manager は、
31 (分離されたMergerを除けば)編集コマンドを中継するだけである。 33 (分離されたMergerを除けば)編集コマンドを中継するだけである。
65 は自動的に決まったポートを通してSMに接続(join/put)する。このようにすれば、 67 は自動的に決まったポートを通してSMに接続(join/put)する。このようにすれば、
66 エディタ上でホスト名を入力する必要はない。一つのホスト上では、 68 エディタ上でホスト名を入力する必要はない。一つのホスト上では、
67 単一のSMに複数のエディタが接続する。離れたホスト同士のエディタを 69 単一のSMに複数のエディタが接続する。離れたホスト同士のエディタを
68 接続する場合は、まず、それぞれのホスト同士のSMを接続する。そして、 70 接続する場合は、まず、それぞれのホスト同士のSMを接続する。そして、
69 それぞれエディタがSMに接続した後で、ホスト間の接続を選択(select)する。 71 それぞれエディタがSMに接続した後で、ホスト間の接続を選択(select)する。
72 <center><img src="fig/one_session_manager.pdf" alt="Session Managerの導入"></center>
70 73
71 ---Session managerの接続protocol 74 ---Session managerの接続protocol
72 75
73 SM同士の接続は、{\tt sm\_join}コマンドをSMに送ることによる。 76 SM同士の接続は、{\tt sm\_join}コマンドをSMに送ることによる。
74 接続により、接続したSM間でuniqueな session manager id 77 接続により、接続したSM間でuniqueな session manager id
79 が発行される場合もあるので、リングを避けるために、 82 が発行される場合もあるので、リングを避けるために、
80 {\tt sm\_join} はmaster SMまで転送される。自分自身に 83 {\tt sm\_join} はmaster SMまで転送される。自分自身に
81 {\tt sm\_join} が戻って来た場合は、その{\tt sm\_join} は 84 {\tt sm\_join} が戻って来た場合は、その{\tt sm\_join} は
82 廃棄される。現在は、既にsession/editorを持つSMは、他のSMに 85 廃棄される。現在は、既にsession/editorを持つSMは、他のSMに
83 接続することは出来ない。 86 接続することは出来ない。
87 <center><img src="fig/many_session_manager.pdf" alt="Session Manager同士の接続"></center>
84 88
85 ---Session 接続 protocol 89 ---Session 接続 protocol
86 90
87 SMに接続したエディタは、自分の既にオープンしたファイルを持って接続する 91 SMに接続したエディタは、自分の既にオープンしたファイルを持って接続する
88 {\tt put}と、他のエディタへ空のバッファを接続する{\tt join}の二種類の 92 {\tt put}と、他のエディタへ空のバッファを接続する{\tt join}の二種類の
103 によって、すべてのSMに通知される。このファイルの編集に参加したい場合は、 107 によって、すべてのSMに通知される。このファイルの編集に参加したい場合は、
104 まず、Editorを空のバッファの状態でSMに{\tt join}コマンドで接続する。 108 まず、Editorを空のバッファの状態でSMに{\tt join}コマンドで接続する。
105 すると、{\tt put}と同様に{\tt join}したEditorがすべてのSM上に通知される。 109 すると、{\tt put}と同様に{\tt join}したEditorがすべてのSM上に通知される。
106 SMのGUI上の操作{\tt select}により、{\tt put}されたファイルと{\tt join} 110 SMのGUI上の操作{\tt select}により、{\tt put}されたファイルと{\tt join}
107 したEditorが結びつけられる。 111 したEditorが結びつけられる。
112 <center><img src="fig/sm_join.pdf" alt="join コマンド"></center>
108 113
109 {\tt select}操作では、{\tt join}したEditorと{\tt put}したエディタを 114 {\tt select}操作では、{\tt join}したEditorと{\tt put}したエディタを
110 探し出す必要がある。そのために、SM木上にSM同士に到達するための 115 探し出す必要がある。そのために、SM木上にSM同士に到達するための
111 routing tableを構築している。これは、{\tt sm\_join}時に作成される。 116 routing tableを構築している。これは、{\tt sm\_join}時に作成される。
112 まず{\tt put}したEditorを探し、見つかったら{\tt select\_ack}を、 117 まず{\tt put}したEditorを探し、見つかったら{\tt select\_ack}を、
116 121
117 {\tt join}したエディタは空のバッファを持っているので、Session master 122 {\tt join}したエディタは空のバッファを持っているので、Session master
118 ({\tt put}したEditor)に、必要な編集行を要求する{\tt sync}コマンドを 123 ({\tt put}したEditor)に、必要な編集行を要求する{\tt sync}コマンドを
119 session ring に送る。Session master は、次のEditor Command を使って 124 session ring に送る。Session master は、次のEditor Command を使って
120 必要な行を送信する。 125 必要な行を送信する。
126 <center><img src="fig/use_case_put_join_over_sm.pdf" alt="Session Managerを介したエディタの接続"></center>
121 127
122 ---Editor Command 128 ---Editor Command
123 129
124 Editorのコマンドは、すべて、{\tt insert},{\tt delete} に分解される。 130 Editorのコマンドは、すべて、{\tt insert},{\tt delete} に分解される。
125 SM上での混乱を避けるために、Editorが直接SMに送ったユーザが生成した 131 SM上での混乱を避けるために、Editorが直接SMに送ったユーザが生成した
166 受け取った Editor Command をキューに入れておく。 172 受け取った Editor Command をキューに入れておく。
167 (2) 戻って来たタイミングで、キュー上のEditor Commandを、eid とCommandの 173 (2) 戻って来たタイミングで、キュー上のEditor Commandを、eid とCommandの
168 順序を基にソートする。 174 順序を基にソートする。
169 (3) Editor Command がなくても、他のEditorからCommand を受け取ったら、 175 (3) Editor Command がなくても、他のEditorからCommand を受け取ったら、
170 NOP Command を生成して、それが戻って来た時にソートを行なう。 176 NOP Command を生成して、それが戻って来た時にソートを行なう。
177
178 <center><img src="fig/new_merge.pdf" alt="Session Ring上のREPコマンドの送信"></center>
171 179
172 この手法では、EditorがN個あるSessionの場合、一つのEditor Commandに対して、N-1 180 この手法では、EditorがN個あるSessionの場合、一つのEditor Commandに対して、N-1
173 個のNOP Command が生成される。 181 個のNOP Command が生成される。
174 182
175 そこで、以下のようなMerge Protocol (C)を導入する。(1) Editor Command 183 そこで、以下のようなMerge Protocol (C)を導入する。(1) Editor Command
206 この時に、ユーザが編集コマンドを割り込ませる可能性がある。 214 この時に、ユーザが編集コマンドを割り込ませる可能性がある。
207 215
208 これを防ぐ一つの方法は、Merge 作業が始まった段階で、ユーザ入力を 216 これを防ぐ一つの方法は、Merge 作業が始まった段階で、ユーザ入力を
209 block してやれば良い(a)。もう一つの方法は、ユーザ入力の割り込みが 217 block してやれば良い(a)。もう一つの方法は、ユーザ入力の割り込みが
210 あった場合は、その入力込みで、もう一度、ソートを実行すれば良い(b)。 218 あった場合は、その入力込みで、もう一度、ソートを実行すれば良い(b)。
219 これはリマージと呼ばれる。
220
221 <center><img src="fig/remerge.pdf" alt="リマージ"></center>
211 222
212 Merge 作業中には、他のSM/Editorからの入力をblockすることは問題ない。 223 Merge 作業中には、他のSM/Editorからの入力をblockすることは問題ない。
213 それは、もともと非同期で動作しており、遅延は許容されるように 224 それは、もともと非同期で動作しており、遅延は許容されるように
214 なっている。 225 なっている。
215 226
290 このように簡単に証明することは出来ない。そこで、 301 このように簡単に証明することは出来ない。そこで、
291 モデル検査器であるJava PathFinder\cite{}を用いる。 302 モデル検査器であるJava PathFinder\cite{}を用いる。
292 303
293 --Protocol の実装 304 --Protocol の実装
294 305
295 Session Manager 306 Session Manager はJava 1.5で実装されており、 Ecplise は Java によるPlug-in
296 307 となっている。 Emacs は、従来はCで書いたクライアントを接続していたが、
297 Ecplise Plug-in 308 今は、すべて Emacs Lisp で書かれている。 Vim は、C で記述されており、
298 309 Merger もCで記述されていたが、今回の実装で取り外された。
299 Emacs 310
300 311 今回の実装では、Editor 側の実装のコストが削減されており、Merge Protocol
301 Vim 312 部分でCで150行程度が削減されている。Editor 側の実装は、Editor Command を
313 {\tt insert, delete} に分解する部分の実装が大半である。
314
315 Editor 側で実装する必要があるのは、表\ref{tb:sync}の機能である。
316 \end{table}
317 \begin{table}[htdp]
318 \caption{Editor 側での実装}
319 \begin{center}
320 \begin{tabular}{|l|l|}
321 \hline
322 1 & 編集機能の{\tt user\_insert,user\_detele}への分解と、分解したEditor Command の送信 \\
323 \hline
324 2 & {\tt join,put} Command のUI部分と、Command の送信 \\
325 \hline
326 3 & {\tt join,put} Command のUI部分と、Command の送信 \\
327 \hline
328 4 & {\tt join\_ack,put\_ack} の受け取りとsid,eidの設定 \\
329 \hline
330 5 & 外部からのEditor Commandの非同期受け取りと実行 \\
331 \hline
332 6 & {\tt sync} Command を受け取った場合の{\tt user\_insert,user\_detele}の生成
333 \hline
334 7 & Merge 時のlock (optional) \\
335 \hline
336 7 & {\tt quit} Command \\
337 \hline
338 \end{tabular}
339 \end{center}
340 \label{tb:sync}
341 \end{table}%
342
343 ファイルのオープン/セーブなどの機能はREPには含まれていない。Master Editor
344 も、それ以外のEditorも任意の時点でのローカルなセーブが可能である。
345 版管理なども、REP以外の部分で対応する。
346
347 外部からのEditor Command を受け取った場合のカーソルなどの制御は、規定されて
348 いない。移動した場合が便利な場合と、そうでない場合があると思われる。
302 349
303 --Socket Simulator 350 --Socket Simulator
304 351
305 Java Pathfinder による検証 352 Java Pathfinder による検証を行なうために、直接、Socketを経由せずに、
353 Thread を通して通信を行なうライブラリを作成した。
354
355 このライブラリは、最初、java.nio互換ではなく作成し、Merge Protocol
356 (A)及び(B)の動作をJava PathFinder で確認した。編集結果の同一性を
357 調べるために、Session 内の Editor のquit プロトコルを実装している。
358
359 まず、 {\tt quit } Command がSessin ring に送られ、各Editorは、
360 {\tt quit}を受け取ると、自分のユーザ編集コマンドを停止する。その編集を
361 終了した後、{\tt quit}を返す。{\tt quit}を受け取った後も、他の
362 Editor からのEditor Commandは来る可能性がある。{\tt quit}を最初に
363 送ったEditorに{\tt quit}が戻ると、今度は{\tt quit2}をSession Ring
364 に流す。これより後に、ユーザ編集コマンドが来ることはない。Editor は
365 自分の待っているEditor Commandのackがすべて来るのを確認してから、
366 {\tt quit2}を次へ渡す。{\tt quit2}を渡した後は、Editor Command は
367 来ないので、終了して良い。最初のEditorへ{\tt quit2}が戻った時点で、
368 すべての編集が終了する。
369
370 この時に、Editor のバッファを比較して、
371 すべてのEditorのバッファが同じならば、正しくプロトコルが動いた
372 ことになる。これをJava PathFinderで検証を行なう。
373
374
375 (C)の実装を、実際のSession Manager 上で検証するために、java.nio と
376 Thread による通信のシミュレーションを切替えることが可能なライブラリ
377 を作成した。実際のSession Manager に対する Java PathFinder での
378 実行確認は、計算時間の制約により、まだ、可能とはなっていない。
306 379
307 --検証とデバッグ 380 --検証とデバッグ
308 381
382 (A)のプロトコルがEditor 二つで動作すること、及び、(B)のプロトコル
383 が複数のEditorで動作することを Java PathFinder で確認することが
384 出来た。
385
386 (C)は、実際のSession Managerの実装を含む検証となるので、よりハードルが
387 高い。現状では、Java PathFinder での動作確認は出来ていない。
388
389 Java PathFinder でvimやEmacsを含む検証は可能とはなっていないが、
390 Sample Editor をJava で実装することにより、Java PathFinderでの
391 Merge Protocolの検証が可能となっている。
392
393 実際には、vim やEmacs などのEditor側の実装が正しいかどうかを調べる
394 ことも重要である。それは、Merge Protocolを切った状態で、Javaの
395 Sample Editor に対する動作を確認することで調べることが出来る。
396
397
309 --比較 398 --比較
399
400 類似のProject としては、GroupKit \cite{}, Soba Project\cite{} がある。
401 vim やEmacs などのOpen source editor の実装を含むのが、REPの特徴
402 である。
403
404 また、Java で実装されていて、Session Manager 部分、Editor の改変部分、
405 Eclipse plugin のすべてが、LGPLで公開されているのも独自な特徴の
406 一つである。
407
408 GroupKit はtcl/tkで記述されており、検証などが困難だが、REPでは、
409 Java の部分をJava PathFinder で検証することが可能だと思われる。
410 しかし、現状では、まだ、検証までには至っていない。
411
412 GroupKit などで使われているマルチメディア編集の同期は、Masterが
413 一つ存在し、それに対するCommandの発行と、MasterからのCommandの
414 マルチキャストで実現されている\cite{}。REPでは、マルチキャスト
415 ではなく、Session ring によって同期を実現している。Ring は、
416 遅く信頼性に欠ける部分があるが、ネットワークに対する負荷が
417 軽いと言う特徴がある。(C)のMerge Protocolを使うことにより、
418 o(n)のパケットで同期を行なうことが出来る。また、マルチキャスト
419 を避けているので、WANなどの遅延が大きい部分に複数のストリーム
420 を張る必要がないという特徴がある。
421
422 また、Session Manager 上には、Editor Bufferが存在しないので、
423 大きなファイルを編集する場合でも、Session Manager のメモリを
424 消費することはない。
425
426 --最後に
427
428 このプロジェクトは、sourceforge を通じて公開\cite{}されており、まだ、
429 開発途上となっている。
430
431 残念ながら、実際のSession Manager 上でのJava Pathfinder での検証は
432 まだ、出来てはないが、通信ライブラリ上での処理をatomicにするなどの
433 工夫で可能になると期待している。
434
435
436
437