アプリケーションの大部分は、「ディスクがいっぱい」のシナリオを適切に処理しません。
例: インストーラーは、ディスクがいっぱいであることを認識せず、すべてのエラーを無視し、最終的に喜んで「インストールが完了しました!」と通知します。または、メール プログラムは、ダウンロードしたばかりのメッセージを保存できなかったことを認識せず、サーバーに通知します。オリジナルを削除します。
この状況を適切に処理するには、どのようなテクニックがありますか? それらを使用しますか?それらをテストしますか?
アプリケーションの大部分は、「ディスクがいっぱい」のシナリオを適切に処理しません。
例: インストーラーは、ディスクがいっぱいであることを認識せず、すべてのエラーを無視し、最終的に喜んで「インストールが完了しました!」と通知します。または、メール プログラムは、ダウンロードしたばかりのメッセージを保存できなかったことを認識せず、サーバーに通知します。オリジナルを削除します。
この状況を適切に処理するには、どのようなテクニックがありますか? それらを使用しますか?それらをテストしますか?
ユーザーとして、私はソフトウェアに次のことを望んでいます。
#2
不可能な場合は、特別な要件について教えてください。開発者として、これを行うためのテクニックは次のとおりです。
よくあることですが、この質問に対する私の立場は従来の考え方と矛盾しています。
一般に、メモリ不足を無視するのと同じように、ディスク容量不足を無視します。これらの状態を確実に予測することは不可能であるためです。その理由の 1 つは、予期しない状況 (ディスクやメモリをすべて消費してしまう原因となる、自分ではわからないバグなど) でのソフトウェアの動作について話している場合、その状況をコード化するのに十分な理由を説明することが不可能だからです。そしてそれをテストします。(テストされていないコードがある場合、それは機能しないと考えて間違いありません)。
ただし、別のアプローチを示す特定の条件があります。
保存されていない重要なユーザー状態 (一部の編集を含むテキスト ファイルなど) を保持している場合は、後でクラッシュを回復できるように、バックグラウンドでデータを事前に保存することを検討してください。
インタラクティブなユーザー コマンド (例: [ファイル] -> [保存]) に基づいてディスクに書き込もうとしている場合、失敗をキャッチして、再試行を許可することができます。
どちらの場合でも、バグがバグのように見えることが重要です。クラッシュするバグはクラッシュするはずです。予期しない例外をキャッチして静かに続行すると、診断の機会が奪われ、ソフトウェアは危険な状態のままになります。
ファイルを開く、書き込む、または閉じるときにエラーをチェックします。一方で、「ディスクがいっぱいです」というエラーを処理するために、私は特に何もしていません。代わりに、基になる OS に依存して、他の種類のエラーを報告するのと同じ方法でこれらのエラーを報告します。
私はデータ取得ソフトウェアを使用しています。ファイルを作成する前に (取得するように要求されたデータの量に基づいて) ファイルのサイズを見積もることができるので、空き容量がなくなることが予想される場合は、ファイルを作成する前に、存在するディスク容量に基づいて警告します。 .
データが正しく保存されるか、ユーザーがキャンセルを選択するまで、ユーザーに場所を選択してから保存を試みるようにループするブロック内に永続化ルーチンを構成することが重要です。私には当然のことのように思えますが、永続化しようとすると例外が発生し、それが処理されず、ルーチンから実行が押し出され、メモリ内データが失われるアプリをたくさん見てきました。
テストのために、さまざまな時点でスペースが不足する小さなパーティションを作成します。おそらく仮想 PC として、テストが十分に含まれ、再現可能になるようにします。
アプリを作成している場合は、I/O 障害から何らかの方法で回復させることができますが、他の人のアプリを実行している場合は、別のアプローチを取る必要があります。つまり、できるだけ多くのディスク領域を回復することです。 . これは私が使用する方法です。回復可能な大量のディスク領域が、1) 目立たないディレクトリの奥深くに隠されている少数の大きなファイル、または 2) ディスク上に散らばっている多数の小さなファイルの形で存在する可能性があります。このメソッドは、どちらの方法でもそれらを見つけます。
ええ、おそらく、この種の問題について「賢い」ことをしようとするのは本当に悪い考えです。基本的にできることは、損失を最小限に抑えることです。ユーザー データが保存されていない対話型アプリの場合は、ユーザーが問題を解決する前にクラッシュを回避するようにしてください。
これに対するサポートを製品に追加したところです。組み込みデバイスで実行し、ディスク容量が 20% (10mb) 未満であることを毎時間チェックし、オフィス サーバーに警告を送信し、問題をログに記録し、ユーザーに警告します。
この状態になると、2 分ごとに 2 MB 未満のスペースをチェックし、アプリケーション (ガイダンス システム) を適切に停止し、スペースの問題が解決されるまで実行を拒否します。
当社の製品はお客様の職場のコア システムであるため、管理者の注目を集めています。
これをさらに拡張するために、SQLサーバーで「ディスクがいっぱい」を処理する手法はありますか? 決して起こるべきではありませんが、起こる可能性があります(そして私に起こりました)。
私は、スタンドアロンの PC アプリでディスクがいっぱいになったかどうかをテストすることに精通しています (フロッピー ディスク時代にプログラミングを経験したことがあります)。スペースが非常に狭く、スペースがなくなるとフリーズする古い SCO Unix システムでも。現代のシステムでそれが何を意味するのかについてはあまり詳しくありません。
あなたは完全に正しいです。ソフトウェアは、この種の状況を適切に処理する必要があります。
IOException をいつでもチェックして、ディスクがいっぱいかどうか、またはユーザーがその場所への書き込み権限を持っているかどうかを確認できます。
SQL Server はこの状況を処理しますが、回復しません。ディスクがいっぱいになると...動作が停止します。:)