-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: allow to count select requests on storages
I don't want to lean on box.stat() information here, because I don't control all iproto calls to storages: say, vshard rebalancer may perform them in background. Instead, I wrapped particular storage function I'm interested in. The goal is to be able to determine how much storages are involved into a select/pairs request. It is implemented as a helper for testing, but hopefully we'll implement some nice statistics as part of the module in a future (see #224). Part of #220
- Loading branch information
1 parent
d13fe63
commit a6e34e1
Showing
2 changed files
with
168 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
local checks = require('checks') | ||
local helpers = require('test.helper') | ||
|
||
local storage_stat = {} | ||
|
||
-- Wrap crud's select_on_storage() function to count selects | ||
-- and add storage_stat() function that returns resulting | ||
-- statistics. | ||
-- | ||
-- Call it after crud's initialization. | ||
function storage_stat.init_on_storage() | ||
assert(_G._crud.select_on_storage ~= nil) | ||
|
||
-- Here we count requests. | ||
local storage_stat_table = { | ||
select_requests = 0, | ||
} | ||
|
||
-- Wrap select_on_storage() function. | ||
local select_on_storage_saved = _G._crud.select_on_storage | ||
_G._crud.select_on_storage = function(...) | ||
local requests = storage_stat_table.select_requests | ||
storage_stat_table.select_requests = requests + 1 | ||
return select_on_storage_saved(...) | ||
end | ||
|
||
-- Accessor for the statistics. | ||
rawset(_G, 'storage_stat', function() | ||
return storage_stat_table | ||
end) | ||
end | ||
|
||
-- Accumulate statistics from storages. | ||
-- | ||
-- The statistics is grouped by replicasets. | ||
-- | ||
-- Example of a return value: | ||
-- | ||
-- | { | ||
-- | ['s-1'] = { | ||
-- | select_requests = 1, | ||
-- | }, | ||
-- | ['s-2'] = { | ||
-- | select_requests = 0, | ||
-- | }, | ||
-- | } | ||
function storage_stat.collect(cluster) | ||
checks('table') | ||
|
||
local res = {} | ||
|
||
helpers.call_on_storages(cluster, function(server, replicaset) | ||
checks('table', 'table') | ||
|
||
-- Collect the statistics. | ||
local storage_stat = server.net_box:call('storage_stat') | ||
|
||
-- Initialize if needed. | ||
if res[replicaset.alias] == nil then | ||
res[replicaset.alias] = {} | ||
end | ||
|
||
-- Accumulate the collected statistics. | ||
for key, val in pairs(storage_stat) do | ||
local old = res[replicaset.alias][key] or 0 | ||
res[replicaset.alias][key] = old + val | ||
end | ||
end) | ||
|
||
return res | ||
end | ||
|
||
-- Difference between 'a' and 'b' storage statistics. | ||
-- | ||
-- The return value structure is the same as for | ||
-- storage_stat.collect(). | ||
function storage_stat.diff(a, b) | ||
checks('table', 'table') | ||
|
||
local diff = table.deepcopy(a) | ||
|
||
for replicaset_alias, stat_b in pairs(b) do | ||
-- Initialize if needed. | ||
if diff[replicaset_alias] == nil then | ||
diff[replicaset_alias] = {} | ||
end | ||
|
||
-- Substract 'b' statistics from 'a'. | ||
for key, val in pairs(stat_b) do | ||
local old = diff[replicaset_alias][key] or 0 | ||
diff[replicaset_alias][key] = old - val | ||
end | ||
end | ||
|
||
return diff | ||
end | ||
|
||
return storage_stat |