Mac を再起動するとローカル環境の Datastore が消去される

2017年2月15日 20:53 428

一応最初に断っておくが、今回は Google App Engine(GAE)の Python、さらに Mac OS X のローカル環境で起きた事例であり、たとえば Windows でも同様の症状が起こるかどうかは未確認である。

Mac を再起動後もしくは GAE アプリをセットアップ後に初めて dev_appserver コマンドを実行すると、コンソールにはこんな風に表示される(後者は Ctrl-C 実行時)。

$ dev_appserver.py .
INFO     2018-01-05 11:06:47,534 devappserver2.py:105] Skipping SDK update check.
WARNING  2018-01-05 11:06:47,745 simple_search_stub.py:1196] Could not read search indexes from /var/folders/5w/9r0pcwzx5cvfktr71ldtdhmm0000gp/T/appengine.xxxxx.somin/search_indexes
INFO     2018-01-05 11:06:47,748 api_server.py:308] Starting API server at: http://localhost:58835
INFO     2018-01-05 11:06:47,849 dispatcher.py:255] Starting module "default" running at: http://localhost:8080
INFO     2018-01-05 11:06:47,852 admin_server.py:146] Starting admin server at: http://localhost:8000
INFO     2018-01-05 11:06:58,230 shutdown.py:45] Shutting down.
INFO     2018-01-05 11:06:58,231 api_server.py:964] Applying all pending transactions and saving the datastore
INFO     2018-01-05 11:06:58,231 api_server.py:967] Saving search indexes

WARNING の行は、特定のパス(アプリ名は伏せ字)に対して search indexes(search_indexes というファイル)を探しに行って見当たらなかった旨を表示している。どうやらこの場所にアプリ固有のフォルダを作成し、必要なファイルを保存しているようだ。実際に確認してみたところ、そのフォルダの中に datastore.db、logs.db、search_indexes、xsrf という4つのファイルが作られていた。Datastore の中身(SQLite の DB ファイル)は十中八九、datastore.db であろう。

ツイート中にもあるが、このパスは、Python の一時ファイル置き場のパスと一致した。

>>> import tempfile
>>> tempfile.gettempdir()
'/var/folders/5w/9r0pcwzx5cvfktr71ldtdhmm0000gp/T'

ちなみに Mac OS X の場合、/var は /private/var のエイリアスなので、実際には /private/var/folders/5w/9r0pcwzx5cvfktr71ldtdhmm0000gp/T となる。要は /tmp や /var/tmp のように、再起動すれば消去されてしまう場所だったというわけ。

いつ消えるか分からない場所に datastore.db を置いておくわけにはいかないので、ツイート中に書いた datastore_path オプションを指定して、プロジェクトフォルダ内に datastore.db というファイルを作成するのをマイルールにした。

$ dev_appserver.py . --datastore_path=datastore.db

他の search_indexes などは今のところ救済する必要に迫られていないのでそのままにしているが、将来的に全文検索機能を使う機会が出てきたときにまた考えようと思う。