Commit 3e4db57f authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 283a2c25
# Copyright (C) 2019 Nexedi SA and Contributors.
# Kirill Smelkov <kirr@nexedi.com>
#
# This program is free software: you can Use, Study, Modify and Redistribute
# it under the terms of the GNU General Public License version 3, or (at your
# option) any later version, as published by the Free Software Foundation.
#
# You can also Link and Combine this program with other software covered by
# the terms of any of the Free Software licenses or any of the Open Source
# Initiative approved licenses and Convey the resulting work. Corresponding
# source of such a combination shall include the source code for all other
# software used.
#
# This program is distributed WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# See COPYING file for full licensing terms.
# See https://www.nexedi.com/licensing for rationale and options.
# cython: language_level=2
"""Module wcfs_test complements wcfs_test.py with things that are impossible to implement in Python"""
# read0_nogil accesses mem[0] with GIL released and returns first byte read from there.
def read0_nogil(const unsigned char[::1] mem not None) -> int:
cdef unsigned char b
with nogil:
b = mem[0]
return b
......@@ -41,6 +41,7 @@ from zodbtools.util import ashex as h, fromhex
from pytest import raises
from six import reraise
from .internal import mm
from .internal.wcfs_test import read0_nogil
# setup:
# - create test database, compute zurl and mountpoint for wcfs
......@@ -972,6 +973,8 @@ def test_wcfs():
wg = sync.WorkGroup(ctx)
blk = 2
pinok = {2: at4}
blk_data = f.blk(blk)
assert f.cached()[blk] == 0
......@@ -985,11 +988,11 @@ def test_wcfs():
ev.append('pin ack pre')
for p in pinv:
pin.reply("ack")
p.reply("ack")
# check that we don't get extra pins before read wakeup
try:
req = twlink.recvReq(ctx)
req = wl.recvReq(ctx)
except Exception as e:
if e is context.canceled:
return # cancel is expected after seeing "ok"
......@@ -1001,8 +1004,12 @@ def test_wcfs():
def _(ctx):
assert f.cached()[blk] == 0
ev.append('read pre')
blk_data[0] # read access -> XXX without GIL
ev.append('read')
# access data with released GIL so that the thread that reads data from
# head/watch can receive pin message.
b = read0_nogil(blk_data)
ev.append('read ' + chr(b))
# cancel _expectPin waiting upon waking up from read from wcfs
# -> error that missed pins were not received.
cancel()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment