mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

gbellato
06.06.2007 fe4c8ab9a1c15ab0965d235bb9eccbf587cfc93e
fix for 1898 : Conflicts between moddn and del generate server errors

In the solveNamingConflict method, the case when the entry has been
deleted was not correctly tested, thus leading to a NullPointerException,
The fix is simply to return since when the entry has already been deleted
there is not need to change its name anymore.

A test for this case has also been added.
2 files modified
28 ■■■■■ changed files
opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java 11 ●●●●● patch | view | raw | blame | history
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/UpdateOperationTest.java 17 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java
@@ -1612,6 +1612,17 @@
  // get the current DN of this entry in the database.
  DN currentDN = findEntryDN(entryUid);
  if (currentDN == null)
  {
    // The entry targetted by the Modify DN is not in the database
    // anymore.
    // This is a conflict between a delete and this modify DN.
    // The entry has been deleted anymore so we can safely assume
    // that the operation is completed.
    numResolvedNamingConflicts.incrementAndGet();
    return true;
  }
  // if the newDN and the current DN match then the operation
  // is a no-op (this was probably a second replay)
  // don't do anything.
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/UpdateOperationTest.java
@@ -1089,6 +1089,23 @@
    // check that unresolved conflict count has been incremented
    assertEquals(getMonitorDelta(), 1);
    
    // Check that when an entry is deleted on a first master and
    // renamed on a second master and the rename is replayed last
    // this is correctly detected as a resolved conflict.
    // To simulate this simply try a modifyDN on a non existent uid.
    modDnMsg = new ModifyDNMsg(
        "uid=new person,ou=People,dc=example,dc=com", gen.newChangeNumber(),
        "33343333-3533-3633-3373-333333833333", baseUUID, false,
        "uid=wrong, ou=people,dc=example,dc=com",
        "uid=newrdn");
    updateMonitorCount(baseDn, resolvedMonitorAttr);
    broker.publish(modDnMsg);
    // unfortunately it is difficult to check that the operation
    // did not do anything.
    // The only thing we can check is that resolved naminf conflict counter
    // has correctly been incremented.
    assertEquals(getMonitorDelta(), 1);
    broker.stop();
  }