view merger.tex @ 0:39af8ab46cbb

(no commit message)
author one
date Wed, 18 Feb 2009 22:22:25 +0900
parents
children 4742b1e4da3a
line wrap: on
line source

\section{マージ}
REPでは、それぞれのエディタでのテキストへの編集を非同期に行うため、エディタ間で編集コマンドの衝突が起こることがある。

例えば、エディタAとエディタBでほぼ同時に同じテキストの同じ行を編集した場合、 
2つのエディタ間で編集の順番が逆になってしまい、編集結果に差が出てしまう 
(図\ref{fig:conflict3})。
  
\begin{figure}[htpb]
    \begin{center}
	\includegraphics[scale=.4]{figure/conflict3.pdf}
    \end{center}
    \caption{コマンドの衝突}
    \label{fig:conflict3}
\end{figure}

このような編集コマンドの衝突による編集結果の不整合をマージにより修正する。

\subsection{Session Ring}
実際にはエディタはSession Managerにスター型に接続されるが、同じSession内(同じテキストに対する編集を行っているエディタ同士)でのREPコマンドの送受信は仮想的なリングネットワークを構成し、このリング上をREPコマンドを1方向に送信する(図\ref{fig:new_merge})。これをSession Ringと呼ぶ。
テキスト編集をREPコマンドに変換し、このREPコマンドをリングネットワーク上に巡回させることにより、全てのエディタで起こった編集をREPコマンド列として、それぞれのエディタで収集する。
このSession Ringを用いると、全てのエディタで起こったテキスト編集の履歴をREPコマンド列としてそれぞれのエディタで蓄積できる。
この蓄積されたコマンド列を利用してマージを行う。

\begin{figure}[htpb]
    \begin{center}
	\includegraphics[scale=.3]{figure/new_merge.pdf}
    \end{center}
    \caption{Session Ring上のREPコマンドの送信}
    \label{fig:new_merge}
\end{figure}

\subsection{マージアルゴリズム}
それぞれのエディタに蓄積されたREPコマンド列は順番が異なる。図\ref{fig:new_merge}を例に見ると、Editor1ではeid=1,3,2の順に蓄積されているが、Editor2ではeid=2,1,3の順番である。
これをソートして順番を一致させてエディタへ反映すれば編集結果を一致させることができる。
しかしエディタには既に、それぞれのエディタ間で異なった順番でREPコマンドが反映されてしまっているので、エディタ側のテキストに対してUndoの処理を行う。
これにより、それぞれのエディタは、編集前の状態に戻り、テキストは一致している状態である。
その後、ソートされたREPコマンド列をテキストへ反映させ全てのテキストを一致させる。
このUndoの処理のために蓄積されたREPコマンド列からUndoコマンドを生成する。


\subsection{マージ処理のSession Managerへの移行}
マージの処理はこれまで、エディタ側で実装されていたが、マージはREP共通の処理であるため、それぞれのテキストエディタへ個別に実装するよりは、Session Managerへ実装する方が望ましいと考えた。
しかし、エディタとSession Managerとの間では非同期に通信を行っているため、マージコマンドとエディタコマンドとの間で衝突が起こってしまうことがある。マージ中にエディタからの割り込みがあった場合である。
これを解決するため、マージコマンドとエディタコマンドとの間マージを行うリマージコマンドの生成を提案した(図\ref{fig:remerge})。

リマージコマンドもマージコマンドと同様にUndoを行うが、コマンドのソートは行わずに、エディタからの割り込みのみを排除して、もう一度同様のマージコマンド列をテキストへ反映させる。
その後、排除したエディタ割り込みコマンドをテキストへ反映させる。

\begin{figure}[htpb]
    \begin{center}
	\includegraphics[scale=.3]{figure/remerge.pdf}
    \end{center}
    \caption{リマージ}
    \label{fig:remerge}
\end{figure}