From: Howard Chu Date: Fri, 13 May 2022 15:32:41 +0000 (+0100) Subject: ITS#7165 back-mdb: check for stale readers on MDB_READERS_FULL X-Git-Tag: OPENLDAP_REL_ENG_2_5_13~38 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f3d89d6203c457bff0ee0336b538b81fda607c5c;p=thirdparty%2Fopenldap.git ITS#7165 back-mdb: check for stale readers on MDB_READERS_FULL retry opening a read txn if we cleared any stale readers --- diff --git a/servers/slapd/back-mdb/id2entry.c b/servers/slapd/back-mdb/id2entry.c index a7ba23a949..aa6067a0e1 100644 --- a/servers/slapd/back-mdb/id2entry.c +++ b/servers/slapd/back-mdb/id2entry.c @@ -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 );