1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
#! /bin/sh /usr/share/dpatch/dpatch-run
## avoid-duplicate-sending.dpatch by spiralvoice <spiralvoice@hotmail.com>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Avoid uploading data blocks twice to eMule clients.
## DP: See Debian bug #406247.
@DPATCH@
diff -urNad mldonkey-2.8.1~/src/networks/donkey/donkeyClient.ml mldonkey-2.8.1/src/networks/donkey/donkeyClient.ml
--- mldonkey-2.8.1~/src/networks/donkey/donkeyClient.ml 2006-09-05 14:18:24.000000000 +0000
+++ mldonkey-2.8.1/src/networks/donkey/donkeyClient.ml 2007-01-13 11:27:35.000000000 +0000
@@ -438,15 +438,17 @@
let new_chunk up begin_pos end_pos =
if begin_pos <> end_pos then
- let pair = (begin_pos, end_pos) in
- (match up.up_chunks with
- [] ->
+ let chunk = (begin_pos, end_pos) in
+ (* the zone requested is already "in the pipe" *)
+ if not (List.mem chunk up.up_flying_chunks) then
+ match up.up_chunks with
+ | [] ->
up.up_pos <- begin_pos;
up.up_end_chunk <- end_pos;
- up.up_chunks <- [pair];
- | chunks ->
- if not (List.mem pair chunks) then
- up.up_chunks <- chunks @ [pair])
+ up.up_chunks <- [chunk];
+ | up_chunks ->
+ if not (List.mem chunk up_chunks) then
+ up.up_chunks <- up_chunks @ [chunk]
let identify_client_brand c =
if c.client_brand = Brand_unknown then
@@ -1989,13 +1991,21 @@
set_rtimeout sock !!upload_timeout;
let up, waiting = match c.client_upload with
- Some ({ up_file = f } as up) when f == file -> up, up.up_waiting
+ | Some ({ up_file = f } as up) when f == file ->
+ (* zones are received in the order they're sent, so we
+ know that the oldest of the zones "in fly" must have
+ been received when this QueryBlockReq was sent *)
+ (match up.up_flying_chunks with
+ | [] -> ()
+ | _ :: q -> up.up_flying_chunks <- q);
+ up, up.up_waiting
| Some old_up ->
{
up_file = file;
up_pos = Int64.zero;
up_end_chunk = Int64.zero;
up_chunks = [];
+ up_flying_chunks = [];
up_waiting = old_up.up_waiting;
}, old_up.up_waiting
| _ ->
@@ -2004,6 +2014,7 @@
up_pos = Int64.zero;
up_end_chunk = Int64.zero;
up_chunks = [];
+ up_flying_chunks = [];
up_waiting = false;
}, false
in
@@ -2091,12 +2102,12 @@
let init_client sock c =
set_handler sock WRITE_DONE (fun s ->
match c.client_upload with
- None -> ()
- | Some up ->
+ | Some ({ up_chunks = _ :: _ } as up) ->
if not up.up_waiting && !CommonUploads.has_upload = 0 then begin
up.up_waiting <- true;
CommonUploads.ready_for_upload (as_client c)
end
+ | _ -> ()
);
(*
set_handler sock (BASIC_EVENT RTIMEOUT) (fun s ->
diff -urNad mldonkey-2.8.1~/src/networks/donkey/donkeyFiles.ml mldonkey-2.8.1/src/networks/donkey/donkeyFiles.ml
--- mldonkey-2.8.1~/src/networks/donkey/donkeyFiles.ml 2006-05-19 23:43:54.000000000 +0000
+++ mldonkey-2.8.1/src/networks/donkey/donkeyFiles.ml 2007-01-13 11:27:35.000000000 +0000
@@ -123,7 +123,7 @@
(* lprintf "send_client_block\n"; *)
if per_client > 0 && CommonUploads.can_write_len sock max_msg_size then
match c.client_upload with
- | Some ({ up_chunks = _ :: chunks } as up) ->
+ | Some ({ up_chunks = current_chunk :: chunks } as up) ->
if up.up_file.file_shared = None then begin
(* Is there a message to warn that a file is not shared anymore ? *)
c.client_upload <- None;
@@ -134,16 +134,17 @@
if max_len <= msg_block_size_int then
(* last block from chunk *)
begin
+ send_small_block c sock up.up_file up.up_pos max_len;
if !verbose_upload then
lprintf_nl "END OF CHUNK (%d) %Ld" max_len up.up_end_chunk;
- send_small_block c sock up.up_file up.up_pos max_len;
+ up.up_flying_chunks <- up.up_flying_chunks @ [current_chunk];
up.up_chunks <- chunks;
let per_client = per_client - max_len in
match chunks with
- [] ->
+ | [] ->
if !verbose_upload then
- lprintf_nl "NO CHUNKS";
- c.client_upload <- None;
+ lprintf_nl "NO MORE CHUNKS";
+ up.up_waiting <- false;
| (begin_pos, end_pos) :: _ ->
up.up_pos <- begin_pos;
up.up_end_chunk <- end_pos;
@@ -168,10 +169,10 @@
let size = mini max_msg_size size in
send_client_block c sock size;
(match c.client_upload with
- None -> ()
- | Some up ->
+ | Some ({ up_chunks = _ :: _ }) ->
if !CommonUploads.has_upload = 0 then
CommonUploads.ready_for_upload (as_client c)
+ | _ -> ()
)
)
let _ =
diff -urNad mldonkey-2.8.1~/src/networks/donkey/donkeyTypes.ml mldonkey-2.8.1/src/networks/donkey/donkeyTypes.ml
--- mldonkey-2.8.1~/src/networks/donkey/donkeyTypes.ml 2006-09-05 14:18:24.000000000 +0000
+++ mldonkey-2.8.1/src/networks/donkey/donkeyTypes.ml 2007-01-13 11:27:35.000000000 +0000
@@ -569,6 +569,8 @@
mutable up_pos : int64;
mutable up_end_chunk : int64;
mutable up_chunks : (int64 * int64) list;
+ (* zones sent but not yet received by other peer, oldest first *)
+ mutable up_flying_chunks : (int64 * int64) list;
mutable up_waiting : bool;
}
|