Commit e328d422 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent a035b1cd
...@@ -51,7 +51,7 @@ using std::tie; ...@@ -51,7 +51,7 @@ using std::tie;
using std::vector; using std::vector;
// nil is synonym for nullptr and NULL. // nil is synonym for nullptr and NULL. XXX -> pygolang
const nullptr_t nil = nullptr; const nullptr_t nil = nullptr;
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
# See https://www.nexedi.com/licensing for rationale and options. # See https://www.nexedi.com/licensing for rationale and options.
"""wcfs_test tests wcfs filesystem from outside as python client process """wcfs_test tests wcfs filesystem from outside as python client process
It also unit-tests wcfs.py virtmem-level integration. XXX It also unit-tests virtmem layer of wcfs virtmem client.
At functional level, the whole wendelin.core test suite is used to verify At functional level, the whole wendelin.core test suite is used to verify
wcfs.py/wcfs.go while running tox tests in wcfs mode. wcfs.py/wcfs.go while running tox tests in wcfs mode.
...@@ -1698,18 +1698,23 @@ def test_wcfs_watch_2files(): ...@@ -1698,18 +1698,23 @@ def test_wcfs_watch_2files():
# XXX @revX/ is automatically removed after some time # XXX @revX/ is automatically removed after some time
# ---- wcfs.py + virtmem integration ---- # ---- unit-tests for virtmem layer of wcfs client ----
# tMapping provides testing environment for Mapping. # tMapping provides testing environment for Mapping.
class tMapping(object): class tMapping(object):
def __init__(t, mmap): def __init__(t, tdb, mmap):
t.tdb = tdb
t.mmap = mmap t.mmap = mmap
# XXX assertCache # XXX assertCache
# assertBlk asserts that mmap[·] with · corresponding to blk reads as dataok. # assertBlk asserts that mmap[·] with · corresponding to blk reads as dataok.
# pinnedOK: {} blk -> rev of t.mmap.fileh.pinned after access.
#
# see also: tFile.assertBlk . # see also: tFile.assertBlk .
def assertBlk(t, blk, dataok): # NOTE contrary to tFile, pinnedOK represents full fh.pinned state, not
# only pins that wcfs sent to client after tested access.
def assertBlk(t, blk, dataok, pinnedOK):
assert t.mmap.blk_start <= blk < t.mmap.blk_stop assert t.mmap.blk_start <= blk < t.mmap.blk_stop
blk_inmmap = blk - t.mmap.blk_start blk_inmmap = blk - t.mmap.blk_start
...@@ -1738,14 +1743,24 @@ class tMapping(object): ...@@ -1738,14 +1743,24 @@ class tMapping(object):
assert _ == dataok[0] assert _ == dataok[0]
assert blkview.tobytes() == dataok assert blkview.tobytes() == dataok
assert fhpinned(t.tdb, fh) == pinnedOK
# XXX assertData # XXX assertData
# fhpinned(fh) returns fh.pinned with rev wrapped into tAt.
# XXX better wrap FileH into tFileH and do this automatically in .pinned ?
def fhpinned(t, fh):
p = fh.pinned.copy()
for blk in p:
p[blk] = tAt(t, p[blk])
return p
# test_wcfs_virtmem unit-tests virtmem layer of wcfs client. # test_wcfs_virtmem unit-tests virtmem layer of wcfs client.
@func @func
def test_wcfs_virtmem(): def test_wcfs_virtmem():
t = tDB(); zf = t.zfile t = tDB(); zf = t.zfile; at0=t.at0
defer(t.close) defer(t.close)
pinned = lambda fh: fhpinned(t, fh)
at1 = t.commit(zf, {2:'c1', 3:'d1'}) at1 = t.commit(zf, {2:'c1', 3:'d1'})
at2 = t.commit(zf, {2:'c2'}) at2 = t.commit(zf, {2:'c2'})
...@@ -1755,13 +1770,6 @@ def test_wcfs_virtmem(): ...@@ -1755,13 +1770,6 @@ def test_wcfs_virtmem():
fh = wconn.open(zf._p_oid) fh = wconn.open(zf._p_oid)
defer(fh.close) defer(fh.close)
# pinned(fh) returns fh.pinned with rev wrapped into tAt.
# XXX better wrap FileH into tFileH and do this automatically in .pinned ?
def pinned(fh):
p = fh.pinned.copy()
for blk in p:
p[blk] = tAt(t, p[blk])
return p
# create mmap with 1 block beyond file size # create mmap with 1 block beyond file size
m1 = fh.mmap(2, 3) m1 = fh.mmap(2, 3)
...@@ -1771,43 +1779,37 @@ def test_wcfs_virtmem(): ...@@ -1771,43 +1779,37 @@ def test_wcfs_virtmem():
assert m1.blk_stop == 5 assert m1.blk_stop == 5
assert len(m1.mem) == 3*zf.blksize assert len(m1.mem) == 3*zf.blksize
tm1 = tMapping(m1) tm1 = tMapping(t, m1)
#assertCache(m1, [0,0,0]) #assertCache(m1, [0,0,0])
assert pinned(fh) == {} assert pinned(fh) == {}
# verify initial data reads # verify initial data reads
tm1.assertBlk(2, 'c1') tm1.assertBlk(2, 'c1', {2:at1})
assert pinned(fh) == {2:at1} tm1.assertBlk(3, 'd1', {2:at1})
tm1.assertBlk(3, 'd1') tm1.assertBlk(4, '', {2:at1})
assert pinned(fh) == {2:at1}
tm1.assertBlk(4, '')
assert pinned(fh) == {2:at1}
# commit with growing file size -> verify data read as the same, #3 pinned. # commit with growing file size -> verify data read as the same, #3 pinned.
# (#4 is not yet pinned because it was not accessed) # (#4 is not yet pinned because it was not accessed)
at3 = t.commit(zf, {3:'d3', 4:'e3'}) at3 = t.commit(zf, {3:'d3', 4:'e3'})
assert pinned(fh) == {2:at1} assert pinned(fh) == {2:at1}
tm1.assertBlk(2, 'c1') tm1.assertBlk(2, 'c1', {2:at1})
assert pinned(fh) == {2:at1} tm1.assertBlk(3, 'd1', {2:at1, 3:at1})
tm1.assertBlk(3, 'd1') tm1.assertBlk(4, '', {2:at1, 3:at1})
assert pinned(fh) == {2:at1, 3:at1}
tm1.assertBlk(4, '')
assert pinned(fh) == {2:at1, 3:at1}
# resync at1 -> at2: #2 must unpin to @head; #4 must stay as zero # resync at1 -> at2: #2 must unpin to @head; #4 must stay as zero
wconn.resync(at2) wconn.resync(at2)
assert pinned(fh) == {3:at1} assert pinned(fh) == {3:at1}
tm1.assertBlk(2, 'c2') tm1.assertBlk(2, 'c2', { 3:at1})
tm1.assertBlk(3, 'd1') tm1.assertBlk(3, 'd1', { 3:at1})
tm1.assertBlk(4, '') tm1.assertBlk(4, '', { 3:at1, 4:at0}) # XXX 4->ø ?
# resync at2 -> at3: #3 must unpin to @head; #4 - start to read with data # resync at2 -> at3: #3 must unpin to @head; #4 - start to read with data
wconn.resync(at3) wconn.resync(at3)
assert pinned(fh) == {} assert pinned(fh) == {}
tm1.assertBlk(2, 'c2') tm1.assertBlk(2, 'c2', {})
tm1.assertBlk(3, 'd3') tm1.assertBlk(3, 'd3', {})
tm1.assertBlk(4, 'e3') tm1.assertBlk(4, 'e3', {})
# XXX resync ↓ ? # XXX resync ↓ ?
......
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