| | |
| | | import org.opends.messages.Severity; |
| | | import org.opends.server.protocols.internal.InternalClientConnection; |
| | | import org.opends.server.protocols.internal.InternalSearchOperation; |
| | | import org.opends.server.replication.plugin.ReplicationBroker; |
| | | import org.opends.server.replication.plugin.ReplicationDomain; |
| | | import org.opends.server.replication.service.ReplicationBroker; |
| | | import org.opends.server.replication.plugin.LDAPReplicationDomain; |
| | | import org.opends.server.replication.protocol.DoneMsg; |
| | | import org.opends.server.replication.protocol.EntryMsg; |
| | | import org.opends.server.replication.protocol.ErrorMsg; |
| | |
| | | ReplicationServer changelog2 = null; |
| | | ReplicationServer changelog3 = null; |
| | | boolean emptyOldChanges = true; |
| | | ReplicationDomain replDomain = null; |
| | | LDAPReplicationDomain replDomain = null; |
| | | |
| | | private void log(String s) |
| | | { |
| | |
| | | // re-enabled and this clears the backend reference and thus the underlying |
| | | // data. So for this particular test, we use a classical backend. Let's |
| | | // clear it. |
| | | ReplicationDomain.clearJEBackend(false, "userRoot", EXAMPLE_DN); |
| | | LDAPReplicationDomain.clearJEBackend(false, "userRoot", EXAMPLE_DN); |
| | | |
| | | updatedEntries = newLDIFEntries(); |
| | | |
| | |
| | | connection = InternalClientConnection.getRootConnection(); |
| | | |
| | | synchroServerEntry = null; |
| | | replServerEntry = null; |
| | | replServerEntry = null; |
| | | |
| | | taskInitFromS2 = TestCaseUtils.makeEntry( |
| | | "dn: ds-task-id=" + UUID.randomUUID() + |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-from-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTask", |
| | | "ds-task-initialize-domain-dn: " + EXAMPLE_DN, |
| | | "ds-task-initialize-replica-server-id: " + server2ID); |
| | | |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTargetTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTargetTask", |
| | | "ds-task-initialize-domain-dn: " + EXAMPLE_DN, |
| | | "ds-task-initialize-replica-server-id: " + server2ID); |
| | | |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTargetTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTargetTask", |
| | | "ds-task-initialize-domain-dn: " + EXAMPLE_DN, |
| | | "ds-task-initialize-replica-server-id: all"); |
| | | } |
| | |
| | | { |
| | | break; |
| | | } |
| | | Thread.sleep(10); |
| | | Thread.sleep(100); |
| | | } |
| | | } while (completionTime == null); |
| | | |
| | |
| | | // Send entries |
| | | try |
| | | { |
| | | RoutableMsg initTargetMessage = new InitializeTargetMsg( |
| | | baseDn, server2ID, destinationServerID, requestorID, updatedEntries.length); |
| | | RoutableMsg initTargetMessage = |
| | | new InitializeTargetMsg( |
| | | EXAMPLE_DN, server2ID, destinationServerID, requestorID, |
| | | updatedEntries.length); |
| | | broker.publish(initTargetMessage); |
| | | |
| | | for (String entry : updatedEntries) |
| | |
| | | { |
| | | EntryMsg em = (EntryMsg)msg; |
| | | log("Broker " + serverID + " receives entry " + new String(em.getEntryBytes())); |
| | | entriesReceived++; |
| | | entriesReceived+=countEntryLimits(em.getEntryBytes()); |
| | | } |
| | | else if (msg instanceof DoneMsg) |
| | | { |
| | |
| | | } |
| | | |
| | | /** |
| | | * Count the number of entries in the provided byte[]. |
| | | * This is based on the hypothesis that the entries are separated |
| | | * by a "\n\n" String. |
| | | * |
| | | * @param entryBytes |
| | | * @return The number of entries in the provided byte[]. |
| | | */ |
| | | private int countEntryLimits(byte[] entryBytes) |
| | | { |
| | | int entryCount = 0; |
| | | int count = 0; |
| | | while (count<=entryBytes.length-2) |
| | | { |
| | | if ((entryBytes[count] == '\n') && (entryBytes[count+1] == '\n')) |
| | | { |
| | | entryCount++; |
| | | count++; |
| | | } |
| | | count++; |
| | | } |
| | | return entryCount; |
| | | } |
| | | |
| | | /** |
| | | * Creates a new replicationServer. |
| | | * @param changelogId The serverID of the replicationServer to create. |
| | | * @return The new replicationServer. |
| | |
| | | ReplServerFakeConfiguration conf = |
| | | new ReplServerFakeConfiguration( |
| | | getChangelogPort(changelogId), |
| | | "initOnlineTest" + getChangelogPort(changelogId) + testCase + "Db", |
| | | "initOnlineTest" + getChangelogPort(changelogId) + testCase + "Db", |
| | | 0, |
| | | changelogId, |
| | | 0, |
| | |
| | | |
| | | |
| | | // Clear the backend |
| | | ReplicationDomain.clearJEBackend(false, "userRoot", EXAMPLE_DN); |
| | | LDAPReplicationDomain.clearJEBackend(false, "userRoot", EXAMPLE_DN); |
| | | |
| | | synchroServerEntry = TestCaseUtils.entryFromLdifString(synchroServerLdif); |
| | | DirectoryServer.getConfigHandler().addEntry(synchroServerEntry, null); |
| | |
| | | "Unable to add the synchronized server"); |
| | | configEntryList.add(synchroServerEntry.getDN()); |
| | | |
| | | replDomain = ReplicationDomain.retrievesReplicationDomain(baseDn); |
| | | replDomain = LDAPReplicationDomain.retrievesReplicationDomain(baseDn); |
| | | |
| | | assertTrue(!replDomain.ieRunning(), |
| | | "ReplicationDomain: Import/Export is not expected to be running"); |
| | |
| | | server2 = openReplicationSession(DN.decode(EXAMPLE_DN), |
| | | server2ID, 100, getChangelogPort(changelog1ID), 1000, emptyOldChanges); |
| | | |
| | | Thread.sleep(2000); |
| | | // Thread.sleep(2000); |
| | | |
| | | // In S1 launch the total update |
| | | addTask(taskInitFromS2, ResultCode.SUCCESS, null); |
| | |
| | | catch(Exception e) |
| | | { |
| | | fail(testCase + " Exception:"+ e.getMessage() + " " + stackTraceToSingleLineString(e)); |
| | | } finally |
| | | } finally |
| | | { |
| | | afterTest(); |
| | | } |
| | |
| | | String testCase = "initializeExport"; |
| | | |
| | | log("Starting "+testCase); |
| | | |
| | | |
| | | try |
| | | { |
| | | changelog1 = createChangelogServer(changelog1ID, testCase); |
| | |
| | | server2 = openReplicationSession(DN.decode(EXAMPLE_DN), |
| | | server2ID, 100, getChangelogPort(changelog1ID), 1000, emptyOldChanges); |
| | | |
| | | Thread.sleep(3000); |
| | | // Not needed anymore since OpenReplicationSession |
| | | // checks for session establishment ? |
| | | // Thread.sleep(3000); |
| | | |
| | | InitializeRequestMsg initMsg = new InitializeRequestMsg(baseDn, |
| | | InitializeRequestMsg initMsg = new InitializeRequestMsg(EXAMPLE_DN, |
| | | server2ID, server1ID); |
| | | server2.publish(initMsg); |
| | | |
| | |
| | | String testCase = "initializeTargetExport"; |
| | | |
| | | log("Starting " + testCase); |
| | | |
| | | |
| | | try |
| | | { |
| | | |
| | |
| | | server2 = openReplicationSession(DN.decode(EXAMPLE_DN), |
| | | server2ID, 100, getChangelogPort(changelog1ID), 1000, emptyOldChanges); |
| | | |
| | | Thread.sleep(1000); |
| | | // Thread.sleep(1000); |
| | | |
| | | // Launch in S1 the task that will initialize S2 |
| | | addTask(taskInitTargetS2, ResultCode.SUCCESS, null); |
| | |
| | | server3 = openReplicationSession(DN.decode(EXAMPLE_DN), |
| | | server3ID, 100, getChangelogPort(changelog1ID), 1000, emptyOldChanges); |
| | | |
| | | Thread.sleep(1000); |
| | | // Thread.sleep(1000); |
| | | |
| | | // Launch in S1 the task that will initialize S2 |
| | | addTask(taskInitTargetAll, ResultCode.SUCCESS, null); |
| | |
| | | // S2 publishes entries to S1 |
| | | makeBrokerPublishEntries(server2, server2ID, server1ID, server2ID); |
| | | |
| | | Thread.sleep(10000); // FIXME - how to know the import is done |
| | | // wait until the replication domain has expected generationID |
| | | // this should indicate that the import occured correctly. |
| | | for (int count = 0; count < 100; count++) |
| | | { |
| | | if (replDomain.getGenerationID() == 56869) |
| | | break; |
| | | Thread.sleep(200); |
| | | } |
| | | |
| | | // Test that entries have been imported in S1 |
| | | testEntriesInDb(); |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTargetTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTargetTask", |
| | | "ds-task-initialize-domain-dn: foo", |
| | | "ds-task-initialize-remote-replica-server-id: " + server2ID); |
| | | addTask(taskInitTarget, ResultCode.INVALID_DN_SYNTAX, |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTargetTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTargetTask", |
| | | "ds-task-initialize-domain-dn: dc=foo", |
| | | "ds-task-initialize-remote-replica-server-id: " + server2ID); |
| | | addTask(taskInitTarget, ResultCode.OTHER, |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-from-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTask", |
| | | "ds-task-initialize-domain-dn: foo", |
| | | "ds-task-initialize-replica-server-id: " + server2ID); |
| | | addTask(taskInit, ResultCode.INVALID_DN_SYNTAX, |
| | | ERR_TASK_INITIALIZE_INVALID_DN.get()); |
| | | ERR_NO_MATCHING_DOMAIN.get()); |
| | | |
| | | // Domain base dn not related to any domain |
| | | taskInit = TestCaseUtils.makeEntry( |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-from-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTask", |
| | | "ds-task-initialize-domain-dn: dc=foo", |
| | | "ds-task-initialize-replica-server-id: " + server2ID); |
| | | addTask(taskInit, ResultCode.OTHER, ERR_NO_MATCHING_DOMAIN.get()); |
| | | addTask(taskInit, ResultCode.INVALID_DN_SYNTAX, |
| | | ERR_NO_MATCHING_DOMAIN.get()); |
| | | |
| | | // Invalid Source |
| | | taskInit = TestCaseUtils.makeEntry( |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-from-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTask", |
| | | "ds-task-initialize-domain-dn: " + baseDn, |
| | | "ds-task-initialize-replica-server-id: -3"); |
| | | addTask(taskInit, ResultCode.OTHER, |
| | |
| | | |
| | | // Check that the list of connected LDAP servers is correct |
| | | // in each replication servers |
| | | List<String> l1 = changelog1.getReplicationServerDomain(baseDn, false). |
| | | List<String> l1 = changelog1.getReplicationServerDomain( |
| | | baseDn.toNormalizedString(), false). |
| | | getConnectedLDAPservers(); |
| | | assertEquals(l1.size(), 1); |
| | | assertEquals(l1.get(0), String.valueOf(server1ID)); |
| | | |
| | | List<String> l2; |
| | | l2 = changelog2.getReplicationServerDomain(baseDn, false).getConnectedLDAPservers(); |
| | | l2 = changelog2.getReplicationServerDomain( |
| | | baseDn.toNormalizedString(), false).getConnectedLDAPservers(); |
| | | assertEquals(l2.size(), 2); |
| | | assertTrue(l2.contains(String.valueOf(server2ID))); |
| | | assertTrue(l2.contains(String.valueOf(server3ID))); |
| | | |
| | | List<String> l3; |
| | | l3 = changelog3.getReplicationServerDomain(baseDn, false).getConnectedLDAPservers(); |
| | | l3 = changelog3.getReplicationServerDomain( |
| | | baseDn.toNormalizedString(), false).getConnectedLDAPservers(); |
| | | assertEquals(l3.size(), 0); |
| | | |
| | | // Test updates |
| | | broker3.stop(); |
| | | Thread.sleep(1000); |
| | | l2 = changelog2.getReplicationServerDomain(baseDn, false).getConnectedLDAPservers(); |
| | | l2 = changelog2.getReplicationServerDomain( |
| | | baseDn.toNormalizedString(), false).getConnectedLDAPservers(); |
| | | assertEquals(l2.size(), 1); |
| | | assertEquals(l2.get(0), String.valueOf(server2ID)); |
| | | |
| | |
| | | server3ID, 100, getChangelogPort(changelog2ID), 1000, emptyOldChanges); |
| | | broker2.stop(); |
| | | Thread.sleep(1000); |
| | | l2 = changelog2.getReplicationServerDomain(baseDn, false).getConnectedLDAPservers(); |
| | | l2 = changelog2.getReplicationServerDomain( |
| | | baseDn.toNormalizedString(), false).getConnectedLDAPservers(); |
| | | assertEquals(l2.size(), 1); |
| | | assertEquals(l2.get(0), String.valueOf(server3ID)); |
| | | |
| | |
| | | afterTest(); |
| | | } |
| | | } |
| | | |
| | | |
| | | @Test(enabled=true, groups="slow") |
| | | public void initializeTargetExportMultiSS() throws Exception |
| | | { |
| | |
| | | server2ID, 100, getChangelogPort(changelog2ID), 1000, emptyOldChanges); |
| | | } |
| | | |
| | | Thread.sleep(1000); |
| | | // Thread.sleep(1000); |
| | | |
| | | // Launch in S1 the task that will initialize S2 |
| | | addTask(taskInitTargetS2, ResultCode.SUCCESS, null); |
| | |
| | | log(testCase + " Will connect server 2 to " + changelog2ID); |
| | | server2 = openReplicationSession(DN.decode(EXAMPLE_DN), |
| | | server2ID, 100, getChangelogPort(changelog2ID), |
| | | 1000, emptyOldChanges, changelog1.getGenerationId(baseDn)); |
| | | 1000, emptyOldChanges, |
| | | changelog1.getGenerationId(baseDn.toNormalizedString())); |
| | | } |
| | | |
| | | // Connect a broker acting as server 3 to Repl Server 3 |
| | |
| | | log(testCase + " Will connect server 3 to " + changelog3ID); |
| | | server3 = openReplicationSession(DN.decode(EXAMPLE_DN), |
| | | server3ID, 100, getChangelogPort(changelog3ID), |
| | | 1000, emptyOldChanges, changelog1.getGenerationId(baseDn)); |
| | | 1000, emptyOldChanges, |
| | | changelog1.getGenerationId(baseDn.toNormalizedString())); |
| | | } |
| | | |
| | | Thread.sleep(500); |
| | | // Thread.sleep(500); |
| | | |
| | | // S3 sends init request |
| | | log(testCase + " server 3 Will send reqinit to " + server1ID); |
| | | InitializeRequestMsg initMsg = |
| | | new InitializeRequestMsg(baseDn, server3ID, server1ID); |
| | | new InitializeRequestMsg(EXAMPLE_DN, server3ID, server1ID); |
| | | server3.publish(initMsg); |
| | | |
| | | // S3 should receive target, entries & done |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-from-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTask", |
| | | "ds-task-initialize-domain-dn: " + baseDn, |
| | | "ds-task-initialize-replica-server-id: " + 20); |
| | | |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-from-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTask", |
| | | "ds-task-initialize-domain-dn: " + baseDn, |
| | | "ds-task-initialize-replica-server-id: " + server1ID); |
| | | |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTargetTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTargetTask", |
| | | "ds-task-initialize-domain-dn: " + baseDn, |
| | | "ds-task-initialize-replica-server-id: " + 0); |
| | | |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-from-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTask", |
| | | "ds-task-initialize-domain-dn: " + baseDn, |
| | | "ds-task-initialize-replica-server-id: " + server2ID); |
| | | |
| | |
| | | "objectclass: top", |
| | | "objectclass: ds-task", |
| | | "objectclass: ds-task-initialize-from-remote-replica", |
| | | "ds-task-class-name: org.opends.server.tasks.InitializeTask", |
| | | "ds-task-class-name: org.opends.server.replication.service.InitializeTask", |
| | | "ds-task-initialize-domain-dn: " + baseDn, |
| | | "ds-task-initialize-replica-server-id: " + server2ID); |
| | | |
| | |
| | | super.classCleanUp(); |
| | | |
| | | // Clear the backend |
| | | ReplicationDomain.clearJEBackend(false, "userRoot", EXAMPLE_DN); |
| | | |
| | | LDAPReplicationDomain.clearJEBackend(false, "userRoot", EXAMPLE_DN); |
| | | |
| | | paranoiaCheck(); |
| | | } |
| | | } |