パスワードを忘れた? アカウント作成
11015 story

小田急予約サイトで競合状態バグによるトラブル 98

ストーリー by yoosee
あーあやっちゃいました 部門より

Anonymous Coward曰く、"13日の朝日新聞の記事によると、小田急電鉄の特急券予約サイト「ロマンスカー@クラブ」で、システム障碍により少なくとも6件の情報漏洩または誤課金が発生したとのことで、小田急の公式アナウンスが出ている。
それによると、予約操作したのに予約が行われない、何も操作していないのに予約された、購入していないのにポイントが減額された、他の会員の画面が表示されたなどの現象が確認されているとのことで、いわゆる競合状態バグ(race condition bug)による事故だと思われる。類似の事故として2004年2月のストーリー「国税庁のWeb確定申告書作成システム、作ってみたら他人の申告書」が思い起こされる。この種のバグをなくすためにはどのような開発手法、検証手法が有効であろうか。"

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by tit (23686) on 2005年10月14日 13時12分 (#813966)
    request/session/applicationの正しい認識が重要かと。(j2eeの場合)
    あとはstaticの認識と。
    • まずはそこでしょうね、開発手法とか検証方法だけで回避できたらすごいなぁ~とは思いますが(笑)

      デバック環境って言うのであれば、
      競合関連は処理速度が速くなればなるほど再現が困難になるので
      最低限必要なのは、わざと処理速度を遅く出来るデバッグ環境とかかなぁ

      でもデバックで求められるのは結局普通の試験と一緒の検証方法でしょう。
      地道な努力しかないのではないかと、無論それに伴ってコストは増大しますが..

      逆にこんなアルゴリズムなら回避しやすいとかなら有りそう?
      親コメント
    • by SaySet (18192) on 2005年10月14日 14時43分 (#814024) 日記
      たとえばServletにインスタンス変数を持たせるだけでも、同様の障害が発生しうるんですよね...
      # うちではStrutsベースなんだけど、Actionについても同様。

      VBとかからクラスチェンジしてきた奴とかは、その辺の概念まできっちり押さえてくれてないことが多い。
      人材不足なんだろうけど、その辺きちんと把握しているエンジニアが一人はいるんだよな。
      親コメント
    • staticの認識を言うならば、synchronizedとvolatile、sleep()・wait()・notify()・notifyAll()の正しい認識も同時に必要でしょう。
      staticを使ってのパフォーマンス向上は諸刃の剣のはずなのだけど…やたらとpubli staticなsetter/getterを作りたがるPGがたまに居て…_no
      親コメント
      • > staticを使ってのパフォーマンス向上

        いまどき、こんな事言うヤツを開発に参加させてはイカンのでは?
        オマエだけはCで書けって言ってあげましょうよ。
    •  認識できたら、バグがなくなるわけ?
      • 「全てのバグ」を未然に潰す事は出来なくても、
        「特定のタイプのバグ」を起きないように設計する事はできる。
        そうでなきゃそこいら中のシステムが競合状態ばかりになっちゃうよ。
  • 逐次処理 (スコア:2, おもしろおかしい)

    by tuneo (2938) on 2005年10月14日 13時22分 (#813973) ホームページ 日記
    並列処理なんかしてるからそういうバグに出くわすのだ。
    逐次処理しろ!処理中だったら待たせとけ!!
    # でもマルチスレッド大好きなのでID。
    • システム「現在、正常な処理をするには406番後となります」
      システム「現在、予約が多数の方と競合しています。出し抜きますか?」
      システム「処理待機中に23名の方に追い越されました」
      システム「本日の営業時間内で処理が完了しません」
      システム「本日のご利用ありがとうございました」

      誰も使わなくなりそうだ、と思った。(笑
      親コメント
  • 似たような体験 (スコア:2, 参考になる)

    by s-jima (3363) on 2005年10月14日 20時57分 (#814186) ホームページ 日記
    小田急ロマンスカーの予約なら10年以上前ですが、似たような経験がありますよ。
    券売機で切符を買って席に行くと、すでに別の人が座ってました。
    きっとどちらかが間違えているんだろうって思い、切符を見比べてみると、これがまったく同じ。
    私はちょっと酔っ払ってたので、自信なさげに駅員を捕まえて確認してもらったら、駅員曰く、「きっと、同時に押しちゃったんですねえ」。
    別の席をもらって無事にかえりました。
    #まさか、あいかわらずのシステムだったなんて・・・
    • by Anonymous Coward on 2005年10月14日 23時42分 (#814239)
      システム以前に、使い方が異様に難しい > 新宿駅下層の特急券+乗車券発券機
      意味不明のユーザーインターフェースに加え、説明も皆無。

      初めてアレを使って、ちゃんと券が買える人がいるのか疑問。
      親コメント
  • valgrind [valgrind.org] だと
    一応、multithread での資源の共有違反を検査してくれます。
    共有違反チェックで幸せになったことないのですが、他の人はどうなんでしょ?

    昔新人が、loop counter の変数をいちいち宣言するのが面倒なんで global で
      external int loopcnt ;
    みたいにしていました。なかなか斬新な考え方だなと感心しました。
    しかしdebug にはかなり苦労していた模様です。

    このタイプの共有違反は valgrind では見つけてくれません。
  • 正直、やらかしやすいミスかなあと思いました。
    ついこの間カットオーバーしたシステムでもあったし...
    # そっちはシステムテストで発覚して、即時対応したけど。

    構成がわからない以上、ここが悪い、こうした方がよかったみたいなのは言えませんが、
    ツールを使った過負荷テストをやってみるか、10人くらい人を集めて
    「せーの、どん」
    で操作するテストをしてみるとかでも検出できるはずなんだけどなあ。

    そろそろテスト手法の標準化にも着手する必要があるかな、と思ったりはしているのですけどね。
    # あ、普通やってる? ...失礼しました~
  • 500円? (スコア:1, 参考になる)

    by Anonymous Coward on 2005年10月14日 17時06分 (#814111)
    インプレスの記事中 [impress.co.jp]にお詫びとして金券(500円相当)を送るというのが個人的には気になりました。 着々とデファクトスタンダード化していますね。
    • by tuneo (2938) on 2005年10月14日 17時28分 (#814115) ホームページ 日記
      > 着々とデファクトスタンダード化していますね。
      ちゃんと物価の変動に連動してくれるんだろうな>デファクトスタンダードのお詫び。

      # 心配するところが大間違いなのでID。
      親コメント
    • 500円じゃなくて、小田急の全線乗車券にしとけば双方オトクな気がします。小田急の負担は500円より安く済むだろうし、客にしてみれば最大で850円 (新宿~小田原) の価値があるんですから。

      ロマンスカー@クラブを使う客なら特急乗車をひんぱんにする客だから、新宿~町田 (360円) の客が多いということを考えると、全線乗車券2枚なら500円に見合うのではないかと。
      親コメント
  • こういう点に注意しろという具体的な回答がここにつかない時点で
    銀の弾丸はやっぱりないことを物語っているんじゃないかな。
    当然そんな中で開発していればこういったことはいくらでも起こると思う。

    自分は大抵、事後処理の火消し役なんで
    FileOutputStreamでGrepしたりstaticでgrepしたり、Diffしたり、
    request,session,applicationの内部変数監視ツール作ったり、
    トランザクション管理をトレースしたり、オープンカーソ…うう悪夢が…
    これ以上は勘弁して下さい…。

    何にしろGrepとDiffで大抵解決できますっ!ってダメかな?
    • by pinch (22469) on 2005年10月14日 21時18分 (#814192)
      時々、自作検証ツールで検証をしていると、お客さんがそれをほしがったりしませんか?
      ほしいなら、すぐにあげてもいいけど、

      途中から検証ツールに「あの機能は無駄だから削ってくれ、この機能が必要だからつけてくれ」みたいな話になって…

      まったく、もう!
      親コメント
  • えんじにありんぐ (スコア:1, おもしろおかしい)

    by Anonymous Coward on 2005年10月14日 21時09分 (#814191)
    「アクセスのあった秒数でID振ると衝突するのでミリ秒にしました」
    にこやかに説明するのやめてくれ。
  • Internet Watch [impress.co.jp]の記事に具体的な障害内容が出ているけど、この障害が発生するシステムはどうやったらできます?

    効率化のためにオブジェクトをいちいち生成・開放せずにプーリングするようにしておいて
    ログイン時に開いているオブジェクトを取得、
    ログアウト時にオブジェクトを手放すようにして、
    ただし、同一セッションでログインしたら以前のオブジェクトへの参照を取得できるようにすればいいのかな?
    --
    マクロの基本は検索置換(by y.mikome)
    • なぜこうなったかを推測するのは、なかなか面白い問題ですね。
      • IPアドレスのみでログインしているユーザを判別していた?
      • サーバー側のプログラムが状態を持っており、必ずユーザがログアウト処理をする事を前提していた?
      • cookieの扱いが目茶目茶で、簡単に他人に化けるようになっていた?
      • 動作テストをユーザ一人でしかやっていなかったのはほぼ確実。
      ...といった所でしょうか。
      --
      --- de FTNS.
      親コメント
  • by Anonymous Coward on 2005年10月14日 13時20分 (#813971)
    「通常実施する運用テスト(確認作業)では発見することができない部分に関するものであったため」って何だ?


    4 原因
    10月6日(木)早朝の@クラブサービス休止時間帯(10月6日午前2時から午前4時までの間)に、@クラブ利用のサービス向上を図るためシステム改修を行った際、プログラムの一部にミスが含まれていたことが原因です。このミスは、通常実施する運用テスト(確認作業)では発見することができない部分に関するものであったため、結果としてミスを発見することができなかったものです。
    • 「普通は実施しますよ」でおしまいですな。
      要は、仕様変更の影響範囲の把握と退行テスト項目が
      適当ではなかったということですか。

      ありがちと言えばありがち・・・。
      --

      --- (´-`)。oO(平和な日常は私を鈍くする) ---
      親コメント
    • a. 「通常実施する運用テスト」から漏れていただけである。
      b. エラーにならないことだけを確認していて、中身まで見てなかった。
      c. 複数同時アクセステストはやってたけど、同じデータを入れてたので発覚しなかった。

      どれにしても、ちゃんとした手順なりツールなりを適用していれば避けられたはずだが...
      親コメント
  • by Anonymous Coward on 2005年10月14日 13時48分 (#813991)
    この手のシステム障害においての
    開発発注者側と受託側の言い分を聞いてみたいナァ。
    「仕様が云々」
    「予算が云々」
    「テストとデバッグの時間が云々」
    「エンジニアのスキルが云々」
    「上司が云々」
    「チームのあの娘を云々」

    ………だれが正しいのか判断がつかなくなる悪寒
    私が携わってきた数十のプロジェクトでリリース後に障害が発生した中で共通しているのは「テストを含めた開発期間不足」→「予算不足」→「きっと政治的な云々」だったかなー。

    もう足を洗ったからどうだっていいことなんだけど。
    • by Sune (7520) on 2005年10月14日 22時48分 (#814223)
      該当サイトを毎日使ってますけど、変な動作すること多すぎですね。最近良く見かけるのは「二重に操作されました~」かな。普通にアクセスしてても出ますので、誰かのアクセスがおいらのアクセスとコンフリクトしたのかなーと思ってたけどまさにそういうバグだったんですね。

      毎月新しいバグが出て挙動が変わるからサイトを更新してるのがわかります。ただ単にリリース期間が短すぎてテストしてないだけなんじゃないかな。

      言っちゃ悪いですが座席の予約なんて本来は大した処理じゃないんです。ドル箱システムですからハードやインフラに問題があるとは考えられません。おそらくは大本のレガシーな予約システムとの連携部分の設計か実装が稚拙で思った以上にパフォーマンスが出ず、HWの増強予算が出るまでの応急的なパフォーマンス対策をしているうちにぼろが出始めたってことなんじゃないでしょうか。
      親コメント
    • エンジニアのスキル次第では? 予算がなく時間がないなら、自動テスト用のHTTPクライアントを さくっと数時間で書いて、それを実行していれば、競合状態が 発生したときにでもすぐに発見できますよ。
      親コメント
typodupeerror

物事のやり方は一つではない -- Perlな人

読み込み中...