Tarantool development patches archive
 help / color / mirror / Atom feed
* [Tarantool-patches] [PATCH v2] test: concurrent tuple update segfault on bitset index iteration
@ 2020-08-31 10:59 Ilya Kosarev
  2020-08-31 11:36 ` Kirill Yukhin
  0 siblings, 1 reply; 2+ messages in thread
From: Ilya Kosarev @ 2020-08-31 10:59 UTC (permalink / raw)
  To: kyukhin; +Cc: tarantool-patches

Concurrent tuple update could segfault on BITSET_ALL_NOT_SET iterator
usage. Fixed in 850054b2dbca257076c3f7c22e00564ac55b70d5. This patch
introduces corresponding test.

Closes #1088
---
Branch: https://github.com/tarantool/tarantool/tree/i.kosarev/gh-1088-concurrent-tuple-update-segfault-with-bitset-index
Issue: https://github.com/tarantool/tarantool/issues/1088

Changes in v2:
- put test in separate file

 ...gh-1088-concurrent-bitset-iteration.result | 94 +++++++++++++++++++
 ...-1088-concurrent-bitset-iteration.test.lua | 42 +++++++++
 2 files changed, 136 insertions(+)
 create mode 100644 test/engine/gh-1088-concurrent-bitset-iteration.result
 create mode 100644 test/engine/gh-1088-concurrent-bitset-iteration.test.lua

diff --git a/test/engine/gh-1088-concurrent-bitset-iteration.result b/test/engine/gh-1088-concurrent-bitset-iteration.result
new file mode 100644
index 0000000000..242c745628
--- /dev/null
+++ b/test/engine/gh-1088-concurrent-bitset-iteration.result
@@ -0,0 +1,94 @@
+-- test-run result file version 2
+-- gh-1088 concurrent tuple update segfaults on BITSET_ALL_NOT_SET iteration
+
+test_run = require('test_run').new()
+ | ---
+ | ...
+fiber = require('fiber')
+ | ---
+ | ...
+
+s = box.schema.space.create('gh-1088')
+ | ---
+ | ...
+_ = s:create_index('primary', {type = 'hash', parts = {1, 'num'}})
+ | ---
+ | ...
+_ = s:create_index('bitset', {unique = false, type = 'BITSET', parts = {2, 'num'}})
+ | ---
+ | ...
+for i = 1, 100 do s:insert{i, 0, i - 1} end
+ | ---
+ | ...
+
+counter = 0
+ | ---
+ | ...
+test_run:cmd("setopt delimiter ';'")
+ | ---
+ | - true
+ | ...
+function update()
+    for _, t in s.index.bitset:pairs(1, {iterator = box.index.BITS_ALL_NOT_SET}) do
+        counter = counter + 1
+        s:update(t[1], {{'+', 3, 11}})
+        fiber.sleep(0)
+    end
+    fiber.self():cancel()
+end;
+ | ---
+ | ...
+test_run:cmd("setopt delimiter ''");
+ | ---
+ | - true
+ | ...
+
+fibers = {}
+ | ---
+ | ...
+for _ = 1, 100 do table.insert(fibers, fiber.create(update)) end
+ | ---
+ | ...
+
+updating = true
+ | ---
+ | ...
+test_run:cmd("setopt delimiter ';'")
+ | ---
+ | - true
+ | ...
+while updating do
+    updating = false
+    for _, f in pairs(fibers) do
+        if f:status() ~= 'dead' then updating = true end
+    end
+    fiber.sleep(0.001)
+end;
+ | ---
+ | ...
+test_run:cmd("setopt delimiter ''");
+ | ---
+ | - true
+ | ...
+
+s:get(1)
+ | ---
+ | - [1, 0, 1100]
+ | ...
+s:get(2)
+ | ---
+ | - [2, 0, 1101]
+ | ...
+s:get(3)
+ | ---
+ | - [3, 0, 1102]
+ | ...
+s:get(4)
+ | ---
+ | - [4, 0, 1103]
+ | ...
+
+counter -- total updates counter
+ | ---
+ | - 10000
+ | ...
diff --git a/test/engine/gh-1088-concurrent-bitset-iteration.test.lua b/test/engine/gh-1088-concurrent-bitset-iteration.test.lua
new file mode 100644
index 0000000000..f57d1ecabe
--- /dev/null
+++ b/test/engine/gh-1088-concurrent-bitset-iteration.test.lua
@@ -0,0 +1,42 @@
+-- gh-1088 concurrent tuple update segfaults on BITSET_ALL_NOT_SET iteration
+
+test_run = require('test_run').new()
+fiber = require('fiber')
+
+s = box.schema.space.create('gh-1088')
+_ = s:create_index('primary', {type = 'hash', parts = {1, 'num'}})
+_ = s:create_index('bitset', {unique = false, type = 'BITSET', parts = {2, 'num'}})
+for i = 1, 100 do s:insert{i, 0, i - 1} end
+
+counter = 0
+test_run:cmd("setopt delimiter ';'")
+function update()
+    for _, t in s.index.bitset:pairs(1, {iterator = box.index.BITS_ALL_NOT_SET}) do
+        counter = counter + 1
+        s:update(t[1], {{'+', 3, 11}})
+        fiber.sleep(0)
+    end
+    fiber.self():cancel()
+end;
+test_run:cmd("setopt delimiter ''");
+
+fibers = {}
+for _ = 1, 100 do table.insert(fibers, fiber.create(update)) end
+
+updating = true
+test_run:cmd("setopt delimiter ';'")
+while updating do
+    updating = false
+    for _, f in pairs(fibers) do
+        if f:status() ~= 'dead' then updating = true end
+    end
+    fiber.sleep(0.001)
+end;
+test_run:cmd("setopt delimiter ''");
+
+s:get(1)
+s:get(2)
+s:get(3)
+s:get(4)
+
+counter -- total updates counter
-- 
2.17.1

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Tarantool-patches] [PATCH v2] test: concurrent tuple update segfault on bitset index iteration
  2020-08-31 10:59 [Tarantool-patches] [PATCH v2] test: concurrent tuple update segfault on bitset index iteration Ilya Kosarev
@ 2020-08-31 11:36 ` Kirill Yukhin
  0 siblings, 0 replies; 2+ messages in thread
From: Kirill Yukhin @ 2020-08-31 11:36 UTC (permalink / raw)
  To: Ilya Kosarev; +Cc: tarantool-patches

Hello,

On 31 авг 13:59, Ilya Kosarev wrote:
> Concurrent tuple update could segfault on BITSET_ALL_NOT_SET iterator
> usage. Fixed in 850054b2dbca257076c3f7c22e00564ac55b70d5. This patch
> introduces corresponding test.
> 
> Closes #1088
> ---
> Branch: https://github.com/tarantool/tarantool/tree/i.kosarev/gh-1088-concurrent-tuple-update-segfault-with-bitset-index
> Issue: https://github.com/tarantool/tarantool/issues/1088

I've checked your patch into 1.10, 2.4, 2.5 and master.

--
Regards, Kirill Yukhin

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-08-31 11:36 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-31 10:59 [Tarantool-patches] [PATCH v2] test: concurrent tuple update segfault on bitset index iteration Ilya Kosarev
2020-08-31 11:36 ` Kirill Yukhin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox