• Julien Muchembled's avatar
    Fix protocol and DB schema so that storages can handle transactions of any size · d5c469be
    Julien Muchembled authored
    - Change protocol to use SHA1 for all checksums:
      - Use SHA1 instead of CRC32 for data checksums.
      - Use SHA1 instead of MD5 for replication.
    
    - Change DatabaseManager API so that backends can store raw data separately from
      object metadata:
      - When processing AskStoreObject, call the backend to store the data
        immediately, instead of keeping it in RAM or in the temporary object table.
        Data is then referenced only by its checksum.
        Without such change, the storage could fail to store the transaction due to
        lack of RAM, or it could make tpc_finish step very slow.
      - Backends have to store data in a separate space, and remove entries as soon
        as they get unreferenced. So they must have an index of checksums in object
        metadata space. A new '_uncommitted_data' backend attribute keeps references
        of uncommitted data.
      - New methods: _pruneData, _storeData, storeData, unlockData
      - MySQL: change vertical partitioning of 'obj' by having data in a separate
        'data' table instead of using a shortened 'obj_short' table.
      - BTree: data is moved from '_obj' to a new '_data' btree.
    
    - Undo is optimized so that backpointers are not required anymore to fetch data:
      - The checksum of an object is None only when creation is undone.
      - Removed DatabaseManager methods: _getObjectData, _getDataTIDFromData
      - DatabaseManager: move some code from _getDataTID to findUndoTID so that
        _getDataTID only has what's specific to backend.
    
    - Removed because already covered by ZODB tests:
      - neo.tests.storage.testStorageDBTests.StorageDBTests.test__getDataTID
      - neo.tests.storage.testStorageDBTests.StorageDBTests.test__getDataTIDFromData
    d5c469be
test.py 14.4 KB