v↑ tempstorage 2.12.2 -> 5.2(ZODB5) 3-nxd(ZODB4-wc2, ZODB4)
tempstorage 2.12.2 is from 2012 and misses loadBefore fixes which are important when ERP5 is run with ZODB5 or ZODB4-wc2:
https://github.com/zopefoundation/tempstorage/commit/d187a86d
https://github.com/zopefoundation/tempstorage/pull/16
When the first loadBefore fix is not there, the problem manifests itself as Zope not starting correctly with the following error in its log:
2021-07-02 08:37:25,579 ERROR Zope.ZODBMountPoint Failed to mount database. <class 'ZODB.POSException.ReadConflictError'> (^@^@^@^@^@^@^@^@)
Traceback (most recent call last):
File ".../eggs/Zope2-2.13.30-py2.7.egg/Products/ZODBMountPoint/MountedObject.py", line 248, in _getOrOpenObject
root = conn.root()
File ".../parts/ZODB4-wc2/src/ZODB/Connection.py", line 405, in root
return RootConvenience(self.get(z64))
File ".../parts/ZODB4-wc2/src/ZODB/Connection.py", line 276, in get
p, serial = self._load(oid)
File ".../parts/ZODB4-wc2/src/ZODB/Connection.py", line 246, in _load
return self._loadFrom(oid, self._storage)
File ".../parts/ZODB4-wc2/src/ZODB/Connection.py", line 255, in _loadFrom
raise ReadConflictError(oid)
ReadConflictError: ^@^@^@^@^@^@^@^@
When the second loadBefore fix is not there, the problem manifests itself as data corruption and sporadic POSKeyErrors (https://github.com/zopefoundation/tempstorage/issues/8).
-> Fix both problem by using recent tempstorage with ZODB5 and ZODB4:
- ZODB5: just use tempstorage 5.2 egg
- ZODB4-wc2: use tempstorage 3 + loadBefore backports: https://lab.nexedi.com/nexedi/tempstorage/commits/3-nxd
-
ZODB4: stays at 2.12.2 for now for this change to be as risk-free as possible. However, due to the fixes and e.g. https://github.com/zopefoundation/tempstorage/issues/8#issuecomment-873894941 it makes sense to switch ZODB4 to tempstorage 3-nxd as well.
EDIT: ZODB4 is also updated to use tempstorage 3-nxd (see !1009 (comment 137985) and below).