2017/12/13

[lmdb]putに成功してもgetに失敗したのはcommitエラーだった

lmdbで、mdb_get()してキーが無かったらmdb_put()する、という処理にしていた。
それは動いていたのだが、ずっと動かしていると急に、mdb_get()→失敗してmdb_put()→成功→同じキーでmdb_get()→失敗、という動作をするようになってしまった。
今まで動いていたので、APIの使い方を間違っているとか、lmdbの仕様を確認してなかったとかだろうと思ったのだが、どうにもわからない。。。


あれこれ考えていると、mdb_txn_commit()も戻り値があることに気付いた。
いや、commitで失敗してもやれることがないだろうと思って、チェックしていなかったのだ。

そうすると、一覧にないエラーが起きていた。

MDB_MAP_FULL

見ていくと、mdb_env_set_mapsize()にたどり着いた。
えー、これってmdb_put()で返すように書いてあるけど、mdb_txn_commit()のタイミングで返すの。。。
まあ、commitするまで反映しないということからすると、その方が自然なのか。。。


どうやら、mapsizeがDBに保存できるサイズの上限らしい。
たしかに今回は、初めて実動作させて大量のデータを保存させていたのだ。

DBって、ディスク容量に制限されるだけかと思っていたのだが、処理の都合でいろいろあるということがわかった。
SQLとか使うほどじゃないから軽いやつにしよう、くらいで選択してはよくないのかもしれんな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。