From 611fc34a518fa04d8fc37fb953f01101454118b7 Mon Sep 17 00:00:00 2001
From: sin <sin@localhost>
Date: Tue, 17 Jul 2007 20:42:40 +0000
Subject: [PATCH] Bug# 1953 Bug Desc: Handle RunRecoveryException thrown by Sleepycat with Administrative Alerts

---
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java |  147 +++++++++++++++++++++++++++++++++---------------
 1 files changed, 101 insertions(+), 46 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
index 6e82539..e9fd080 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
@@ -28,25 +28,22 @@
 
 import java.io.IOException;
 import java.io.File;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import java.io.FileInputStream;
 import java.io.FilenameFilter;
-import java.util.Arrays;
-import java.util.Collections;
+import java.util.*;
 import java.util.zip.Adler32;
 import java.util.zip.CheckedInputStream;
 
 import com.sleepycat.je.DatabaseException;
 import com.sleepycat.je.EnvironmentConfig;
+import com.sleepycat.je.RunRecoveryException;
 
 import org.opends.server.admin.std.server.MonitorProviderCfg;
 import org.opends.server.api.Backend;
 import org.opends.server.api.MonitorProvider;
+import org.opends.server.api.AlertGenerator;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.AddOperation;
 import org.opends.server.core.DeleteOperation;
@@ -67,8 +64,8 @@
 import org.opends.server.types.*;
 import static org.opends.server.util.ServerConstants.*;
 import org.opends.server.admin.std.server.JEBackendCfg;
-import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.Configuration;
+import org.opends.server.admin.server.ConfigurationChangeListener;
 
 /**
  * This is an implementation of a Directory Server Backend which stores entries
@@ -76,7 +73,7 @@
  */
 public class BackendImpl
     extends Backend
-    implements ConfigurationChangeListener<JEBackendCfg>
+    implements ConfigurationChangeListener<JEBackendCfg>, AlertGenerator
 {
   /**
    * The tracer object for the debug logger.
@@ -85,6 +82,13 @@
 
 
   /**
+    * The fully-qualified name of this class.
+    */
+   private static final String CLASS_NAME =
+        "org.opends.server.backends.jeb.BackendImpl";
+
+
+  /**
    * The configuration of this JE backend.
    */
   private JEBackendCfg cfg;
@@ -360,6 +364,8 @@
     monitorProviders.add(monitorProvider);
     DirectoryServer.registerMonitorProvider(monitorProvider);
 
+    //Register as an AlertGenerator.
+    DirectoryServer.registerAlertGenerator(this);
     // Register this backend as a change listener.
     cfg.addJEChangeListener(this);
   }
@@ -429,6 +435,9 @@
     DirectoryServer.registerOfflineBackendStateID(this.getBackendID(),
       checksumDbEnv());
 
+    //Deregister the alert generator.
+    DirectoryServer.deregisterAlertGenerator(this);
+
     // Make sure the thread counts are zero for next initialization.
     threadTotalCount.set(0);
     threadWriteCount.set(0);
@@ -622,10 +631,7 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
-      String message = getMessage(MSGID_JEB_DATABASE_EXCEPTION,
-                                  e.getMessage());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                   message, MSGID_JEB_DATABASE_EXCEPTION);
+      throw createDirectoryException(e);
     }
     catch (JebException e)
     {
@@ -677,10 +683,7 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
-      String message = getMessage(MSGID_JEB_DATABASE_EXCEPTION,
-                                  e.getMessage());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                   message, MSGID_JEB_DATABASE_EXCEPTION);
+      throw createDirectoryException(e);
     }
     catch (JebException e)
     {
@@ -731,10 +734,7 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
-      String message = getMessage(MSGID_JEB_DATABASE_EXCEPTION,
-                                  e.getMessage());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                   message, MSGID_JEB_DATABASE_EXCEPTION);
+      throw createDirectoryException(e);
     }
     catch (JebException e)
     {
@@ -787,10 +787,7 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
-      String message = getMessage(MSGID_JEB_DATABASE_EXCEPTION,
-                                  e.getMessage());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                   message, MSGID_JEB_DATABASE_EXCEPTION);
+      throw createDirectoryException(e);
     }
     catch (JebException e)
     {
@@ -859,9 +856,7 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
-      String message = getMessage(MSGID_JEB_DATABASE_EXCEPTION, e.getMessage());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                   message, MSGID_JEB_DATABASE_EXCEPTION);
+      throw createDirectoryException(e);
     }
     catch (JebException e)
     {
@@ -909,9 +904,7 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
-      String message = getMessage(MSGID_JEB_DATABASE_EXCEPTION, e.getMessage());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                   message, MSGID_JEB_DATABASE_EXCEPTION);
+      throw createDirectoryException(e);
     }
     finally
     {
@@ -980,10 +973,7 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, de);
       }
