Skip to content

Commit c8921d7

Browse files
committed
api: release lock in pool:put(conn)
The absence of this operation could lead to an infinite bloсking when used with fiber (case in tests). Closes #34
1 parent b8b70df commit c8921d7

File tree

2 files changed

+25
-19
lines changed

2 files changed

+25
-19
lines changed

mysql/init.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,11 @@ local function conn_put(conn)
6868
ffi.gc(conn.__gc_hook, nil)
6969
if not conn.queue:get() then
7070
conn.usable = false
71-
conn.queue:put()
71+
conn.queue:put(false)
7272
return POOL_EMPTY_SLOT
7373
end
7474
conn.usable = false
75+
conn.queue:put(false)
7576
return mysqlconn
7677
end
7778

test/mysql.test.lua

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -516,39 +516,44 @@ local function test_underlying_conn_closed_during_gc(test)
516516
test:ok(ffi.C.fcntl(handle, F_GETFD) == -1, 'descriptor is closed')
517517
end
518518

519-
local function test_block_fiber1(conn)
520-
print('fiber1')
521-
conn:execute('SELECT sleep(0.01)')
522-
print('fiber 1 end')
523-
end
524-
525519
local fiber_2
526520

527521
local function test_block_fiber2(conn)
528-
print('fiber2')
529522
fiber_2 = fiber.self()
530523
for _ = 1, 2 do
531524
conn:execute('SELECT sleep(0.01)')
532525
end
533-
print('fiber 2 end')
534-
end
535-
536-
local function test_block_fiber3(pool, conn)
537-
print('fiber3')
538-
pool:put(conn)
539-
print('fiber 3 end')
540526
end
541527

542528
local function test_block_fiber_inf(test, pool)
543-
test:plan(1)
529+
test:plan(2)
530+
-- Check that the second fiber is not blocked infinitely, when
531+
-- the third fiber do pool:put(conn) or conn:close().
544532
local conn = pool:get()
545-
fiber.create(test_block_fiber1, conn)
533+
-- First.
534+
fiber.create(conn.execute, conn, 'SELECT sleep(0.01)')
535+
-- Second.
536+
fiber.create(test_block_fiber2, conn)
537+
-- Third.
538+
fiber.create(pool.put, pool, conn)
539+
while fiber.status(fiber_2) ~= 'dead' do
540+
fiber.sleep(0)
541+
end
542+
test:ok(fiber.status(fiber_2) == 'dead', 'fiber is not blocked')
543+
544+
local conn, err = mysql.connect({ host = host, port = port, user = user,
545+
password = password, db = db })
546+
if conn == nil then error(err) end
547+
-- First.s
548+
fiber.create(conn.execute, conn, 'SELECT sleep(0.01)')
549+
-- Second.
546550
fiber.create(test_block_fiber2, conn)
547-
fiber.create(test_block_fiber3, pool, conn)
551+
-- Third.
552+
fiber.create(conn.close, conn)
548553
while fiber.status(fiber_2) ~= 'dead' do
549554
fiber.sleep(0)
550555
end
551-
test:ok(true, 'fiber is not blocked')
556+
test:ok(fiber.status(fiber_2) == 'dead', 'fiber is not blocked')
552557
end
553558

554559
local test = tap.test('mysql connector')

0 commit comments

Comments
 (0)