diff --git a/changelogs/unreleased/gh-6421-wrong-count.md b/changelogs/unreleased/gh-6421-wrong-count.md new file mode 100644 index 0000000000000000000000000000000000000000..d1189c30d4d45793877df1914ce9fd98e35a98f6 --- /dev/null +++ b/changelogs/unreleased/gh-6421-wrong-count.md @@ -0,0 +1,3 @@ +## bugfix/core + +* Fixed a bug which resulted in wrong space count (gh-6421). diff --git a/src/box/memtx_tx.c b/src/box/memtx_tx.c index f74d6e9d8581dda16cae25b7a3263d2002152cd7..2cfd2cf00f4417cb5bdc61fbc49177fbd03c2050 100644 --- a/src/box/memtx_tx.c +++ b/src/box/memtx_tx.c @@ -1966,7 +1966,8 @@ memtx_tx_index_invisible_count_slow(struct txn *txn, assert(index->dense_id < lookup->index_count); bool unused; if (memtx_tx_story_is_visible(lookup, txn, - &visible, true, &unused)) + &visible, txn != NULL, + &unused)) break; } if (visible == NULL) diff --git a/test/box-luatest/gh_6421_mvcc_wrong_index_count_test.lua b/test/box-luatest/gh_6421_mvcc_wrong_index_count_test.lua new file mode 100644 index 0000000000000000000000000000000000000000..5279e16efbaacd3ab812bf11dfd323b29a4953ee --- /dev/null +++ b/test/box-luatest/gh_6421_mvcc_wrong_index_count_test.lua @@ -0,0 +1,81 @@ +local server = require('test.luatest_helpers.server') +local t = require('luatest') + +local g = t.group() + +g.before_all = function() + g.server = server:new{ + alias = 'default', + box_cfg = {memtx_use_mvcc_engine = true} + } + g.server:start() +end + +g.after_all = function() + g.server:drop() +end + +g.before_each(function() + g.server:exec(function() + local s = box.schema.space.create('test') + s:create_index('primary') + end) +end) + +g.after_each(function() + g.server:exec(function() box.space.test:drop() end) +end) + +g.test_mvcc_wrong_space_count_simple = function() + g.server:exec(function() + local t = require('luatest') + local fiber = require('fiber') + local s = box.space.test + + local f = fiber.create(function() + fiber.self():set_joinable(true) + s:insert{1} + end) + + -- Unconfirmed TX is not visible. + t.assert_equals(s:select(), {}) + t.assert_equals(s:count(), 0) + + f:join() + + -- Confirmed TX is visible. + t.assert_equals(s:select(), {{1}}) + t.assert_equals(s:count(), 1) + end) +end + +g.test_mvcc_wrong_space_count_rw_tx = function() + g.server:exec(function() + local t = require('luatest') + local fiber = require('fiber') + local s = box.space.test + + local f1 = fiber.create(function() + fiber.self():set_joinable(true) + s:insert{1} + end) + + local fiber_select = nil + local fiber_count = nil + local f2 = fiber.create(function() + fiber.self():set_joinable(true) + box.begin() + s:insert{2} + fiber_select = s:select() + fiber_count = s:count() + box.commit() + end) + + -- RW transaction must see unconfirmed statements + t.assert_equals(fiber_select, {{1}, {2}}) + t.assert_equals(fiber_count, 2) + + f1:join() + f2:join() + end) +end