ISUCON9決勝参加記 (チーム名: ようするにメガネが大好きです)

ISUCON9決勝に参加して fail しました。原因は自分の書いたバグで大分凹んでいます。ピークスコアは14991点でした。

やったこと

自分がやった分だけ。大したことはやれていません。

  • pprof, stackdriver trace の導入
  • Docker compose があったのでローカル開発できるか試してすぐやめた
  • reservation の N+1 解消 ref
  • distance_fare_master のオンメモリ化 ref
  • reservation テーブルの arrival, depature カラムに駅名ではなくIDを入れるようにした。これで getAvailableSeats で station との join が消せた。 ref

失敗したこと

fail の原因になったバグはこんなコードです。

   for {
        _, err := dbx.Exec("select 42")
        if err != nil {
            log.Println(err)
            time.Sleep(time.Second)
        }
        break
    }

接続ができなくても Sleep したあと continue してないですね。。。。これでDBより先にアプリが起動したら、 master データをDBから持ってくるコードが動かずに fail してしまいました。

cancel を bulk 化する前にいったん遅延するようにしてみたところエラーが起こり revert しました。しかしこれはどうやら別の原因だったようです。

/initialize で負荷を指定できることに気づいておらず(大ポカ)、17:20頃に教えてもらって試したら cancel がたまりすぎてエラーに。慌てて bulk を実装始めるもヌルポエラーを出してしまい、修正できないまま再起動試験に。

あと、 makki_d が train_master, seat_master をオンメモリ化してくれている間に座席のロックの粒度を下げたり、席が空いているかどうかを高速にチェックできるようにする方法を考えようとしていたのですが、全然頭がクリアに働かず頭の中をぐるぐるするだけで何もできませんでした。この時間にキャンセルの bulk 化とか落ち着いてレギュレーション読むとかできればもっと色々できたはず。

感想と反省

意味不明の print だらけでログがぐちゃぐちゃになるクソコード、プライマリキーが存在せずに駅名等が全て文字列で入っているテーブル、とにかく問題外な初期実装でした。(褒め言葉)

家庭の問題があってメンタルも睡眠時間も不足気味で実力を発揮できないばかりか致命的なミスをしてしまい本当に悔しいやら情けないやら。来年もできれば同じチームで参加して挽回したいです。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。