openldap slapd が Lock table is out of available lock entries エラーを発生させる

Solution Unverified - Updated -

Environment

  • Red Hat Enterprise Linux 6
  • Red Hat Enterprise Linux 5
  • openldap-servers

Issue

多数の属性、または大きな属性を持つ ldap エントリを追加すると、slapd が以下のエラーを表示します。

Jun 20 15:44:10 hostname slapd[2705]: bdb(dc=example,dc=com):Lock table is out of available lock entries
Jun 20 15:44:10 hostname slapd[2705]:=> bdb_idl_insert_key: c_get failed:Cannot allocate memory (12)
Jun 20 15:44:10 hostname slapd[2705]: conn=1038 op=1 RESULT tag=105 err=80 text=index generation failed

Resolution

/var/lib/ldap/DB_CONFIG で、BDB 環境で利用できるロック数を増やします。

たとえば、以下のようになります。

set_lk_max_locks 10000
set_lk_max_lockers 10000
set_lk_max_objects 20000

Red Hat サポートからは適正値を示すことはできませんが、以下の方法を実行すると、現在の設定と統計を確認することができます。

  1. 現在のステータスと設定を確認します。
    1-1. ディレクトリを /var/lib/ldap に変更します。
   # cd /var/lib/ldap

1-2. db_stat (RHEL6) または slapd_db_stat (RHEL5) にて、現在のステータスを確認します。

たとえば、RHEL6 の場合は以下のコマンドを実行してください。

  # db_stat -h . -c
   <..SNIP..>
  1000  Maximum number of locks possible 
  1000  Maximum number of lockers possible
  1000  Maximum number of lock objects possible
  <..SNIP..>
  XXX   Maximum number of locks at any one time

  <..SNIP..>

  YYYY  Maximum number of lockers at any one time

  <..SNIP..>

  ZZZZ  Maximum number of lock objects at any one time

[Maximum number of locks possible ]
Berkeley DB 環境でサポートされている最大のロック数の設定
この値の統計は、"Maximum number of locks at any one time" 行の値で確認できます。

[Maximum number of lockers ]
Berkeley DB 環境でサポートされている最大のロッキング エンティティの設定
この値の統計は、"Maximum number of lockers at any one time" 行の値で確認できます。

[Maximum number of lock objects possible ]
Berkeley DB 環境でサポートされている最大のロックされたオブジェクトの設定
この値の統計は、"Maximum number of lock objects at any one time" 行の値で確認できます。

  1. slapd サービスを停止します。

    # service slapd stop
    
  2. /var/lib/ldap ディレクトリの DB_CONFIG ファイルを修正 (または作成) してください。

    set_lk_max_locks 10000   // set Maximum number of locks
    set_lk_max_lockers 10000 // set Maximum number of lockers
    set_lk_max_objects 20000 // set Maximum number of objects
    

    少なくとも、上の手順 1-2 で確認した値よりも高く設定する必要があります。

  3. /var/lib/ldap ディレクトリで、db_recover (RHEL6) または slapd_db_recover (RHEL5) を実行します。

たとえば、RHEL6 の場合は以下のコマンドを実行してください。

   # db_recover -h .

必ず"." を入力してください。これにより、この場所が db_recover のホームディレクトリとして設定されます。

  1. slapd サービスを再度開始します。

    # service slapd restart
    
  2. 手順 1-2 で db_stat コマンドを実行して設定したように、lock パラメータの数を変更したかどうかを確認できます。

    注意: 各パラメーターの詳細については、/usr/share/doc/db4-devel-/<parameter-name>.html を参照してください。
    db_stat ユーティリティの詳細については、/usr/share/doc/db4-utils-
    /utility/<utility-name>.html を参照してください。

Root Cause

slapd がエントリを新しく追加するのに、ロックオブジェクトが足りません。

Diagnostic Steps

  • syslog を有効にして log level4 メッセージを取得します。
  • 「問題」セクションに表示されているメッセージを確認します。

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.