0116名無しする人この指とまれ
2010/08/01(日) 23:28:20ID:c+4G+PKV2chに投げる差分取得のバイト数が間違ってた。
簡略して説明するので若干語弊があるが、詳しく知りたきゃググッてくれ。
差分取得するとき、鯖に
「何月何日何時何分何秒から後、更新されてる? 更新されてるなら、***バイト以降のデータを頂戴」
っていう形式でリクエストを投げる。
この時、***バイト数は、前回(鯖に投げる時刻)の鯖上のファイルサイズ。
で、鯖から送られてくるデータはgzip圧縮されている。
ヘッダに記載されているContent-Length:の値はファイルサイズじゃない。
差分取得したときは圧縮されないので問題ないのだが、問題が出るのはサイズ不一致で再取得したとき。
再取得時には、gzip圧縮される。
gzip圧縮されている状態のサイズを、ファイルサイズとして記録してしまうというバグがあった。
→サイズ
■■■■■■■■■■■■■ 鯖上のdatサイズ
■■■■■■■■ gzip圧縮されたサイズ
↑ ↑
│ 本来記録すべきサイズ(A)
転送されたデータのサイズ(B)
で、次の巡回時、転送されたデータのサイズ(B)で差分取得してしまう。
そうすると、
■■■■■■■■■■■■■□ 鯖上のdatサイズ
■■■■■■■■☆☆☆☆☆□ gzip圧縮されたサイズ
↑ ↑
│ 正しいリクエスト位置
間違ったリクエスト位置
となる。
必要なのは□部分だけなのだが、間違って投げたリクエストのせいで☆分まで受信してしまう。
通常は、その後のチェックで「サイズ不一致再取得」となる。
が、チェック方法は「受信したデータの先頭が改行文字か否か」、という方法なので、稀に間違った位置でありながら
先頭がたまたま改行文字になることもある。
その結果、正しいデータだと勘違いしてdファイルに追加書き込みしてしまう。
コレが、レスがダブル原因。
さらに、datサイズに圧縮されたサイズが書き込まれているため、実際のサイズより少ない位置で検索ポイントを切り上げてしまう。
これが、レスが反映されないバグの原因。
問題は・・・
・・・ソースのバックアップのかなり古いモノを開いても、このバグが確認できるということ。
で、このバグを修正してからスレ巡回させたら、キャッシュファイルの破損があちこちにあるらしく落ちる落ちるwww