From 8c65daf79d1c7fbe47f556c4d4bba2c2859851d1 Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Mon, 21 Apr 2008 21:08:12 +0000
Subject: [PATCH] This patch adds index buffering capabilities to the JE backend as to avoid using a fixed lock timeout for subtree delete and mod DN operations. Previously, any index modifications to subordinate entries of the affected operations will be performed with dn2id and id2entry modifications. This creates multiple random access to index database keys which could cause deadlocks in face of multiple parallel operations. With this fix, all index modifications are buffered up until the end of the operation so that each key of each index will be accessed once and in order. This maintains the DB access ordering in the JE backend of dn2id, id2entry, dn2uri, indexes in config order, VLV indexes in config order, and finally id2children and id2subtree. Since deadlocks should no longer occur in the JE backend, JE lock timeouts are now disabled at the JE environment level instead of the txn level. With this change, the performance of subtree deletes and mod DN operations have increased dramatically.
---
opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java | 24 ++++++++++++------------
1 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
index 41c7d9f..d8d13b5 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java
@@ -37,7 +37,6 @@
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.protocols.internal.InternalSearchOperation;
import org.opends.server.protocols.ldap.LDAPFilter;
-import org.opends.server.protocols.asn1.ASN1OctetString;
import org.opends.server.types.*;
import org.opends.server.util.Base64;
import static
@@ -50,6 +49,7 @@
import static org.testng.Assert.*;
import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.LockMode;
import org.opends.server.core.DeleteOperationBasis;
import org.opends.server.core.ModifyOperationBasis;
@@ -819,7 +819,7 @@
{
entry = ec.getEntry(DN.decode("uid=user.539,ou=People,dc=test,dc=com"));
entryID = ec.getDN2ID().get(null,
- DN.decode("uid=user.539,ou=People,dc=test,dc=com"));
+ DN.decode("uid=user.539,ou=People,dc=test,dc=com"), LockMode.DEFAULT);
DeleteOperationBasis delete = new DeleteOperationBasis(conn,
conn.nextOperationID(),
@@ -835,7 +835,7 @@
assertFalse(ec.entryExists(DN.decode("uid=user.539,ou=People,dc=test,dc=com")));
assertNull(ec.getDN2ID().get(null,
- DN.decode("uid=user.539,ou=People,dc=test,dc=com")));
+ DN.decode("uid=user.539,ou=People,dc=test,dc=com"), LockMode.DEFAULT));
assertFalse(ec.getDN2URI().delete(null,
DN.decode("uid=user.539,ou=People,dc=test,dc=com")));
@@ -919,7 +919,7 @@
entry = ec.getEntry(DN.decode("uid=user.0,ou=People,dc=test,dc=com"));
oldEntry = entries.get(0);
entryID = ec.getDN2ID().get(null,
- DN.decode("uid=user.0,ou=People,dc=test,dc=com"));
+ DN.decode("uid=user.0,ou=People,dc=test,dc=com"), LockMode.DEFAULT);
assertNotNull(entry);
LinkedHashSet<AttributeValue> values =
@@ -1086,7 +1086,7 @@
newEntry = entries.get(1);
newEntry.applyModifications(modifications);
entry = ec.getEntry(DN.decode("uid=user.1,ou=People,dc=test,dc=com"));
- entryID = ec.getDN2ID().get(null, DN.decode("uid=user.1,ou=People,dc=test,dc=com"));
+ entryID = ec.getDN2ID().get(null, DN.decode("uid=user.1,ou=People,dc=test,dc=com"), LockMode.DEFAULT);
assertNotNull(entryID);
@@ -1290,12 +1290,12 @@
entry, null);
assertNotNull(backend.getEntry(DN.decode("cn=Abbey Abbie,ou=People,dc=test,dc=com")));
- assertNotNull(ec.getDN2ID().get(null, DN.decode("cn=Abbey Abbie,ou=People,dc=test,dc=com")));
+ assertNotNull(ec.getDN2ID().get(null, DN.decode("cn=Abbey Abbie,ou=People,dc=test,dc=com"), LockMode.DEFAULT));
assertNull(backend.getEntry(DN.decode("uid=user.2,ou=People,dc=test,dc=com")));
assertNull(ec.getDN2ID().get(null,
- DN.decode("uid=user.2,ou=People,dc=test,dc=com")));
+ DN.decode("uid=user.2,ou=People,dc=test,dc=com"), LockMode.DEFAULT));
}
finally
{
@@ -1317,9 +1317,9 @@
ec.sharedLock.lock();
try
{
- EntryID newSuperiorID = ec.getDN2ID().get(null, DN.decode("ou=JEB Testers,dc=test,dc=com"));
+ EntryID newSuperiorID = ec.getDN2ID().get(null, DN.decode("ou=JEB Testers,dc=test,dc=com"), LockMode.DEFAULT);
EntryID oldID = ec.getDN2ID().get(null,
- DN.decode("ou=People,dc=test,dc=com"));
+ DN.decode("ou=People,dc=test,dc=com"), LockMode.DEFAULT);
assertTrue(newSuperiorID.compareTo(oldID) > 0);
ArrayList<Control> noControls = new ArrayList<Control>(0);
@@ -1338,17 +1338,17 @@
modifyDN.run();
assertNotNull(backend.getEntry(DN.decode("ou=Good People,ou=JEB Testers,dc=test,dc=com")));
- EntryID newID = ec.getDN2ID().get(null, DN.decode("ou=Good People,ou=JEB Testers,dc=test,dc=com"));
+ EntryID newID = ec.getDN2ID().get(null, DN.decode("ou=Good People,ou=JEB Testers,dc=test,dc=com"), LockMode.DEFAULT);
assertNotNull(newID);
assertTrue(newID.compareTo(newSuperiorID) > 0);
assertNotNull(backend.getEntry(DN.decode("uid=user.0,ou=Good People,ou=JEB Testers,dc=test,dc=com")));
EntryID newSubordinateID = ec.getDN2ID().get(null,
- DN.decode("uid=user.0,ou=Good People,ou=JEB Testers,dc=test,dc=com"));
+ DN.decode("uid=user.0,ou=Good People,ou=JEB Testers,dc=test,dc=com"), LockMode.DEFAULT);
assertTrue(newSubordinateID.compareTo(newID) > 0);
assertNull(backend.getEntry(DN.decode("ou=People,dc=test,dc=com")));
assertNull(ec.getDN2ID().get(null,
- DN.decode("ou=People,dc=test,dc=com")));
+ DN.decode("ou=People,dc=test,dc=com"), LockMode.DEFAULT));
}
finally
{
--
Gitblit v1.10.0