From 1b3efaaadc7bb43e4f4165fd462b584788d54e45 Mon Sep 17 00:00:00 2001 From: Karl Baum Date: Mon, 7 Oct 2019 19:44:05 -0400 Subject: [PATCH 1/2] Modified lua script payload expectation --- lib/coverband/adapters/hash_redis_store.rb | 32 +++++--- lua/lib/persist-coverage.lua | 38 ++++----- lua/test/test-persist-coverage.lua | 94 ++++++++++++---------- 3 files changed, 92 insertions(+), 72 deletions(-) diff --git a/lib/coverband/adapters/hash_redis_store.rb b/lib/coverband/adapters/hash_redis_store.rb index 31e935bf..d74ab0f0 100644 --- a/lib/coverband/adapters/hash_redis_store.rb +++ b/lib/coverband/adapters/hash_redis_store.rb @@ -57,7 +57,7 @@ def save_report(report) updated_time = type == Coverband::EAGER_TYPE ? nil : report_time script_id = hash_incr_script keys = [] - json = report.map do |file, data| + files_data = report.map do |file, data| relative_file = @relative_file_converter.convert(file) file_hash = file_hash(relative_file) key = key(relative_file, file_hash: file_hash) @@ -70,7 +70,11 @@ def save_report(report) report_time: report_time, updated_time: updated_time ) - end.to_json + end + json = { + ttl: @ttl, + files_data: files_data + }.to_json return unless keys.any? arguments_key = [@redis_namespace, SecureRandom.uuid].compact.join('.') @@ -122,18 +126,22 @@ def coverage_data_from_redis(data_from_redis) end def script_input(key:, file:, file_hash:, data:, report_time:, updated_time:) - data.each_with_index - .each_with_object( - first_updated_at: report_time, - last_updated_at: updated_time, - file: file, - file_hash: file_hash, - ttl: @ttl, - file_length: data.length, - hash_key: key - ) do |(coverage, index), hash| + coverage_data = data.each_with_index.each_with_object({}) do |(coverage, index), hash| hash[index] = coverage if coverage end + meta = { + first_updated_at: report_time, + file: file, + file_hash: file_hash, + file_length: data.length, + hash_key: key + } + meta.merge!(last_updated_at: updated_time) if updated_time + { + hash_key: key, + meta: meta , + coverage: coverage_data + } end def hash_incr_script diff --git a/lua/lib/persist-coverage.lua b/lua/lib/persist-coverage.lua index b214ee4d..fa433103 100644 --- a/lua/lib/persist-coverage.lua +++ b/lua/lib/persist-coverage.lua @@ -1,25 +1,25 @@ -local hash_values_array = cjson.decode(redis.call('get', (KEYS[1]))) -redis.call('DEL', KEYS[1]) -for i, hash_values in ipairs(hash_values_array) do - local function remove(key) - local val = hash_values[key] - hash_values[key] = nil - return val +local hmset = function (key, dict) + if next(dict) == nil then return nil end + local bulk = {} + for k, v in pairs(dict) do + table.insert(bulk, k) + table.insert(bulk, v) end - local first_updated_at = remove('first_updated_at') - local last_updated_at = remove('last_updated_at') - local file = remove('file') - local file_hash = remove('file_hash') - local ttl = remove('ttl') - local file_length = remove('file_length') - local hash_key = remove('hash_key') - redis.call('HMSET', hash_key, 'file', file, 'file_hash', file_hash, 'file_length', file_length) + return redis.call('HMSET', key, unpack(bulk)) +end +local payload = cjson.decode(redis.call('get', (KEYS[1]))) +local ttl = payload.ttl +local files_data = payload.files_data +redis.call('DEL', KEYS[1]) +for _, file_data in ipairs(files_data) do - if (last_updated_at ~= cjson.null) then - redis.call('HSET', hash_key, 'last_updated_at', last_updated_at) - end + local hash_key = file_data.hash_key + local first_updated_at = file_data.meta.first_updated_at + file_data.meta.first_updated_at = nil + + hmset(hash_key, file_data.meta) redis.call('HSETNX', hash_key, 'first_updated_at', first_updated_at) - for line, coverage in pairs(hash_values) do + for line, coverage in pairs(file_data.coverage) do if coverage == '-1' then redis.call("HSET", hash_key, line, coverage) else diff --git a/lua/test/test-persist-coverage.lua b/lua/test/test-persist-coverage.lua index e764d1fb..c93e0388 100644 --- a/lua/test/test-persist-coverage.lua +++ b/lua/test/test-persist-coverage.lua @@ -1,6 +1,6 @@ local call_redis_script = require "./lua/test/harness"; -describe("incr-and-stor", function() +describe("persist-coverage", function() local function hgetall(hash_key) local flat_map = redis.call('HGETALL', hash_key) local result = {} @@ -10,8 +10,6 @@ describe("incr-and-stor", function() return result end - - local function clean_redis() redis.call('flushdb') end @@ -30,30 +28,38 @@ describe("incr-and-stor", function() local key = 'hash_key' local json = cjson.encode({ - { - hash_key = "coverband_hash_3_3.coverband_test.runtime../dog.rb.abcd", - first_updated_at = first_updated_at, - last_updated_at = last_updated_at, - file = "./dog.rb", - file_hash = 'abcd', - ttl = -1, - file_length = 3, - ['0'] = 0, - ['1'] = 1, - ['2'] = 2 - }, - - { - hash_key = "coverband_hash_3_3.coverband_test.runtime../fish.rb.1234", - first_updated_at = first_updated_at, - last_updated_at = last_updated_at, - file = "./fish.rb", - file_hash = '1234', - ttl = -1, - file_length = 3, - ['0'] = 1, - ['1'] = 0, - ['2'] = 1 + ttl = -1, + files_data = { + { + hash_key = "coverband_hash_3_3.coverband_test.runtime../dog.rb.abcd", + meta = { + first_updated_at = first_updated_at, + last_updated_at = last_updated_at, + file = "./dog.rb", + file_hash = 'abcd', + file_length = 3 + }, + coverage = { + ['0'] = 0, + ['1'] = 1, + ['2'] = 2 + } + }, + { + hash_key = "coverband_hash_3_3.coverband_test.runtime../fish.rb.1234", + meta = { + first_updated_at = first_updated_at, + last_updated_at = last_updated_at, + file = "./fish.rb", + file_hash = '1234', + file_length = 3 + }, + coverage = { + ['0'] = 1, + ['1'] = 0, + ['2'] = 1 + } + } } }); redis.call( 'set', key, json) @@ -83,23 +89,29 @@ describe("incr-and-stor", function() last_updated_at = last_updated_at }, results) - - assert.is_false(false, redis.call('exists', key)) last_updated_at = "1569453953" - json = cjson.encode({{ - hash_key="coverband_hash_3_3.coverband_test.runtime../dog.rb.abcd", - first_updated_at=first_updated_at, - last_updated_at=last_updated_at, - file="./dog.rb", - file_hash='abcd', - ttl=-1, - file_length=3, - ['0']= 1, - ['1']= 1, - ['2']= 1 - }}) + json = cjson.encode({ + ttl = -1, + files_data = { + { + hash_key="coverband_hash_3_3.coverband_test.runtime../dog.rb.abcd", + meta = { + first_updated_at=first_updated_at, + last_updated_at=last_updated_at, + file="./dog.rb", + file_hash='abcd', + file_length=3 + }, + coverage = { + ['0']= 1, + ['1']= 1, + ['2']= 1 + } + } + } + }) redis.call( 'set', key, json ) call_redis_script('persist-coverage.lua', { key }, {} ); From a8b2b64973bc555d8209bb4b92dde73e6566dd75 Mon Sep 17 00:00:00 2001 From: Karl Baum Date: Wed, 9 Oct 2019 22:34:32 -0400 Subject: [PATCH 2/2] Remove use of -1 --- lib/coverband/adapters/hash_redis_store.rb | 10 +++++----- lua/lib/persist-coverage.lua | 9 +++------ lua/test/test-persist-coverage.lua | 4 ++-- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/lib/coverband/adapters/hash_redis_store.rb b/lib/coverband/adapters/hash_redis_store.rb index d74ab0f0..de39adf7 100644 --- a/lib/coverband/adapters/hash_redis_store.rb +++ b/lib/coverband/adapters/hash_redis_store.rb @@ -24,7 +24,7 @@ def initialize(redis, opts = {}) @redis = redis raise 'HashRedisStore requires redis >= 2.6.0' unless supported? - @ttl = opts[:ttl] || -1 + @ttl = opts[:ttl] @relative_file_converter = opts[:relative_file_converter] || Utils::RelativeFileConverter end @@ -71,7 +71,7 @@ def save_report(report) updated_time: updated_time ) end - json = { + json = { ttl: @ttl, files_data: files_data }.to_json @@ -129,7 +129,7 @@ def script_input(key:, file:, file_hash:, data:, report_time:, updated_time:) coverage_data = data.each_with_index.each_with_object({}) do |(coverage, index), hash| hash[index] = coverage if coverage end - meta = { + meta = { first_updated_at: report_time, file: file, file_hash: file_hash, @@ -137,9 +137,9 @@ def script_input(key:, file:, file_hash:, data:, report_time:, updated_time:) hash_key: key } meta.merge!(last_updated_at: updated_time) if updated_time - { + { hash_key: key, - meta: meta , + meta: meta, coverage: coverage_data } end diff --git a/lua/lib/persist-coverage.lua b/lua/lib/persist-coverage.lua index fa433103..ddb36d07 100644 --- a/lua/lib/persist-coverage.lua +++ b/lua/lib/persist-coverage.lua @@ -20,13 +20,10 @@ for _, file_data in ipairs(files_data) do hmset(hash_key, file_data.meta) redis.call('HSETNX', hash_key, 'first_updated_at', first_updated_at) for line, coverage in pairs(file_data.coverage) do - if coverage == '-1' then - redis.call("HSET", hash_key, line, coverage) - else - redis.call("HINCRBY", hash_key, line, coverage) - end + redis.call("HINCRBY", hash_key, line, coverage) end - if ttl > -1 then + print('ttl = ' .. inspect(ttl)) + if ttl and ttl ~= cjson.null then redis.call("EXPIRE", hash_key, ttl) end end diff --git a/lua/test/test-persist-coverage.lua b/lua/test/test-persist-coverage.lua index c93e0388..1ed031a0 100644 --- a/lua/test/test-persist-coverage.lua +++ b/lua/test/test-persist-coverage.lua @@ -28,7 +28,7 @@ describe("persist-coverage", function() local key = 'hash_key' local json = cjson.encode({ - ttl = -1, + ttl = nil, files_data = { { hash_key = "coverband_hash_3_3.coverband_test.runtime../dog.rb.abcd", @@ -93,7 +93,7 @@ describe("persist-coverage", function() last_updated_at = "1569453953" json = cjson.encode({ - ttl = -1, + ttl = nil, files_data = { { hash_key="coverband_hash_3_3.coverband_test.runtime../dog.rb.abcd",