From f6f44d80e15b638b013a725396a8d7fe03031a1f Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Tue, 06 May 2008 22:12:59 +0000
Subject: [PATCH] Fixed an issue where a NPE could be thrown when the server processes a mod DN operation with a new superior entry thats in the subtree to be moved. An informative error message is added so the user can fix the mistake. 

---
 opends/resource/schema/02-config.ldif                                                               |    6 ---
 opends/src/messages/messages/core.properties                                                        |    3 +
 opends/src/admin/defn/org/opends/server/admin/std/LocalDBBackendConfiguration.xml                   |   24 ------------
 opends/src/server/org/opends/server/backends/jeb/EntryContainer.java                                |   32 ++++++---------
 opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyDNOperation.java |    7 +++
 opends/src/messages/messages/jeb.properties                                                         |    2 
 opends/resource/config/config.ldif                                                                  |    1 
 opends/src/admin/defn/org/opends/server/admin/std/DebugLogPublisherConfiguration.xml                |    6 +-
 opends/src/server/org/opends/server/backends/jeb/ID2Entry.java                                      |    3 -
 opends/tests/unit-tests-testng/resource/config-changes.ldif                                         |    5 --
 10 files changed, 28 insertions(+), 61 deletions(-)

diff --git a/opends/resource/config/config.ldif b/opends/resource/config/config.ldif
index 6505f36..adf3f86 100644
--- a/opends/resource/config/config.ldif
+++ b/opends/resource/config/config.ldif
@@ -184,7 +184,6 @@
 ds-cfg-import-queue-size: 100
 ds-cfg-import-thread-count: 8
 ds-cfg-entries-compressed: false
-ds-cfg-deadlock-retry-limit: 10
 ds-cfg-compact-encoding: true
 ds-cfg-db-cache-percent: 10
 ds-cfg-db-cache-size: 0 megabytes
diff --git a/opends/resource/schema/02-config.ldif b/opends/resource/schema/02-config.ldif
index ea3c10a..0e956e1 100644
--- a/opends/resource/schema/02-config.ldif
+++ b/opends/resource/schema/02-config.ldif
@@ -1100,11 +1100,6 @@
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
   SINGLE-VALUE
   X-ORIGIN 'OpenDS Directory Server' )
