データプレーンがパケットのフォワーディングを続ける技術である。コントロールプレーンが停止 している間もパケットのフォワーディングは継続されるが、ルーチング処理は停止しているため、
headless forwardingという状態である。
non-stop forwardingの問題点は以下の2点である。
• headless forwarding状態は、ルーチングのループや、ブラックホール(ダウンしたルートへの パケット送信によるパケット紛失)が発生するなど、危険が大きい。計画的(planned)なコン トロールプレーンの停止であれば、周囲の環境が変化しないようにオペレーションすることは 不可能ではないが、オペレーションコストがかかるのが問題である。
• ステートレスなパケット中継であればデータプレーンによるパケット転送が可能であるが、SIP のようなステートフルなパケット処理ではコントロールプレーンの介在が必須である。
以上の理由により、ルータにおいても、オペレーションコストや信頼性の観点から、コントロー ルプレーンの停止を伴わないプログラム更新機能が求められている。
5.4.5 Linuxのプラグイン
Linuxにおいても、ライブパッチと呼ばれるC++のプラグインと同様の技術が存在する。我々は、
OSDLで検討されているCGL(Carrier Grade Linux) [66]の機能として、Pannusと呼ばれるLinux のライブパッチ機能を実装した [67]。
Pannusの実装は、C++のプラグイン同様、旧関数の先頭にジャンプパッチを当てて新関数にジャ
ンプさせる方式である。適用性や制限事項についてもC++のプラグイン同様である。また、同様の 実装として、鵜飼氏のライブパッチも存在する[68]。
5.4.6 既存の機構のまとめ
上記から、交換機のようなシステムにおいて、オンラインプラグイン機構が最も修正パターンの カバー率が高い。その他の機構は、Javaを扱うことができるが、適用範囲やパフォーマンスの点で 不十分である。従って、これらの機構の利点を考察し、筆者は、Javaオンラインプラグイン機構を 考案した。
5.5. Javaオンラインプラグイン機構 63
5.5.1 基本的な手順
既存の交換機におけるオンラインプラグイン(C++オンラインプラグイン)機構は、既存プログ ラムと別に修正プログラムを同時に存在させる方式である。オンラインJavaプラグイン機構の基本 的な考え方は、C++オンラインプラグインと同様である。
置換えの単位は、Javaのクラスである。
基本的な手順を下記に示す。
• 修正されたメソッドを含む新しいJavaクラスは、システムのメインメモリにロードされる。
この段階では、Java中間コードがロードされていることに注意。
• ローダは、古いJavaクラスのメソッド呼出を、新しいJavaクラスのメソッド呼出に切替える。
• オンラインプラグイン実行後に、もし異常が発生した場合は、保守者操作あるいはシステムが 自律的にロールバックを行ない、旧状態に復帰する。
• オンラインプラグイン後、一定の監視期間を経過後も異常が発生しない場合は、オペレータ は、確認のコマンド(commit)により、投入したプラグインを確定することができる。
5.5.2 Javaオンラインプラグインファイルのインストールと切替え
Javaプログラムは、Java仮想機械(Java VM)によって制御・実行される。Javaプラグイン機構
はJava VMの中に組み込まなければならない。筆者は、前述のシーケンスに基づく基本的な機能を
明らかにした。
Javaにおいては、ツールの位置付けで、Javaクラスを入れ換えるための基本的な機能が存在し、
これを元にJavaオンラインプラグイン機構まで拡張できると考えた。
HotSwap [69–72]と呼ばれるこの機構は、JPDA(Java Platform Debugger Architecture)の一部 であり、そして、主として、システム開発の間のデバッグの効率化のために用いられる。
筆者は、HotSwapの機能修正および機能拡張により、HotSwapの基本機能に基づいたJavaオン ラインプラグイン機構を構築した。
HotSwapは、Javaのデバッグ機構であるJPDA(Java Platform Debugger Architecture)の一部 として開発されており、主にJava統合開発環境においてデバッグを効率化するために利用されて いる。
HotSwap機能は、旧クラス名(クラスパス)と、新クラスのディスク上の位置を指定することによ
り、クラスロードからメソッドの切り替えまでを実行する。
Javaプラグイン機構を図29に示す。
プラグインコンソールは保守者のためのユーザインタフェース部分であり、ここからコマンド投 入と状態参照を行う。
プラグインエージェントは、プラグインコンソールからの指示に従い、プラグインファイルの投 入/取り外し、投入したプラグインファイルの管理、コミット処理を行う。プラグインエージェント は、Javaのデバッグ機能(JDB)によってJavaVMと接続される。
target system in service J ava cl asses J avaV M
J D B
p l u g-in agent
o p eratio n terminal
p l u g-in co nso l e p l u g-in/
p l u g-o u t mech anism
p l u g-im management
p l u g-in management
tab l e
co mmit mech anism f il e o p eratio n
mech anism
p l u g-in interf ace
図29: Javaオンラインプラグイン機構