【実施例1】
【0032】
図1は、本発明の第1の実施の形態に係るネットワークファイル共有システムの構成例を示す。本実施例のシステムは、ファイルサーバ100、クライアント端末110、ネットワーク120、および、ストレージ装置130からなる。本システムでは、ファイルサーバ100が、クライアント端末110に対して、ファイルサーバ100に接続されたストレージ装置130に格納される文書および画像等のデータファイルを、ネットワーク120を経由してアクセスする、ネットワークファイル共有サービスを提供する。
【0033】
ファイルサーバ100は、例えば、UNIX(登録商標)等のOSが動作するWSであり、ファイルサーバアプリケーション部140、VFS(Virtual File System)150、リアルタイムI/Oファイルシステム160、および、I/O代行デーモン部400からなる。ファイルサーバアプリケーション部140は、ネットワークファイル共有サービスを提供するファイルサーバアプリケーションソフトウェアであり、例えば、SMBD(Samba Daemon)やNFSD(Network File System Daemon)等である。
【0034】
ファイルサーバアプリケーション部140は、ファイルサーバ100上に同一あるいは異なる種類のものが複数存在してもよい。ファイルサーバアプリケーション部140のVFS150に対するI/O要求は、I/Oフックモジュール部300によってフックされる。
【0035】
VFS150は、ファイルサーバ100のOSが提供するファイルシステムインタフェースモジュールであり、例えば、open(), close(), read(), write()等のシステムコールインタフェースを提供する、I/O特性を認識しないファイルシステムである。
【0036】
リアルタイムI/Oファイルシステム160は、リアルタイムI/O制御機能を備えたファイルシステムモジュールであり、例えば、個々のI/O要求にデッドライン情報等の制御情報を付加してI/O制御の精度を高めることにより、I/O特性を認識するファイルシステムである。
【0037】
I/O代行デーモン部400は、I/Oフックモジュール部300を介してファイルサーバ140のI/O要求を受け取り、ファイルサーバ140に代行してリアルタイムI/Oファイルシステム160にI/O要求を発行する。I/O代行デーモン部400は、構成情報500に基づき、個々のI/Oにデッドライン情報等の制御情報を付加する。
【0038】
クライアント端末110は、例えば、文書編集や画像閲覧機能を備えるPCや携帯端末等である。クライアント端末110は、ネットワーク120を介してファイルサーバ140上のデータファイルにアクセスする。クライアント端末110は、同一あるいは異なる種類のものが複数存在してもよい。
【0039】
ネットワーク120は、例えば、LANおよびWAN等のIP(Internet Protocol)ネットワークである。ネットワーク120は、ファイルサーバ100とクライアント端末110を接続する。
【0040】
ストレージ装置130は、ファイルサーバ100の補助記憶装置であり、例えば、HDD(Hard Disk Drive)やSSD(Solid State
Drive)、および、HDDやSSDを複数備えるRAID(Redundant Arrays of Inexpensive Independent
Disks)装置等である。ストレージ装置130には、文書や画像データ等のデータファイルが格納される。
【0041】
図2は本実施例のファイルサーバ100のハードウェア構成例を示す。ファイルサーバ100は、CPU(Central Processing Unit)200、メモリ210、NIC(Network
Interface Card)220、HBA(Host Bus Adapter)230、および、プログラム格納領域240からなる。なお、本発明の説明に直接関係しないハードウェア構成要素、例えば、キーボード、マウス、電源装置等については記載および説明を省略する。
【0042】
CPU200は、プログラム格納領域240に格納されるプログラムをメモリ210上にロードして実行することにより、ファイルサーバ100全体を制御する。CPU200は、ファイルサーバ100上に複数存在してもよく、シングルコアプロセッサであってもマルチコアプロセッサであってもよい。
【0043】
メモリ210は、計算機100の主記憶装置であり、例えば、DRAM(Dynamic Random Access Memory)やSRAM(Static Random Access Memory)等を用いて構成される。メモリ210には、CPU200が実行しているOSおよびアプリケーションソフトウェアのプログラムコードおよびデータが格納される。
【0044】
NIC220は、ファイルサーバ100とネットワーク120を接続するI/Oインタフェースデバイスであり、例えば、イーサネット(登録商標)、ミリネット、インフィニバンド等の接続機能を提供する。
【0045】
HBA230、ファイルサーバ100とストレージ装置130を接続するI/Oインタフェースデバイスであり、例えば、SCSI(Small Computer System Interface)、SAS(Serial Attached SCSI)、FC(Fibre Channel)等の接続機能を提供する。
【0046】
プログラム格納領域240は、不揮発性の記憶領域であり、例えば、ROM(Read Only Memory)やフラッシュメモリ等を用いて構成される。プログラム格納領域240には、OSプログラム241、ファイルサーバプログラム242、I/Oフックモジュールプログラム243、および、I/O代行デーモンプログラム244が格納される。なお、これらのプログラムの一部あるいは全部が、ストレージ装置130上に格納されていてもよい。この場合、CPU200は、HBA230を介してストレージ装置130からそれぞれのプログラムをメモリ210にロードして実行する。
【0047】
図3は、I/Oフックモジュール部300の機能モジュール構成を示す。I/Oフックモジュール部300は、I/Oフック部310、および、プロセス間通信部320からなる。I/Oフックモジュール部300は、例えば、Sambaの場合、ソースファイルのファイルI/O発行部分を改変してもよく、スタッカブルVFSモジュールとして実装してもよい。また、環境変数LD_PRELOAD等の機構を利用してファイルサーバアプリケーション部140に依存しないダイナミックリンクライブラリとして実装してもよい。
【0048】
I/Oフック部310は、ファイルサーバアプリケーション部140がVFS150に対して発行するファイルI/O要求をフックする。I/Oフック部310は、フックしたファイルI/O要求のうち、open(), close(), read(), write(), unlink(), ftruncate()の各ファイルI/O要求をI/O代行デーモン部400に代行させる。I/Oフック部310は、その他のファイルI/O要求、例えば、stat()等を、VFS150に対して発行することでファイルサーバアプリケーション部140のプロセスコンテキストで実行する。
【0049】
プロセス間通信部320は、ファイルサーバアプリケーション部140とI/O代行デーモン部400との間のプロセス間通信機能を提供する。プロセス間通信部320は、I/Oフック部310でフックしたファイルI/O要求に関する情報をI/O代行デーモン部400へ送り、実行結果をI/O代行デーモン部400より受信する。プロセス通信部320は、プロセス間通信機能を、例えば、UNIX(登録商標)ドメインソケットを用いて実装してもよく、POSIX(Portable Operating System Interface)メッセージキューを用いて実装してもよい。
【0050】
図4は、I/O代行デーモン部400の機能モジュール構成を示す。I/O代行デーモン部400は、プロセス間通信部410、セッション管理部420、ファイル管理部430、共有メモリ管理部440、非同期I/O管理部450、および、構成情報500からなる。I/O代行デーモン部400は、例えば、ファイルサーバアプリケーション部140と完全独立したプロセスとして実装してもよく、ファイルサーバアプリケーション部140から実行中にfork()されるプロセスとして実装してもよい。
【0051】
プロセス間通信部410は、I/Oフックモジュール部300のプロセス間通信部320と同様の機構により、I/O代行デーモン部400とファイルサーバアプリケーション部140との間のプロセス間通信機能を提供する。プロセス間通信部410は、ファイルサーバアプリケーション部140のI/Oフックモジュール部300よりファイルI/O要求に関する情報を受け取る。
【0052】
セッション管理部420は、I/O代行デーモン部400とファイルサーバアプリケーション部140との通信をセッションとして扱い、ファイルサーバアプリケーション部140の代理で開いているファイル等を管理する。セッション管理部420は、ファイルサーバアプリケーション部140のプロセスの終了を検出した場合に、代理で開いているファイルを閉じる等の後片付け処理を行う。
【0053】
ファイル管理部430は、I/O代行デーモン部400が開いているファイル、および、当該ファイルのデータ領域の一部であるファイルブロックのうち、共有メモリ管理部440においてキャッシュしているファイルブロックを管理する。
【0054】
共有メモリ管理部440は、I/O代行デーモン部400が、ファイルサーバ100のメモリ210上に確保した共有メモリ領域を管理する。I/O代行デーモン部400は、メモリ210上に確保した共有メモリ領域を、ファイルサーバアプリケーション部140と共有する。I/O代行デーモン部400とファイルサーバアプリケーション部140は、共有メモリ領域をI/Oバッファとして使用することにより、リアルタイムI/Oファイルシステム160に対して読み書きするデータの受け渡しを行う。
【0055】
非同期I/O管理部450は、I/O代行デーモン部400が、リアルタイムI/Oファイルシステム160に対して発行する非同期I/O要求を管理する。非同期I/O管理部450は、ファイルサーバアプリケーション部140から受け取ったファイルI/O要求に構成情報500に基づく制御情報を付加し、リアルタイムI/Oファイルシステム160に対して非同期で発行する。非同期I/O管理部450は、リアルタイムI/Oファイルシステム160からファイルI/O実行結果を非同期で受け取り、プロセス間通信部410を介してファイルサーバアプリケーション部140に通知する。
【0056】
図5は、構成情報500の詳細を示す。構成情報500は、アプリケーション構成情報510、および、ファイル構成情報520からなる。構成情報500は、コンフィグファイルとしてストレージ装置130に格納されているものをI/O代行デーモン部400の起動時に読み込んでもよく、I/O代行デーモンプログラム244の一部として組み込まれていてもよい。
【0057】
アプリケーション構成情報510は、アプリケーション名511、優先度512、リトライポリシー513を格納するテーブルである。アプリケーション名511は、I/O代行デーモン部400と連携するファイルサーバアプリケーション部140のプロセス名やバイナリファイル名である。
【0058】
優先度512は当該ファイルサーバアプリケーション部140のI/O実行優先度であり、例えば、優先度の値の高いファイルサーバアプリケーション部140から受け取ったファイルI/O要求は、優先度の低いファイルサーバアプリケーション部140から受け取ったファイルI/O要求に比べて、I/O代行デーモン部400によって、優先的に処理される。
【0059】
リトライポリシー513は、当該ファイルサーバアプリケーション部140から受け取った個々のファイルI/O要求がデッドラインミスを起こした場合に、ファイルI/Oデーモン部400が再試行する回数等を格納する。
【0060】
ファイル構成情報520は、ファイルパス521、ビットレート522、デッドライン523の値を格納するテーブルである。ファイルパス521は、I/O代行デーモン部400がアクセス対象とするファイルのパスである。ビットレート522は、当該ファイルの読み込みおよび書き込みビットレートである。デッドライン523は、当該ファイルに対する個々のファイルI/O要求に付加するデッドライン情報である。なお、ファイルパス521は、例えば、絶対パスによって単一のファイルを一意に識別するものであってもよく、正規表現を含むパス名によって複数のファイルを識別すものであってもよい。
【0061】
図6は、I/Oフックモジュール部300とI/O代行デーモン部400との間のI/O代行通信プロトコル600を示す。I/O代行通信プロトコル600には、I/Oフックモジュール部300からI/O代行デーモン部400へ伝達されるI/O代行要求と、その応答としてI/O代行デーモン部400からI/Oフックモジュール部300へ伝達されるI/O代行応答がある。
【0062】
I/O代行要求には、CONNECT要求610、DISCONNECT要求611、OPEN要求612、CLOSE要求613、READ0要求614、READ1要求615、WRITE0要求616、WRITE1要求617、FTRUNCATE要求618、および、UNLINK要求619がある。
【0063】
I/O代行応答には、CONNECT応答620、DISCONNECT応答621、OPEN応答622、CLOSE応答623、READ0応答624、READ1応答625、WRITE0応答626、WRITE1応答627、FTRUNCATE応答628、および、UNLINK応答629がある。
【0064】
CONNECT要求610は、I/Oフックモジュール部300がI/O代行デーモン部400と連携を開始する場合に使用される。CONNECT要求610には、I/Oフックモジュール300が組み込まれているファイルサーバアプリケーション部140のプロセス識別子、例えば、プロセスID(PID)と、I/Oフックモジュール部300が応答の受信に使用する情報、例えば、メッセージキュー名(MQ NAME)が含まれる。CONNECT要求610を受け取ったI/O代行デーモン部400は、送信元のファイルサーバアプリケーション部140との通信を、セッション管理部420においてセッションとして管理する。
【0065】
CONNECT応答620は、CONNECT要求610に対する応答として使用される。CONNECT応答620には、CONNECT要求610の実行結果(RESULT)と、I/O代行デーモン部400が共有メモリ管理部440において管理している共有メモリ領域の情報、例えば、共有メモリ名(SHM NAME)と、共有メモリ領域サイズ(SHM SIZE)が含まれる。CONNECT応答620を受け取ったI/Oフックモジュール部300は、共有メモリ領域をファイルサーバアプリケーション部140のプロセスメモリ空間にマップする。
【0066】
DISCONNECT要求611は、I/Oフックモジュール部300がI/O代行デーモン部400との連携を終了する場合に使用される。DISCONNECT要求611には、プロセス識別子が含まれる。DISCONNECT要求610を受け取ったI/O代行デーモン部400は、対応するファイルサーバアプリケーション部140のセッションの後片付け処理を行う。
【0067】
DISCONNECT応答621は、DISCONNECT要求611に対する応答として使用される。DISCONNECT応答621には、DISCONNECT要求611の実行結果が含まれる。
【0068】
OPEN要求612は、I/Oフックモジュール部300が、ファイルサーバアプリケーション部140のファイルオープン処理をフックした場合に使用される。OPEN要求612には、プロセス識別子と、ファイルサーバアプリケーション部140内でファイルを一意に示すファイル識別子、例えば、ファイルID(FID)と、読み出しのみ、あるいは、読み書きのオープンモードを示すフラグ(FLAGS)と、ファイルのパス名(PATH)が含まれる。OPEN要求612を受け取ったI/O代行デーモン部400は、当該ファイルを指定されたモードでオープンし、ファイル管理部430において管理する。
【0069】
OPEN応答622は、OPEN要求612に対する応答として使用される。OPEN応答622には、OPEN要求612の実行結果と、ファイル識別子が含まれる。
【0070】
CLOSE要求613は、I/Oフックモジュール部300が、ファイルサーバアプリケーション部140のファイルクローズ処理をフックした場合に使用される。CLOSE要求613には、ファイルサーバアプリケーション部140の識別子と、ファイル識別子が含まれる。CLOSE要求613を受け取ったI/O代行デーモン部400は、ファイル管理部430において管理されている当該ファイルをクローズする。
【0071】
CLOSE応答623は、CLOSE要求613に対する応答して使用される。CLOSE応答623には、CLOSE要求613の実行結果と、ファイル識別子が含まれる。
【0072】
READ0要求614は、I/Oフックモジュール部300が、ファイルサーバアプリケーション部140のファイルリード処理をフックした場合に使用される。
【0073】
READ0要求614には、プロセス識別子と、読み込み対象ファイルを示すファイル識別子と、ファイルサーバアプリケーション部140内でI/O代行デーモン部400に代行させるファイルI/O要求を一意に識別するI/O識別子(IOID)と、対象ファイル内の読み込み位置を示すオフセット(OFFSET)とサイズ(SIZE)が含まれる。
【0074】
READ0要求614を受け取ったI/O代行デーモン部400は、共有メモリ管理部440においてI/Oバッファメモリとなる共有メモリ領域を割り当て、非同期I/O管理部450において、構成情報500に基づく制御情報を付加したファイルI/O要求をリアルタイムI/Oファイルシステム160に対して発行し、割り当てたI/Oバッファメモリに当該ファイルデータを読み込む。
【0075】
READ0応答624は、READ0要求614に対する応答として使用される。READ0応答624には、READ0要求614の実行結果と、ファイル識別子と、I/O識別子と、読み込んだデータが格納されているI/Oバッファメモリを示す共有メモリ領域内のオフセット(SHM OFFSET)とサイズが含まれる。
【0076】
READ1要求615は、I/Oフックモジュール部300が、READ0応答624を受け取り、例えば、クライアント端末110に送信し終わった等、共有メモリ領域に読み込まれたデータの使用を完了した場合に使用される。READ1要求615には、プロセス識別子と、ファイル識別子と、I/O識別子が含まれる。READ1要求615を受け取ったI/O代行デーモン部400は、共有メモリ部450において当該ファイルI/O要求のために割り当てたI/Oバッファメモリを開放する。
【0077】
READ1応答625は、READ1要求615に対する応答として使用される。READ1応答625には、READ1要求625の実行結果と、ファイル識別子と、I/O識別子が含まれる。
【0078】
WRITE0要求616は、I/Oフックモジュール部300が、ファイルサーバアプリケーション部140のファイルライト処理をフックした場合に使用される。WRITE0要求616には、プロセス識別子と、ファイル識別子と、I/O識別子と、対象ファイル内の書き込み位置を示すオフセットとサイズが含まれる。WRITE0要求616を受け取ったI/O代行デーモン部400は、共有メモリ管理部440においてI/Oバッファメモリとなる共有メモリ領域を割り当てる。
【0079】
WRITE0応答626は、WRITE0要求616に対する応答として使用される。WRITE0応答626には、WRITE0要求616の実行結果と、ファイル識別子と、I/O識別子と、I/O代行デーモン部400が割り当てたI/Oバッファメモリを示す共有メモリ領域内のオフセットとサイズが含まれる。
【0080】
WRITE1要求617は、I/Oフックモジュール部300が、WRITE0応答626を受け取り、I/Oバッファとして割り当てられた共有メモリ領域へ書き込むべきデータの転送を完了した場合に使用される。WRITE1要求617には、プロセス識別子と、ファイル識別子と、I/O識別子が含まれる。WRITE1要求617を受け取ったI/O代行デーモン部400は、非同期I/O管理部450において構成情報500に基づく制御情報を付加したファイルI/O要求をリアルタイムI/Oファイルシステム160に対して発行し、I/Oバッファメモリに格納されたデータを当該ファイルに書き込む。
【0081】
WRITE1応答627は、WRITE1要求617の応答として使用される。WRITE1応答627には、WRITE1要求617の実行結果と、ファイル識別子と、I/O識別子と、実際に書き込まれたサイズが含まれる。
【0082】
FTRUNCATE要求618は、I/Oフックモジュール部300が、ファイルサーバアプリケーション部140のファイルサイズ変更処理をフックした場合に使用される。FTRUNCATE要求618には、プロセス識別子と、ファイル識別子と、I/O識別子と、当該ファイルの変更後のファイルサイズが含まれる。
【0083】
FTRUNCATE要求618を受け取ったI/O代行デーモン部400は、ファイル管理部430において管理されている当該ファイルのサイズを変更し、非同期I/O管理部450において、ファイルサイズ変更要求をリアルタイムI/Oファイルシステム160に対して発行する。ファイルサイズが縮小される場合、I/O代行デーモン部400は、共有メモリ管理部440において共有メモリ領域にキャッシュされている当該ファイルのデータブロックのうち、ファイルサイズの変更により不要となる部分を無効化する。
【0084】
FTRUNCATE応答628は、FTRUNCATE要求618の応答として使用される。FTRUNCATE応答628には、FTRUNCATE応答628の実行結果と、フィル識別子と、I/O識別子が含まれる。
【0085】
UNLINK要求619は、I/Oフックモジュール部300が、ファイルサーバアプリケーション部140のファイル削除処理をフックした場合に使用される。UNLINK要求619には、プロセス識別子と、ファイル識別子と、削除対象のファイルのパス名が含まれる。UNLINK要求619を受け取ったI/O代行デーモン部400は、ファイル管理部430において管理されている当該ファイルの情報を削除し、共有メモリ管理部440において共有メモリ領域にキャッシュされている当該ファイルのデータブロックを無効化する。
【0086】
UNLINK応答629は、UNLINK要求619の応答として使用される。UNLINK応答629には、UNLINK要求619の実行結果と、ファイル識別子が含まれる。
【0087】
以下、フローチャートを用いてI/Oフックモジュール部300、および、I/O代行デーモン部400の処理を説明する。
【0088】
図7は、I/Oフックモジュール部300の処理を示すフローチャートである。I/Oフックモジュール部300は、ファイルサーバアプリケーション部140の開始時に合わせて開始される。I/Oフックモジュール部300は、開始時にFIDテーブル等の初期化処理を行う(S700)。
【0089】
次に、連携するI/O代行デーモン部400に対して、自身のファイルサーバアプリケーション部140のプロセスID(PID)CONNECT要求610を送信し(S710)、その応答としてCONNECT応答620を受信する(S720)。I/Oフックモジュール部300は、CONNECT応答620に含まれる共有メモリ領域の情報をもとに、当該共有メモリを自身のプロセス空間にマップする(S730)。
【0090】
I/Oフックモジュール部300は、ファイルサーバアプリケーション部140が終了するまで、I/Oフック処理を繰り返す(S740)。
【0091】
I/Oフックモジュール部300は、ファイルサーバアプリケーション部140が終了する際に、I/O代行処理の終了を通知するためにI/O代行デーモン部400に対してDISCONNECT要求611を送信する(S750)。最後に、I/Oフックモジュール部300は、DISCONNECT応答S621を受信し(S760)、自身の処理を終了する。
【0092】
図8は、I/Oフック処理(S710)の詳細を示すフローチャートである。I/Oフックモジュール部300は、ファイルサーバアプリケーション部140のファイルI/O要求をフックした際に、フックしたファイルI/O要求がファイルI/Oデーモン400部に代行させる対象のI/O要求、例えば、ファイルオープンopen()、ファイルクローズclose()、ファイルリードread()、ファイルライトwrite()、ファイルサイズ変更ftruncate()、および、ファイル削除unlink()であるかを判定する(S800)。
【0093】
代行対象I/O要求である場合(S800においてYES)、I/Oフックモジュール部300は、I/O代行デーモン部400にI/Oを代行させる処理を行い(S810)、結果をファイルサーバアプリケーション部140に返す。
【0094】
代行対象I/O要求でない場合(S800においてNO)、I/Oフックモジュール部300は、VFS関数を実行することにより自身でVFS150に対してファイルI/O要求を発行し(S820)、結果をファイルサーバアプリケーション部140に返す。
【0095】
図9は、I/O代行デーモン部400の処理を示すフローチャートである。I/O代行デーモン部400は、例えば、デーモンプロセスとして起動され、最初に、共有メモリ管理部440において共有メモリ領域を確保する等の初期化処理を行う(S900)。
【0096】
初期化処理を完了すると、I/O代行デーモン部400は、自身のプロセスを終了するまで、I/Oフックモジュール部300からのI/O代行要求の処理を行うI/O代行実行処理を繰り返す(S910)。
【0097】
図10は、I/O代行デーモン部400のI/O代行実行処理(S910)のひとつである、ファイルサーバアプリケーション部140との連携を開始する処理の詳細を示すフローチャートである。
【0098】
I/O代行デーモン部400は、CONNECT要求610を受信した場合(S1000)、要求に含まれるファイルサーバアプリケーション部140のプロセス識別子をセッション管理部420においてセッション情報として登録する(S1010)。次に、I/O代行デーモン400は、I/Oフックモジュール部300に対して、実行結果および共有メモリ領域の情報等を含むCONNECT応答620を送信し(S1020)、I/O代行実行処理を終了する。
【0099】
図11は、I/O代行デーモン部400のI/O代行実行処理(S910)のひとつである、ファイルサーバアプリケーション部140との連携を終了する処理の詳細を示すフローチャートである。
【0100】
I/O代行デーモン部400は、DISCONNECT要求611を受信した場合(S1100)、要求に含まれるプロセス識別子を含むセッション情報をセッション管理部420において削除する(S1110)。次に、I/O代行デーモン部400は、I/Oフックモジュール300に対して、実行結果を含むDISCONNECT応答621を送信し(S1120)、I/O代行実行処理を終了する。
【0101】
図12は、I/Oフックモジュール部300のI/O代行処理(S810)のひとつである、ファイルオープン処理の詳細を示すフローチャートである。I/Oフックモジュール部300は、ファイルオープンI/O要求をフックした場合、最初に、VFS150が提供するVFS関数を用いて対象ファイルを自身でオープンし、FIDを取得する(S1200)。ファイルオープンに失敗した場合(S1210においてNO)、I/Oフックモジュール部300は、失敗をファイルサーバアプリケーション部140に返す。
【0102】
ファイルオープンに成功した場合(S1210においてYES)、I/Oフックモジュール部300は、I/O代行デーモン部400に対して、ファイルサーバアプリケーション部140のPID、オープンしたファイルのFID、対象ファイルのパス等を含むOPEN要求612を送信する(S1220)。
【0103】
次に、I/Oフックモジュール部300は、I/O代行モジュール部400からOPEN応答622を受信し(S1230)、応答に含まれる実行結果が成功であったかを判定する(S1240)。実行結果が失敗であった場合(S1240においてNO)、自身のファイルオープン処理には成功しているため、成功をファイルサーバアプリケーション部140に返す。
【0104】
実行結果が成功であった場合(S1240においてYES)、FIDをファイルI/O要求代行対象のファイルを示す情報としてI/Oフックモジュール部300内に登録し(S1250)、成功をファイルサーバアプリケーション部140に返す。
【0105】
図13は、I/O代行デーモン部400のI/O代行実行処理(S910)のひとつである、ファイルオープン代行実行処理の詳細を示すフローチャートである。I/O代行デーモン部400は、OPEN要求612を受信した場合(S1300)、要求に含まれるパス名等の情報を用いて、対象ファイルをオープンする(S1310)。ファイルオープンに失敗した場合(S1320においてNO)、I/O代行デーモン部400は、I/Oフックモジュール部300に対して、実行結果に失敗を含むOPEN応答622を送信(S1340)し、I/O代行実行処理を終了する。
【0106】
ファイルオープンに成功した場合(S1320においてYES)、I/O代行デーモン部400は、ファイル管理部430において、要求に含まれるFID、自身がファイルオープン処理により取得したFID等の情報をファイル管理情報として登録する(S1330)。次に、I/O代行デーモン部400は、I/Oフックモジュール部300に対して、実行結果に成功を含むOPEN応答622を送信(S1340)し、I/O代行実行処理を終了する。
【0107】
図14は、I/Oフックモジュール部300のI/O代行処理(S810)のひとつである、ファイルクローズ処理の詳細を示すフローチャートである。I/Oフックモジュール部300は、ファイルクローズI/O要求をフックした場合、最初に、対象ファイルが代行対象ファイルであるかを判定する(S1400)。代行対象ファイルであるかの判定は、対象FIDがI/Oフックモジュール部300内に登録されているかどうかを判定することによって行う。
【0108】
代行対象ファイルでない場合(S1400においてNO)、I/Oフックモジュール部300は、自身でオープンしたファイルをクローズし(S1440)、結果をファイルサーバアプリケーション部140に返す。
【0109】
代行対象ファイルである場合(S1400においてYES)、I/Oフックモジュール部300は、I/O代行デーモン部400に対して、PIDおよびFIDを含むCLOSE要求613を送信する(S1410)。次に、I/Oフックモジュール部300は、I/O代行モジュール400からCLOSE応答623を受信し(S1420)、結果をファイルサーバアプリケーション部140に返す。
【0110】
図15は、I/O代行デーモン部400のI/O代行実行処理(S910)のひとつである、ファイルクローズ代行実行処理の詳細を示すフローチャートである。I/O代行デーモン部400は、CLOSE要求613を受信した場合(S1500)、要求に含まれるPID、FIDに対応するファイルをクローズする(S1510)。
【0111】
次に、I/O代行デーモン部400は、ファイル管理部430において、登録されている対応するファイル情報を削除し(S1520)する。次に、I/O代行デーモン部400は、CLOSE応答623を送信(S1530)し、I/O代行実行処理を終了する。
【0112】
図16は、I/Oフックモジュール部300のI/O代行処理(S810)のひとつである、ファイルリード処理の詳細を示すフローチャートである。I/Oフックモジュール部300は、ファイルリードI/O要求をフックした場合、最初に、対象ファイルが代行対象ファイルであるかを判定する(S1600)。
【0113】
代行対象ファイルでない場合(S1600においてNO)、I/Oフックモジュール部300は、VFS150が提供するVFS関数を実行することによりファイルリード処理を実行し(S1610)、結果をファイルサーバアプリケーション部140に返す。
【0114】
代行対象ファイルである場合(S1600においてYES)、I/Oフックモジュール部300は、I/O代行デーモン部400に対して、PID、FID、IOID、そして、ファイルの読み出し範囲を示すOFFSETおよびSIZEを含むREAD0要求614を送信する(S1620)。ここで、IOIDは、ファイルサーバアプリケーション部140プロセス内で単調増加する整数値を用いればよい。
【0115】
次に、I/Oフックモジュール部300は、I/O代行モジュール部400からREAD0応答624を受信し(S1630)、応答に含まれるSHM OFFSETおよびSIZEで示される共有メモリ領域に格納されたファイルデータを読み出す(S1640)。
【0116】
ここで、例えば、ファイルデータのストレージ装置130からの読み込みおよびネットワーク120への送信を一度に行うsendfile()をフック対象にしている場合は、共有メモリ領域に格納されたファイルデータを直接ネットワーク120へ送信すればよい。通常のread()をフックした場合は、共有メモリ領域に格納されたファイルデータをファイルサーバアプリケーション140が読み込みバッファに指定したメモリ領域にコピーすればよい。
【0117】
次に、I/Oフックモジュール部300は、I/O代行デーモン部400に対して、READ0要求614送信時と同一のIOID含むREAD1要求615を送信し(S1650)、共有メモリ領域に格納されたファイルデータの使用を完了したことを通知する。
【0118】
次に、I/Oフックモジュール部300は、I/O代行デーモン部400からREAD1応答625を受信し(S1660)、結果をファイルサーバアプリケーション部140に返す。
【0119】
図17は、I/O代行デーモン部400のI/O代行実行処理(S910)のひとつである、ファイルリード代行実行処理の詳細を示すフローチャートである。I/O代行デーモン部400は、READ0要求614を受信した場合(S1700)、共有メモリ管理部440において要求に含まれるサイズ分の共有メモリ領域をI/Oバッファメモリとして割り当てる(S1710)。
【0120】
次に、非同期I/O管理部450において、構成情報500に基づく制御情報を付加したファイルI/O要求をリアルタイムI/Oファイルシステム160に対して発行し、割り当てた共有メモリ領域に当該ファイルデータを読み込む(S1720)。次に、I/O代行デーモン部400は、I/Oフックモジュール部300に対して、ファイルデータを読み込んだ共有メモリ領域の情報を含むREAD0応答624を送信する(S1730)。
【0121】
次に、I/O代行デーモン部400は、READ1要求615を受信し(S1740)、共有メモリ管理部440においてI/Oバッファメモリとして割り当てた共有メモリ領域を解放する(S1750)。次に、I/O代行デーモン部400は、I/Oフックモジュール部300に対して、READ1応答625を送信し(S1760)、I/O代行実行処理を終了する。
【0122】
図18は、I/Oフックモジュール部300のI/O代行処理(S810)のひとつである、ファイルライト処理の詳細を示すフローチャートである。I/Oフックモジュール部300は、ファイルライトI/O要求をフックした場合、最初に、対象ファイルが代行対象ファイルであるかを判定する(S1800)。
【0123】
代行対象ファイルでない場合(S1800においてNO)、I/Oフックモジュール部300は、VFS150が提供するVFS関数を実行することによりファイルライト処理を実行し(S1810)、結果をファイルサーバアプリケーション部140に返す。
【0124】
代行対象ファイルである場合(S1800においてYES)、I/Oフックモジュール部300は、I/O代行デーモン部400に対して、PID、FID、IOID、そして、ファイルの書き込み範囲を示すOFFSETおよびSIZEを含むWRITE0要求616を送信する(S1820)。
【0125】
次に、I/Oフックモジュール部300は、I/O代行デーモン部400からWRITE0応答626を受信し(S1830)、応答に含まれるSHM OFFSETおよびSIZEで示される共有メモリ領域に対して、対象ファイルに書き込むデータを書き込む(S1840)。次に、I/Oフックモジュール部300は、I/O代行デーモン部400に対して、WRITE0要求616送信時と同一のIOID含むWRITE1要求617を送信し(S1850)、共有メモリ領域へのファイルデータの書き込みが完了したことを通知する。
【0126】
次に、I/Oフックモジュール部300は、I/O代行デーモン部400からWRITE1応答627を受信し(S1860)、結果をファイルサーバアプリケーション部140に返す。
【0127】
図19は、I/O代行デーモン部400のI/O代行実行処理(S910)のひとつである、ファイルライト代行実行処理の詳細を示すフローチャートである。I/O代行デーモン部400は、WRITE0要求616を受信した場合(S1900)、共有メモリ管理部440において要求に含まれるサイズ分の共有メモリ領域をI/Oバッファメモリとして割り当てる(S1910)。次に、I/O代行デーモン部400は、I/Oフックモジュール部300に対して、割り当てた共有メモリ領域の情報を含むWRITE0応答626を送信する(S1920)。
【0128】
次に、I/O代行デーモン部400は、WRITE1要求617を受信し(S1930)、非同期I/O管理部450において、構成情報500に基づく制御情報を付加したファイルI/O要求をリアルタイムI/Oファイルシステム160に対して発行し、共有メモリ領域に格納された当該ファイルデータを書き込む(S1940)。次に、I/O代行デーモン部400は、共有メモリ管理部440において割り当てた共有メモリ領域を解放する(S1950)。
【0129】
次に、I/O代行デーモン部400は、I/Oフックモジュール300に対して、WRITE1応答627を送信し(S1960)、I/O代行実行処理を終了する。
【0130】
図20は、I/Oフックモジュール部300のI/O代行処理(S810)のひとつである、ファイルサイズ変更処理の詳細を示すフローチャートである。I/Oフックモジュール部300は、ファイルサイズ変更I/O要求をフックした場合、最初に、対象ファイルが代行対象ファイルであるかを判定する(S2000)。
【0131】
代行対象ファイルでない場合(S2000においてNO)、I/Oフックモジュール部300は、VFS150が提供するVFS関数を実行することによりファイルサイズ変更処理を実行し(S2010)、結果をファイルサーバアプリケーション部140に返す。
【0132】
代行対象ファイルである場合(S2000においてYES)、I/Oフックモジュール部300は、I/O代行デーモン部400に対して、PID、FID、IOID、そして、変更後のファイルサイズを示すSIZEを含むFTRUNCATE要求618を送信する(S2020)。次に、I/Oフックモジュール部300は、I/O代行デーモン部400からFTRUNCATE応答628を受信し(S2030)、結果をファイルサーバアプリケーション部140に返す。
【0133】
図21は、I/O代行デーモン部400のI/O代行実行処理(S910)のひとつである、ファイルサイズ変更代行実行処理の詳細を示すフローチャートである。I/O代行デーモン部400は、FTRUNCATE要求618を受信した場合(S2100)、ファイル管理部430において管理されている当該ファイルのサイズを変更し、非同期I/O管理部450において、ファイルサイズ変更要求をリアルタイムI/Oファイルシステム160に対して発行する(S2110)。次に、I/O代行デーモン部400は、ファイルサイズ変更処理がファイルサイズ縮小であるかを判定する(S2120)。
【0134】
ファイルサイズ縮小である場合(S2120においてYES)、I/O代行デーモン部400は、共有メモリ管理部440において共有メモリ領域にキャッシュされている当該ファイルのデータブロックのうち、ファイルサイズの変更により不要となる部分を無効化する(S2130)。次に、I/O代行デーモン部400は、I/Oフックモジュール部300に対して、FTRUNCATE応答628を送信し(S2140)、I/O代行実行処理を終了する。
【0135】
ファイルサイズ縮小でない場合(S2120においてNO)、I/O代行デーモン部400は、I/Oフックモジュール部300に対して、直ちにFTRUNCATE応答628を送信し(S2140)、I/O代行実行処理を終了する。
【0136】
図22は、I/Oフックモジュール部300のI/O代行処理(S810)のひとつである、ファイル削除処理の詳細を示すフローチャートである。I/Oフックモジュール部300は、ファイル削除I/O要求をフックした場合、I/O代行デーモン部400に対して、PID、FID、そして、削除対象のファイルを示すPATHを含むUNLINK要求619を送信する(S2200)。次に、I/Oフックモジュール部300は、I/O代行デーモン部400からUNLINK応答629を受信し(S2210)、VFS関数を用いて対象ファイルを削除して(S2220)、結果をファイルサーバアプリケーション部140に返す。
【0137】
図23は、I/O代行デーモン部400のI/O代行実行処理(S910)のひとつである、ファイル削除代行実行処理の詳細を示すフローチャートである。I/O代行デーモン部400は、UNLINK要求619を受信した場合(S2300)、対象ファイルがファイル管理部430において管理されている代行対象ファイルであるかを判定する(S2310)。
【0138】
代行対象ファイルである場合(S2310においてYES)、I/O代行デーモン部400は、ファイル管理部430において管理されている当該ファイルの情報を削除し、共有メモリ管理部440において共有メモリ領域にキャッシュされている当該ファイルのデータブロックを無効化する(S2320)。次に、UNLINK応答629を送信し(S2330)、I/O代行実行処理を終了する。
【0139】
代行対象ファイルでない場合(S2310においてNO)、I/O代行デーモン部400は、I/Oフックモジュール部300に対して、直ちにUNLINK応答629を送信し(S2330)、I/O代行実行処理を終了する。
【0140】
以上に説明したように、本発明の第1の実施の形態に係るネットワークファイル共有システムでは、個々のファイルサーバアプリケーション部140には、ファイルI/O要求発行をフックするI/Oフックモジュール部300に対応する改変を加えるのみで、実際のファイルI/Oの発行をI/O代行デーモン部400に代行させることができる。I/O代行デーモン部400は、I/Oフックモジュール部300から受け取った個々のファイルI/O要求にリトライポリシー513およびデッドライン523等の制御情報を付加してリアルタイムI/Oファイルシステム160に発行することにより、リアルタイムI/Oファイルシステム160等の新たなファイルシステムが提供する拡張機能の効果を得ることができる。
【0141】
従って、本発明によれば、個々のファイルサーバアプリケーションソフトウェアの改変工数を従来技術と比較して少なく抑えて新たなファイルシステムの拡張機能に対応する方式および装置を提供することができる。
【0142】
また、本発明は、Sambaに限らず、例えば、HTTPDなど他のI/O特性を認識しないアプリケーションに適用して実施することが出来る。