mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

boli
24.19.2008 ecfef39261a93e691fd5e52a2ce0b4b88a032bef
Improved error handling in logger retention policy enforcement. The rotater thread will now handle exceptions rasied during rotation and/or retention runs.

Partial fix for issue 2353
9 files modified
275 ■■■■ changed files
opends/src/messages/messages/log.properties 8 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/loggers/FileNamingPolicy.java 5 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/loggers/FileNumberRetentionPolicy.java 47 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/loggers/FreeDiskSpaceRetentionPolicy.java 72 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/loggers/LogPublisherErrorHandler.java 17 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/loggers/MultifileTextWriter.java 39 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/loggers/RetentionPolicy.java 20 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/loggers/SizeBasedRetentionPolicy.java 48 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/loggers/TimeStampNaming.java 19 ●●●● patch | view | raw | blame | history
opends/src/messages/messages/log.properties
@@ -20,7 +20,7 @@
#
# CDDL HEADER END
#
#      Portions Copyright 2006-2007 Sun Microsystems, Inc.
#      Portions Copyright 2006-2008 Sun Microsystems, Inc.
@@ -63,3 +63,9 @@
 permissions for the log file %s: %s
MILD_WARN_LOGGER_UNABLE_SET_PERMISSIONS_9=This platform does not support \
 setting file permissions %s to the log file %s
SEVERE_ERR_LOGGER_ERROR_LISTING_FILES_10=Error occured while listing log files \
  named by policy with initial file name %s
SEVERE_ERR_LOGGER_ERROR_OBTAINING_FREE_SPACE_11=Error occured while obtaining \
  free disk space in the partition containing log file %s: %s
SEVERE_ERR_LOGGER_ERROR_ENFORCING_RETENTION_POLICY_12=Error occured while \
  enforcing retention policy %s for logger %s: %s
opends/src/server/org/opends/server/loggers/FileNamingPolicy.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.loggers;
@@ -60,7 +60,8 @@
  /**
   * Gets all the existing files named by this policy.
   *
   * @return The files named by this policy.
   * @return The files named by this policy or <code>null</code> if an
   *         error occured.
   */
  public File[] listFiles();
opends/src/server/org/opends/server/loggers/FileNumberRetentionPolicy.java
@@ -22,10 +22,11 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.loggers;
import org.opends.messages.Message;
import static org.opends.messages.LoggerMessages.ERR_LOGGER_ERROR_LISTING_FILES;
import org.opends.server.admin.std.server.FileCountLogRetentionPolicyCfg;
import org.opends.server.admin.server.ConfigurationChangeListener;
@@ -39,6 +40,8 @@
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.ResultCode;
import org.opends.server.types.DirectoryException;
import org.opends.server.core.DirectoryServer;
/**
@@ -54,8 +57,8 @@
   */
  private static final DebugTracer TRACER = getTracer();
  private int numFiles = 0;
  private FileCountLogRetentionPolicyCfg config;
  /**
   * {@inheritDoc}
@@ -63,7 +66,8 @@
  public void initializeLogRetentionPolicy(
      FileCountLogRetentionPolicyCfg config)
  {
    numFiles = config.getNumberOfFiles();
    this.numFiles = config.getNumberOfFiles();
    this.config = config;
    config.addFileCountChangeListener(this);
  }
@@ -90,7 +94,8 @@
    boolean adminActionRequired = false;
    ArrayList<Message> messages = new ArrayList<Message>();
    numFiles = config.getNumberOfFiles();
    this.numFiles = config.getNumberOfFiles();
    this.config = config;
    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
  }
@@ -98,14 +103,24 @@
  /**
   * {@inheritDoc}
   */
  public int deleteFiles(MultifileTextWriter writer)
  public File[] deleteFiles(FileNamingPolicy fileNamingPolicy)
      throws DirectoryException
  {
    int count = 0;
    File[] files = writer.getNamingPolicy().listFiles();
    File[] files = fileNamingPolicy.listFiles();
    if(files == null)
    {
      Message message =
          ERR_LOGGER_ERROR_LISTING_FILES.get(
              fileNamingPolicy.getInitialName().toString());
      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
                                   message);
    }
    ArrayList<File> filesToDelete = new ArrayList<File>();
    if (files.length <= numFiles)
    {
      return 0;
      return new File[0];
    }
    // Sort files based on last modified time.
