[prev in list] [next in list] [prev in thread] [next in thread] 

List:       helix-server-cvs
Subject:    [Server-cvs] log/tmplgpln outputs.cpp, 1.27.48.1, 1.27.48.2 outputs.h, 1.16, 1.16.48.1
From:       tniu () helixcommunity ! org
Date:       2013-10-16 7:09:59
[Download RAW message or body]

Update of /cvsroot/server/log/tmplgpln
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv25047

Modified Files:
      Tag: SERVER_15_1_0
	outputs.cpp outputs.h 
Log Message:


Synopsis
========
This CR fix bug: 
(HLXSRV-695) [Uptime][windows 2012]There has serious memory leak when running the \
uptime test 

Branch : SERVER_15_1_0_RN, HEAD

Suggested Reviewer : Anyone

Description
===========
Repro:
 1. Running uptime in vhost mode on w2k12 platform  2. Check the result
 
Actual:
 There has serious memory leak, and the server crash in 12 hours  There are large \
number of DispatchQueue log printed in r,stdout.log  “DispatchQueue::send: size meets \
the maximum size 163840 (to_procnum=25, bottom=132297, top=132297) on message from \
182385792 to 182411136”  
Expected:
 Uptime running well

Root cause:
It is too slow when write access log file every time to fflush().

My solution:
Replace fwrite() with fprintf(), and write access log file every 10s to fflush().

Files Affected
==============
server/log/tmplgpln/outputs.cpp
server/log/tmplgpln/outputs.h

Test perform
================
Integration Tests:
N/A

Performance Tests: 
N/A

QA Hints
========
None.



Index: outputs.cpp
===================================================================
RCS file: /cvsroot/server/log/tmplgpln/outputs.cpp,v
retrieving revision 1.27.48.1
retrieving revision 1.27.48.2
diff -u -d -r1.27.48.1 -r1.27.48.2
--- outputs.cpp	5 Sep 2013 08:43:35 -0000	1.27.48.1
+++ outputs.cpp	16 Oct 2013 07:09:57 -0000	1.27.48.2
@@ -236,6 +236,26 @@
 // CTLFileOutput::CTLFileOutput
 ///////////////////////////////////////////////////////////////////////////////
 
+CTLFileOutput::CFFlushCallback::CFFlushCallback(CTLFileOutput* pOwner)
+    : m_pOwner(pOwner)
+{
+}
+
+CTLFileOutput::CFFlushCallback::~CFFlushCallback()
+{
+}
+
+STDMETHODIMP
+CTLFileOutput::CFFlushCallback::Func()
+{
+    if(m_pOwner)
+    {
+        m_pOwner->FlushFile();
+    }
+
+    return HXR_OK;
+}
+
 CTLFileOutput::CTLFileOutput()
     : CTLOutput()
     , m_fp(NULL)
@@ -244,6 +264,7 @@
     , m_pTSScheduler(NULL)
     , m_pScheduler(NULL)
     , m_ulRollTimeCallbackHandle(0)
+    , m_ulFFlushCallbackHandle(0)
     , m_nRollTime(0)
     , m_nRollSize(0)
     , m_nByteCount(0)
@@ -265,6 +286,7 @@
     , m_pTSScheduler(pTSScheduler)
     , m_pScheduler(NULL)
     , m_ulRollTimeCallbackHandle(0)
+    , m_ulFFlushCallbackHandle(0)
     , m_nRollTime(0)
     , m_nRollSize(0)
     , m_nByteCount(0)
@@ -276,7 +298,7 @@
 
     if (pTSScheduler)
     {
-	pTSScheduler->QueryInterface(IID_IHXScheduler, (void **)&m_pScheduler);
+        pTSScheduler->QueryInterface(IID_IHXScheduler, (void **)&m_pScheduler);
         m_StartTime = m_pScheduler->GetCurrentSchedulerTime();
         pTSScheduler->AddRef(); // addref for m_pTSScheduler
     }
@@ -306,6 +328,7 @@
     , m_pTSScheduler(pTSScheduler)
     , m_pScheduler(NULL)
     , m_ulRollTimeCallbackHandle(0)
+    , m_ulFFlushCallbackHandle(0)
     , m_nRollTime(0)
     , m_nRollSize(0)
     , m_nByteCount(0)
@@ -321,7 +344,7 @@
 
     if (pTSScheduler)
     {
-	pTSScheduler->QueryInterface(IID_IHXScheduler, (void **)&m_pScheduler);
+        pTSScheduler->QueryInterface(IID_IHXScheduler, (void **)&m_pScheduler);
         m_StartTime = m_pScheduler->GetCurrentSchedulerTime();
         pTSScheduler->AddRef(); // addref for m_pTSScheduler
     }
@@ -345,6 +368,11 @@
         m_pTSScheduler->Remove(m_ulRollTimeCallbackHandle);
     }
 
+    if(m_ulFFlushCallbackHandle)
+    {
+        m_pTSScheduler->Remove(m_ulFFlushCallbackHandle);
+    }
+
     HX_RELEASE(m_pFileMutex);
     HX_RELEASE(m_pTSScheduler);
     HX_RELEASE(m_pScheduler);
@@ -674,6 +702,52 @@
     m_nByteCount = 0;
 }
 
