.. _mainthread: メインスレッド処理概要 ------------------------ メインスレッドでは RI のリクエスト受付から転送までの一連の処理を行う。 スレッドの存続 ++++++++++++++++ dtsd からの stop 指示を受けると RI はメインスレッドを停止する。 メインスレッドにそれぞれスレッドの停止指示の有無を確認するフラグ変数を 持たせ、RI の stop ハンドラがそのフラグを立てるようにすれば良いだろう。 リクエストを待機 ++++++++++++++++ リクエストを受け付ける TCP ソケットへの接続を待つ。 select(2) を利用してタイムアウトを設定し、ループする構造にすると良い。 またループ毎にスレッドの停止フラグを確認し、フラグが立っている場合は スレッドを終了させるようにする。 リクエストの解析 ++++++++++++++++ リクエストを解析し、転送先ノードの選出に必要な情報を得る。 リクエストは転送先ホストでも必要になるため、 受信したリクエストデータは保持しておく必要がある。 転送先ノードの選出 ++++++++++++++++++++ 転送先ノードを選出する。詳しくは :ref:`dispatcher` を参照されたい。 転送 ++++++++++++++++++++ 転送先ノードへリクエストを転送する。転送には libftcs の ftcs_request_handover() 関数を利用する。 ftcs_request_handover() 関数の API は以下の通りである。 :: int ftcs_request_handover(int s, const struct sockaddr *dest_addr, socklen_t addrlen, const void *req_buff, size_t req_len, size_t next_req_offset) 転送に失敗した場合は所定の回数まで転送を試みる。 所定の回数を越えて失敗した場合はこのセッションを放棄し、リクエストの待機を再開する。 転送に成功した場合も、リクエストの待機を再開する。