« 図書館蔵書検索ソフト SearchLibrary バージョン 0.3.6公開 | メイン | CSV Mailerバージョン0.3.4公開 »

世界を股にかける数十億ドル規模の巨大航空会社をストップさせたバグ

Release It! 本番用ソフトウェア製品の設計とデプロイのために』で紹介されていた話。

数百の旅客機と数万人の社員を擁し、世界を股にかける数十億ドル規模の巨大航空会社をストップさせたのが次のコード。
さて、どこに問題があったかわかるだろうか。

package com.example.cf.flightsearch;
…
public class FlightSearch implements SessionBean {
  private MonitoredDataSource connectionPool;
  private List lookupByCity(…) throws SQLException RemoteException {
    Connection conn = null;
    Statement stmt = null;
    try {
      conn = connectionPool.getConnection();
      stmt = conn.createStatement();
      // 検索のロジックを実行して、
      // 結果のリストを返す
    } finally {
      if (stmt != null) {
        stmt.close();
      }
      if (conn != null) {
        conn.close();
      }
    }
  }
}

ヒントを一つ。
問題があるのは「finally { … }」の部分だ。

追記
アジャイルプラクティス 達人プログラマに学ぶ現場開発者の習慣』にも、おそらくこの事件と思われる話が紹介されていました。

つい先日も、大規模な航空座席予約システムでの重大な障害がニュースで報じられた。 システムがクラッシュして飛行機が空港に足止めされて、何千人もの乗客が立ち往生することになった。 航空輸送システム全体の混乱は数日間にもわたって続いたそうだ。 原因は何だったのかって? アプリケーションサーバで起きた、たった1つのSQLの非チェック例外だったんだ。

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/1007

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2009年07月05日 22:34に投稿されたエントリーのページです。

ひとつ前の投稿は「図書館蔵書検索ソフト SearchLibrary バージョン 0.3.6公開」です。

次の投稿は「CSV Mailerバージョン0.3.4公開」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35