%#!make OX-RFC-101-ja.dvi
% $OpenXM: OpenXM/doc/OpenXM-specs/OX-RFC-101.tex,v 1.7 2020/03/14 01:21:56 takayama Exp $
\documentclass{article}
%%\IfFileExists{epsfig.sty}{\usepackage{epsfig}}{}
\usepackage{html}
/*&jp
\title{{\bf エンジン起動プロトコル, OpenXM RFC 101 Draft}}
\author{ 小原功任\thanks{{金沢大学理学部計算科学教室, \htmladdnormallink{http://omega.s.kanazawa-u.ac.jp/ohara/}{http://omega.s.kanazawa-u.ac.jp/ohara/}}}}
\date{ 2000年, 11月30日}
*/
/*&eg
\title{{\bf Protocol to Start Engines, OpenXM RFC 101 Draft}}
\author{ Katsuyoshi Ohara\thanks{Department of Computational Science, Kanazawa University, \htmladdnormallink{http://www.s.kanazawa.ac.jp}{http://www.s.kanazawa.ac.jp}}}
\date{ November 30, 2000 }
*/

\begin{document}
\maketitle
\section{Session Management}

/*&jp
この文書では ``OpenXM RFC 100, OpenXM の設計と実装''\ 
\htmladdnormallink{http://www.math.kobe-u.ac.jp/OpenXM/OpenXM-RFC.html}{http://www.math.kobe-u.ac.jp/OpenXM/OpenXM-RFC.html}
で定義されたコントロールサーバを置き換える新しいコントロールサーバの
仕様を説明する.
*/

/*&eg
This document describes a new control server specification
which is intended to be
a replacement of the control server defined in 
``Design and implementation of OpenXM, OpenXM RFC 100''\ 
\htmladdnormallink{http://www.math.kobe-u.ac.jp/OpenXM/OpenXM-RFC.html}{http://www.math.kobe-u.ac.jp/OpenXM/OpenXM-RFC.html}.
*/

\subsection{New OpenXM control servers}

