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