Mercurial > hg > RemoteEditor > Documents
view Merger/remote_editor.ind @ 17:fcd3800b4d26
*** empty log message ***
author | kono |
---|---|
date | Tue, 04 Nov 2008 18:36:04 +0900 |
parents | 9e761988e372 |
children |
line wrap: on
line source
-title: Remote Editor Procotol --EditorとSession Manager の間の非同期Merge Merge はsesion manager側で行なわれるので、それと同時にeditor 側からの入力がある場合がある。start_merge,end_merge を流す ので、editorは、それを使って入力をlock(できれば)した方が良い。 editorからの割込みがあった場合は、もう一度やり直す。これは、 local な処理。割り込まれた入力は、そのままsession ringに 流して良い。 <center><img src="reMerge.jpg"></center> editorからのcommandは、session ringを廻るが、editorには戻らない。 その代わり、start_merge が出る。merge_command は、eid=-2が ついているので、editorは、これを実行しsession managerに返す 必要がある。(これを見て、割り込みがあったかどうかを判断する) <center><img src="merge-sequence.jpg"></center> nop()を付け加えるプロトコルだと、一周で、n^2の コマンドが出てしまう。insert() の後に、insert-ack() を流して、insert-ack()をnop()の代わりに start-merge のタイミングとする。これで、2 * n の数に減る。 <center><img src="ack-based-merge.jpg"></center> --Sessionのquit まず、quitを廻して、editorからの入力を止める。 既に、入力されたcommandは、quitの前後にいる。 <center><img src="terminate1.jpg"></center> quitが一周したら、quit2を流す。quit2を出す時には、 editorが自分が出したcommandが一周するのを確認した 後になる。確認は、session managerが行なう。最初の editorは、quit2を出した時には終了出来ず、quit2_ack を待つ必要がある。その他は、quit2を出したら終了 して良い。 <center><img src="terminate2.jpg"></center> closeも同様だが、client editorは単に抜けるだけで良い。 master editorが抜ける時には、quitを行なう。 --Session Manager の切断時の処理 切断された時には、gatherを使って、自分がどのsession を持っているかを判断する必要がある。gatherの後で、 updateを行なう。 <center><img src="disconnect.jpg"></center> --Session Manager の join ループの検出を行なう必要がある。 <center><img src="sm_join.jpg"></center> --Session Manager にまたがるsession <center><img src="inter-sm-session.jpg"></center> --Session Manager にまたがる join/put <center><img src="inter-sm-join.jpg"></center> --Session Manager にまたがる select <center><img src="inter-sm-select.jpg"></center> --Handler Editor/Forwarder/Dispatcher などが通信を担当する Object となる。これらの判断は、FirstConnector が 識別する。handler() と merge() があるが、特に差はない。 <center><img src="handler.jpg"></center> (1) SessionManager の中で閉じた closed session (2) SessionManager にまたがった session は、Dispatcherで、 Editor/Forwarderに分配される。他のSessin Managerへは Forwarder経由で送られる。 (3) 一つのEditor connectionに複数のSessionが乗る場合は、 Editor connectionに、DispatcherとForwarderがはさまる。 この場合は、protocolに、どのeditorから来たかを識別する field が必要となる。