/*&jp

我々は新しいコントロールサーバを提案する。そのサンプル実装として oxc が
提供される。新しいコントロールサーバは以下の点で従来のものと異なる。
\begin{enumerate}
\item コントロールサーバは OpenXM スタックマシンであり、
CMObject/Primitive をサポートする。
\item 計算サーバの起動はスタックマシンコマンドを介して行う。
\item 一つのコントロールサーバから複数の計算サーバを起動できる。
\end{enumerate}

oxc の導入により、いままでのサーバの起動手順はコントロールサーバの起動と
計算サーバの起動に分離される。コントロールサーバを起動するには次の手順を
取る。まず、適当なオプション(後述)をつけて、コントロールサーバを起動する
と、コントロールサーバはソケットを作成し、connect する。クライアントは、
listen, accept する。接続後、最初にバイトオーダを決定する。バイトオーダ
の決定方法については、従来のものと変更はない
(OpenXM/doc/OpenXM-specs/control.tex を見よ)。その後、コントロールサーバ
は待機状態にはいる。コントロールサーバは OpenXM スタックマシンであるから、
mathcap の交換などの手続きに入ってもよい。

\subsection{OpenXM control stack machine}

コントロールサーバは、次のスタックマシンコマンドを実装しなければならない。
それぞれのスタックコマンドの意味は、{\bf 以前のコントロールサーバとは異なる。}

\begin{enumerate}
\item
\begin{verbatim}
SM_control_spawn_server
\end{verbatim}
新たに計算サーバを起動する。計算サーバの起動に成功すると、その ID を返す。

Request:
\begin{tabular}{|c|c|}  \hline
{\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_spawn\_server}  \\
\hline
\end{tabular}

Stack before the request: 
\begin{tabular}{|c|c|}  \hline
{\sl List} Argument \\
\hline
\end{tabular}

Stack after the request: 
\begin{tabular}{|c|c|}  \hline
{\sl Integer32} ServerID \\
\hline
\end{tabular}

Output: none.

Argument:	 
\begin{tabular}{|c|c|c|}  \hline
{\sl List} Ports & {\sl String} ServerName & ...\\
\hline
\end{tabular}

Ports:
\begin{tabular}{|c|c|}  \hline
{\sl Integer32} Port & ... \\
\hline
\end{tabular}

\item
\begin{verbatim}
SM_control_terminate_server
\end{verbatim}
指定された計算サーバに SIGKILL を送る。

Request:
\begin{tabular}{|c|c|}  \hline
{\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_terminate\_server}  \\
\hline
\end{tabular}

Stack before the request:
\begin{tabular}{|c|c|}  \hline
{\sl Integer32} ServerID \\
\hline
\end{tabular}

Output: none.

\item
\begin{verbatim}
SM_control_kill
\end{verbatim}
全ての計算サーバに SIGKILL を送る。

Request:
\begin{tabular}{|c|c|}  \hline
{\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_kill}  \\
\hline
\end{tabular}

Output: none.

\item
\begin{verbatim}
SM_control_reset_connection_server
\end{verbatim}
指定された計算サーバに SIGUSR1 を送る。

Request:
\begin{tabular}{|c|c|}  \hline
{\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_reset\_connection\_server}  \\
\hline
\end{tabular}

Stack before the request:
\begin{tabular}{|c|c|}  \hline
{\sl Integer32} ServerID \\
\hline
\end{tabular}

Output: none.

\item
\begin{verbatim}
SM_control_reset_connection
\end{verbatim}
全ての計算サーバに SIGUSR1 を送る。これは下位互換性のための措置である。

Request:
\begin{tabular}{|c|c|}  \hline
{\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_reset\_connection}  \\
\hline
\end{tabular}

Output: none.

\end{enumerate}

\bigskip
\bigskip

\subsection{OpenXM reset protocol}
OX-RFC-100 に準拠する。

\subsection{A sample implementation}

\subsubsection{Command Line Arguments}
コントロールサーバの実行形式は getopt(3) に ``c:p:h:x'' で指定するオプショ
ンを持つ。すなわち、
\begin{verbatim}
oxc -c [password] -h [hostname] -p [portnumber] -x
\end{verbatim}

{\tt -h} では、クライアントのホスト名を指定する。クライアントはあらかじめ、
hostname:port を開いて待ち受けなければならない。

{\tt -x} オプションはなくてもよい。-x を指定し、かつ環境変数 DISPLAY が
設定されていると、oxc は新たに端末(ウィンドウ)を作成して、メッセージをそ
の端末に出力する。oxc の用いる端末の種類は環境変数OpenXM\_XTERM で指定す
る。デフォルトは xterm である。

オプション {\tt -h} が指定されないときには特別な動作を行う。

\subsubsection{パイプを利用した接続}

oxc はオプション {\tt -h} が指定されないときには、コマンドラインで与えら
れるべき情報を、標準入力から得ようとする。ここでは、この機能について説明
する。まず、標準入力から受け取るデータは次の形式をしていなければならない。
\begin{tabular}{|c|c|c|c|c|}
\hline
{\sl int32} port & {\sl String} hostname & {\sl byte} 0 & {\sl String} password & {\sl byte} 0\\
\hline
\end{tabular}

\medskip

String は C のストリングではなくて、cmo\_string のような、長さ付きの
ストリングである。

\noindent
データの例: \\
port = 1324 = 0x052c, hostname = ``orange'', password = ``hogehoge''
の場合
\begin{verbatim}
00 00 05 2c 00 00 00 07 6f 72 61 6e 67 65 00 00
00 00 09 68 6f 67 65 68 6f 67 65 00
\end{verbatim}

さて具体的な起動プロセスは次の通りである。

\begin{enumerate}
\item 
クライアントは pipe(2) を用いて、ファイルディスクリプタ fd0, fd1 を
手にいれる。
\item
fork(2) で子プロセスを生成し、子プロセスは dup2(fd1, 0) を実行する。
これで 親プロセスの fd0 と子プロセスの 0 が接続されている。
\item
子プロセスは exec("ssh remotehost controlserver") としてリモートプロセ
ス起動する。このとき、親プロセスの fd0 とリモートプロセスの 0 が接続さ
れている。
\item
この通信路はリモートプロセスからは標準入力として見えている。
リモートプロセスは標準入力から既に述べたフォーマットにしたがってデータを
読み込む。リモートプロセスは、そのデータを用いて connect(2) を実行する。
\end{enumerate}


\subsubsection{Local Functions}

コントロールサーバの各実装は、独自にローカル関数をサポートしてもよい。
実際、サンプル実装 oxc はローカル関数をサポートしている。

ここでは、oxc のローカル関数 spawn について説明しよう。

spawn は計算サーバを起動し、少なくとも 1 個の引数を持つ。この引数は
SM\_control\_spawn\_server で用いられる {\sl List} Argument と同一の形式で
ある。すなわち、スタックに(右がトップ)
\begin{tabular}{|c|c|c|}  \hline
{\sl List} Argument & {\sl Integer32} 1 & {\sl String} ``spawn'' \\
\hline
\end{tabular}
を積み、SM\_executeFunction をコントローラに送る。
SM\_executeStringByLocalParser は利用できないので注意する。

spawn は、計算サーバの起動に成功したら (CMO\_INT32, サーバID) を、失
敗したらエラーオブジェクトをスタックに積む。例えば計算サーバが発見できな
かった場合にはエラーオブジェクトを積むことになる。コントロールサーバは 
access(2) を用いて PATH から計算サーバを探す。もし見つからなければ、fork 
をせずに、エラーオブジェクトをスタックに積む。
*/

/*&eg

This document has not yet been translated into English from Japanese.

*/

\end{document}
