途中で落ちたら成功した分も消えた話|部分成功の落とし穴

画像を2枚まとめてアップする処理を走らせました。1枚目は通って、2枚目でサーバーに弾かれた。まあ、ようある話です。

ところが後から見たら、成功したはずの1枚目も、どこにも残ってへんかった。上がったのは事実やのに、上がった証拠だけが消えとった。

2枚まとめて上げて、1枚目だけ通った

記事に貼る画像をサイトへ上げる、そういう自作の処理があります。ファイル名を並べて渡すと、1枚ずつ順番に上げていく作りです。

その日は2枚渡しました。1枚目は上がった表示が出た。2枚目でサーバーが受け取りを拒否しました。

拒否された理由の方は今回の本題やないので置いときます。問題はその後です。

上がった1枚が、無かったことになる

緑チェックと赤バツの2枚のファイルから記録ノートへ矢印が伸びるが、ページは真っ白で空っぽ
成功した1枚も、記録には残っていない

上げた画像は、次の工程で使うために置き場所を控えるようになってます。次の処理がその控えを読んで、続きをやる。

で、その控えを書く部分が全部終わった後に置いてありました。2枚目で失敗した時点で処理は打ち切り。控えを書く行までは一度も届かんかった。

1枚目はサイトに実在しとるのに、こっちの手元には何も残ってへん。使えるのに、使う手段が無い状態です。

しかもこの処理、同じファイルの上の方に「途中で落ちて半分だけ上がる状態は作らん」とコメントが書いてありました。書いたのは自分です。

実際に守っとったのは、走らせる前に「ファイルが全部あるか」を確かめる部分だけ。ファイルが無いせいで途中で止まるのは防げます。でもサーバーに弾かれるのは防げん。約束の方が、実装より大きいこと言うとったわけです。

直した初回で、また落ちた

直し方自体は簡単でした。失敗して打ち切る直前にも、そこまでの分を控える。数行足すだけです。

で、走らせたらまた落ちました。今度は別の理由で。

控えの置き場所を書いた行が、画像を上げる部分より下にあったんです。プログラムは上から順に読むので、下に書いてあるもんは、上から呼ばれた時点ではまだ用意できてへん扱いになる。前は一番最後にしか呼んでへんかったから問題なかった。途中から呼ぶようにした瞬間、順番が合わんくなりました。

行を上へ動かして解決。ただ動かして満足して、走らせてへんかったら、直したつもりで終わっとった。タチが悪いのは、この落ち方が失敗した時にしか出てこんことです。全部うまくいく回は今までどおり通る。控えを残したかったのは、まさに途中で落ちた時やのに。

記録は、成果が出た直後に書く

今回で頭に置いとくことにしたのが2つあります。

ひとつは部分的な成功は、放っといたら失敗として丸ごと捨てられること。人間は「2枚のうち1枚は上がったな」と数えるけど、機械はそう数えてくれん。エラーが出た、はい全部無かったこと、で終わります。

もうひとつは記録をまとめて最後に書かんこと。成果が出た直後に書く。最後にまとめる形は、途中で落ちた時に全部持っていかれます。

ひとつだけ設計が効いとった部分もあって、次の工程が「控えに置き場所が無い」でちゃんと止まってくれました。無いもんを想像で埋めてまうのが一番アカンやつなので、そこは止まってくれて助かった。

あわせて読みたい

近い系統の失敗を、前にも2本書いてます。落としたら戻せなかった話|自作ツールの取り消し設計テストが通っても本番で落ちる|緑を信じて1日分飛ばした