50 double P_last, X_last, Xn;
59 const auto peer = p.get();
61 if (!p->options.sourcehash)
69 rawSourceHashPeers.push_back(peer);
76 if (rawSourceHashPeers.empty())
80 for (
const auto &p: rawSourceHashPeers) {
82 p->sourcehash.hash = 0;
84 for (t = p->name; *t != 0; ++t)
85 p->sourcehash.hash +=
ROTATE_LEFT(p->sourcehash.hash, 19) + (
unsigned int) *t;
87 p->sourcehash.hash += p->sourcehash.hash * 0x62531965;
89 p->sourcehash.hash =
ROTATE_LEFT(p->sourcehash.hash, 21);
92 p->sourcehash.load_factor = ((
double) p->weight) / (
double) W;
94 if (floor(p->sourcehash.load_factor * 1000.0) == 0.0)
95 p->sourcehash.load_factor = 0.0;
99 qsort(rawSourceHashPeers.data(), rawSourceHashPeers.size(),
sizeof(
decltype(rawSourceHashPeers)::value_type),
peerSortWeight);
109 const auto K = rawSourceHashPeers.size();
117 for (
size_t k = 1; k <= K; ++k) {
118 double Kk1 = (
double) (K - k + 1);
119 const auto p = rawSourceHashPeers[k - 1];
120 p->sourcehash.load_multiplier = (Kk1 * (p->sourcehash.load_factor - P_last)) / Xn;
121 p->sourcehash.load_multiplier += pow(X_last, Kk1);
122 p->sourcehash.load_multiplier = pow(p->sourcehash.load_multiplier, 1.0 / Kk1);
123 Xn *= p->sourcehash.load_multiplier;
124 X_last = p->sourcehash.load_multiplier;
125 P_last = p->sourcehash.load_factor;
128 SourceHashPeers().assign(rawSourceHashPeers.begin(), rawSourceHashPeers.end());
213 sumfetches += p->stats.fetches;
220 p->name, p->sourcehash.hash,
221 p->sourcehash.load_multiplier,
222 p->sourcehash.load_factor,
223 sumfetches ? (
double) p->stats.fetches / sumfetches : -1.0);
std::vector< CachePeer *, PoolingAllocator< CachePeer * > > RawCachePeers
Temporary, local storage of raw pointers to zero or more Config.peers.