# HG changeset patch # User sugi # Date 1421136656 -32400 # Node ID b9b3f2241ab474a05a73d1844c7c4ef85f320f89 # Parent ef47dab5764f6e95af69a94e4e5a4996853fccdc modify chapter2 diff -r ef47dab5764f -r b9b3f2241ab4 paper/chapter1.tex --- a/paper/chapter1.tex Mon Jan 12 19:35:31 2015 +0900 +++ b/paper/chapter1.tex Tue Jan 13 17:10:56 2015 +0900 @@ -237,7 +237,24 @@ \end{figure} \section{Aliceによるプログラミング手法} +AliceはCode SegmentとData Segmentによってプログラミングを行なう。Code Segmentから別にCode SegmentへData Segmentを引き渡す際、コンストラクタは使わない。Code SegmentがLocal / Remote Data Segmentに対してputを行い、別のCode SegmentがLocal / Remote Data Segmentに対してpeekを行うことで引き渡される。つまり、Code Segmentは実行前後にData Segmentへ通信が行われるのである。この通信の順序がCode Segmentの実行順序を決定している。 +すなわち、Aliceによるプログラミングとは通信の管理を行うことであり、プロトコルを設計することと捉える事ができる。 + \subsection{記述に関する注意点} -\subsubsection{nullpointerException} -\subsubsection{Message Packの使い方} +\subsubsection{setKey のシンタックス問題} +setKeyメソッドをコンストラクタ等で呼ぶ際、setKeyメソッドを必ず最後に呼ばなければならない。 + +Code Segmentは内部で実行に必要なData Segmentを数えている。Data Segmentの取得に成功するとこの値が、デクリメントされ、0になると必要なData Segmentが全て揃ったことと判断される。全て揃った際にはThread poolへ送られる。 + +setKey移行に処理を記述した場合、その処理が行われない可能性がありThread poolへと送られNullPointerExceptionを引き起こす。 + +\begin{table}[html] +\lstinputlisting[label=src:NullPointerException,caption=NullPointerExceptionになる可能性がある]{source/ShowDataFailed.java} +\end{table} + +ソースコード\ref{src:NullPointerException}は、for文でsetKeyとids.createをcntの回数呼び、動的にData Segmentの取得数を決めようとしている。しかし、setKeyが最初に呼ばれた際に、Data Segmentの取得に成功すると実行可能と判断されてしまう。runの中でinfoの配列の要素だけ中身を表示させようとしてるが、2回目のasClassでNullPointExceptionを引き起こす。今回の場合、コンストラクタ内をソースコード\ref{src:success}のように記述する必要がある。 + +\begin{table}[html] +\lstinputlisting[label=src:success,caption=NullPointerExceptionにならない記述]{source/ShowData.java} +\end{table} \subsubsection{singleton Code Segment} \ No newline at end of file diff -r ef47dab5764f -r b9b3f2241ab4 paper/chapter2.tex --- a/paper/chapter2.tex Mon Jan 12 19:35:31 2015 +0900 +++ b/paper/chapter2.tex Tue Jan 13 17:10:56 2015 +0900 @@ -98,7 +98,7 @@ %画像挿入 -subsection{処理の流れ} +\subsection{処理の流れ} 図\ref{fig:NodeToClient}はデータの伝搬の様子をコラボレーションダイアグラムで示したものである。 \begin{enumerate} \item ユーザーが魚を操作することで魚の座標のData SegmentであるfishDataが更新される。 diff -r ef47dab5764f -r b9b3f2241ab4 paper/chapter3.tex --- a/paper/chapter3.tex Mon Jan 12 19:35:31 2015 +0900 +++ b/paper/chapter3.tex Tue Jan 13 17:10:56 2015 +0900 @@ -73,7 +73,6 @@ 接続状態に問題があり、{\tt CLOSE}タスクの実行されるまでにレスポンスがない場合は、{\tt CLOSE}タスクによりRemote Data Segmentが削除される。 heartbeatは、Node AからNode Bに一方向に送られる訳ではなく、Node BからNode Aにも送られている。 -%Singleton Code Segmentの注意点 ids.initが必要とその理由の記述 \section{切断時の処理} DataBaseではデータ更新の際にトランザクション処理に障害が起こった場合、DataBase側でトランザクション処理開始前に戻すロールバックという処理が行われる。 @@ -99,7 +98,53 @@ その際は、もちろんInput Data Segmentが全て揃うまでCode Segmentは実行されない。 \section{Topologyの再構成} -AliceVNCのTopologyは木構造であるため、木の途中のNodeが切断した場合にTopologyを再構成しなければならない。特定の切断時の処理が終わると自動でTopologyの再構成を行なう。 +ノードは永続的にアプリケーションに参加し続ける訳ではない。目的を果たすとアプリケーションから離脱する。 +Topology次第では、アプリケーションに支障をきたす。 +例えば、AliceVNCは木構造であるため、子ノードを持つノードがアプリケーションから離脱した場合、その子ノードに対してデータを送信することができなくなる。 + +この問題を解決するには、アプリケーションからノードが切断するたびにTopologyの再構成を行なう必要がある。そこで、Dynamic Topology Managerに、Topologyの再構成を行う機能を追加した。 + +図 \ref{fig:TopologyFIx}、 \ref{fig:TopologyFIx2}、\ref{fig:TopologyFIx3}はTopologyの再構成をコラボレーションダイアグラムで表したものである。 + +%コラボレーションダイアグラム図の挿入 +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=120mm]{images/TopologyFIx.pdf} +\end{center} +\caption{切断ノードの検知} +\label{fig:TopologyFIx} +\end{figure} + +\begin{enumerate} +\item Keep AliveがNode1の切断を検知すると、Node3からTopology Managerに対して切断したノードの情報がputされる。keep Aliveは各ノードで動いているため、実際にはNode0とNode4もTopology Managerに対してNode1の情報をputする。 +\item Topology Managerは最後にアプリケーションに参加したNode6とその親Node2に対して互いを切断するための準備を行わせる、CLOSEMESSAGEをputする。 +\item 切断する準備ができるとお互いに準備完了を知らせるCLOSEREADYをputする。 +\item \label {tb:last}CLOSEREADYを受け取ると切断を行い、Remote Data Segmentが使用不可能になる。 +\end{enumerate} + +\begin{figure}[htbp] + \begin{minipage}{0.5\hsize} + \begin{center} + \includegraphics[width=90mm]{images/TopologyFix2.pdf} + \end{center} + \caption{接続すべきノード情報の送信} + \label{fig:TopologyFIx2} + \end{minipage} + \begin{minipage}{0.5\hsize} + \begin{center} + \includegraphics[width=80mm]{images/TopologyFix3.pdf} + \end{center} + \caption{再構成の完了} + \label{fig:TopologyFIx3} + \end{minipage} +\end{figure} + +\begin{enumerate} +\setcounter{enumi}{4} +\item Node1、Node3、Node4に対してNode6の情報を送り、接続を行わせる。 +\item Node6に対して、Node1、Node3、Node4の情報を送り、接続を行わせる。 +\item お互いにRemote Data Segmentの名前を贈り合い、Remote Data Segmentが利用可能になる。 +\end{enumerate} \section{再接続の処理} diff -r ef47dab5764f -r b9b3f2241ab4 paper/images/TopologyFix.pdf Binary file paper/images/TopologyFix.pdf has changed diff -r ef47dab5764f -r b9b3f2241ab4 paper/images/TopologyFix2.pdf Binary file paper/images/TopologyFix2.pdf has changed diff -r ef47dab5764f -r b9b3f2241ab4 paper/images/TopologyFix3.pdf Binary file paper/images/TopologyFix3.pdf has changed diff -r ef47dab5764f -r b9b3f2241ab4 paper/master_paper.tex --- a/paper/master_paper.tex Mon Jan 12 19:35:31 2015 +0900 +++ b/paper/master_paper.tex Tue Jan 13 17:10:56 2015 +0900 @@ -8,7 +8,7 @@ \usepackage{url} \input{dummy.tex} %% font -\jtitle{分散ネットワークフレームワーク Alice 改良} +\jtitle{分散フレームワーク Alice の改良と評価} \etitle{Design and Implementation Distributed network framework Alice} \year{平成23年度} \affiliation{\center% diff -r ef47dab5764f -r b9b3f2241ab4 paper/source/ShowData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/ShowData.java Tue Jan 13 17:10:56 2015 +0900 @@ -0,0 +1,10 @@ +public ShowData(int cnt) { + info = new Receiver[cnt]; + for (int i= 0;i < cnt; i++) { + info[i] = ids.create(CommandType.TAKE); + } + + for (int i= 0;i < cnt; i++) { + info[i].setKey(SetInfo.array[i]); + } +} diff -r ef47dab5764f -r b9b3f2241ab4 paper/source/ShowDataFailed.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/ShowDataFailed.java Tue Jan 13 17:10:56 2015 +0900 @@ -0,0 +1,19 @@ +public class ShowData extends CodeSegment{ + private Receiver[] info; + + public ShowData(int cnt) { + info = new Receiver[cnt]; + for (int i= 0;i < cnt; i++) { + info[i] = ids.create(CommandType.TAKE); + info[i].setKey(SetInfo.array[i]); + } + } + + @Override + public void run() { + int size = 0; + for (Receiver anInfo : info) { + DataList dlist = anInfo.asClass(DataList.class); + dlist.showData(); + } + } \ No newline at end of file