Long ago, I made the mistake of trying out the collective.pdfpeek add-on. I've since then never been able to fully remove it, and it has plagued all my Plone upgrades since then.
I recently added wildcard.fixpersistentutilities to my Plone 4 site, and after messing around with it (removing anything with "pdfpeek" in its name), I got to the point where my Plone 4 site would load without the collective.pdfpeek product installed. It seemed like I had fully eradicated it!
However, I then imported a copy of that cluster's filestorage and blobstorage into a new Plone 5 instance, and tried to run the migration for this site. It fails with the following error:
Upgrade aborted. Error:
Traceback (most recent call last):
File "/opt/plone/buildout-cache/eggs/Products.CMFPlone-5.0.4-py2.7.egg/Products/CMFPlone/MigrationTool.py", line 268, in upgrade
step['step'].doStep(setup)
File "/opt/plone/buildout-cache/eggs/Products.GenericSetup-1.8.2-py2.7.egg/Products/GenericSetup/upgrade.py", line 166, in doStep
self.handler(tool)
File "/opt/plone/buildout-cache/eggs/plone.app.upgrade-1.3.24-py2.7.egg/plone/app/upgrade/v40/alphas.py", line 377, in cleanUpSkinsTool
transaction.savepoint(optimistic=True)
File "/opt/plone/buildout-cache/eggs/transaction-1.1.1-py2.7.egg/transaction/_manager.py", line 101, in savepoint
return self.get().savepoint(optimistic)
File "/opt/plone/buildout-cache/eggs/transaction-1.1.1-py2.7.egg/transaction/_transaction.py", line 260, in savepoint
self._saveAndRaiseCommitishError() # reraises!
File "/opt/plone/buildout-cache/eggs/transaction-1.1.1-py2.7.egg/transaction/_transaction.py", line 257, in savepoint
savepoint = Savepoint(self, optimistic, *self._resources)
File "/opt/plone/buildout-cache/eggs/transaction-1.1.1-py2.7.egg/transaction/_transaction.py", line 690, in __init__
savepoint = savepoint()
File "/opt/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/Connection.py", line 1123, in savepoint
self._commit(None)
File "/opt/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/Connection.py", line 623, in _commit
self._store_objects(ObjectWriter(obj), transaction)
File "/opt/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/Connection.py", line 658, in _store_objects
p = writer.serialize(obj) # This calls __getstate__ of obj
File "/opt/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/serialize.py", line 422, in serialize
return self._dump(meta, obj.__getstate__())
File "/opt/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/serialize.py", line 431, in _dump
self._p.dump(state)
PicklingError: Can't pickle <class 'collective.pdfpeek.async.IQueue'>: import of module collective.pdfpeek.async failed
End of upgrade path, main migration has finished.
The upgrade path did NOT reach current version.
Migration has failed
Why does Plone still think collective.pdfpeek is in use? I removed all traces I could find of it in the Plone 4 site. Where is it hiding? How can I remove it? Has anyone else had this problem?