We have a summer project that will hopefully be accepted which will focus on load balancing, but that shouldn't prevent us from discussing the issue.
As I see it, we need some form of "tit-for-tat" system, as popularized by BitTorrent, where nodes incur credit or debt with each other every time they send requests to each-other. For example, if node A sends a request via node B which is answered by node C, then A incurs a debt to B, which incurs a debt to C - since C answers the request, it incurs a debt to nobody and thus gets a net credit in the network as a whole. Note that B's network debt remains unchanged as it just forwarded a message. This approach means that nodes initiating requests incur debt to the network, while those answering those requests incur credit. I think we would probably handle inserts in the same way - a node initiating an insert would incur a debt, but the node where the data gets stored incurs a credit. So we keep track of how much each node is contributing, the question then is how we bias in favor of nodes that we are in debt to - considerations are: 1) A new node should be given the opportunity to build up credit with the network, to do this it has to be able to make requests 2) We need to avoid a deadlock situation where all nodes are refusing to talk to each-other 3) Ideally, we want to avoid any situation where nodes are just sitting around waiting for each-other 4) We also want to avoid situations where nodes all end up being forced to make poor routing decisions - as these simply increase the load on the network by making requests go through more hops - worsening the overload problem. This is the issue we ran into in previous versions of Freenet. Ian.
