From d5193b4f72a86a30a116b4629d1db5231dd42992 Mon Sep 17 00:00:00 2001
From: gbellato <gbellato@localhost>
Date: Mon, 26 Mar 2007 07:17:13 +0000
Subject: [PATCH] This commit allows to complete issues 504, 505 and 507 by using the new import/export/backup/restore interface to get notifications of import and restore and then resynchronize the server approprietely.

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/StressTest.java                |    2 
 opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ReSyncTest.java                |   23 -----
 opends/src/server/org/opends/server/tasks/RestoreTask.java                                                 |   13 ++
 opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SchemaSynchronizationTest.java |    1 
 opends/src/server/org/opends/server/synchronization/plugin/MultimasterSynchronization.java                 |  177 ++++++++++++++++++++++++++++++++-----------
 opends/src/server/org/opends/server/tasks/ImportTask.java                                                  |   13 ++
 6 files changed, 151 insertions(+), 78 deletions(-)

diff --git a/opends/src/server/org/opends/server/synchronization/plugin/MultimasterSynchronization.java b/opends/src/server/org/opends/server/synchronization/plugin/MultimasterSynchronization.java
index bce232b..e71fd3b 100644
--- a/opends/src/server/org/opends/server/synchronization/plugin/MultimasterSynchronization.java
+++ b/opends/src/server/org/opends/server/synchronization/plugin/MultimasterSynchronization.java
@@ -30,9 +30,14 @@
 import java.util.List;
 import java.util.Map;
 
+import org.opends.server.api.Backend;
+import org.opends.server.api.BackupTaskListener;
 import org.opends.server.api.ConfigAddListener;
 import org.opends.server.api.ConfigChangeListener;
 import org.opends.server.api.ConfigDeleteListener;
+import org.opends.server.api.ExportTaskListener;
+import org.opends.server.api.ImportTaskListener;
+import org.opends.server.api.RestoreTaskListener;
 import org.opends.server.api.SynchronizationProvider;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;
@@ -47,8 +52,12 @@
 import org.opends.server.core.ModifyDNOperation;
 import org.opends.server.core.ModifyOperation;
 import org.opends.server.core.Operation;
+import org.opends.server.types.BackupConfig;
 import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.LDIFExportConfig;
+import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.Modification;
+import org.opends.server.types.RestoreConfig;
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.SynchronizationProviderResult;
 
@@ -63,7 +72,10 @@
  * as pre-op, conflictRsolution, and post-op.
  */
 public class MultimasterSynchronization extends SynchronizationProvider
