• Kirill Smelkov's avatar
    go/zodb/zeo: Fix initialization when server database is empty · dcdf98c0
    Kirill Smelkov authored
    In that case at0 was initialized as 0 and still considered uninitialized
    by flushEventq0:
    
        (neo) (z-dev) (g.env) kirr@deco:~/src/neo/src/lab.nexedi.com/kirr/neo/go/zodb/storage/zeo$ go test -run Empty
        ------
        2020-10-12T07:39:25 INFO ZEO.runzeo (146240) opening storage '1' using FileStorage
        ------
        2020-10-12T07:39:25 INFO ZEO.StorageServer StorageServer created RW with storages: 1:RW:/tmp/zeo905263273/1.fs
        ------
        2020-10-12T07:39:25 INFO ZEO.asyncio.server listening on /tmp/zeo905263273/1.fs.zeosock
        ------
        2020-10-12T07:39:25 INFO ZEO.asyncio.base Connected server protocol
        ------
        2020-10-12T07:39:25 INFO ZEO.asyncio.server received handshake 'Z5'
        2020/10/12 07:39:25 /tmp/zeo905263273/1.fs.zeosock: EOF
        --- FAIL: TestEmptyDB (0.22s)
            --- FAIL: TestEmptyDB/py/msgpack=false (0.22s)
        panic: flush, but .at0 not yet initialized [recovered]
                panic: flush, but .at0 not yet initialized
    
        goroutine 7 [running]:
        testing.tRunner.func1.1(0x644a60, 0x6e1a50)
                /home/kirr/src/tools/go/go/src/testing/testing.go:1072 +0x30d
        testing.tRunner.func1(0xc000001e00)
                /home/kirr/src/tools/go/go/src/testing/testing.go:1075 +0x41a
        panic(0x644a60, 0x6e1a50)
                /home/kirr/src/tools/go/go/src/runtime/panic.go:969 +0x175
        lab.nexedi.com/kirr/neo/go/zodb/storage/zeo.(*zeo).flushEventq0(0xc00018a000)
                /home/kirr/src/neo/src/lab.nexedi.com/kirr/neo/go/zodb/storage/zeo/zeo.go:180 +0xf3
        lab.nexedi.com/kirr/neo/go/zodb/storage/zeo.openByURL(0x6e9ca0, 0xc000016108, 0xc000138120, 0xc000153d98, 0x0, 0x0, 0x0, 0x0, 0x0)
                /home/kirr/src/neo/src/lab.nexedi.com/kirr/neo/go/zodb/storage/zeo/zeo.go:488 +0x5ba
        lab.nexedi.com/kirr/neo/go/zodb/storage/zeo.zeoOpen(0xc000018740, 0x1e, 0xc000049d98, 0x0, 0x0, 0x0, 0x0)
                /home/kirr/src/neo/src/lab.nexedi.com/kirr/neo/go/zodb/storage/zeo/zeo_test.go:285 +0x17b
        lab.nexedi.com/kirr/neo/go/zodb/storage/zeo.withZEO.func1(0xc000001e00, 0x6e9ea0, 0xc00005e6c0)
                /home/kirr/src/neo/src/lab.nexedi.com/kirr/neo/go/zodb/storage/zeo/zeo_test.go:219 +0xd0
        lab.nexedi.com/kirr/neo/go/zodb/storage/zeo.withZEOSrv.func2.1(0xc0000185c0, 0x16)
                /home/kirr/src/neo/src/lab.nexedi.com/kirr/neo/go/zodb/storage/zeo/zeo_test.go:205 +0xfb
        lab.nexedi.com/kirr/neo/go/zodb/storage/zeo.withZEOSrv.func1(0xc000001e00, 0xc00000e5a0)
                /home/kirr/src/neo/src/lab.nexedi.com/kirr/neo/go/zodb/storage/zeo/zeo_test.go:185 +0x129
        lab.nexedi.com/kirr/neo/go/zodb/storage/zeo.withZEOSrv.func2(0xc000001e00)
                /home/kirr/src/neo/src/lab.nexedi.com/kirr/neo/go/zodb/storage/zeo/zeo_test.go:197 +0x105
        testing.tRunner(0xc000001e00, 0xc00000e440)
                /home/kirr/src/tools/go/go/src/testing/testing.go:1123 +0xef
        created by testing.(*T).Run
                /home/kirr/src/tools/go/go/src/testing/testing.go:1168 +0x2b3
        exit status 2
        FAIL    lab.nexedi.com/kirr/neo/go/zodb/storage/zeo     0.227s
    
    -> Fix it by using dedicated field marking whether .at0 was initialized or not yet.
    dcdf98c0
zeo.go 13.5 KB