From a72ae6523fc66a21ced5b5ab04c23e1629ae4d20 Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Thu, 20 Dec 2007 17:45:49 +0000
Subject: [PATCH] Updated indexes to order the keys before inserting them into the database. This assures no deadlocks will occur between multiple adds and mods.  Disabled lock timeouts for add and mod operations since deadlocks can not occur. This prevents txn aborts and op retry expiration due to lock timeouts of add and mod operations when the server is under high write load. 

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestBackendImpl.java |  130 +++++++++++++++++++++---------------------
 1 files changed, 65 insertions(+), 65 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 10f0180..74b0b5d 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
@@ -804,7 +804,7 @@
     EntryID entryID;
     AttributeType attribute;
     AttributeIndex index;
-    HashSet<ASN1OctetString> addKeys;
+    HashSet<byte[]> addKeys;
     DatabaseEntry key;
     PresenceIndexer presenceIndexer;
     EqualityIndexer equalityIndexer;
@@ -843,47 +843,47 @@
       index = ec.getAttributeIndex(attribute);
 
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       presenceIndexer = new PresenceIndexer(index.getAttributeType());
       presenceIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(index.presenceIndex.containsID(null, key, entryID),
           ConditionResult.FALSE);
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       equalityIndexer = new EqualityIndexer(index.getAttributeType());
       equalityIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(index.equalityIndex.containsID(null, key, entryID),
           ConditionResult.FALSE);
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       substringIndexer = new SubstringIndexer(index.getAttributeType(),
                    index.getConfiguration().getSubstringLength());
       substringIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(index.substringIndex.containsID(null, key, entryID),
           ConditionResult.FALSE);
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       orderingIndexer = new OrderingIndexer(index.getAttributeType());
       orderingIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(index.orderingIndex.containsID(null, key, entryID),
           ConditionResult.FALSE);
@@ -903,7 +903,7 @@
     EntryID entryID;
     AttributeType attribute;
     AttributeIndex index;
-    HashSet<ASN1OctetString> addKeys;
+    HashSet<byte[]> addKeys;
     DatabaseEntry key;
     EqualityIndexer equalityIndexer;
     SubstringIndexer substringIndexer;
@@ -943,66 +943,66 @@
       attribute = entry.getAttribute("cn").get(0).getAttributeType();
       index = ec.getAttributeIndex(attribute);
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       orderingIndexer = new OrderingIndexer(index.getAttributeType());
       orderingIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(index.orderingIndex.containsID(null, key, entryID),
           ConditionResult.TRUE);
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       orderingIndexer.indexEntry(null, oldEntry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(index.orderingIndex.containsID(null, key, entryID),
                    ConditionResult.FALSE);
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       substringIndexer = new SubstringIndexer(index.getAttributeType(),
                                               index.getConfiguration().getSubstringLength());
       substringIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(index.substringIndex.containsID(null, key, entryID),
                    ConditionResult.TRUE);
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       substringIndexer.indexEntry(null, oldEntry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(index.substringIndex.containsID(null, key, entryID),
                    ConditionResult.FALSE);
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       equalityIndexer = new EqualityIndexer(index.getAttributeType());
       equalityIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(index.equalityIndex.containsID(null, key, entryID),
           ConditionResult.TRUE);
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       equalityIndexer.indexEntry(null, oldEntry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(index.equalityIndex.containsID(null, key, entryID),
           ConditionResult.FALSE);
@@ -1024,7 +1024,7 @@
     AttributeType attribute;
     AttributeIndex titleIndex;
     AttributeIndex nameIndex;
-    HashSet<ASN1OctetString> addKeys;
+    HashSet<byte[]> addKeys;
     DatabaseEntry key;
     PresenceIndexer presenceIndexer;
     EqualityIndexer equalityIndexer;
@@ -1097,21 +1097,21 @@
       nameIndex = ec.getAttributeIndex(attribute);
 
       //This current entry in the DB shouldn't be in the presence titleIndex.
-      addKeys = new HashSet<ASN1OctetString>();
-      addKeys.add(new ASN1OctetString(AttributeIndex.presenceKey.getData()));
+      addKeys = new HashSet<byte[]>();
+      addKeys.add(AttributeIndex.presenceKey.getData());
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(titleIndex.presenceIndex.containsID(null, key, entryID),
           ConditionResult.FALSE);
 
       //This current entry should be in the presence nameIndex.
-      addKeys = new HashSet<ASN1OctetString>();
-      addKeys.add(new ASN1OctetString(AttributeIndex.presenceKey.getData()));
+      addKeys = new HashSet<byte[]>();
+      addKeys.add(AttributeIndex.presenceKey.getData());
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
       }
       assertEquals(nameIndex.presenceIndex.containsID(null, key, entryID),
           ConditionResult.TRUE);
@@ -1176,92 +1176,92 @@
       assertFalse(entry.getAttribute("employeenumber").contains(new
           Attribute("employeenumber", "1")));
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       presenceIndexer = new PresenceIndexer(titleIndex.getAttributeType());
       presenceIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
         assertEquals(titleIndex.presenceIndex.containsID(null, key, entryID),
           ConditionResult.TRUE);
       }
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       presenceIndexer = new PresenceIndexer(nameIndex.getAttributeType());
       presenceIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
         assertEquals(nameIndex.presenceIndex.containsID(null, key, entryID),
           ConditionResult.TRUE);
       }
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       orderingIndexer = new OrderingIndexer(titleIndex.getAttributeType());
       orderingIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
         assertEquals(titleIndex.orderingIndex.containsID(null, key, entryID),
           ConditionResult.TRUE);
       }
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       orderingIndexer = new OrderingIndexer(nameIndex.getAttributeType());
       orderingIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
         assertEquals(nameIndex.orderingIndex.containsID(null, key, entryID),
           ConditionResult.TRUE);
       }
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       equalityIndexer = new EqualityIndexer(titleIndex.getAttributeType());
       equalityIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
         assertEquals(titleIndex.equalityIndex.containsID(null, key, entryID),
           ConditionResult.TRUE);
       }
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       equalityIndexer = new EqualityIndexer(nameIndex.getAttributeType());
       equalityIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
         assertEquals(nameIndex.equalityIndex.containsID(null, key, entryID),
           ConditionResult.TRUE);
       }
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       substringIndexer = new SubstringIndexer(titleIndex.getAttributeType(),
                    titleIndex.getConfiguration().getSubstringLength());
       substringIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
         assertEquals(titleIndex.substringIndex.containsID(null, key, entryID),
           ConditionResult.TRUE);
       }
 
-      addKeys = new HashSet<ASN1OctetString>();
+      addKeys = new HashSet<byte[]>();
       substringIndexer = new SubstringIndexer(nameIndex.getAttributeType(),
                    nameIndex.getConfiguration().getSubstringLength());
       substringIndexer.indexEntry(null, entry, addKeys);
 
       key = new DatabaseEntry();
-      for (ASN1OctetString keyBytes : addKeys) {
-        key.setData(keyBytes.value());
+      for (byte[] keyBytes : addKeys) {
+        key.setData(keyBytes);
         assertEquals(nameIndex.substringIndex.containsID(null, key, entryID),
           ConditionResult.TRUE);
       }

--
Gitblit v1.10.0