Webサーバーにダウンロード用に大きなファイルを置いているとき、

複数のアクセスユーザーがそのファイルをダウンロードしている最中に、そのファイルを差し替えることで何か問題が起こることはあるでしょうか。
その心配がなければ問題ないのですが、もしあるとすればどのような処置を行う必要がありますか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/04/14 01:47:36
  • 終了:2011/04/21 01:50:03

回答(5件)

id:adachi_c No.1

adachi_c回答回数13ベストアンサー獲得回数02011/04/14 02:02:26

ポイント20pt

書き込みではなくダウンロードであれば、問題はありません。最悪、転送が中断されます。

クライアント側の実装によって、リトライするか、中断するか決まると思います。

http1.1以上のサーバ/クライアントであれば壊れたファイルをダウンロードするということはありません。

http1.1でダウンロードする場合、Content-MD5リクエスト/応答ヘッダでファイルが通信途中で改変されていないかを確認します。クライアントがContent-MD5を得て、受信したファイルを検証し、不正であった場合、そこからリトライするか、中断するかは実装によると思います。

id:dedara

ありがとうございます。

ダウンロード失敗時の自動リトライ(?)の実装について説明のあるサイトなどがありましたら教えていただけると助かります。

2011/04/14 02:09:17
id:adachi_c No.2

adachi_c回答回数13ベストアンサー獲得回数02011/04/14 02:40:07

ポイント20pt

すみません、上ではいい加減なことを言ってました。

実際に試しました。

今、試しにFirefox3.6.16と、wget1.10.2でやってみました。

Firefoxでは、リトライせず、ダウンロード途中で中断しました。

中断されたファイルは、クライアントに残っていました。

wget1.10.2(Mac OS X 10.6.7)は、ファイル前半は上書き前の内容、ファイル後半は上書き後の内容になっていました。

ですので、クライアントによっては、ファイル内容が改変されてしまうことがわかりました。

というわけで、webサーバを停止し、ファイルを上書きするのが間違いないと思われます。

上記実験の手順:

サーバ側

$ dd if=/dev/zero of=./100M bs=1024 count=1000000

$ echo a > a

$ cat a 100M a> a100a

$ echo b > b

$ cat b 100M b> b100b

クライアントでa100aのダウンロード開始

真ん中あたりまでダウンロードする。

$ cp b100b a100a

クライアント側で、以下を実行

$ tail a100a

(確認の結果、末尾の1バイトはbになっているので、改変されたことになる。)

id:dedara

細かい検証ありがとうございます。

wgetはとくに考えてませんでした。

サーバを停めて差し替えが良いでしょうか。

2011/04/14 13:59:28
id:asuka645 No.3

あすか回答回数856ベストアンサー獲得回数972011/04/14 07:23:12

ポイント20pt

どのような手順でダウンロードさせているのか分かりませんが、ふつうはダウンロードファイルにロックがかかっていますから、差し替えることはできません。

id:dedara

やはりサーバを停止させての差し替えでしょうか。

2011/04/14 14:00:23
id:pretaroe No.4

pretaroe回答回数531ベストアンサー獲得回数752011/04/14 21:09:35

ポイント20pt

サーバーを止めても止めなくても、クライアント側のダウンロードのレジュームの動作とは無関係です。

>ダウンロード失敗時の自動リトライ(?)の実装について説明のあるサイトなどがありましたら教えていただけると

>助かります。

>Firefoxでは、リトライせず、ダウンロード途中で中断しました。

>wget1.10.2(Mac OS X 10.6.7)は、ファイル前半は上書き前の内容、ファイル後半は上書き後の内容になっていました。

差し替えた後、どちらの動作になってほしいのか疑問ですが

通常は、差し替えられたらレジュームは無効にして、1からダウンロードするように実装するのが妥当だと思います。

そういう意味では前者のほうがまとも、

id:dedara

もし中断になったとしてもそんなにおかしな実装じゃないということですね。

ブラウザに自動リトライさせるような実装方法でも何かあって、そうした方が良いのかな、という感じで聞きました。

2011/04/14 22:53:02
id:niwa-mikiho No.5

niwa-mikiho回答回数508ベストアンサー獲得回数382011/04/15 03:08:55

ポイント20pt

クライアントがサーバーから A というファイルをダウンロード中、

サーバーにて A というファイルが B というファイルに差し変わった際、

サーバーでは B というファイルに対してロックがかかるため読み出せない状況になります。

そのためクライアントのダウンロードは停止します。


もし上書き後の B というファイルが ファイル A と同じサイズであれば、クライアントは

ただ単に切断されたものと判断してレジュームでダウンロード済み以降の部分のダウンロードを試みます。

ファイルサイズが変わっていれば、ちゃんとしたダウンロードソフトなどであれば、ダウンロードしてる

ファイルのタイムスタンプやサイズが変わった時点でダウンロードは停止するはずです。


もし A と B が同じサイズて、ダウンロードが継続されてしまったファイルは A と B が混ざった状態のものになるため、

正常なファイルとはなりません。



もし何らかのデータファイルの更新をお考えであれば、新しいデータファイルを別のファイル名で公開した方が良いです。

id:dedara

違うファイル名にする対応でいきたいと思います。

2011/04/15 21:24:15

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません