From 3adf302c0f44adc53cef45f091ac54460a9264ab Mon Sep 17 00:00:00 2001 From: Georgy Kirichenko <georgy@tarantool.org> Date: Thu, 17 Aug 2017 10:14:25 +0300 Subject: [PATCH] vinyl: add a test case for DDL while active cursor Check that Tarantool doesn't crash when space remove while cursor is open. Fixes #2342 --- test/vinyl/ddl.result | 67 +++++++++++++++++++++++++++++++++++++++++ test/vinyl/ddl.test.lua | 22 ++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/test/vinyl/ddl.result b/test/vinyl/ddl.result index 67a6eecad4..ca95542ab6 100644 --- a/test/vinyl/ddl.result +++ b/test/vinyl/ddl.result @@ -469,3 +469,70 @@ test_run:cmd("setopt delimiter ''"); s:drop() --- ... +-- gh-2342 cursors after death of index +create_iterator = require('utils').create_iterator +--- +... +s = box.schema.space.create('test', { engine = 'vinyl' }) +--- +... +pk = s:create_index('primary', { parts = { 1, 'uint' } }) +--- +... +sk = s:create_index('sec', { parts = { 2, 'uint' } }) +--- +... +s:replace{1, 2, 3} +--- +- [1, 2, 3] +... +s:replace{4, 5, 6} +--- +- [4, 5, 6] +... +s:replace{7, 8, 9} +--- +- [7, 8, 9] +... +itr = create_iterator(s, {}) +--- +... +f, ctx, state = s.index.sec:pairs({5}, { iterator='LE' }) +--- +... +itr.next() +--- +- [1, 2, 3] +... +f(ctx, state) +--- +- <iterator state> +- [4, 5, 6] +... +s:drop() +--- +... +itr.next() +--- +- null +... +f(ctx, state) +--- +- null +... +f = nil +--- +... +ctx = nil +--- +... +state = nil +--- +... +itr = nil +--- +... +collectgarbage('collect') +--- +- 0 +... diff --git a/test/vinyl/ddl.test.lua b/test/vinyl/ddl.test.lua index f3d30e38be..747b9a8a31 100644 --- a/test/vinyl/ddl.test.lua +++ b/test/vinyl/ddl.test.lua @@ -196,3 +196,25 @@ end ; test_run:cmd("setopt delimiter ''"); s:drop() + +-- gh-2342 cursors after death of index +create_iterator = require('utils').create_iterator +s = box.schema.space.create('test', { engine = 'vinyl' }) +pk = s:create_index('primary', { parts = { 1, 'uint' } }) +sk = s:create_index('sec', { parts = { 2, 'uint' } }) +s:replace{1, 2, 3} +s:replace{4, 5, 6} +s:replace{7, 8, 9} +itr = create_iterator(s, {}) +f, ctx, state = s.index.sec:pairs({5}, { iterator='LE' }) +itr.next() +f(ctx, state) +s:drop() +itr.next() +f(ctx, state) +f = nil +ctx = nil +state = nil +itr = nil +collectgarbage('collect') + -- GitLab