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; } }