@@ -113,16 +128,18 @@
    for (int j = numFiles; j < files.length; j++)
    {
      if(debugEnabled())
      {
        TRACER.debugInfo("Deleting log file:", files[j]);
      }
      files[j].delete();
      count++;
      filesToDelete.add(files[j]);
    }
    return count;
    return filesToDelete.toArray(new File[0]);
  }
  /**
   * {@inheritDoc}
   */
  public String toString()
  {
    return "Free Number Retention Policy " + config.dn().toString();
  }
}
opends/src/server/org/opends/server/loggers/FreeDiskSpaceRetentionPolicy.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.loggers;
import org.opends.messages.Message;
@@ -34,12 +34,16 @@
import java.util.List;
import static org.opends.server.loggers.debug.DebugLogger.*;
import static org.opends.messages.LoggerMessages.*;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.DebugLogLevel;
import org.opends.server.types.ResultCode;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.DirectoryException;
import org.opends.server.admin.std.server.FreeDiskSpaceLogRetentionPolicyCfg;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.core.DirectoryServer;
import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
/**
@@ -56,8 +60,8 @@
   */
  private static final DebugTracer TRACER = getTracer();
  private long freeDiskSpace = 0;
  private FreeDiskSpaceLogRetentionPolicyCfg config;
  /**
   * {@inheritDoc}
@@ -65,7 +69,8 @@
  public void initializeLogRetentionPolicy(
      FreeDiskSpaceLogRetentionPolicyCfg config)
  {
    freeDiskSpace = config.getFreeDiskSpace();
    this.freeDiskSpace = config.getFreeDiskSpace();
    this.config = config;
    config.addFreeDiskSpaceChangeListener(this);
  }
@@ -92,27 +97,35 @@
    boolean adminActionRequired = false;
    ArrayList<Message> messages = new ArrayList<Message>();
    freeDiskSpace = config.getFreeDiskSpace();
    this.freeDiskSpace = config.getFreeDiskSpace();
    this.config = config;
    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
  }
  /**
   * This method deletes files based on the policy.
   *
   * @param writer the multi file text writer writing the log files.
   * @return number of files deleted.
   * {@inheritDoc}
   */
  public int deleteFiles(MultifileTextWriter writer)
  public File[] deleteFiles(FileNamingPolicy fileNamingPolicy)
      throws DirectoryException
  {
    File[] files = writer.getNamingPolicy().listFiles();
    File[] files = fileNamingPolicy.listFiles();
    if(files == null)
    {
      Message message =
          ERR_LOGGER_ERROR_LISTING_FILES.get(
              fileNamingPolicy.getInitialName().toString());
      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
                                   message);
    }
    ArrayList<File> filesToDelete = new ArrayList<File>();
    if(files.length <= 0)
    {
      return 0;
      return new File[0];
    }
    int count = 0;
    long freeSpace = 0;
    try
@@ -129,19 +142,23 @@
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, e);
      }
      return 0;
      Message message =
          ERR_LOGGER_ERROR_OBTAINING_FREE_SPACE.get(files[0].toString(),
              stackTraceToSingleLineString(e));
      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
                                   message, e);
    }
          if(debugEnabled())
      { // TODO: i18n
        TRACER.debugInfo("Current free disk space: %d, Required: %d", freeSpace,
                  freeDiskSpace);
      }
    if(debugEnabled())
    {
      TRACER.debugInfo("Current free disk space: %d, Required: %d", freeSpace,
          freeDiskSpace);
    }
    if (freeSpace > freeDiskSpace)
    {
      // No cleaning needed.
      return 0;
      return new File[0];
    }
    long freeSpaceNeeded = freeDiskSpace - freeSpace;
