Matthew Toseland wrote:
* A peer would like to send us a request
* There are no tokens left in its bucket (and we've told it so)
* Being unable to forward the request, it has to reject it
* The RejectedOverload travels back to the source

So let me get this straight, RejectedOverload's kill the request?

They don't prevent the source from restarting the request, but they kill the current incarnation. Isn't that how they currently work?

However, there is another option. We don't have to do this sort of
calculations, we can simply pass the tokens on directly:

Propagate the tokens, and queue.

If I understand your proposal correctly, it's equivalent to my proposal with the addition of queues - in my proposal, requests that can't be forwarded immediately are rejected; in yours they're queued, but the size of the queue is limited. Sending a token in your proposal is equivalent to incrementing the receiver window in mine; in both cases it means "I'm ready to accept an additional request".

Regardless of whether we use queues, we can either give a token to some deserving node whenever a request is forwarded or answered locally, or work out the average rate at which requests are forwarded / answered locally and hand out tokens at the average rate. So there seem to be three separate questions:

1) Queues or no queues?
2) Propagate exactly one token per request processed, or propagate an average of n tokens per n requests processed?
3) How do we choose a deserving node?

I've argued both sides of (2) in the past, and to be honest I'm not sure it matters much either way. (1) is probably more important, because queueing increases latency but gives better throughput due to statistical multiplexing. We have two proposals for (3): tokens overflow to the emptiest bucket, and tokens overflow to the fullest non-full bucket.

I'll write an applet to help us visualise these questions, but I'm going out for dinner tonight so it won't be done till tomorrow. Something like this:

A--\   /--X
    \ /
B----N----Y
    / \
C--/   \--Z

For simplicity, traffic only flows one way. A, B, C send requests to N at different average rates. Each request is either processed locally or forwarded to X, Y, Z with different probabilities. X, Y, Z process requests at different average rates. The applet shows the number of tokens in each bucket, the number of requests in each queue (if applicable), the average latency, and the throughput.

Cheers,
Michael
_______________________________________________
Devl mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl

Reply via email to