summaryrefslogtreecommitdiffstats
path: root/src/mds/balancers/greedyspill.lua
blob: 20576cdb803850ef331238f3e93013054111763d (plain)
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
local metrics = {"auth.meta_load", "all.meta_load", "req_rate", "queue_len", "cpu_load_avg"}

-- Metric for balancing is the workload; also dumps metrics
local function mds_load()
  for rank, mds in pairs(mds) do
    local s = "MDS"..rank..": < "
    for _, metric in ipairs(metrics) do
      s = s..metric.."="..mds[metric].." "
    end
    mds.load = mds["all.meta_load"]
    BAL_LOG(5, s.."> load="..mds.load)
  end
end

-- Shed load when you have load and your neighbor doesn't
local function when()
  if not mds[whoami+1] then
    -- i'm the last rank
    BAL_LOG(5, "when: not migrating! I am the last rank, nothing to spill to.");
    return false
  end
  my_load = mds[whoami]["load"]
  his_load = mds[whoami+1]["load"]
  if my_load > 0.01 and his_load < 0.01 then
    BAL_LOG(5, "when: migrating! my_load="..my_load.." hisload="..his_load)
    return true
  end
  BAL_LOG(5, "when: not migrating! my_load="..my_load.." hisload="..his_load)
  return false
end

-- Shed half your load to your neighbor
-- neighbor=whoami+2 because Lua tables are indexed starting at 1
local function where(targets)
  targets[whoami+1] = mds[whoami]["load"]/2
  return targets
end

local targets = {}
for rank in pairs(mds) do
  targets[rank] = 0
end

mds_load()
if when() then
  where(targets)
end

return targets