ZODBのlast modified timeを修正

zopeが動作しているサーバの時間を誤って2028年とかにしてしまいました。短時間で気がついて、正しく修正したのですが、その短時間中に作成、更新されたオブジェクトの更新日付(ZMIで参照したときのlast modified)が全部2028年になってしまいました。
日付を正しく修正した状態で当該オブジェクトに対してなにか更新しても、なぜだか日付はそのまま。また、フォルダオブジェクトが2028年になっていると、その下層に新規作成されたオブジェクトもその日付になってしまいます。

ソースをちょろっと読んだところ、self._p_mtimeという属性をlast modifiedとして表示している様子。Plone上では別の属性値を利用しているようで、CMSの機能としては影響ありません。
ではってことでzopeデバッグモードで立ち上げて属性値を更新してもread onlyだからダメよとのこと。くそ。

>>> app._p_mtime=1421669525
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: attribute '_p_mtime' of 'persistent.Persistent' objects is not writable

じゃあオブジェクトの日付をチェックして、現在時間よりも未来だったらリセットしてオブジェクト新規作成する方向で検討。fsrecover.py($ZOPE/lib/python/ZODBにあります)にちょっと手を加えて上記ロジックを追加。
パッチはこんなのです。

324,330d323
<         t_now = time.time()
<         t_now = TimeStamp(*time.gmtime(t_now)[:5] + (t_now % 60,))
<         
<         if t > t_now:
<             print ('Time stamp from the future, resetting: %s' % (t))
<             tid = None
< 
332d324
<         tid=ofs._tid
350c342
<                 ofs.restore(r.oid, tid, r.data, r.version, r.data_txn,
---
>                 ofs.restore(r.oid, r.tid, r.data, r.version, r.data_txn,

これでもってData.fsを引数にして起動。

$ path_to_python fsrecover.py Data.fs Data.fs.new

zopeのバージョンはすこし古いので現在のZODBだと行数などあってないかも。
これでData.fsを別ファイルへ吐き出してリプレイス。