fix a nasty bug, where emule clients receive twice (!) the data they want.
from spiralvoice, thx !
This commit is contained in:
parent
b85231e121
commit
016accf765
@ -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
|
||||
|
@ -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 ->
|
@ -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 _ =
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user