-attributeTypes: ( 1.3.6.1.4.1.26027.1.1.225
-  NAME 'ds-cfg-deadlock-retry-limit'
-  SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
-  SINGLE-VALUE
-  X-ORIGIN 'OpenDS Directory Server' )
 attributeTypes: ( 1.3.6.1.4.1.26027.1.1.226
   NAME 'ds-cfg-db-evictor-lru-only'
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
@@ -2280,7 +2275,6 @@
         ds-cfg-import-queue-size $
         ds-cfg-import-thread-count $
         ds-cfg-entries-compressed $
-        ds-cfg-deadlock-retry-limit $
         ds-cfg-db-directory-permissions $
         ds-cfg-db-cache-percent $
         ds-cfg-subtree-delete-batch-size $
diff --git a/opends/src/admin/defn/org/opends/server/admin/std/DebugLogPublisherConfiguration.xml b/opends/src/admin/defn/org/opends/server/admin/std/DebugLogPublisherConfiguration.xml
index 695a5d6..4486b00 100644
--- a/opends/src/admin/defn/org/opends/server/admin/std/DebugLogPublisherConfiguration.xml
+++ b/opends/src/admin/defn/org/opends/server/admin/std/DebugLogPublisherConfiguration.xml
@@ -230,7 +230,7 @@
     </adm:synopsis>
     <adm:default-behavior>
       <adm:defined>
-        <adm:value>false</adm:value>
+        <adm:value>true</adm:value>
       </adm:defined>
     </adm:default-behavior>
     <adm:syntax>
@@ -249,11 +249,11 @@
     </adm:synopsis>
     <adm:default-behavior>
       <adm:defined>
-        <adm:value>0</adm:value>
+        <adm:value>2147483647</adm:value>
       </adm:defined>
     </adm:default-behavior>
     <adm:syntax>
-      <adm:integer lower-limit="0" />
+      <adm:integer lower-limit="0" upper-limit="2147483647" />
     </adm:syntax>
     <adm:profile name="ldap">
       <ldap:attribute>
diff --git a/opends/src/admin/defn/org/opends/server/admin/std/LocalDBBackendConfiguration.xml b/opends/src/admin/defn/org/opends/server/admin/std/LocalDBBackendConfiguration.xml
index ac512a8..f292d24 100644
--- a/opends/src/admin/defn/org/opends/server/admin/std/LocalDBBackendConfiguration.xml
+++ b/opends/src/admin/defn/org/opends/server/admin/std/LocalDBBackendConfiguration.xml
@@ -124,30 +124,6 @@
       </adm:defined>
     </adm:default-behavior>
   </adm:property-override>
-  <adm:property name="deadlock-retry-limit" advanced="true">
-    <adm:synopsis>
-      Specifies the number of times that the server should retry an
-      attempted operation in the backend if a deadlock results from two
-      concurrent requests that interfere with each other in a
-      conflicting manner.
-    </adm:synopsis>
-    <adm:description>
-      A value of "0" indicates no limit.
-    </adm:description>
-    <adm:default-behavior>
-      <adm:defined>
-        <adm:value>10</adm:value>
-      </adm:defined>
-    </adm:default-behavior>
-    <adm:syntax>
-      <adm:integer lower-limit="0" upper-limit="2147483647" />
-    </adm:syntax>
-    <adm:profile name="ldap">
-      <ldap:attribute>
-        <ldap:name>ds-cfg-deadlock-retry-limit</ldap:name>
-      </ldap:attribute>
-    </adm:profile>
-  </adm:property>
   <adm:property name="db-directory" mandatory="true">
     <adm:TODO>Default this to the db/backend-id</adm:TODO>
     <adm:synopsis>
diff --git a/opends/src/messages/messages/core.properties b/opends/src/messages/messages/core.properties
index cbd716f..17e171d 100644
--- a/opends/src/messages/messages/core.properties
+++ b/opends/src/messages/messages/core.properties
@@ -1768,3 +1768,6 @@
   canceled
 MILD_ERR_CANNOT_CANCEL_CANCEL_701=Cancel extended operations can not be \
   canceled
+MILD_ERR_MODDN_NEW_SUPERIOR_IN_SUBTREE_702=The modify DN operation \
+ for entry %s cannot be performed because the new superior entry %s is equal \
+ to or a subordinate of the entry to be moved
diff --git a/opends/src/messages/messages/jeb.properties b/opends/src/messages/messages/jeb.properties
index 0fbe03b..124004d 100644
--- a/opends/src/messages/messages/jeb.properties
+++ b/opends/src/messages/messages/jeb.properties
@@ -73,7 +73,7 @@
  have indexing of type '%s' because it does not have a corresponding matching \
  rule
 MILD_ERR_JEB_UNCHECKED_EXCEPTION_28=Unchecked exception during database \
- transaction
+ transaction: %s
 NOTICE_JEB_CLEAN_DATABASE_START_29=Starting database cleaning on %d log \
  file(s) in '%s'
 NOTICE_JEB_CLEAN_DATABASE_MARKED_30=Marked %d log file(s) for cleaning
diff --git a/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java b/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
index c3faf07..903e8cd 100644
--- a/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/EntryContainer.java
@@ -194,7 +194,6 @@
   /**
    * Cached value from config so they don't have to be retrieved per operation.
    */
-  private int deadlockRetryLimit;
 
   private int subtreeDeleteSizeLimit;
 
@@ -501,7 +500,6 @@
     }
     this.databasePrefix = builder.toString();
 
-    this.deadlockRetryLimit = config.getDeadlockRetryLimit();
     this.subtreeDeleteSizeLimit = config.getSubtreeDeleteSizeLimit();
     this.subtreeDeleteBatchSize = config.getSubtreeDeleteBatchSize();
 
@@ -1781,7 +1779,6 @@
   {
     // Attempt the operation under a transaction until it fails or completes.
     boolean completed = false;
-    int retryRemaining = deadlockRetryLimit;
     while (!completed)
     {
       // Start a transaction.
@@ -1796,18 +1793,6 @@
         EntryContainer.transactionCommit(txn);
         completed = true;
       }
-      catch (DeadlockException deadlockException)
-      {
-        EntryContainer.transactionAbort(txn);
-        if (retryRemaining-- <= 0)
-        {
-          throw deadlockException;
-        }
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, deadlockException);
-        }
-      }
       catch (DatabaseException databaseException)
       {
         EntryContainer.transactionAbort(txn);
@@ -1827,7 +1812,12 @@
       {
         EntryContainer.transactionAbort(txn);
 
-        Message message = ERR_JEB_UNCHECKED_EXCEPTION.get();
+        String msg = e.getMessage();
+        if (msg == null)
+        {
+          msg = stackTraceToSingleLineString(e);
+        }
+        Message message = ERR_JEB_UNCHECKED_EXCEPTION.get(msg);
         throw new JebException(message, e);
       }
     }
