]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#7165 back-mdb: check for stale readers on MDB_READERS_FULL
authorHoward Chu <hyc@openldap.org>
Fri, 13 May 2022 15:32:41 +0000 (16:32 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Mon, 16 May 2022 15:11:51 +0000 (15:11 +0000)
retry opening a read txn if we cleared any stale readers

servers/slapd/back-mdb/id2entry.c

index a7ba23a949acb7640894839550f7ebd3e60a2c4d..aa6067a0e1a5690cb492ebc9cdb606a5d6181e09 100644 (file)
@@ -779,7 +779,17 @@ mdb_opinfo_get( Operation *op, struct mdb_info *mdb, int rdonly, mdb_op_info **m
                        return rc;
                }
                if ( ldap_pvt_thread_pool_getkey( ctx, mdb->mi_dbenv, &data, NULL ) ) {
+                       int retried = 0;
+retry:
                        rc = mdb_txn_begin( mdb->mi_dbenv, NULL, MDB_RDONLY, &moi->moi_txn );
+                       if (rc == MDB_READERS_FULL && !retried) {
+                               int dead;
+                               /* if any stale readers were cleared, a slot should be available */
+                               if (!mdb_reader_check( mdb->mi_dbenv, &dead ) && dead) {
+                                       retried = 1;
+                                       goto retry;
+                               }
+                       }
                        if (rc) {
                                Debug( LDAP_DEBUG_ANY, "mdb_opinfo_get: err %s(%d)\n",
                                        mdb_strerror(rc), rc );