読者です 読者をやめる 読者になる 読者になる

アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

クソ不具合三連コンボセルフ晒しage

自分でもびっくりするくらいのクソすぎる不具合(しかも三連コンボ)を出していたので反省のためにセルフ晒しage。


1年以上前に2人プロジェクトでやったやつで、
どっちがどの作業やってたかあんま覚えてないんですが、その時の相方は既に退職しているし、つーかそもそも自分がPLだったしで、こう、だいたい自分のせいになるやつ\(^o^)/

クソ不具合①:サマリテーブルに再集計するときの古いデータ削除漏れ

説明が面倒なんで詳細は省きますが
集計系データが載るWEBページを開くたびに毎回更新していたらサーバがしぬので、
リアルタイム更新をかなぐり捨てて定期的にサマリテーブルを更新し、そのテーブルから取得するような機能があります。
集計時、古いデータを一旦DELETEして新データをINSERTしているのですが、DELETE時に条件が足りておらず、消すべきデータが消えていなかった模様。
(例外的な条件だったので修正は保留になったが)

クソ不具合②:本番環境に設定値うpし忘れ

WEB系だと本番環境と開発環境を用意して…っていうパターンが多いと思うんですが、
弊社だと、開発から本番にうpする時に、以下のような作業があります。

  • PHPなどのファイルを一括でぽいっとsyncする
  • ②本番の設定値ファイルをviで書き変える(define値みたいなもん)
  • ③データベース系をごりごり書き変える

大抵の場合は①がメイン作業で、②③は必要に応じて…というパターンが多いです。

②が抜けてました。

いえ、動作確認も一通りやった(つもり)なんです。
しかしこの設定値がなくとも、見た目上は正しい動きをするパターンが多く、全く気付かなかったです…。②③忘れるとエラーになったり全く違う動きになったりするのが普通なんで…
こんな状態で1年以上動いていてしかも誰も気づなかったんだからある意味奇跡的…。

今回不具合の原因を探す時も相当手間取り、
開発環境では発生していないことに気付いて「まさかとは思うが…」と確認してみたらそのまさかでした。ひどい。

クソ不具合③:変数まちがい

さっきのサマリテーブルの話に戻るんですが、
集計時、別テーブルにサマリの最終更新日を保存しています。

集計データの単位 集計データの日付 サマリ最終更新日
hoge 2015-12-01 2015-12-05 12:34:56
hoge 2015-12-02 2015-12-05 12:34:56

という感じで、集計期間の日付ごと×データの単位ごとのレコードができる仕様です。
(データがない場合はサマリデータが作られないため、サマリの最終更新日はあてにならない)

しかしなんか保存されている日付が微妙におかしいことがある…と思ったらとんでもねーポカミスやらかしてました。

// 2015年12月を集計
$base_from_date = "2015-12-01";
$base_to_date   = "2016-01-01";

// データ集計
foreach ([データを集計する単位ごとにうんたらかんたら])
{
    $from_date = [$base_from_dateを元にデータによって調整]; // ※1
    $to_date   = [$base_to_dateを元にデータによって調整];   // ※1

    (集計データ算出)
}

// 更新日テーブルにぶちこむ
$query  = "INSERT INTO `サマリ更新日テーブル`(データ単位, 基準日, 最終更新日) ";
$query .= "VALUES ";
for ($value_date = $from_date から $to_date まで) // ※2
{
    $query .= "(データ単位, $value_date, NOW()) ";
}
$query .= "ON KEY DUPLICATEうんたらかんたら ";

(クエリ実行)

日本語混ぜまくり細かいとこ省略しまくりで多分相当わかりにくいと思うのですが、こういうことをやっていました。
1ヶ月間(その月の1日~末日)の集計をする時に、データによって期間の調整が入るのですが(※1)、なんと、その調整した日付を使って更新日テーブルを更新していました(※2)!
アホちゃうか!!しにたい!!


自分で言うのもアレですが普段こんな酷くないっす…これに限ってなんでこんなに酷いんだ…