@@ -153,21 +170,22 @@
    for (int j = files.length - 1; j < 1; j--)
    {
      freedSpace += files[j].length();
      if(debugEnabled())
      {
        TRACER.debugInfo("Deleting log file:", files[j]);
      }
      files[j].delete();
      filesToDelete.add(files[j]);
      if (freedSpace >= freeSpaceNeeded)
      {
        break;
      }
      count++;
    }
    return count;
    return filesToDelete.toArray(new File[0]);
  }
  /**
   * {@inheritDoc}
   */
  public String toString()
  {
    return "Free Disk Retention Policy " + config.dn().toString();
  }
}
opends/src/server/org/opends/server/loggers/LogPublisherErrorHandler.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.loggers;
import org.opends.messages.Message;
@@ -115,4 +115,19 @@
            stackTraceToSingleLineString(ex));
    System.err.println(msg);
  }
  /**
   * Handle an exception which occured while trying to list log files
   * in a directory.
   * @param retentionPolicy - the retention policy being enforced when
   *                          the exception occured.
   * @param ex - the exception occurred.
   */
  public void handleDeleteError(RetentionPolicy retentionPolicy, Throwable ex)
  {
    Message msg = ERR_LOGGER_ERROR_ENFORCING_RETENTION_POLICY.get(
            retentionPolicy.toString(), publisherConfigDN.toString(),
            stackTraceToSingleLineString(ex));
    System.err.println(msg);
  }
}
opends/src/server/org/opends/server/loggers/MultifileTextWriter.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.loggers;
@@ -427,18 +427,35 @@
        for(RetentionPolicy retentionPolicy : retentionPolicies)
        {
          int numFilesDeleted =
              retentionPolicy.deleteFiles(writer);
          if(numFilesDeleted > 0)
          try
          {
            lastCleanTime = TimeThread.getCalendar();
            lastCleanCount = numFilesDeleted;
            totalFilesCleaned++;
            File[] files =
                retentionPolicy.deleteFiles(writer.getNamingPolicy());
            for(File file : files)
            {
              file.delete();
              totalFilesCleaned++;
              if(debugEnabled())
              {
                TRACER.debugInfo(retentionPolicy.toString() +
                    " cleaned up log file %s", file.toString());
              }
            }
            if(files.length > 0)
            {
              lastCleanTime = TimeThread.getCalendar();
              lastCleanCount = files.length;
            }
          }
          if (debugEnabled())
          catch(DirectoryException de)
          {
            TRACER.debugVerbose("%d files deleted by rentention policy",
                         numFilesDeleted);
            if(debugEnabled())
            {
              TRACER.debugCaught(DebugLogLevel.ERROR, de);
            }
            errorHandler.handleDeleteError(retentionPolicy, de);
          }
        }
      }
