• Kirill Smelkov's avatar
    fixup! ZBigFile: Add ZBlk format option 'h' (heuristic) (1) · b72a79e6
    Kirill Smelkov authored
    Fix tests that started to fail with e.g,:
    
        bigarray/tests/test_arrayzodb.py::test_zbigarray FAILED
    
        ===================================================================== FAILURES =====================================================================
        __________________________________________________________________ test_zbigarray __________________________________________________________________
    
            @func
            def test_zbigarray():
                root = testdb.dbopen()
                defer(lambda: dbclose(root))
    
                root['zarray'] = ZBigArray((16*1024*1024,), uint8)
                transaction.commit()
    
                dbclose(root)
    
                root = testdb.dbopen()
                A = root['zarray']
    
                assert isinstance(A, ZBigArray)
                assert A.shape  == (16*1024*1024,)
                assert A.dtype  == dtype(uint8)
    
                assert all(A[:] == 0)
    
                a = A[:]
                a[1] = 1
                a[3] = 3
                a[5] = 5
                a[-1] = 99
    
                b = A[:]
                assert (b[0],b[1]) == (0,1)
                assert (b[2],b[3]) == (0,3)
                assert (b[4],b[5]) == (0,5)
                assert all(b[6:-1] == 0)
                assert b[-1] == 99
    
                # abort - should forget all changes
                transaction.abort()
                assert all(a[:] == 0)
                assert all(b[:] == 0)
                assert all(A[:] == 0)
    
                # now modify again and commit
                a[33] = 33
                a[-2] = 98
                assert all(b[:33] == 0)
                assert b[33] == 33
                assert all(b[33+1:-2] == 0)
                assert b[-2] == 98
                assert b[-1] == 0
    
        >       transaction.commit()
    
        bigarray/tests/test_arrayzodb.py:95:
        _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
        ../venv/z-dev/lib/python2.7/site-packages/transaction/_manager.py:252: in commit
            return self.manager.commit()
        ../venv/z-dev/lib/python2.7/site-packages/transaction/_manager.py:131: in commit
            return self.get().commit()
        ../venv/z-dev/lib/python2.7/site-packages/transaction/_transaction.py:311: in commit
            reraise(t, v, tb)
        ../venv/z-dev/lib/python2.7/site-packages/transaction/_transaction.py:302: in commit
            self._commitResources()
        ../venv/z-dev/lib/python2.7/site-packages/transaction/_transaction.py:447: in _commitResources
            reraise(t, v, tb)
        ../venv/z-dev/lib/python2.7/site-packages/transaction/_transaction.py:421: in _commitResources
            rm.commit(self)
        bigfile/file_zodb.py:835: in commit
            self.zfileh.dirty_writeout(WRITEOUT_STORE)
        bigfile/_file_zodb.pyx:91: in wendelin.bigfile._file_zodb._ZBigFile.storeblk
            def storeblk(self, blk, buf):   return self.zself.storeblk(blk, buf)
        bigfile/file_zodb.py:551: in storeblk
            zblk_fmt = self._zblk_fmt_heuristic(zblk, blk, buf)
        _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    
        self = <wendelin.bigfile.file_zodb.ZBigFile object at 0x7f297c99d8d0 oid 0x2 in <ZODB.Connection.Connection object at 0x7f297c99e4d0>>, zblk = None
        blk = 7L, buf = <read-only buffer ptr 0x(nil), size 0 at 0x7f297c99e770>
    
            def _zblk_fmt_heuristic(self, zblk, blk, buf):
                if _is_appending(zblk, buf):
                    if not zblk and blk > 0:  # is new zblk?
                        # Set previous filled-up ZBlk to ZBlk0 for fast reads
                        previous_blk = blk - 1
                        previous_zblk = self.blktab.get(previous_blk)
        >               self._setzblk(previous_blk, previous_zblk, previous_zblk.loadblkdata(), "ZBlk0")
        E               AttributeError: 'NoneType' object has no attribute 'loadblkdata'
    
    There is no guarantee that previous block is not hole.
    b72a79e6
file_zodb.py 34.2 KB