gzip -tが切り捨てられたダウンロードエラーを100%検出できますか?

gzip -tが切り捨てられたダウンロードエラーを100%検出できますか?

想像する:単一の1g CSV.gzがFTPフォルダに記録されています。その間、私のクライアントコンピュータはSFTPを介してフォルダに接続し、そのフォルダをドラッグしようとします。

尋ねる:ファイルを取得したら、クライアント側で取得した見かけの長さに関係なく、部分ファイルを検出し、gzip -t切り捨てが発生した場所に関係なく失敗することはありますか?

解凍または-t'estingは、断片が突然終了したときに可能な切り捨て点の99%でエラーが発生すると思います。しかし、gz構造には、gzipが予期せず成功を報告するきれいな切断点がありますか?

テーブルにない緩和(これらのいずれかが機能している場合は、上記の質問をする必要はありません。)

  1. 別のネットワーク要求を介してファイルの長さまたはmd5を取得します。
    1. FTPを介してファイルの長さをポーリングすることは、サーバーが時々zipストリームにブロックを書き込む可能性があるため、あまり良くありません。バッチジョブがファイルハンドルを閉じる前にそれを完全なデータセットとして間違えることは、分析にとって致命的です。
    2. バッチ操作による最終ファイルの長さまたはハッシュを考慮すると、この問題はもう必要ありませんが、これは(この問題に対して)存在しない可能性がある実装負担をチームに与えます。
  2. 一日の異なる時間に読み書きをスケジュールしても競合を避けることはできません。
  3. サーバーがアトミック移動操作を使用していません。
  4. CSV行/列の数は、すべてのスナップショットと統合ごとに変わります。この問題に対してgzipで圧縮されたファイルは、不透明なバイナリBLOBと言うこともできます。
  5. ゲームにクライアントがありません => SFTPネットワークエラーです。 (これはキャプチャされ処理されます。私の懸念は、サーバー上でバッチ操作中に時々作成されるファイルを読むことです。)
  6. SFTPの代わりにRESTful APIを使用してください。

既存のSOが見つかりません。

いくつかのSOが言及されています。扱う切り捨てられたが、すべての問題に対してワークフロー全体を確実に失敗させる必要があるのと比較して、損失が許容される環境で。 (私は医療データ環境で計算をするので、間違った統計を広げるので、むしろサーバーを止めて火がついたほうがいいです。)

ベストアンサー1

gzip形式のファイルには、圧縮データの長さと圧縮されていないデータの長さが含まれます。ただし、これは古い形式で、長さフィールドは32ビットにすぎないため、モジュロ2^32(つまり4GiB)の長さと解釈されます。解凍する前に、gzip圧縮データのチェックサムが正しいことを確認してください。解凍後、解凍gzipされたデータのチェックサムが正しいこと、解凍されたデータのサイズが2^32モジュールで正しいことを確認します。

したがって、圧縮データのサイズ(または圧縮解除されたデータのサイズ)が4GiB未満の場合、gzipは切り捨てられた入力を検出します。ただし、任意のサイズのファイルの場合、これらのチェックには十分な理由はありません。入力が意図的に設計されておらず、長さが4GiBモジュールに均一に分散されている場合、圧縮された長さとチェックサムの一致の可能性は1/2 ^ 64にすぎません。中に一致しません。 (圧縮された長さモジュロ2^32と圧縮されていない長さモジュロ2^32が互いに関連しているため、これは必ずしも機会を1/2^96に減らすわけではありません。)したがって、エラーが検出されない可能性は少なくなります。 0ではなく、おそらく意図的に作成されたと確信しています。

この分析は、gzip ファイルが単一ストリームで構成されている場合にのみ適用されます。gunzip複数のリンクストリームで構成されたファイルを解凍することができ、ファイルに有効なストリームシーケンスが含まれているかどうかを検出する方法はありませんが、より多くのストリームが必要です。ただし、本番チェーンはおそらくマルチストリームファイルを生成しません。gzipそれ自体は生成せず、複数の実行の出力を手動でリンクするか、別のツール(pkzip?)を使用する必要があります。

サーバーがアトミック移動操作を使用していません。

残念ながら、サーバーが書き込みを完了した後に計算された外部メタデータ(長さまたは暗号化チェックサム)やその方法なしでエラーを検出するための完全に信頼できる方法はないと思います。

おすすめ記事