[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