openldap/backport-ITS-7165-back-mdb-check-for-stale-readers-on-MDB_REA.patch

37 lines
1.2 KiB
Diff
Raw Normal View History

2022-11-07 12:04:02 +00:00
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