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

Reply via email to