fix a nasty bug, where emule clients receive twice (!) the data they want.

from spiralvoice, thx !
This commit is contained in:
espie 2007-01-24 01:32:51 +00:00
parent b85231e121
commit 016accf765
4 changed files with 135 additions and 2 deletions

View File

@ -1,4 +1,4 @@
# $OpenBSD: Makefile,v 1.16 2006/12/26 22:39:31 avsm Exp $
# $OpenBSD: Makefile,v 1.17 2007/01/24 01:32:51 espie Exp $
COMMENT='e-donkey client'
CATEGORIES=net
@ -22,7 +22,7 @@ HOMEPAGE=http://mldonkey.sourceforge.net/Main_Page
MASTER_SITES=${MASTER_SITE_SOURCEFORGE:=mldonkey/}
DISTNAME=mldonkey-2.8.1
PKGNAME=${DISTNAME}p0
PKGNAME=${DISTNAME}p1
EXTRACT_SUFX=.tar.bz2
CONFIGURE_ARGS+=--enable-gui=newgui1

View File

@ -0,0 +1,74 @@
$OpenBSD: patch-src_networks_donkey_donkeyClient_ml,v 1.1 2007/01/24 01:32:51 espie Exp $
--- src/networks/donkey/donkeyClient.ml.orig Tue Sep 5 16:18:24 2006
+++ src/networks/donkey/donkeyClient.ml Wed Jan 24 02:25:44 2007
@@ -438,15 +438,17 @@ let client_wants_file c md4 =
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 @@ end else *)
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 @@ end else *)
up_pos = Int64.zero;
up_end_chunk = Int64.zero;
up_chunks = [];
+ up_flying_chunks = [];
up_waiting = false;
}, false
in
@@ -2091,12 +2102,12 @@ make 1500 connections/10 minutes. *)
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 ->

View File

@ -0,0 +1,47 @@
$OpenBSD: patch-src_networks_donkey_donkeyFiles_ml,v 1.1 2007/01/24 01:32:51 espie Exp $
--- src/networks/donkey/donkeyFiles.ml.orig Sat May 20 01:43:54 2006
+++ src/networks/donkey/donkeyFiles.ml Wed Jan 24 02:25:44 2007
@@ -123,7 +123,7 @@ module NewUpload = struct
(* 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 @@ module NewUpload = struct
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 @@ module NewUpload = struct
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 _ =

View File

@ -0,0 +1,12 @@
$OpenBSD: patch-src_networks_donkey_donkeyTypes_ml,v 1.1 2007/01/24 01:32:51 espie Exp $
--- src/networks/donkey/donkeyTypes.ml.orig Tue Sep 5 16:18:24 2006
+++ src/networks/donkey/donkeyTypes.ml Wed Jan 24 02:25:44 2007
@@ -569,6 +569,8 @@ and upload_info = {
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;
}