+void 
+CTLFileOutput::FlushFile()
+{
+    m_ulFFlushCallbackHandle = 0;
+    if(m_fp != NULL)
+    {
+        const char* szErrorMsg = NULL;
+        UINT32 ulErrorCode = 0;
+        struct stat st;
+        
+        if (fflush(m_fp) != 0)
+        {
+            ulErrorCode = errno;
+            szErrorMsg = strerror(ulErrorCode);
+        }
+        else if (m_szCurrentOpenFile)
+        {
+            if (stat(m_szCurrentOpenFile, &st) == 0)
+            {
+                m_nByteCount = st.st_size;
+            }
+            else
+            {
+                ulErrorCode = errno;
+                szErrorMsg = strerror(ulErrorCode);
+            }
+        }
+    
+        if (szErrorMsg)
+        {
+            HX_VECTOR_DELETE(m_pszLastError);
+            m_pszLastError = new char[strlen(szErrorMsg) + 1];
+            strcpy(m_pszLastError, szErrorMsg);
+            m_ulLastErrorCode = ulErrorCode;
+        }
+    }
+    
+    if(m_pTSScheduler)
+    {
+        CFFlushCallback* pCallback = new CFFlushCallback(this);
+        pCallback->AddRef();
+        m_ulFFlushCallbackHandle = m_pTSScheduler->RelativeEnter(pCallback, \
FLUSH_INTERVAL_TIME * 1000); +        pCallback->Release();
+    }
+}
+
 
 ///////////////////////////////////////////////////////////////////////////////
 //  CTLFileOutput::OpenFile
@@ -738,6 +812,14 @@
         return HXR_FAIL;
     }
 
+    if(m_pTSScheduler)
+    {
+        CFFlushCallback* pCallback = new CFFlushCallback(this);
+        pCallback->AddRef();
+        m_ulFFlushCallbackHandle = m_pTSScheduler->RelativeEnter(pCallback, \
FLUSH_INTERVAL_TIME * 1000); +        pCallback->Release();
+    }
+
     return HXR_OK;
 }
 
@@ -774,39 +856,18 @@
 
     if (m_fp && !szErrorMsg)
     {
-        struct stat st;
-
         replacePercent((char *)pOutput->GetBuffer(), pOutput->GetSize());
 
         m_pFileMutex->Lock();
-        nWritten = fprintf(m_fp, "%s", (const char*)pOutput->GetBuffer());
+        nWritten = fwrite((const char*)pOutput->GetBuffer(), 1,
+            strlen((const char*)pOutput->GetBuffer()), m_fp);
         m_pFileMutex->Unlock();
 
         if (nWritten <= 0)
         {
             ulErrorCode = errno;
             szErrorMsg = strerror(ulErrorCode);
-        }
-        else
-        {
-            if (fflush(m_fp) != 0)
-            {
-                ulErrorCode = errno;
-                szErrorMsg = strerror(ulErrorCode);
-            }
-            else if (m_szCurrentOpenFile)
-            {
-                if (stat(m_szCurrentOpenFile, &st) == 0)
-                {
-                    m_nByteCount = st.st_size;
-                }
-                else
-                {
-                    ulErrorCode = errno;
-                    szErrorMsg = strerror(ulErrorCode);
-                }
-            }
-        }
+        }      
     }
 
     if (szErrorMsg)

Index: outputs.h
===================================================================
RCS file: /cvsroot/server/log/tmplgpln/outputs.h,v
retrieving revision 1.16
retrieving revision 1.16.48.1
diff -u -d -r1.16 -r1.16.48.1
--- outputs.h	17 Aug 2011 18:43:29 -0000	1.16
+++ outputs.h	16 Oct 2013 07:09:57 -0000	1.16.48.1
@@ -64,6 +64,9 @@
 #define HTTP_VERSION           "1.1"
 #define HTTP_CONTENT_TYPE      "application/x-www-form-urlencoded"
 
+// Flush interval time to write log file
+#define FLUSH_INTERVAL_TIME    1
+
 ///////////////////////////////////////////////////////////////////////////////
 // CTLOutput class
 ///////////////////////////////////////////////////////////////////////////////
@@ -128,6 +131,16 @@
 {
 
 protected:
+    class CFFlushCallback : public BaseCallback
+    {
+    public:
+        CFFlushCallback(CTLFileOutput* pOwner);
+        virtual ~CFFlushCallback();
+        // Callback Func
+        STDMETHOD(Func)     (THIS);
+    private:        
+        CTLFileOutput* m_pOwner;    
+    };
 
     FILE* m_fp;
 
@@ -145,6 +158,7 @@
     IHXThreadSafeScheduler* m_pTSScheduler;
     IHXScheduler* m_pScheduler;
     CallbackHandle m_ulRollTimeCallbackHandle;
+    CallbackHandle m_ulFFlushCallbackHandle;
 
     HXTimeval m_StartTime;
 
@@ -180,6 +194,7 @@
 
     BOOL WantToRotate(IHXBuffer *pOutput);
     void Rotate();
+    void FlushFile();
 
     HX_RESULT OpenFile();
     virtual HX_RESULT Output(IHXBuffer* pOutput);


_______________________________________________
Server-cvs mailing list
Server-cvs@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/server-cvs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic