• Kirill Smelkov's avatar
    lib/zodb: Add tests for critical ZODB properties that Wendelin.core 2 will depend on · c37a989d
    Kirill Smelkov authored
    The tests verify that there is no concurrency bugs around load,
    Connection.open and invalidations. See e.g.
    
    https://github.com/zopefoundation/ZODB/issues/290
    https://github.com/zopefoundation/ZEO/issues/155
    
    By including the tests into wendelin.core, we will have CI coverage for
    all supported storages (FileStorage, ZEO, NEO), and for all supported
    ZODB (currently ZODB4, ZODB4-wc2 and ZODB5).
    
    ZEO5 is know to currently fail zloadrace.
    However, even though ZODB#290 was fixed, ZEO5 turned out to also fail on zopenrace:
    
            def test_zodb_zopenrace():
                # exercises ZODB.Connection + particular storage implementation
        >       zopenrace.main()
    
        lib/tests/test_zodb.py:382:
        _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
        <decorator-gen-1>:2: in main
            ???
        ../../tools/go/pygolang/golang/__init__.py:103: in _
            return f(*argv, **kw)
        lib/tests/testprog/zopenrace.py:115: in main
            test(zstor)
        <decorator-gen-2>:2: in test
            ???
        ../../tools/go/pygolang/golang/__init__.py:103: in _
            return f(*argv, **kw)
        lib/tests/testprog/zopenrace.py:201: in test
            wg.wait()
        golang/_sync.pyx:246: in golang._sync.PyWorkGroup.wait
            ???
        golang/_sync.pyx:226: in golang._sync.PyWorkGroup.go.pyrunf
            ???
        lib/tests/testprog/zopenrace.py:165: in T1
            t1()
        _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    
            def t1():
                transaction.begin()
                zconn = db.open()
    
                root = zconn.root()
                obj1 = root['obj1']
                obj2 = root['obj2']
    
                # obj1 - reload it from zstor
                # obj2 - get it from zconn cache
                obj1._p_invalidate()
    
                # both objects must have the same values
                i1 = obj1.i
                i2 = obj2.i
                if i1 != i2:
        >           raise AssertionError("T1: obj1.i (%d)  !=  obj2.i (%d)" % (i1, i2))
        E           AssertionError: T1: obj1.i (3)  !=  obj2.i (2)
    
        lib/tests/testprog/zopenrace.py:156: AssertionError
    c37a989d
zloadrace.py 7.08 KB