On Jan 4, 2008, at 2:30 PM, Matthew Toseland wrote:

On Friday 04 January 2008 18:32, Robert Hailey wrote:

Apparently until this revision 16886, (so long as any one node does
not timeout) a node will take as long as necessary to exhaust routable peers. Even long after the original requestor has given up on that node.

Yes. Is this bad? Obviously there are limits - if it gets a post- accepted
timeout on any one node it will finish the request.

Generally I think this is probably a good thing - the data is wanted, so why not find it? It will be cached and will be transferred later. With ULPRs it
will even be transferred when we complete, despite the timeout.

So in the best case, the timeout value was just-wrong-enough for overall network topology towards this address. In the worst case, the data does not exist (e.g. looking for a newer USK, or the next frost message)... which might actually be the common case.

In either case, resuming a request after we know that the upstream peer has forgotten about it could be very bad. Assuming 20 peers (ala opennet), the theoretical worst-case-per-node is that the last new request will leave the node about 40 minutes from when it entered the node. To the best of my knowledge, all of the upstream nodes will not respond with the LOOP rejection before then. And even well before the worst case, this effect can accrue across many nodes in the path.

I suspect good and bad from this. On the one hand, all nodes will
become much less busy (increase throughput, decrease latency), but the data may be not be found at all (as presently the node may continue to
search all its peers and it be cached for next time).

Right, the advantage of the current system is that the data will probably be found eventually, and the next time the request is made it will be available before it times out. But if it's hard to find, if we timeout as you suggest,
it may not be found.

I think the more-correct solution to that problem is to route less to nodes which take so long, or choose them last. Which is to say, if a certain node (or path to a node) is making us timeout, avoid it; benefiting the general network health and responsiveness.

The only real reason I can think of to timeout as you do below would be for load balancing fairness: If you make a request, you had better be prepared (bandwidth wise) to accept the resulting data, if you're not, that's a denial of service attack. Load management relies on propagating the load back to the requestor. But the requestor can have only a very limited influence on timing
out here so I don't consider it to be valid.

Perhaps related to this is the furthestStoreSuccess stat, which will usually near-instantly stick to ~0.5. Sometimes exactly 0.5... which means that (wherever the request came from), my node was the absolute- farthest node possible, last on his list to call, and all my peers where closer. But weirdest of all, that the data was actually in the store. More evidence (IMHO) for store-position-bias :) Intuitively, we should be near the data the network sends us, and not search the whole network for the data we want.

--
Robert Hailey

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

Reply via email to