新月の開発

da40b5c1 :Anonymous 2007-06-21 23:45
うーむ、ソース(Trunk(リビジョン1409)のcache.py)を見ると、UpdateListの__init__の819行目からの数行で、ファイルのmtimeと内部キャッシュの最終更新時(update_stamp)を比較してmtimeの方が未来ならファイルから読み込み直しているように見える。

しかし、UpdateListのsync内ではファイルを全て書き終ってからupdate_stampを更新してるから、ファイルが出力されている途中(update_stampが更新される前)で、他のスレッドからUpdateListの__init__が呼ばれるとmtimeの方が未来になるように見える。

HTTPServerはSocketServer.ThreadingMixInを継承してるのでHTTPリクエストはマルチスレッドで行なわれる。crond.pyにから定期的に呼び出されるclient.cgiではdo_sync内でUpdateListのサブクラスであるRecentListのインスタンスを作って更新した後(getallを通じて)syncしてる。一方gateway.py内にある書き込み処理の本体であるdo_postでもRecentListのインスタンスを作って更新した後syncしている。そのため、do_syncとdo_postが重なってファイルが壊れうるように見える。

ソースはちょっとしか読んでないから全然違うこと言ってるかもしれないけど。
Powered by shinGETsu.