forked from ydb-platform/nbs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbalancing.cpp
61 lines (49 loc) · 1.69 KB
/
balancing.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "balancing.h"
#include <cloud/blockstore/public/api/protos/discovery.pb.h>
#include <util/generic/algorithm.h>
namespace NCloud::NBlockStore::NDiscovery {
namespace {
////////////////////////////////////////////////////////////////////////////////
class TBalancingPolicy final
: public IBalancingPolicy
{
public:
void Reorder(TInstanceList& instances) override
{
with_lock (instances.Lock) {
for (auto& ii : instances.Instances) {
if (ii.Status == TInstanceInfo::EStatus::Unreachable) {
ii.BalancingScore = 0;
continue;
}
if (ii.LastStat) {
if (ii.PrevStat) {
const auto diff = Max(
1.,
double(ii.LastStat.Bytes) - ii.PrevStat.Bytes
);
const auto timeDiff = ii.LastStat.Ts - ii.PrevStat.Ts;
ii.BalancingScore = timeDiff.MicroSeconds() / (diff * 1e6);
} else {
ii.BalancingScore = 1;
}
}
}
// stability needed for uts
StableSortBy(
instances.Instances.begin(),
instances.Instances.end(),
[] (const auto& ii) {
return -ii.BalancingScore;
}
);
}
}
};
} // namespace
////////////////////////////////////////////////////////////////////////////////
IBalancingPolicyPtr CreateBalancingPolicy()
{
return std::make_shared<TBalancingPolicy>();
}
} // namespace NCloud::NBlockStore::NDiscovery