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