-       implements ConfigAddListener, ConfigDeleteListener, ConfigChangeListener
+       implements ConfigAddListener, ConfigDeleteListener, ConfigChangeListener,
+       BackupTaskListener, RestoreTaskListener, ImportTaskListener,
+       ExportTaskListener
+
 {
   static String CHANGELOG_DN = "cn=Changelog Server," +
     "cn=Multimaster Synchronization, cn=Synchronization Providers, cn=config";
@@ -131,6 +143,11 @@
     {
       processSchemaChange(offlineSchemaChanges);
     }
+
+    DirectoryServer.registerBackupTaskListener(this);
+    DirectoryServer.registerRestoreTaskListener(this);
+    DirectoryServer.registerExportTaskListener(this);
+    DirectoryServer.registerImportTaskListener(this);
   }
 
   /**
@@ -453,6 +470,11 @@
     // shutdown the Changelog Service if necessary
     if (changelog != null)
       changelog.shutdown();
+
+    DirectoryServer.deregisterBackupTaskListener(this);
+    DirectoryServer.deregisterRestoreTaskListener(this);
+    DirectoryServer.deregisterExportTaskListener(this);
+    DirectoryServer.deregisterImportTaskListener(this);
   }
 
   /**
@@ -504,51 +526,6 @@
     return;
   }
 
-
-  /**
-   * Handle a Notification of restore start from the core server.
-   *
-   * @param dn The baseDn of the restore.
-   */
-  public static void notificationRestoreStart(DN dn)
-  {
-    SynchronizationDomain domain = findDomain(dn, null);
-    domain.disable();
-  }
-
-  /**
-   * Handle a Notification of restore end from the core server.
-   *
-   * @param dn The baseDn of the restore.
-   */
-  public static void notificationRestoreEnd(DN dn)
-  {
-    SynchronizationDomain domain = findDomain(dn, null);
-    domain.enable();
-  }
-
-  /**
-   * Handle a Notification of backup start from the core server.
-   *
-   * @param dn The baseDn of the backup.
-   */
-  public static void notificationBackupStart(DN dn)
-  {
-    SynchronizationDomain domain = findDomain(dn, null);
-    domain.backupStart();
-  }
-
-  /**
-   * Handle a Notification of backup end from the core server.
-   *
-   * @param dn The baseDn of the backup.
-   */
-  public static void notificationBackupEnd(DN dn)
-  {
-    SynchronizationDomain domain = findDomain(dn, null);
-    domain.backupEnd();
-  }
-
   /**
    * This method is called whenever the server detects a modification
    * of the schema done by directly modifying the backing files
@@ -566,6 +543,114 @@
     if (domain != null)
       domain.synchronizeModifications(modifications);
   }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void processBackupBegin(Backend backend, BackupConfig config)
+  {
+    for (DN dn : backend.getBaseDNs())
+    {
+      SynchronizationDomain domain = findDomain(dn, null);
+      if (domain != null)
+        domain.backupStart();
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void processBackupEnd(Backend backend, BackupConfig config,
+                               boolean successful)
+  {
+    for (DN dn : backend.getBaseDNs())
+    {
+      SynchronizationDomain domain = findDomain(dn, null);
+      if (domain != null)
+        domain.backupEnd();
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void processRestoreBegin(Backend backend, RestoreConfig config)
+  {
+    for (DN dn : backend.getBaseDNs())
+    {
+      SynchronizationDomain domain = findDomain(dn, null);
+      if (domain != null)
+        domain.disable();
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void processRestoreEnd(Backend backend, RestoreConfig config,
+                                boolean successful)
+  {
+    for (DN dn : backend.getBaseDNs())
+    {
+      SynchronizationDomain domain = findDomain(dn, null);
+      if (domain != null)
+        domain.enable();
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void processImportBegin(Backend backend, LDIFImportConfig config)
+  {
+    for (DN dn : backend.getBaseDNs())
+    {
+      SynchronizationDomain domain = findDomain(dn, null);
+      if (domain != null)
+        domain.disable();
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void processImportEnd(Backend backend, LDIFImportConfig config,
+                               boolean successful)
+  {
+    for (DN dn : backend.getBaseDNs())
+    {
+      SynchronizationDomain domain = findDomain(dn, null);
+      if (domain != null)
+        domain.enable();
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void processExportBegin(Backend backend, LDIFExportConfig config)
+  {
+    for (DN dn : backend.getBaseDNs())
+    {
+      SynchronizationDomain domain = findDomain(dn, null);
+      if (domain != null)
+        domain.backupStart();
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void processExportEnd(Backend backend, LDIFExportConfig config,
+                               boolean successful)
+  {
+    for (DN dn : backend.getBaseDNs())
+    {
+      SynchronizationDomain domain = findDomain(dn, null);
+      if (domain != null)
+        domain.backupEnd();
+    }
+  }
 }
 
 
diff --git a/opends/src/server/org/opends/server/tasks/ImportTask.java b/opends/src/server/org/opends/server/tasks/ImportTask.java
index 688c4e8..826ac4f 100644
--- a/opends/src/server/org/opends/server/tasks/ImportTask.java
+++ b/opends/src/server/org/opends/server/tasks/ImportTask.java
@@ -32,7 +32,6 @@
 import static org.opends.server.loggers.debug.DebugLogger.debugCaught;
 import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
 import org.opends.server.types.DebugLogLevel;
-import static org.opends.server.loggers.Error.logError;
 import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
 import static org.opends.server.config.ConfigConstants.*;
 import static org.opends.server.core.DirectoryServer.getAttributeType;
@@ -473,6 +472,11 @@
     DN[] baseDNs = new DN[defaultIncludeBranches.size()];
     defaultIncludeBranches.toArray(baseDNs);
 
+    // Notify the task listeners that an import is going to start
+    // this must be done before disabling the backend to allow
+    // listeners to get access to the backend configuration
+    // and to take appropriate actions.
+    DirectoryServer.notifyImportBeginning(backend, importConfig);
 
     // Disable the backend.
     try
@@ -528,9 +532,7 @@
       // Launch the import.
       try
       {
-        DirectoryServer.notifyImportBeginning(backend, importConfig);
         backend.importLDIF(configEntry, baseDNs, importConfig);
-        DirectoryServer.notifyImportEnded(backend, importConfig, true);
       }
       catch (DirectoryException de)
       {
@@ -600,6 +602,10 @@
       try
       {
         TaskUtils.setBackendEnabled(configEntry, true);
+        // It is necessary to retrieve the backend structure again
+        // because disabling and enabling it again may have resulted
+        // in a new backend being registered to the server.
+        backend = DirectoryServer.getBackend(backendID);
       }
       catch (DirectoryException e)
       {
@@ -612,6 +618,7 @@
                  e.getErrorMessage(), e.getErrorMessageID());
         return TaskState.STOPPED_BY_ERROR;
       }
+      DirectoryServer.notifyImportEnded(backend, importConfig, true);
     }
 
 
diff --git a/opends/src/server/org/opends/server/tasks/RestoreTask.java b/opends/src/server/org/opends/server/tasks/RestoreTask.java
index c5b0565..8082c1c 100644
--- a/opends/src/server/org/opends/server/tasks/RestoreTask.java
+++ b/opends/src/server/org/opends/server/tasks/RestoreTask.java
@@ -289,6 +289,11 @@
     RestoreConfig restoreConfig = new RestoreConfig(backupDir, backupID,
                                                     verifyOnly);
 
+    // Notify the task listeners that a restore is going to start
+    // this must be done before disabling the backend to allow
+    // listener to get access to the backend configuration
+    // and to take appropriate actions.
+    DirectoryServer.notifyRestoreBeginning(backend, restoreConfig);
 
     // Disable the backend.
     try
@@ -307,7 +312,6 @@
       return TaskState.STOPPED_BY_ERROR;
     }
 
-
     // From here we must make sure to re-enable the backend before returning.
     boolean errorsEncountered = false;
     try
@@ -321,9 +325,7 @@
           // Perform the restore.
           try
           {
-            DirectoryServer.notifyRestoreBeginning(backend, restoreConfig);
             backend.restoreBackup(configEntry, restoreConfig);
-            DirectoryServer.notifyRestoreEnded(backend, restoreConfig, true);
           }
           catch (DirectoryException de)
           {
@@ -362,6 +364,10 @@
       try
       {
         TaskUtils.setBackendEnabled(configEntry, true);
+        // it is necessary to retrieve the backend structure again
+        // because disabling and enabling it again may have resulted
+        // in a new backend being registered to the server.
+        backend = DirectoryServer.getBackend(backendID);
       }
       catch (DirectoryException e)
       {
@@ -374,6 +380,7 @@
                  e.getErrorMessage(), e.getErrorMessageID());
         errorsEncountered = true;
       }
+      DirectoryServer.notifyRestoreEnded(backend, restoreConfig, true);
     }
 
     if (errorsEncountered)
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ReSyncTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ReSyncTest.java
index 7a1844a..95917ec 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ReSyncTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/ReSyncTest.java
@@ -42,7 +42,6 @@
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.schema.DirectoryStringSyntax;
-import org.opends.server.synchronization.plugin.MultimasterSynchronization;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
@@ -169,10 +168,6 @@
     // we do test something.
     connection.processDelete(DN.decode("dc=foo, dc=example,dc=com"));
 
-    MultimasterSynchronization.notificationBackupStart(
-        DN.decode("dc=example,dc=com")); // TEMPORARY UNTIL core server
-                                        // sends a notification
-
     task("dn: ds-task-id=" + UUID.randomUUID()
         +  ",cn=Scheduled Tasks,cn=Tasks\n"
         + "objectclass: top\n"
@@ -185,9 +180,6 @@
     addEntry("dn: dc=foo, dc=example,dc=com\n"
         + "objectClass: top\n" + "objectClass: domain\n");
 
-    MultimasterSynchronization.notificationRestoreStart(
-        DN.decode("dc=example,dc=com"));// TEMPORARY UNTIL core server
-                                       //  sends a notification
     task("dn: ds-task-id=" + UUID.randomUUID()
         + ",cn=Scheduled Tasks,cn=Tasks\n"
         + "objectclass: top\n"
@@ -197,10 +189,6 @@
         + "ds-backup-directory-path: bak" + File.separator
         + "userRoot\n");
 
-    MultimasterSynchronization.notificationRestoreEnd(
-        DN.decode("dc=example,dc=com"));// TEMPORARY UNTIL core server
-                                       // sends a notification
-
    if (getEntry(DN.decode("dc=foo, dc=example,dc=com"), 30000, true) == null)
      fail("The Directory has not been resynchronized after the restore.");
 
@@ -224,10 +212,6 @@
     // we do test something.
     connection.processDelete(DN.decode("dc=foo, dc=example,dc=com"));
 
-    MultimasterSynchronization.notificationBackupStart(
-        DN.decode("dc=example,dc=com")); // TEMPORARY UNTIL core server
-                                        // sends a notification
-
     String buildRoot = System.getProperty(TestCaseUtils.PROPERTY_BUILD_ROOT);
     String path = buildRoot + File.separator + "build" +
                   File.separator + "unit-tests" + File.separator +
@@ -245,9 +229,6 @@
     addEntry("dn: dc=foo, dc=example,dc=com\n"
         + "objectClass: top\n" + "objectClass: domain\n");
 
-    MultimasterSynchronization.notificationRestoreStart(
-        DN.decode("dc=example,dc=com"));// TEMPORARY UNTIL core server
-                                       //  sends a notification
     task("dn: ds-task-id=" + UUID.randomUUID()
         + ",cn=Scheduled Tasks,cn=Tasks\n"
         + "objectclass: top\n"
@@ -258,10 +239,6 @@
         + "ds-task-import-ldif-file: " + path + "\n"
         + "ds-task-import-reject-file: " + path + "reject\n");
 
-    MultimasterSynchronization.notificationRestoreEnd(
-        DN.decode("dc=example,dc=com"));// TEMPORARY UNTIL core server
-                                       //  sends a notification
-
    if (getEntry(DN.decode("dc=foo, dc=example,dc=com"), 30000, true) == null)
      fail("The Directory has not been resynchronized after the restore.");
   }
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SchemaSynchronizationTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SchemaSynchronizationTest.java
index b20a411..561cf3e 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SchemaSynchronizationTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/SchemaSynchronizationTest.java
@@ -46,7 +46,6 @@
 import org.opends.server.protocols.ldap.LDAPModification;
 import org.opends.server.synchronization.common.ChangeNumberGenerator;
 import org.opends.server.synchronization.plugin.ChangelogBroker;
-import org.opends.server.synchronization.plugin.MultimasterSynchronization;
 import org.opends.server.synchronization.protocol.ModifyMsg;
 import org.opends.server.synchronization.protocol.SynchronizationMessage;
 import org.opends.server.types.Attribute;
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/StressTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/StressTest.java
index c21c8e6..9a797fd 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/StressTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/synchronization/StressTest.java
@@ -32,14 +32,12 @@
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import java.net.SocketTimeoutException;
 import java.util.ArrayList;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 
 import org.opends.server.TestCaseUtils;
-import org.opends.server.TestErrorLogger;
 import org.opends.server.api.MonitorProvider;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.config.ConfigException;

--
Gitblit v1.10.0