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/RestoreTask.java |   49 ++++++++++++++++++++++++++++---------------------
 1 files changed, 28 insertions(+), 21 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tasks/RestoreTask.java b/opendj-server-legacy/src/main/java/org/opends/server/tasks/RestoreTask.java
index c75a6e2..8568d35 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tasks/RestoreTask.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tasks/RestoreTask.java
@@ -13,6 +13,7 @@
  *
  * Copyright 2006-2008 Sun Microsystems, Inc.
  * Portions Copyright 2014-2016 ForgeRock AS.
+ * Portions Copyright 2026 3A Systems, LLC.
  */
 package org.opends.server.tasks;
 
@@ -262,25 +263,32 @@
     // and to take appropriate actions.
     DirectoryServer.notifyRestoreBeginning(backend, restoreConfig);
 
-    // Disable the backend.
-    if ( !verifyOnly)
-    {
-      try
-      {
-        TaskUtils.disableBackend(backendID);
-      } catch (DirectoryException e)
-      {
-        logger.traceException(e);
-
-        logger.error(e.getMessageObject());
-        return TaskState.STOPPED_BY_ERROR;
-      }
-    }
-
-    // From here we must make sure to re-enable the backend before returning.
+    /*
+     * From here the listeners must be told that the restore 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 errorsEncountered = false;
     try
     {
+      // Disable the backend. From here the finally below re-enables it before returning.
+      if ( !verifyOnly)
+      {
+        try
+        {
+          TaskUtils.disableBackend(backendID);
+          backendDisabled = true;
+        } catch (DirectoryException e)
+        {
+          logger.traceException(e);
+
+          logger.error(e.getMessageObject());
+          errorsEncountered = true;
+          return TaskState.STOPPED_BY_ERROR;
+        }
+      }
+
       // Acquire an exclusive lock for the backend.
       if (verifyOnly || lockBackend(backend))
       {
@@ -294,13 +302,11 @@
           }
           catch (DirectoryException de)
           {
-            DirectoryServer.notifyRestoreEnded(backend, restoreConfig, false);
             logger.error(ERR_RESTOREDB_ERROR_DURING_BACKUP, backupID, backupDir.getPath(), de.getMessageObject());
             errorsEncountered = true;
           }
           catch (Exception e)
           {
-            DirectoryServer.notifyRestoreEnded(backend, restoreConfig, false);
             logger.error(ERR_RESTOREDB_ERROR_DURING_BACKUP, backupID, backupDir.getPath(), getExceptionMessage(e));
             errorsEncountered = true;
           }
@@ -317,8 +323,8 @@
     }
     finally
     {
-      // Enable the backend.
-      if (! verifyOnly)
+      // Enable the backend, if it was this task which disabled it.
+      if (backendDisabled)
       {
         try
         {
@@ -335,7 +341,8 @@
           errorsEncountered = true;
         }
       }
-      DirectoryServer.notifyRestoreEnded(backend, restoreConfig, true);
+      // Notified once, after the backend is back, so that a listener can read it again.
+      DirectoryServer.notifyRestoreEnded(backend, restoreConfig, !errorsEncountered);
     }
 
     if (errorsEncountered)

--
Gitblit v1.10.0