@@ -704,7 +721,7 @@
  }
  /**
   * Retrieves teh total number of files cleaned in this instance of the
   * Retrieves the total number of files cleaned in this instance of the
   * Directory Server.
   *
   * @return The total number of files cleaned.
opends/src/server/org/opends/server/loggers/RetentionPolicy.java
@@ -22,14 +22,16 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.loggers;
import org.opends.server.admin.std.server.LogRetentionPolicyCfg;
import org.opends.server.config.ConfigException;
import org.opends.server.types.InitializationException;
import org.opends.server.types.DirectoryException;
import java.io.File;
/**
 * This interface describes the retention policy that should be used
@@ -60,14 +62,18 @@
      throws ConfigException, InitializationException;
  /**
   * This method checks for whether files should be deleted or not.
   * Returns all files that should be deleted according to the policy.
   *
   * @param writer The multi file writer writing the files to be
   *        checked.
   * @param fileNamingPolicy The naming policy used generate the log file
   *                         names.
   *
   * @return number of files deleted, if any.
   * @return An array of files that should be deleted according to the
   *         policy or <code>null</code> if an error occured while
   *         obtaining the file list.
   * @throws DirectoryException If an error occurs while obtaining a list
   *                            of files to delete.
   */
  public int deleteFiles(MultifileTextWriter writer);
  public File[] deleteFiles(FileNamingPolicy fileNamingPolicy)
      throws DirectoryException;
}
opends/src/server/org/opends/server/loggers/SizeBasedRetentionPolicy.java
@@ -22,10 +22,11 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.loggers;
import org.opends.messages.Message;
import static org.opends.messages.LoggerMessages.ERR_LOGGER_ERROR_LISTING_FILES;
import org.opends.server.admin.std.server.SizeLimitLogRetentionPolicyCfg;
import org.opends.server.admin.server.ConfigurationChangeListener;
@@ -33,6 +34,8 @@
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.ResultCode;
import org.opends.server.types.DirectoryException;
import org.opends.server.core.DirectoryServer;
import java.io.File;
@@ -53,8 +56,8 @@
   */
  private static final DebugTracer TRACER = getTracer();
  private long size = 0;
  private SizeLimitLogRetentionPolicyCfg config;
  /**
   * {@inheritDoc}
@@ -62,7 +65,8 @@
  public void initializeLogRetentionPolicy(
      SizeLimitLogRetentionPolicyCfg config)
  {
    size = config.getDiskSpaceUsed();
    this.size = config.getDiskSpaceUsed();
    this.config = config;
    config.addSizeLimitChangeListener(this);
  }
@@ -89,7 +93,8 @@
    boolean adminActionRequired = false;
    ArrayList<Message> messages = new ArrayList<Message>();
    size = config.getDiskSpaceUsed();
    this.size = config.getDiskSpaceUsed();
    this.config = config;
    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
  }
@@ -97,10 +102,20 @@
  /**
   * {@inheritDoc}
   */
  public int deleteFiles(MultifileTextWriter writer)
  public File[] deleteFiles(FileNamingPolicy fileNamingPolicy)
      throws DirectoryException
  {
    File[] files = writer.getNamingPolicy().listFiles();
    int count = 0;
    File[] files = fileNamingPolicy.listFiles();
    if(files == null)
    {
      Message message =
          ERR_LOGGER_ERROR_LISTING_FILES.get(
              fileNamingPolicy.getInitialName().toString());
      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
                                   message);
    }
    ArrayList<File> filesToDelete = new ArrayList<File>();
    long totalLength = 0;
    for (File file : files)
@@ -115,7 +130,7 @@
    if (totalLength <= size)
    {
      return 0;
      return new File[0];
    }
    long freeSpaceNeeded = totalLength - size;
@@ -127,21 +142,22 @@
    for (int j = files.length - 1; j < 1; j--)
    {
      freedSpace += files[j].length();
      if(debugEnabled())
      {
        TRACER.debugInfo("Deleting log file:", files[j]);
      }
      files[j].delete();
      filesToDelete.add(files[j]);
      if (freedSpace >= freeSpaceNeeded)
      {
        break;
      }
      count++;
    }
    return count;
    return filesToDelete.toArray(new File[0]);
  }
  /**
   * {@inheritDoc}
   */
  public String toString()
  {
    return "Size Based Retention Policy " + config.dn().toString();
  }
}
opends/src/server/org/opends/server/loggers/TimeStampNaming.java
@@ -22,11 +22,13 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.loggers;
import org.opends.server.util.TimeThread;
import org.opends.server.loggers.debug.DebugTracer;
import static org.opends.server.loggers.debug.DebugLogger.getTracer;
import java.io.File;
import java.io.FilenameFilter;
@@ -36,6 +38,11 @@
 */
public class TimeStampNaming implements FileNamingPolicy
{
  /**
   * The tracer object for the debug logger.
   */
  private static final DebugTracer TRACER = getTracer();
  File file;
  /**
@@ -105,7 +112,15 @@
  public File[] listFiles()
  {
    File directory = file.getParentFile();
    return directory.listFiles(getFilenameFilter());
    File[] files =  directory.listFiles(getFilenameFilter());
    if(files == null)
    {
      TRACER.debugError("Unable to list files named by policy " +
          "with initial file %s in directory %s", file, directory);
    }
    return files;
  }
}