@@ -4247,8 +4237,13 @@
         {
           transactionAbort(txn);
 
-          Message message = ERR_JEB_UNCHECKED_EXCEPTION.get();
-          throw new JebException(message, e);
+        String msg = e.getMessage();
+        if (msg == null)
+        {
+          msg = stackTraceToSingleLineString(e);
+        }
+        Message message = ERR_JEB_UNCHECKED_EXCEPTION.get(msg);
+        throw new JebException(message, e);
         }
       }
       else
@@ -4349,7 +4344,6 @@
     id2entry.setDataConfig(entryDataConfig);
 
     this.config = cfg;
-    this.deadlockRetryLimit = config.getDeadlockRetryLimit();
     this.subtreeDeleteSizeLimit = config.getSubtreeDeleteSizeLimit();
     this.subtreeDeleteBatchSize = config.getSubtreeDeleteBatchSize();
     return new ConfigChangeResult(ResultCode.SUCCESS,
diff --git a/opends/src/server/org/opends/server/backends/jeb/ID2Entry.java b/opends/src/server/org/opends/server/backends/jeb/ID2Entry.java
index 80c5fc3..9378e9b 100644
--- a/opends/src/server/org/opends/server/backends/jeb/ID2Entry.java
+++ b/opends/src/server/org/opends/server/backends/jeb/ID2Entry.java
@@ -223,8 +223,7 @@
     DatabaseEntry data = new DatabaseEntry();
 
     OperationStatus status;
-    status = read(txn, key, data,
-                                 LockMode.DEFAULT);
+    status = read(txn, key, data, lockMode);
 
     if (status != OperationStatus.SUCCESS)
     {
diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyDNOperation.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyDNOperation.java
index 85ce265..52ddf08 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyDNOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendModifyDNOperation.java
@@ -233,6 +233,13 @@
       }
       else
       {
+        if(newSuperior.isDescendantOf(entryDN))
+        {
+          setResultCode(ResultCode.UNWILLING_TO_PERFORM);
+          appendErrorMessage(ERR_MODDN_NEW_SUPERIOR_IN_SUBTREE.get(
+              String.valueOf(entryDN), String.valueOf(newSuperior)));
+          break modifyDNProcessing;
+        }
         parentDN = newSuperior;
       }
 
diff --git a/opends/tests/unit-tests-testng/resource/config-changes.ldif b/opends/tests/unit-tests-testng/resource/config-changes.ldif
index b3e4d04..514ed0c 100644
--- a/opends/tests/unit-tests-testng/resource/config-changes.ldif
+++ b/opends/tests/unit-tests-testng/resource/config-changes.ldif
@@ -425,7 +425,6 @@
 ds-cfg-import-queue-size: 100
 ds-cfg-import-thread-count: 8
 ds-cfg-entries-compressed: false
-ds-cfg-deadlock-retry-limit: 10
 ds-cfg-db-cache-percent: 2
 
 dn: ds-cfg-attribute=oncRpcNumber,cn=Index,ds-cfg-backend-id=userRoot,cn=Backends,cn=config
@@ -659,7 +658,6 @@
 ds-cfg-import-queue-size: 100
 ds-cfg-import-thread-count: 8
 ds-cfg-entries-compressed: false
-ds-cfg-deadlock-retry-limit: 10
 ds-cfg-db-cache-percent: 2
 
 dn: cn=VLV Index,ds-cfg-backend-id=rebuildRoot,cn=Backends,cn=config
@@ -833,7 +831,6 @@
 ds-cfg-import-queue-size: 100
 ds-cfg-import-thread-count: 8
 ds-cfg-entries-compressed: false
-ds-cfg-deadlock-retry-limit: 10
 ds-cfg-db-cache-percent: 2
 
 dn: cn=VLV Index,ds-cfg-backend-id=importRoot,cn=Backends,cn=config
@@ -1002,7 +999,6 @@
 ds-cfg-import-queue-size: 100
 ds-cfg-import-thread-count: 8
 ds-cfg-entries-compressed: false
-ds-cfg-deadlock-retry-limit: 10
 ds-cfg-db-cache-percent: 2
 
 dn: cn=VLV Index,ds-cfg-backend-id=verifyRoot,cn=Backends,cn=config
@@ -1205,7 +1201,6 @@
 ds-cfg-import-queue-size: 100
 ds-cfg-import-thread-count: 8
 ds-cfg-entries-compressed: false
-ds-cfg-deadlock-retry-limit: 10
 ds-cfg-db-cache-percent: 2
 
 dn: cn=VLV Index,ds-cfg-backend-id=indexRoot,cn=Backends,cn=config

--
Gitblit v1.10.0