opends/resource/schema/02-config.ldif
@@ -2167,6 +2167,11 @@ SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE X-ORIGIN 'OpenDS Directory Server' ) attributeTypes: ( 1.3.6.1.4.1.26027.1.1.444 NAME 'ds-task-reset-generation-id-new-value' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE X-ORIGIN 'OpenDS Directory Server' ) objectClasses: ( 1.3.6.1.4.1.26027.1.2.1 NAME 'ds-cfg-access-control-handler' SUP top @@ -3330,6 +3335,7 @@ SUP ds-task STRUCTURAL MUST ds-task-reset-generation-id-domain-base-dn MAY ds-task-reset-generation-id-new-value X-ORIGIN 'OpenDS Directory Server' ) objectClasses: ( 1.3.6.1.4.1.26027.1.2.122 NAME 'ds-cfg-entry-uuid-plugin' opends/src/messages/messages/task.properties
@@ -187,3 +187,5 @@ INFO_FAILED_DEPENDENCY_ACTION_CANCEL_100=Cancel INFO_FAILED_DEPENDENCY_ACTION_DISABLE_101=Disable INFO_TASK_STOPPED_BY_ADMIN_102=Task was stopped by an administrator: %s SEVERE_ERR_TASK_INITIALIZE_INVALID_GENERATION_ID_103=Invalid generation ID provided with the \ task opends/src/server/org/opends/server/config/ConfigConstants.java
@@ -4304,6 +4304,13 @@ OC_RESET_GENERATION_ID_TASK + "-domain-base-dn"; /** * The name of the attribute containing the new value of the generation ID * related to the replication domain to which applies the task. */ public static final String ATTR_TASK_SET_GENERATION_ID_NEW_VALUE = OC_RESET_GENERATION_ID_TASK + "-new-value"; /** * The name of the attribute in an import task definition that specifies * whether the backend should be cleared before the import. */ opends/src/server/org/opends/server/replication/plugin/ReplicationDomain.java
@@ -2517,11 +2517,21 @@ * Reset the generationId of this domain in the whole topology. * A message is sent to the Replication Servers for them to reset * their change dbs. * * @param generationIdNewValue The new value of the generation Id. */ public void resetGenerationId() public void resetGenerationId(Long generationIdNewValue) { ResetGenerationId genIdMessage = null; requestedResetSinceLastStart = true; ResetGenerationId genIdMessage = new ResetGenerationId(this.generationId); if (generationIdNewValue == null) { genIdMessage = new ResetGenerationId(this.generationId); } else { genIdMessage = new ResetGenerationId(generationIdNewValue); } broker.publish(genIdMessage); } opends/src/server/org/opends/server/tasks/SetGenerationIdTask.java
@@ -63,6 +63,7 @@ String domainString = null; ReplicationDomain domain = null; TaskState initState; Long generationId = null; private static final void debugInfo(String s) { @@ -85,6 +86,8 @@ */ @Override public void initializeTask() throws DirectoryException { List<Attribute> attrList; if (TaskState.isDone(getTaskState())) { return; @@ -93,13 +96,32 @@ // FIXME -- Do we need any special authorization here? Entry taskEntry = getTaskEntry(); AttributeType typeDomainBase; // Retrieves the eventual generation-ID AttributeType typeNewValue; typeNewValue = getAttributeType(ATTR_TASK_SET_GENERATION_ID_NEW_VALUE, true); attrList = taskEntry.getAttribute(typeNewValue); if ((attrList != null) && !attrList.isEmpty()) { try { generationId = new Long(TaskUtils.getSingleValueString(attrList)); } catch(Exception e) { MessageBuilder mb = new MessageBuilder(); mb.append(TaskMessages.ERR_TASK_INITIALIZE_INVALID_GENERATION_ID.get()); mb.append(e.getMessage()); throw new DirectoryException(ResultCode.CLIENT_SIDE_PARAM_ERROR, mb.toMessage()); } } // Retrieves the replication domain AttributeType typeDomainBase; typeDomainBase = getAttributeType(ATTR_TASK_SET_GENERATION_ID_DOMAIN_DN, true); List<Attribute> attrList; attrList = taskEntry.getAttribute(typeDomainBase); domainString = TaskUtils.getSingleValueString(attrList); DN domainDN = DN.nullDN(); @@ -128,7 +150,7 @@ debugInfo("setGenerationIdTask is starting on domain%s" + domain.getBaseDN()); domain.resetGenerationId(); domain.resetGenerationId(generationId); debugInfo("setGenerationIdTask is ending SUCCESSFULLY"); return TaskState.COMPLETED_SUCCESSFULLY; opends/tests/unit-tests-testng/src/server/org/opends/server/replication/GenerationIdTest.java
@@ -1160,10 +1160,30 @@ debugInfo("Verifying that all replservers genIds have been reset."); genId = readGenId(); assertEquals(replServer2.getGenerationId(baseDn), genId); assertEquals(replServer1.getGenerationId(baseDn), genId); assertEquals(replServer2.getGenerationId(baseDn), genId); assertEquals(replServer3.getGenerationId(baseDn), genId); debugInfo("Adding reset task to DS."); taskReset = TestCaseUtils.makeEntry( "dn: ds-task-id=resetgenid"+ UUID.randomUUID() + ",cn=Scheduled Tasks,cn=Tasks", "objectclass: top", "objectclass: ds-task", "objectclass: ds-task-reset-generation-id", "ds-task-class-name: org.opends.server.tasks.SetGenerationIdTask", "ds-task-reset-generation-id-domain-base-dn: " + baseDnStr, "ds-task-reset-generation-id-new-value: -1"); addTask(taskReset, ResultCode.SUCCESS, null); waitTaskState(taskReset, TaskState.COMPLETED_SUCCESSFULLY, null); Thread.sleep(500); debugInfo("Verifying that all replservers genIds have been reset."); genId = readGenId(); assertEquals(replServer1.getGenerationId(baseDn), -1); assertEquals(replServer2.getGenerationId(baseDn), -1); assertEquals(replServer3.getGenerationId(baseDn), -1); debugInfo("Disconnect DS from replServer1 (required in order to DEL entries)."); disconnectFromReplServer(changelog1ID);