2007年1月17日水曜日

OpenLDAPでBDBバックエンドのロック


openldap/slapd/connection.c
connection_read()
-> connection_input()
Operation *op 構造体
slap_op_alloc()でOperation構造体を初期化

back-bdb/init.c
init_module()->
be->be_private=bdb; でバックエンドデータベースを登録

BDBのlock.c __get_lockでLOCK_REGIONでmutexロックを取得し、他スレッドからのロックを排他制御。
__get_lock()の処理が終わると、UNLOCK_REGIONでmutexロックを解放。


2007年1月15日月曜日

OpenLDAPのBDBバックエンド

BDBのロックを行うのは、LOCK_GET()

bdb_cache_entry_db_lock()の中で、BDBのロックを行っている。
BDBのキャッシュを操作する際(add,deleteなど)にBDBのロックをかける。

bdb_cache_lru_add()
... DB_LOCK_WRITEモード、DB_LOCK_NOWAIT

bdb_cache_find_id()
... DB_LOCK_READモード、DB_LOCK_NOWAITなし

bdb_cache_add()
... DB_LOCK_WRITEモード、DB_LOCK_NOWAITなし

bdb_cache_delete_entry()
... DB_LOCK_WRITEモード、DB_LOCK_NOWAIT

DB_LOCK_NOWAITモードのときは、ロック取得に失敗した場合、すぐにDB_LOCK_NOTGRANTEDのエラーが返される。DB_LOCK_NOWAITモードでないときは、ロック取得できるまで待つ。

BDBでのロック取得処理
lock/lock.cの__lock_get()で行われる。

実際は__lock_get_internal()で処理が行われる。

BDBのロックの際にはlockerと呼ばれるロックを誰が実行したかのIDが使われる。
このlockerは、OpenLDAPでbdbのdbをopenした際に、XLOCK_ID()で割り当てられる。
XLOCK_ID()は、BDBの__lock_id()を呼び出しており、新しいlock_idを割り当てるようになっている。