You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by bo...@apache.org on 2011/09/07 11:23:52 UTC

svn commit: r1166079 - in /logging/log4net/trunk: src/Appender/FileAppender.cs tests/src/Appender/RollingFileAppenderTest.cs

Author: bodewig
Date: Wed Sep  7 09:23:52 2011
New Revision: 1166079

URL: http://svn.apache.org/viewvc?rev=1166079&view=rev
Log:
test new MutexLock and make it actually work.  LOG4NET-164

Modified:
    logging/log4net/trunk/src/Appender/FileAppender.cs
    logging/log4net/trunk/tests/src/Appender/RollingFileAppenderTest.cs

Modified: logging/log4net/trunk/src/Appender/FileAppender.cs
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/src/Appender/FileAppender.cs?rev=1166079&r1=1166078&r2=1166079&view=diff
==============================================================================
--- logging/log4net/trunk/src/Appender/FileAppender.cs (original)
+++ logging/log4net/trunk/src/Appender/FileAppender.cs Wed Sep  7 09:23:52 2011
@@ -388,7 +388,7 @@ namespace log4net.Appender
                     }
 
                     FileMode fileOpenMode = append ? FileMode.Append : FileMode.Create;
-                    return new FileStream(filename, fileOpenMode, FileAccess.Write, FileShare.Read);
+                    return new FileStream(filename, fileOpenMode, FileAccess.Write, fileShare);
                 }
             }
 
@@ -640,12 +640,15 @@ namespace log4net.Appender
             /// </remarks>
             public override void CloseFile()
             {
-                CloseStream(m_stream);
-                m_stream = null;
-
-                m_mutex.ReleaseMutex();
-                m_mutex.Close();
-                m_mutexClosed = true;
+                try {
+                    CloseStream(m_stream);
+                    m_stream = null;
+                }
+                finally {
+                    m_mutex.ReleaseMutex();
+                    m_mutex.Close();
+                    m_mutexClosed = true;
+                }
             }
 
             /// <summary>
@@ -659,13 +662,14 @@ namespace log4net.Appender
             /// </remarks>
             public override Stream AcquireLock()
             {
-                // TODO: add timeout?
-                m_mutex.WaitOne();
-
-                // should always be true (and fast) for FileStream
-                if (m_stream.CanSeek)
-                {
-                    m_stream.Seek(0, SeekOrigin.End);
+                if (m_mutex != null) {
+                    // TODO: add timeout?
+                    m_mutex.WaitOne();
+
+                    // should always be true (and fast) for FileStream
+                    if (m_stream.CanSeek) {
+                        m_stream.Seek(0, SeekOrigin.End);
+                    }
                 }
 
                 return m_stream;
@@ -676,7 +680,7 @@ namespace log4net.Appender
             /// </summary>
             public override void ReleaseLock()
             {
-                if (m_mutexClosed == false)
+                if (m_mutexClosed == false && m_mutex != null)
                 {
                     m_mutex.ReleaseMutex();
                 }

Modified: logging/log4net/trunk/tests/src/Appender/RollingFileAppenderTest.cs
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/tests/src/Appender/RollingFileAppenderTest.cs?rev=1166079&r1=1166078&r2=1166079&view=diff
==============================================================================
--- logging/log4net/trunk/tests/src/Appender/RollingFileAppenderTest.cs (original)
+++ logging/log4net/trunk/tests/src/Appender/RollingFileAppenderTest.cs Wed Sep  7 09:23:52 2011
@@ -1603,7 +1603,74 @@ namespace log4net.Tests.Appender
 			Assert.AreEqual("", sh.Message, "Unexpected error message");
 		}
 
-		/// <summary>
+        /// <summary>
+        /// Verifies that attempting to log to a locked file fails gracefully
+        /// </summary>
+        [Test]
+        public void TestMutexLockFails() {
+            String filename = "test.log";
+
+            FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+            fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+
+            SilentErrorHandler sh = new SilentErrorHandler();
+            ILogger log = CreateLogger(filename, new FileAppender.MutexLock(), sh);
+            log.Log(GetType(), Level.Info, "This is a message", null);
+            log.Log(GetType(), Level.Info, "This is a message 2", null);
+            DestroyLogger();
+            fs.Close();
+
+            AssertFileEquals(filename, "Test");
+            Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message");
+        }
+
+        /// <summary>
+        /// Verifies that attempting to log to a locked file recovers if the lock is released
+        /// </summary>
+        [Test]
+        public void TestMutexLockRecovers() {
+            String filename = "test.log";
+
+            FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+            fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+
+            SilentErrorHandler sh = new SilentErrorHandler();
+            ILogger log = CreateLogger(filename, new FileAppender.MutexLock(), sh);
+            log.Log(GetType(), Level.Info, "This is a message", null);
+            fs.Close();
+            log.Log(GetType(), Level.Info, "This is a message 2", null);
+            DestroyLogger();
+
+            AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
+            Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message");
+        }
+
+        /// <summary>
+        /// Verifies that attempting to log to a file with ExclusiveLock really locks the file
+        /// </summary>
+        [Test]
+        public void TestMutexLockUnlocks() {
+            String filename = "test.log";
+            bool locked;
+
+            SilentErrorHandler sh = new SilentErrorHandler();
+            ILogger log = CreateLogger(filename, new FileAppender.MutexLock(), sh);
+            log.Log(GetType(), Level.Info, "This is a message", null);
+
+            locked = true;
+            FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
+            fs.Write(Encoding.ASCII.GetBytes("Test" + Environment.NewLine), 0, 4 + Environment.NewLine.Length);
+            fs.Close();
+
+            log.Log(GetType(), Level.Info, "This is a message 2", null);
+            DestroyLogger();
+
+            Assert.IsTrue(locked, "File was not locked");
+            AssertFileEquals(filename, "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" + Environment.NewLine);
+            Assert.AreEqual("", sh.Message, "Unexpected error message");
+        }
+
+        /// <summary>
 		/// Verify that the default LockModel is ExclusiveLock, to maintain backwards compatibility with previous behaviour
 		/// </summary>
 		[Test]