diff -a -x Root -x Repository -x Tag -x Entries -x Entries.Log -x .svn -x '*.rej' -x '*.orig' -x '*.cmi' -x '*.cma' -x '*.cmo' -x '*.cmx' -x '*.cmxa' -x '*.a' -x '*.o' -x .depend -x Makefile -x mlnet -x ocamlpp.byte -N -r -u ./src/networks/donkey/donkeyClient.ml ./src/networks/donkey/donkeyClient.ml --- ./src/networks/donkey/donkeyClient.ml 2006-06-11 19:37:39.000000000 +0200 +++ ./src/networks/donkey/donkeyClient.ml 2007-01-08 19:01:18.000000000 +0100 @@ -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 @@ -2002,13 +2004,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 | _ -> @@ -2017,6 +2027,7 @@ up_pos = Int64.zero; up_end_chunk = Int64.zero; up_chunks = []; + up_flying_chunks = []; up_waiting = false; }, false in @@ -2104,12 +2115,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 -a -x Root -x Repository -x Tag -x Entries -x Entries.Log -x .svn -x '*.rej' -x '*.orig' -x '*.cmi' -x '*.cma' -x '*.cmo' -x '*.cmx' -x '*.cmxa' -x '*.a' -x '*.o' -x .depend -x Makefile -x mlnet -x ocamlpp.byte -N -r -u ./src/networks/donkey/donkeyFiles.ml ./src/networks/donkey/donkeyFiles.ml --- ./src/networks/donkey/donkeyFiles.ml 2006-05-20 01:43:54.000000000 +0200 +++ ./src/networks/donkey/donkeyFiles.ml 2007-01-08 19:01:18.000000000 +0100 @@ -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 -a -x Root -x Repository -x Tag -x Entries -x Entries.Log -x .svn -x '*.rej' -x '*.orig' -x '*.cmi' -x '*.cma' -x '*.cmo' -x '*.cmx' -x '*.cmxa' -x '*.a' -x '*.o' -x .depend -x Makefile -x mlnet -x ocamlpp.byte -N -r -u ./src/networks/donkey/donkeyTypes.ml ./src/networks/donkey/donkeyTypes.ml --- ./src/networks/donkey/donkeyTypes.ml 2006-05-31 22:02:14.000000000 +0200 +++ ./src/networks/donkey/donkeyTypes.ml 2007-01-08 19:01:18.000000000 +0100 @@ -728,6 +728,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; }