From f1e7ffb176feafd3f2ad5859c9e40a942c622c63 Mon Sep 17 00:00:00 2001
From: Kurt Spanier <ksp@openldap.org>
Date: Mon, 19 Apr 1999 10:47:03 +0000
Subject: [PATCH] Delayed backend lock release to replog entry after successful
 add().

---
 servers/slapd/back-bdb2/add.c             | 25 ++++++++++++++++-------
 servers/slapd/back-bdb2/entry.c           |  3 +--
 servers/slapd/back-bdb2/proto-back-bdb2.h |  5 +++++
 3 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/servers/slapd/back-bdb2/add.c b/servers/slapd/back-bdb2/add.c
index c3a5b69b0c..f4e40709c6 100644
--- a/servers/slapd/back-bdb2/add.c
+++ b/servers/slapd/back-bdb2/add.c
@@ -11,6 +11,9 @@
 #include "back-bdb2.h"
 #include "proto-back-bdb2.h"
 
+static DB_LOCK         lock;
+
+
 static int
 bdb2i_back_add_internal(
     BackendDB	*be,
@@ -217,7 +220,7 @@ return_results:;
 		bdb2i_cache_return_entry_w( &li->li_cache, p ); 
 	}
 
-	if ( 1 || rc ) {
+	if ( rc ) {
 		/* free entry and writer lock */
 		bdb2i_cache_return_entry_w( &li->li_cache, e );
 	}
@@ -234,9 +237,8 @@ bdb2_back_add(
     Entry	*e
 )
 {
-	DB_LOCK         lock;
 	struct ldbminfo	*li  = (struct ldbminfo *) be->be_private;
-	struct timeval  time1, time2;
+	struct timeval  time1;
 	int             ret;
 
 	bdb2i_start_timing( be->bd_info, &time1 );
@@ -248,8 +250,6 @@ bdb2_back_add(
 
 	}
 
-	bdb2i_start_timing( be->bd_info, &time2 );
-
 	/*  check, if a new default attribute index will be created,
 		in which case we have to open the index file BEFORE TP  */
 	switch ( slapMode ) {
@@ -262,11 +262,22 @@ bdb2_back_add(
 	}
 
 	ret = bdb2i_back_add_internal( be, conn, op, e );
-	bdb2i_stop_timing( be->bd_info, time2, "ADD-INTERN", conn, op );
-	(void) bdb2i_leave_backend_w( lock );
+
+	/*  if the operation was successful, we will delay the unlock  */
+	if ( ret )
+		(void) bdb2i_leave_backend_w( lock );
+
 	bdb2i_stop_timing( be->bd_info, time1, "ADD", conn, op );
 
 	return( ret );
 }
 
 
+int
+bdb2i_release_add_lock( void )
+{
+	(void) bdb2i_leave_backend_w( lock );
+	return 0;
+}
+
+
diff --git a/servers/slapd/back-bdb2/entry.c b/servers/slapd/back-bdb2/entry.c
index d5ed790066..4d9f76d95e 100644
--- a/servers/slapd/back-bdb2/entry.c
+++ b/servers/slapd/back-bdb2/entry.c
@@ -19,12 +19,11 @@ bdb2_back_entry_release_rw(
 	int     rw
 )
 {
-#if 0
 	struct ldbminfo	*li = (struct ldbminfo *) be->be_private;
 
 	/* free entry and reader or writer lock */
 	bdb2i_cache_return_entry_rw( &li->li_cache, e, rw ); 
-#endif
+	bdb2i_release_add_lock();
 
 	return 0;
 }
diff --git a/servers/slapd/back-bdb2/proto-back-bdb2.h b/servers/slapd/back-bdb2/proto-back-bdb2.h
index 04b787fe8c..159757450d 100644
--- a/servers/slapd/back-bdb2/proto-back-bdb2.h
+++ b/servers/slapd/back-bdb2/proto-back-bdb2.h
@@ -9,6 +9,11 @@
 
 LDAP_BEGIN_DECL
 
+/*
+ * add.c
+ */
+int bdb2i_release_add_lock LDAP_P(());
+
 /*
  * alias.c
  */
-- 
GitLab