From c9ad8279480c6a396c50478a7f577a78244b4de2 Mon Sep 17 00:00:00 2001
From: Violette Roche-Montane <violette.roche-montane@forgerock.com>
Date: Fri, 08 Mar 2013 09:45:51 +0000
Subject: [PATCH] OPENDJ-802 rebuild-index online with "--clearDegradedState" should not disable the backend - Fixed : with degraded state option, the backend is no more disabled/activated.

---
 opendj-sdk/opends/src/server/org/opends/server/tasks/RebuildTask.java |   96 +++++++++++++++++++++++++++++++-----------------
 1 files changed, 62 insertions(+), 34 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/tasks/RebuildTask.java b/opendj-sdk/opends/src/server/org/opends/server/tasks/RebuildTask.java
index 4fe886e..b9abaa7 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tasks/RebuildTask.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tasks/RebuildTask.java
@@ -184,7 +184,7 @@
       return TaskState.STOPPED_BY_ERROR;
     }
 
-    for (String index : indexes)
+    for (final String index : indexes)
     {
       rebuildConfig.addRebuildIndex(index);
     }
@@ -193,7 +193,14 @@
     // during the initialization.
     rebuildConfig.isClearDegradedState(isClearDegradedState);
 
-    Backend backend =
+    if (tmpDirectory == null)
+    {
+      tmpDirectory = "import-tmp";
+    }
+    rebuildConfig.setTmpDirectory(tmpDirectory);
+    rebuildConfig.setRebuildMode(rebuildMode);
+
+    final Backend backend =
         DirectoryServer.getBackendWithBaseDN(rebuildConfig.getBaseDN());
 
     if (backend == null)
@@ -210,55 +217,74 @@
       return TaskState.STOPPED_BY_ERROR;
     }
 
-    // Acquire a shared lock for the backend if we are rebuilding attribute
-    // indexes only. If we are rebuilding one or more system indexes, we have
-    // to acquire exclusive lock.
+    // If we are rebuilding one or more system indexes, we have
+    // to acquire exclusive lock. Shared lock in 'cleardegradedstate' mode.
     String lockFile = LockFileManager.getBackendLockFileName(backend);
     StringBuilder failureReason = new StringBuilder();
 
     // Disable the backend.
-    try
+    // Except in 'cleardegradedstate' mode we don't need to disable it.
+    if (!isClearDegradedState)
     {
-      TaskUtils.disableBackend(backend.getBackendID());
-    }
-    catch (DirectoryException e)
-    {
-      if (debugEnabled())
+      try
       {
-        TRACER.debugCaught(DebugLogLevel.ERROR, e);
+        TaskUtils.disableBackend(backend.getBackendID());
+      }
+      catch (DirectoryException e)
+      {
+        if (debugEnabled())
+        {
+          TRACER.debugCaught(DebugLogLevel.ERROR, e);
+        }
+
+        logError(e.getMessageObject());
+        return TaskState.STOPPED_BY_ERROR;
       }
 
-      logError(e.getMessageObject());
-      return TaskState.STOPPED_BY_ERROR;
-    }
-
-    try
-    {
-      if (!LockFileManager.acquireExclusiveLock(lockFile, failureReason))
+      try
+      {
+        if (!LockFileManager.acquireExclusiveLock(lockFile, failureReason))
+        {
+          Message message =
+              ERR_REBUILDINDEX_CANNOT_EXCLUSIVE_LOCK_BACKEND.get(backend
+                  .getBackendID(), String.valueOf(failureReason));
+          logError(message);
+          return TaskState.STOPPED_BY_ERROR;
+        }
+      }
+      catch (Exception e)
       {
         Message message =
             ERR_REBUILDINDEX_CANNOT_EXCLUSIVE_LOCK_BACKEND.get(backend
-                .getBackendID(), String.valueOf(failureReason));
+                .getBackendID(), getExceptionMessage(e));
         logError(message);
         return TaskState.STOPPED_BY_ERROR;
       }
     }
-    catch (Exception e)
+    else
     {
-      Message message =
-          ERR_REBUILDINDEX_CANNOT_EXCLUSIVE_LOCK_BACKEND.get(backend
-              .getBackendID(), getExceptionMessage(e));
-      logError(message);
-      return TaskState.STOPPED_BY_ERROR;
+      // We just need a shared lock on the backend for this part.
+      try
+      {
+        if (!LockFileManager.acquireSharedLock(lockFile, failureReason))
+        {
+          Message message =
+              ERR_REBUILDINDEX_CANNOT_SHARED_LOCK_BACKEND.get(backend
+                  .getBackendID(), String.valueOf(failureReason));
+          logError(message);
+          return TaskState.STOPPED_BY_ERROR;
+        }
+      }
+      catch (Exception e)
+      {
+        Message message =
+            ERR_REBUILDINDEX_CANNOT_SHARED_LOCK_BACKEND.get(backend
+                .getBackendID(), getExceptionMessage(e));
+        logError(message);
+        return TaskState.STOPPED_BY_ERROR;
+      }
     }
 
-    if (tmpDirectory == null)
-    {
-      tmpDirectory = "import-tmp";
-    }
-    rebuildConfig.setTmpDirectory(tmpDirectory);
-    rebuildConfig.setRebuildMode(rebuildMode);
-
     TaskState returnCode = TaskState.COMPLETED_SUCCESSFULLY;
 
     // Launch the rebuild process.
@@ -306,7 +332,9 @@
       }
     }
 
-    if (returnCode == TaskState.COMPLETED_SUCCESSFULLY)
+    // The backend must be enabled only if the task is successful
+    // for prevent potential risks of database corruption.
+    if (returnCode == TaskState.COMPLETED_SUCCESSFULLY && !isClearDegradedState)
     {
       // Enable the backend.
       try

--
Gitblit v1.10.0