view Merger/remote_editor.html @ 17:fcd3800b4d26

*** empty log message ***
author kono
date Tue, 04 Nov 2008 18:36:04 +0900
parents 9e761988e372
children
line wrap: on
line source

<html>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<head>
<title>Remote Editor Procotol</title>
</head>
<body>
<h1>Remote Editor Procotol</h1>
<a href=#content>content</a><br>
<nr>

<p>

<hr>
<h2><a name="content000">EditorとSession Manager の間の非同期Merge </a></h2>
Merge はsesion manager側で行なわれるので、それと同時にeditor
側からの入力がある場合がある。start_merge,end_merge を流すので、editorは、それを使って入力をlock(できれば)した方が良い。editorからの割込みがあった場合は、もう一度やり直す。これは、local な処理。割り込まれた入力は、そのままsession ringに流して良い。
<p>
<center><img src="reMerge.jpg"></center>
<p>
editorからのcommandは、session ringを廻るが、editorには戻らない。その代わり、start_merge が出る。merge_command は、eid=-2がついているので、editorは、これを実行しsession managerに返す必要がある。(これを見て、割り込みがあったかどうかを判断する)
<p>
<center><img src="merge-sequence.jpg"></center>
<p>
nop()を付け加えるプロトコルだと、一周で、n^2のコマンドが出てしまう。insert() の後に、insert-ack()を流して、insert-ack()をnop()の代わりに start-merge
のタイミングとする。これで、2 * n の数に減る。
<p>
<center><img src="ack-based-merge.jpg"></center>
<p>

<hr>
<h2><a name="content001">Sessionのquit</a></h2>
まず、quitを廻して、editorからの入力を止める。既に、入力されたcommandは、quitの前後にいる。
<p>
<center><img src="terminate1.jpg"></center>
<p>
quitが一周したら、quit2を流す。quit2を出す時には、editorが自分が出したcommandが一周するのを確認した後になる。確認は、session managerが行なう。最初のeditorは、quit2を出した時には終了出来ず、quit2_ack
を待つ必要がある。その他は、quit2を出したら終了して良い。
<p>
<center><img src="terminate2.jpg"></center>
<p>
closeも同様だが、client editorは単に抜けるだけで良い。master editorが抜ける時には、quitを行なう。
<p>

<hr>
<h2><a name="content002">Session Manager の切断時の処理</a></h2>
切断された時には、gatherを使って、自分がどのsession
を持っているかを判断する必要がある。gatherの後で、updateを行なう。
<p>
<center><img src="disconnect.jpg"></center>
<p>

<hr>
<h2><a name="content003">Session Manager の join</a></h2>
ループの検出を行なう必要がある。
<p>
<center><img src="sm_join.jpg"></center>
<p>

<hr>
<h2><a name="content004">Session Manager にまたがるsession</a></h2>
<center><img src="inter-sm-session.jpg"></center>
<p>

<hr>
<h2><a name="content005">Session Manager にまたがる join/put</a></h2>
<center><img src="inter-sm-join.jpg"></center>
<p>

<hr>
<h2><a name="content006">Session Manager にまたがる select</a></h2>
<center><img src="inter-sm-select.jpg"></center>
<p>

<hr>
<h2><a name="content007">Handler</a></h2>
Editor/Forwarder/Dispatcher などが通信を担当するObject となる。これらの判断は、FirstConnector が識別する。handler() と merge() があるが、特に差はない。
<p>
<center><img src="handler.jpg"></center>
<p>
(1) SessionManager の中で閉じた closed session
<p>
(2) SessionManager にまたがった session は、Dispatcherで、
<pre>
    Editor/Forwarderに分配される。他のSessin Managerへは
    Forwarder経由で送られる。

</pre>
(3) 一つのEditor connectionに複数のSessionが乗る場合は、
<pre>
    Editor connectionに、DispatcherとForwarderがはさまる。
    この場合は、protocolに、どのeditorから来たかを識別する
    field が必要となる。

<h2><a name="content">Content</h2>
<ol>
<li><a href="#content000">  EditorとSession Manager の間の非同期Merge </a>
<li><a href="#content001">  Sessionのquit</a>
<li><a href="#content002">  Session Manager の切断時の処理</a>
<li><a href="#content003">  Session Manager の join</a>
<li><a href="#content004">  Session Manager にまたがるsession</a>
<li><a href="#content005">  Session Manager にまたがる join/put</a>
<li><a href="#content006">  Session Manager にまたがる select</a>
<li><a href="#content007">  Handler</a>
</ol>

</body></html>