[freenet-dev] [freenet-cvs] r16372 - trunk/freenet/src/freenet/node

Matthew Toseland toad at amphibian.dyndns.org
Fri Dec 7 18:34:10 UTC 2007


Some issues..

On Thursday 06 December 2007 20:24, you wrote:
> Author: robert
> Date: 2007-12-06 20:24:08 +0000 (Thu, 06 Dec 2007)
> New Revision: 16372
> 
> Modified:
>    trunk/freenet/src/freenet/node/MessageItem.java
>    trunk/freenet/src/freenet/node/RequestHandler.java
> Log:
> Don't hang onto a RequestHandler thread just to track the bytes.
> 
> @@ -144,11 +148,14 @@
>              		new BlockTransmitter(node.usm, source, uid, prb, 
node.outputThrottle, this);
>              	node.addTransferringRequestHandler(uid);
>              	if(bt.send(node.executor)) {
> -            		status = RequestSender.SUCCESS; // for byte logging
> +                    // for byte logging
> +            		status = RequestSender.SUCCESS;
>              		// We've fetched it from our datastore, so there won't be a 
downstream noderef.
>              		// But we want to send at least an FNPOpennetCompletedAck, 
otherwise the request source
>              		// may have to timeout waiting for one.
>             			finishOpennetNoRelay();
> +                    //also for byte logging, since the block is 
the 'terminal' message.
> +                    applyByteCounts();

Careful here! IMHO we need to include the opennet messages in the bytes total 
for the request. finishOpennetNoReply() may sendAsync a 
FNPOpennetCompletedAck or an actual noderef...

> @@ -172,13 +179,14 @@
>              if((waitStatus & RequestSender.WAIT_REJECTED_OVERLOAD) != 0) {
>              	// Forward RejectedOverload
>              	Message msg = DMT.createFNPRejectedOverload(uid, false);
> -            	source.sendAsync(msg, null, 0, null);
> +            	source.sendAsync(msg, null, 0, this);
>              }
>              
>              if((waitStatus & RequestSender.WAIT_TRANSFERRING_DATA) != 0) {
>              	// Is a CHK.
>                  Message df = DMT.createFNPCHKDataFound(uid, 
rs.getHeaders());
> -                source.sendSync(df, null);
> +                source.sendAsync(df, null, 0, this);
> +                
>                  PartiallyReceivedBlock prb = rs.getPRB();
>              	BlockTransmitter bt =
>              	    new BlockTransmitter(node.usm, source, uid, prb, 
node.outputThrottle, this);
> @@ -190,6 +198,8 @@
>             			finishOpennetChecked();
>              	}
>  				status = rs.getStatus();
> +                //for byte logging, since the block is the 'terminal' 
message.
> +                applyByteCounts();

This is fine btw, we wait for an explicit acknowledgement so we know the 
blocks have been sent.

> +        private boolean once=true;
> +		public void sent() {
> +            //For byte counting, this relies on the fact that the callback 
will only be excuted once. This check might be paranoid.
> +            if (once) {
> +                applyByteCounts();
> +            } else {
> +                Logger.error(this, "terminalMessage sent multiple times? 
for " + RequestHandler.this);
> +            }
> +        }

It's a sensible check but afaics you haven't implemented it - where is once 
set to false?!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://emu.freenetproject.org/pipermail/devl/attachments/20071207/5bd06be6/attachment.pgp 


More information about the Devl mailing list