getRangeFetchMap method in RangeStreamer should pick unique nodes to stream data from when number of replicas in each DC is three or more.
When N>=3 in a DC, there are two options for streaming a range. Consider an example of 4 nodes in one datacenter and replication factor of 3.
If a node goes down, it needs to recover 3 ranges of data. With current code, two nodes could get selected as it orders the node by proximity.
We ideally will want to select 3 nodes for streaming the data. We can do this by selecting unique nodes for each range.
This will increase the performance of bootstrapping a node and will also put less pressure on nodes serving the data.
Note: This does not affect if N < 3 in each DC as then it streams data from only 2 nodes.