#include "GarbageCleanThread.h" #include "Logger.h" #include #include #include // Expire 󸮸¦ À§ÇÑ ½Ã°£( sec ) // - vmasd Á¤º¸´Â 6 sec ¸¶´Ù Àü¼ÛµÇ¹Ç·Î... ±âÁ¸¿¡µµ 20 sec expire ó¸®ÇßÀ½. // - csagentd ´Â 4 sec ¸¶´Ù Àü¼ÛÇÏÁö¸¸.. tcp ¼¼¼Ç(timeout 6 sec)À̶ó.. Á¤»óÀûÀÎ »óȲÀ̶ó¸é Á¤¸®ÇÒ ÇÊ¿ä ¾øÀ½. #define CLIENT_SHM_EXPIRE_TIME 20 // ÀÛ¾÷ ¼öÇà ÁÖ±â ( sec ) // - ºü¸¥ ÆÇ´ÜÀ¸·Î clean 󸮸¦ ÇØ¾ß.. FHS, RCDB ¿¡ À߸øµÈ Á¤º¸°¡ Àü´ÞµÇÁö ¾ÊÀ½ // - 2018-02-22 #31703 Àϰ¨¿¡¼­ °¢ FHS ¿¡¼­ Á¤º¸ ¼ö½Å timeout ¹ß»ý½Ã ´ë±â°¡ ¾Æ´Ñ ¼¼¼ÇÀ» Á¾·áÇϵµ·Ï ¼öÁ¤ // ÀÌ·Î ÀÎÇØ ±âÁ¸°ú °°ÀÌ ºü¸¥ garbage 󸮰¡ ÇÊ¿äÇÏÁö ¾Ê¾Æ.. µ¿ÀÛ Áֱ⸦ 2 sec -> 4 sec ·Î ¼öÁ¤. #define CLEAN_JOB_INTERVAL 4 // »ý¼ºÀÚ CGarbageCleanThread::CGarbageCleanThread( CShmManager * pShmManager ) : m_pShmManager( pShmManager ) { // Thread handle ÃʱâÈ­ m_threadHandle = 0; } // ¼Ò¸êÀÚ CGarbageCleanThread::~CGarbageCleanThread() { // Thread °¡ µ¿ÀÛ ÁßÀÎ °æ¿ì Thread µ¿ÀÛ Á¤Áö ó¸®. if( m_threadHandle != 0 ) { pthread_cancel( m_threadHandle ); } } // Thread ¸¦ »ý¼ºÇÏ¿© cache ÀÛ¾÷ ¼öÇà bool CGarbageCleanThread::Start( void ) { int nResult = pthread_create( &m_threadHandle, NULL, CGarbageCleanThread::threadFunc, this ); if( nResult != 0 ) { // Thread »ý¼º ½ÇÆÐ½Ã... int errorNum = errno; LOG( LERR, "GarbageCleanThread: Thread create failed.[%d][%s]", errorNum, strerror( errorNum ) ); return false; } return true; } // Thread ÇÔ¼ö void * CGarbageCleanThread::threadFunc( void * arg ) { CGarbageCleanThread * pObject = reinterpret_cast( arg ); pthread_detach( pthread_self() ); // ÁÖ±âÀûÀ¸·Î °øÀ¯¸Þ¸ð¸® clean ÀÛ¾÷ ¼öÇà while( 1 ) { pthread_testcancel(); pObject->Execute(); pthread_testcancel(); // ÁöÁ¤µÈ Áֱ⸶´Ù... sleep( CLEAN_JOB_INTERVAL ); } // Thread Á¾·á½Ã Handle ÃʱâÈ­ pObject->m_threadHandle = 0; return NULL; } // ½ÇÁ¦ °øÀ¯¸Þ¸ð¸® clean 󸮸¦ ´ã´çÇÏ´Â ÇÔ¼ö. void CGarbageCleanThread::Execute() { // expire ½Ã°£ Á¤º¸ time_t expireTime; // ÇöÀç ½Ã°£ Á¤º¸ ÃßÃâ. // - ½Ã°£ µ¿±âÈ­ ¿ÀÂ÷º¸Á¤ °ü·Ã ¹æ¾î¸¦ À§ÇØ clock_gettime(CLOCK_MONOTONIC) ·Î ÃßÃâµÈ Á¤º¸¿Í // - °øÀ¯¸Þ¸ð¸® service.update_time_clock_sec Ç׸ñÀ» ºñ±³Åä·Ï ó¸®. struct timespec currentClock; memset( ¤tClock, 0x00, sizeof( struct timespec ) ); clock_gettime( CLOCK_MONOTONIC, ¤tClock ); // expire ó¸®ÇÒ ½Ã°£ °è»ê. if( currentClock.tv_sec <= CLIENT_SHM_EXPIRE_TIME ) { // ÃßÃâµÈ ½Ã°£ Á¤º¸°¡ ³Ê¹« ÀÛÀº °æ¿ì... // - ÀÌ·² °æ¿ì´Â °ÅÀÇ ¾øÁö¸¸.. Ȥ½Ã³ª ÇØ¼­... LOG( LWAR, "GarbageCleanThread: expire clock value[%lu] too low. clean job skip.", currentClock.tv_sec ); return; } else { int result; expireTime = currentClock.tv_sec - CLIENT_SHM_EXPIRE_TIME; //_LOG( LDBG, "GarbageCleanThread: expire clock value[%lu]", expireTime ); // °øÀ¯¸Þ¸ð¸®¿¡ expire ó¸® ¿äû. result= m_pShmManager->ExpireClient( expireTime ); if( result > 0 ) { _LOG( LINF, "GarbageCleanThread: client expire count[%d] expire_clock[%lu]", result, expireTime ); } } return; }