37 lines
1.2 KiB
Diff
37 lines
1.2 KiB
Diff
From 205e2f1a3e351941a0694e7295e1b3a9b71e5272 Mon Sep 17 00:00:00 2001
|
|
From: Howard Chu <hyc@openldap.org>
|
|
Date: Fri, 13 May 2022 16:32:41 +0100
|
|
Subject: [PATCH] ITS#7165 back-mdb: check for stale readers on
|
|
MDB_READERS_FULL
|
|
|
|
retry opening a read txn if we cleared any stale readers
|
|
---
|
|
servers/slapd/back-mdb/id2entry.c | 10 ++++++++++
|
|
1 file changed, 10 insertions(+)
|
|
|
|
diff --git a/servers/slapd/back-mdb/id2entry.c b/servers/slapd/back-mdb/id2entry.c
|
|
index a7ba23a94..aa6067a0e 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 );
|
|
--
|
|
2.33.0
|
|
|