andykimpe / rpms / 389-ds-base

Forked from rpms/389-ds-base 4 months ago
Clone

Blame 0363-Ticket-47978-Deadlock-between-two-MODs-on-the-same-e.patch

dc8c34
From b5fb783fd4b1f5f34ef9956f0f93cbe3a3e14645 Mon Sep 17 00:00:00 2001
dc8c34
From: Thierry Bordaz <tbordaz@redhat.com>
dc8c34
Date: Mon, 19 Oct 2015 11:03:54 +0200
dc8c34
Subject: [PATCH 363/363] Ticket 47978: Deadlock between two MODs on the same
dc8c34
 entry between entry cache and backend lock
dc8c34
dc8c34
Bug Description:
dc8c34
	During a modify, the modified entry gets into the entry cache and is locked.
dc8c34
	If after the be_txn_postop/txn_commit and before the modify returns
dc8c34
	the modified entry gets out of the entry cache, the entry is not unlocked.
dc8c34
	It can lead to hang as soon as an other write operation hit that unlocked entry.
dc8c34
dc8c34
	This is a side effect of fix:
dc8c34
		#47834 - Tombstone_to_glue: if parents are also converted to glue, the target entry's DN must be adjusted.
dc8c34
dc8c34
Fix Description:
dc8c34
	When the entry is locked, set a flag so that can later be unlocked
dc8c34
	independently of its presence in the entry cache
dc8c34
dc8c34
https://fedorahosted.org/389/ticket/47978
dc8c34
dc8c34
Reviewed by: Noriko Hosoi (Thanks Noriko)
dc8c34
dc8c34
Platforms tested: F22 (IPA CI test test_integration/test_vault.py, one failure out 2-4)
dc8c34
dc8c34
Flag Day: no
dc8c34
dc8c34
Doc impact: no
dc8c34
dc8c34
(cherry picked from commit bdaed4e2fb4633d6fec16eb1ea55b7e2fcbd4df4)
dc8c34
---
dc8c34
 ldap/servers/slapd/back-ldbm/ldbm_modify.c | 4 +++-
dc8c34
 1 file changed, 3 insertions(+), 1 deletion(-)
dc8c34
dc8c34
diff --git a/ldap/servers/slapd/back-ldbm/ldbm_modify.c b/ldap/servers/slapd/back-ldbm/ldbm_modify.c
dc8c34
index 8b36e0f..15cfe2c 100644
dc8c34
--- a/ldap/servers/slapd/back-ldbm/ldbm_modify.c
dc8c34
+++ b/ldap/servers/slapd/back-ldbm/ldbm_modify.c
dc8c34
@@ -387,6 +387,7 @@ ldbm_back_modify( Slapi_PBlock *pb )
dc8c34
 	int repl_op;
dc8c34
 	int opreturn = 0;
dc8c34
 	int mod_count = 0;
dc8c34
+	int ec_locked = 0;
dc8c34
 
dc8c34
 	slapi_pblock_get( pb, SLAPI_BACKEND, &be);
dc8c34
 	slapi_pblock_get( pb, SLAPI_PLUGIN_PRIVATE, &li );
dc8c34
@@ -746,6 +747,7 @@ ldbm_back_modify( Slapi_PBlock *pb )
dc8c34
 
dc8c34
 	/* lock new entry in cache to prevent usage until we are complete */
dc8c34
 	cache_lock_entry( &inst->inst_cache, ec );
dc8c34
+	ec_locked = 1;
dc8c34
 
dc8c34
 	postentry = slapi_entry_dup( ec->ep_entry );
dc8c34
 	slapi_pblock_set( pb, SLAPI_ENTRY_POST_OP, postentry );
dc8c34
@@ -861,7 +863,7 @@ common_return:
dc8c34
 	slapi_mods_done(&smods);
dc8c34
 	
dc8c34
 	if(inst){
dc8c34
-		if (cache_is_in_cache( &inst->inst_cache, ec))
dc8c34
+		if (ec_locked || cache_is_in_cache( &inst->inst_cache, ec))
dc8c34
 		{
dc8c34
 			cache_unlock_entry( &inst->inst_cache, ec);
dc8c34
 		} else if (e) {
dc8c34
-- 
dc8c34
2.4.3
dc8c34