-      String message = getMessage(MSGID_JEB_DATABASE_EXCEPTION,
-                                  de.getMessage());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                   message, MSGID_JEB_DATABASE_EXCEPTION);
+      throw createDirectoryException(de);
     }
     catch (LDIFException e)
     {
@@ -1128,10 +1118,7 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, de);
       }
-      String message = getMessage(MSGID_JEB_DATABASE_EXCEPTION,
-                                  de.getMessage());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                   message, MSGID_JEB_DATABASE_EXCEPTION);
+      throw createDirectoryException(de);
     }
     catch (InitializationException ie)
     {
@@ -1227,10 +1214,7 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
-      String message = getMessage(MSGID_JEB_DATABASE_EXCEPTION,
-                                  e.getMessage());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                   message, MSGID_JEB_DATABASE_EXCEPTION);
+      throw createDirectoryException(e);
     }
     catch (JebException e)
     {
@@ -1314,10 +1298,7 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
-      String message = getMessage(MSGID_JEB_DATABASE_EXCEPTION,
-                                  e.getMessage());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-                                   message, MSGID_JEB_DATABASE_EXCEPTION);
+      throw createDirectoryException(e);
     }
     catch (JebException e)
     {
@@ -1544,6 +1525,80 @@
     EnvManager.removeFiles(backendDirectory.getPath());
   }
 
+  /**
+   * Creates a customized DirectoryException from the DatabaseException thrown
+   * by JE backend.
+   *
+   * @param  e The DatabaseException to be converted.
+   * @return  DirectoryException created from exception.
+   */
+  DirectoryException createDirectoryException(DatabaseException e)
+  {
+    ResultCode resultCode = DirectoryServer.getServerErrorResultCode();
+    String message = null;
+    if(e instanceof RunRecoveryException)
+    {
+      int msgID   = MSGID_BACKEND_ENVIRONMENT_UNUSABLE;
+      message = getMessage(msgID,getBackendID());
+      logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR,
+              message,msgID);
+      DirectoryServer.sendAlertNotification(DirectoryServer.getInstance(),
+              ALERT_TYPE_BACKEND_ENVIRONMENT_UNUSABLE, msgID, message);
+    }
+
+    int msgID = MSGID_JEB_DATABASE_EXCEPTION;
+    String jeMessage = e.getMessage();
+    if (jeMessage == null)
+    {
+      jeMessage = stackTraceToSingleLineString(e);
+    }
+    message = getMessage(msgID, jeMessage);
+    return new DirectoryException(resultCode, message, msgID, e);
+  }
+
+   /**
+   * Retrieves the fully-qualified name of the Java class for this alert
+   * generator implementation.
+   *
+   * @return  The fully-qualified name of the Java class for this alert
+   *          generator implementation.
+   */
+  public String getClassName()
+  {
+    return CLASS_NAME;
+  }
+
+  /**
+   * Retrieves information about the set of alerts that this generator may
+   * produce.  The map returned should be between the notification type for a
+   * particular notification and the human-readable description for that
+   * notification.  This alert generator must not generate any alerts with types
+   * that are not contained in this list.
+   *
+   * @return  Information about the set of alerts that this generator may
+   *          produce.
+   */
+  public LinkedHashMap<String,String> getAlerts()
+  {
+    LinkedHashMap<String,String> alerts = new LinkedHashMap<String,String>();
+
+    alerts.put(ALERT_TYPE_BACKEND_ENVIRONMENT_UNUSABLE,
+               ALERT_DESCRIPTION_BACKEND_ENVIRONMENT_UNUSABLE);
+    return alerts;
+  }
+
+  /**
+   * Retrieves the DN of the configuration entry with which this alert generator
+   * is associated.
+   *
+   * @return  The DN of the configuration entry with which this alert generator
+   *          is associated.
+   */
+  public DN getComponentEntryDN()
+  {
+    return cfg.dn();
+  }
+
   private void initializeRootContainer(EnvironmentConfig envConfig)
       throws ConfigException, InitializationException
   {

--
Gitblit v1.10.0