From e86f702f8e11d85eb7fcbde8de64657a4e308a21 Mon Sep 17 00:00:00 2001
From: Valery Kharseko <vharseko@3a-systems.ru>
Date: Fri, 11 Sep 2026 13:06:49 +0000
Subject: [PATCH] [#966] Tell the import and restore task listeners the task is over on every path (#969)

---
 opendj-server-legacy/src/main/java/org/opends/server/tasks/ImportTask.java |   68 +++++++++++++++++++++-------------
 1 files changed, 42 insertions(+), 26 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tasks/ImportTask.java b/opendj-server-legacy/src/main/java/org/opends/server/tasks/ImportTask.java
index 5d69679..aaebe55 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tasks/ImportTask.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tasks/ImportTask.java
@@ -627,21 +627,29 @@
     // and to take appropriate actions.
     DirectoryServer.notifyImportBeginning(backend, importConfig);
 
-    // Disable the backend.
+    /*
+     * From here the listeners must be told that the import is over whichever way this
+     * method returns: a listener which took something offline when it began - a
+     * replication domain disables itself - gets no other chance to put it back.
+     */
+    boolean backendDisabled = false;
+    boolean successful = false;
     try
     {
-      TaskUtils.disableBackend(backend.getBackendID());
-    }
-    catch (DirectoryException e)
-    {
-      logger.traceException(e);
+      // Disable the backend.
+      try
+      {
+        TaskUtils.disableBackend(backend.getBackendID());
+        backendDisabled = true;
+      }
+      catch (DirectoryException e)
+      {
+        logger.traceException(e);
 
-      logger.error(e.getMessageObject());
-      return TaskState.STOPPED_BY_ERROR;
-    }
+        logger.error(e.getMessageObject());
+        return TaskState.STOPPED_BY_ERROR;
+      }
 
-    try
-    {
       // Acquire an exclusive lock for the backend.
       try
       {
@@ -665,12 +673,12 @@
       try
       {
         backend.importLDIF(importConfig, DirectoryServer.getInstance().getServerContext());
+        successful = true;
       }
       catch (DirectoryException de)
       {
         logger.traceException(de);
 
-        DirectoryServer.notifyImportEnded(backend, importConfig, false);
         if (de.getResultCode().equals(DirectoryServer.getCoreConfigManager().getServerErrorResultCode()))
         {
           logger.error(ERR_LDIFIMPORT_ERROR_DURING_IMPORT.get(de.getMessageObject()));
@@ -685,7 +693,6 @@
       {
         logger.traceException(e);
 
-        DirectoryServer.notifyImportEnded(backend, importConfig, false);
         logger.error(ERR_LDIFIMPORT_ERROR_DURING_IMPORT, getExceptionMessage(e));
         return TaskState.STOPPED_BY_ERROR;
       }
@@ -713,23 +720,32 @@
     }
     finally
     {
-      // Enable the backend.
-      try
+      // Enable the backend, if it was this task which disabled it.
+      boolean backendLeftDisabled = false;
+      if (backendDisabled)
       {
-        TaskUtils.enableBackend(backend.getBackendID());
-        // 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 = getServerContext().getBackendConfigManager().getLocalBackendById(backend.getBackendID());
-      }
-      catch (DirectoryException e)
-      {
-        logger.traceException(e);
+        try
+        {
+          TaskUtils.enableBackend(backend.getBackendID());
+          // 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 = getServerContext().getBackendConfigManager().getLocalBackendById(backend.getBackendID());
+        }
+        catch (DirectoryException e)
+        {
+          logger.traceException(e);
 
-        logger.error(e.getMessageObject());
+          logger.error(e.getMessageObject());
+          backendLeftDisabled = true;
+        }
+      }
+      // Notified once, after the backend is back, so that a listener can read it again.
+      DirectoryServer.notifyImportEnded(backend, importConfig, successful);
+      if (backendLeftDisabled)
+      {
         return TaskState.STOPPED_BY_ERROR;
       }
-      DirectoryServer.notifyImportEnded(backend, importConfig, true);
     }
 
     // Clean up after the import by closing the import config.

--
Gitblit v1.10.0