File: avoid-duplicate-sending.dpatch

package info (click to toggle)
mldonkey 2.8.1-2etch1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 16,940 kB
  • ctags: 26,220
  • sloc: ml: 138,666; sh: 15,368; cpp: 12,076; ansic: 8,243; asm: 3,858; xml: 3,367; perl: 1,831; makefile: 259; python: 258
file content (141 lines) | stat: -rw-r--r-- 5,850 bytes parent folder | download
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;
   }