#include "ReplicateInsert.h" #include #include #include "Logger.h" #include "Database.h" #include "ServiceConfig.h" #include "Util.h" // ó¸® loop °£ÀÇ sleep time Á¤ÀÇ // - ¸Å ÁöÁ¤µÈ sec ¸¶´Ù queue ¸¦ °Ë»çÇÏ¿© RCDB ¿¡ ÀúÀå ó¸®. #define DEFAULT_SLEEP_TIME 3 // RCDB Á¢¼Ó ½ÇÆÐ ¶Ç´Â Query ½ÇÆÐ µîÀÇ »óȲ ¹ß»ý½Ã #define MAX_SLEEP_TIME 30 // Query ¹®Àå ÀúÀåÀ» À§ÇÑ Buffer Å©±â #define DEFAULT_QUERY_BUFFER_SIZE 2048 // »ý¼ºÀÚ // @param [in] pCCompleteData replication ¿Ï·á content Á¤º¸¸¦ ÀúÀåÇÏ´Â queue CReplicateInsert::CReplicateInsert( CDataQueue * pCompleteQueue ) : m_pCompleteQueue( pCompleteQueue ) { m_threadHandle = 0; m_uSleep = DEFAULT_SLEEP_TIME; // NEW 2014-06-16 ½Å±Ô ¸â¹ö º¯¼ö ÃʱâÈ­ ÄÚµå Ãß°¡. // Init() ¿¡¼­ RCDB Á¢¼Ó ½ÇÆÐ°¡ ¹ß»ý °¡´ÉÇϹǷÎ.. ±¸Çü RCDB Çü»óÀ» »ç¿ëÅä·Ï ¼³Á¤. m_bServiceTableSeparate = false; } // ¼Ò¸êÀÚ CReplicateInsert::~CReplicateInsert() { // Thread µ¿ÀÛ Á¤Áö ó¸® // - ¸¸¾à Thread °¡ ÀÌ¹Ì Á¾·áµÈ °æ¿ì m_threadHandle ÀÌ ´Ù¸¥ Thread Handle ÀÏ ¼ö ÀÖÀ¸¹Ç·Î // ¾÷¹« Flow ¼öÁ¤½Ã ÁÖÀÇÇÒ °Í if( m_threadHandle != 0 ) pthread_cancel( m_threadHandle ); } // ÃʱâÈ­ ÀÛ¾÷ ¼öÇà bool CReplicateInsert::Init() { // »ý¼ºÀÚ¸¦ ÅëÇØ Àü´Þ¹ÞÀº queue Æ÷ÀÎÅͰ¡ NULL ÀÎ °æ¿ì... ¿À·ù ó¸® if( m_pCompleteQueue == NULL ) { LOG( LERR, "replication complete queue is null" ); return false; } // Report log ¸¦ ó¸®ÇÒ °´Ã¼ ÃʱâÈ­. if( m_reportLog.Init( CServiceConfig::GetInstance()->GetLogPath() ) == false ) { std::string strErrorMessage; m_reportLog.GetLastError( strErrorMessage ); LOG( LERR, "report log init fail. [%s]", strErrorMessage.c_str() ); return false; } // RCDB Á¢¼Ó Á¤º¸ Load. m_rcdbInfo.Load(); // RCDB Á¢¼Ó 󸮸¦ À§ÇÑ °´Ã¼ »ý¼º DataBase rcdb; // RCDB Á¢¼Ó ½Ãµµ ¹× Á¢¼Ó ½ÇÆÐ½Ã if( rcdb.PgOpenDB( m_rcdbInfo.m_strRcdbIp, m_rcdbInfo.m_nRcdbPort , m_rcdbInfo.m_strRcdbName, m_rcdbInfo.m_strRcdbAcct , m_rcdbInfo.m_strRcdbAcctPw ) == NULL ) { LOG( LERR, "RCDB connection failed." ); return false; } else { // Á¢¼Ó ¼º°øÇÑ °æ¿ì... LOG( LINF, "RCDB connection test ok..." ); // NEW 2014-06-19 huibong // ¼­ºñ½º table ºÐ¸®µÈ ½Å±Ô Çü»óÀÎÁö.. ±¸Çü Çü»óÀÎÁö üũÇÏ¿© // m_bServiceTableSeparate º¯¼ö ¼³Á¤ ó¸®. // ÇØ´ç º¯¼ö ÃʱâÈ­´Â »ý¼ºÀÚ¿¡¼­ 1Â÷·Î ¼öÇàÇÔ. char szQuery[1024]; snprintf( szQuery, 1023, "SELECT * FROM pg_tables WHERE schemaname = 'public' AND tablename = 't_dav_resource' " ); rcdb.PgDoExec( szQuery ); if( rcdb.PgResult( DataBase::NOT_CLEAR ) < 0 ) { // Query ¼öÇà °á°ú ¿À·ù ¹ß»ý½Ã... // - pg_tables °¡ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì ¿À·ù ¹ß»ý °¡´É... // - ÀÌ´Â RCDB °¡ ¾ÆÁ÷ ÀûÀýÇÏ°Ô ±¸¼ºµÇÁö ¾Ê¾Ò´Ù´Â ÀǹÌÀ̹ǷÎ... Init()ÇÔ¼ö¸¦ ¿À·ù·Î ó¸®ÇÑ´Ù. LOG( LERR, "RCDB t_dav_resource exist check failed.[%s][%s]", rcdb.GetErrorMessage().c_str(), szQuery ); rcdb.PgClear(); rcdb.PgCloseDB(); return false; } else { // Query ¼öÇàÀÌ Á¤»óÀÎ °æ¿ì. int nResult = rcdb.GetNoTuples(); if( nResult > 0 ) { // t_dav_resource Å×À̺íÀÌ Á¸ÀçÇÏ´Â °æ¿ì... m_bServiceTableSeparate = false; _LOG( LINF, "CReplicateInsert: t_dav_resource table exist.[Old RCDB Type]" ); } else { // t_dav_resource Å×À̺íÀÌ Á¸ÀçÇÏÁö ¾Ê´Â ¼­ºñ½ºº° Å×ÀÌºí ºÐ¸® Çü»óÀÎ °æ¿ì. m_bServiceTableSeparate = true; _LOG( LINF, "CReplicateInsert: t_dav_resource table not exist.[New RCDB Type]" ); } } // RCDB Á¶È¸ °á°ú set ¸¦ clear ó¸® ÈÄ RCDB Á¢¼Ó ÇØÁ¦. rcdb.PgClear(); rcdb.PgCloseDB(); return true; } } // Thread ¸¦ »ý¼ºÇÏ¿© ÇÒ´çµÈ ÀÛ¾÷À» ¼öÇà. bool CReplicateInsert::Start() { int nRet = ::pthread_create( &m_threadHandle, NULL, CReplicateInsert::threadFunc, this ); if( nRet != 0 ) { // Thread »ý¼º ½ÇÆÐ½Ã int errorNum = errno; LOG( LERR, "Thread create failed.[%d][%s]", errorNum, strerror( errorNum ) ); return false; } return true; } // Thread function void* CReplicateInsert::threadFunc( void* arg ) { CReplicateInsert* pObject = reinterpret_cast( arg ); pthread_detach( pthread_self() ); while( 1 ) { pthread_testcancel(); pObject->Execute(); pthread_testcancel(); // 1ȸ ¼öÇà ÈÄ ÁöÁ¤µÈ ½Ã°£ ¸¸Å­ ´ë±â sleep( pObject->m_uSleep ); } // NEW 2014-06-19 huibong // Thread Á¾·á½Ã m_threadHandle °ªÀ» ÃʱâÈ­ ó¸®. // - ¼Ò¸êÀÚ¿¡¼­ À߸øµÈ Thread ¸¦ Á¾·áÇÒ ¼ö Àֱ⠶§¹®. pObject->m_threadHandle = 0; return NULL; } // ½º·¹µå ³»¿¡¼­ °¢ loop ´ÜÀ§ ó¸® È£Ãâ ÇÔ¼ö. void CReplicateInsert::Execute() { // Queue »ó¿¡ ó¸®ÇÒ Data °¡ Á¸ÀçÇÒ °æ¿ì... if( m_pCompleteQueue->GetSize() > 0 ) { bool bResult; // t_dav_resource Å×ÀÌºí »ç¿ë Çü»óÀÎ °æ¿ì. if( m_bServiceTableSeparate == false ) { bResult = InsertToOldDB(); } else { // ¼­ºñ½ºº° Table ÀÌ ºÐ¸®µÈ ½Å±Ô Çü»óÀÎ °æ¿ì. bResult = InsertToDB(); } // ó¸® °á°ú¿¡ µû¶ó loop sleep time Á¶Á¤ if( bResult == true ) m_uSleep = DEFAULT_SLEEP_TIME; else { // RCDB ¿¬°á ½ÇÆÐ, Queury ¼öÇà ½ÇÆÐ µîÀÇ ¿À·ù ¹ß»ý½Ã m_uSleep = MAX_SLEEP_TIME; } } else { // queue »ó¿¡ ó¸®ÇÒ Data °¡ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì. m_uSleep = DEFAULT_SLEEP_TIME; } } // RCDB »ó¿¡ º¹Á¦ ¿Ï·áµÈ content Á¤º¸¸¦ insert ó¸®ÇÑ´Ù. ( t_dav_resource »ç¿ë ) bool CReplicateInsert::InsertToOldDB() { // 1. RCDB ¿Í ¿¬°á ó¸®. DataBase rcdb; if( rcdb.PgOpenDB( m_rcdbInfo.m_strRcdbIp, m_rcdbInfo.m_nRcdbPort , m_rcdbInfo.m_strRcdbName, m_rcdbInfo.m_strRcdbAcct , m_rcdbInfo.m_strRcdbAcctPw ) == NULL ) { // RCDB Á¢¼ÓÀÌ ½ÇÆÐ LOG( LERR, "RCDB connection failed." ); return false; } // 2. ·çÇÁ¸¦ µ¹¸é¼­ queue ¿¡ ÀúÀåµÈ data ¸¦ ó¸®ÇÑ´Ù. // queue ¿¡¼­ ²¨³½ Á¤º¸¸¦ ÀúÀåÇϱâ À§ÇÑ º¯¼ö CCompleteData resultData; // Query ¹®Àå ÀúÀåÀ» À§ÇÑ ¹öÆÛ »ý¼º char szQuery[DEFAULT_QUERY_BUFFER_SIZE]; // Query ¼öÇà °á°ú°ª ÀúÀåÀ» À§ÇÑ º¯¼ö.. int nResult = 0; while( m_pCompleteQueue->GetSize() > 0 ) { // queue ¿¡ ÀúÀåµÈ ù¹øÂ° data º¹»ç (queue ¿¡¼­ »èÁ¦µÈ »óÅ ¾Æ´Ô) resultData = m_pCompleteQueue->Front(); // URIÀÇ '(ÀÛÀºµû¿ÈÇ¥) ¹®ÀÚ°¡ ÀÖÀ» °æ¿ì SQL ¿À·ù ¹æÁö¸¦ À§ÇÏ¿© °ü·Ã ¹®ÀÚ¸¦ ´Ù¸£°Ô º¯°æÇÔ std::string orgURI = stringreplace(resultData.m_OriginData.m_szURI, "'", "''"); // ¿øº» Á¶È¸ ¼­ºê Äõ¸® Àý¿¡¼­ ºÐ¸®ÇÔ 2012.02.10 // PGPool °æ¿ì INSERT~SELECT »ç¿ë ÁöÇâ // ÇØ´ç ¼­ºêÀý¿¡ SELECT °ªÀÌ DB01,DB02 ¼­·Î ´Ù¸¥ °ªÀ» ÂüÁ¶µÉ ¼ö ÀÖ´Ù. // 3. ¿øº» Á¸Àç ¿©ºÎ È®ÀÎ // Replication 󸮰¡ ¿Ï·áµÈ Content ¿¡ ´ëÇØ meta Á¤º¸ ÀÔ·ÂÀü ½ÇÁ¦ ¿øº»ÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎÇÑ´Ù. sprintf( szQuery, "SELECT " " sp_user_seq, sp_svc_tran_id, " " '%s', " " resource_type, uri, filename_org, '%s', " " depth, display_name, get_content_language, " " get_content_length, get_content_type, " " get_etag, get_lastmodified, creation_date, " " lock_discovery, source, supported_lock, deleted_yn, 'R', file_lastmodified " // is_cache = R "FROM t_dav_resource " "WHERE filename_hash = '%s' " "AND uri = '%s' " "AND get_content_length = %lld " "AND is_cache = 'N' AND host_name = '%s' ;", resultData.m_szTargetHostName.c_str(), resultData.m_szTargetFileNameHash.c_str(), resultData.m_OriginData.m_szFileNameHash.c_str(), orgURI.c_str(), resultData.m_OriginData.m_nContentLength, resultData.m_OriginData.m_szOriginHostName.c_str() ); // Query ¼öÇà ¹× °á°ú È®ÀÎ rcdb.PgDoExec( szQuery ); nResult = rcdb.PgResult( DataBase::NOT_CLEAR ); if( nResult < 0 ) { // RCDB t_dav_resource Å×À̺í Á¶È¸ ½ÇÆÐ½Ã // - RCDB ¿¬°á °ü·Ã ½ÇÆÐ½Ã : nResult = -4 // - uri »óÀÇ Æ¯¼ö¹®ÀÚ·Î ÀÎÇØ query ¿À·ù : nResult = -4 // - Áï ¿À·ù ¹Ýȯ°ªÀÌ µ¿ÀÏÇϱ⠶§¹®¿¡ ¾î¶°ÇÑ ¹®Á¦·Î query °¡ ½ÇÆÐÇß´ÂÁö ÆÇ´Ü ¸øÇÔ. // ¿ì¼± DB ¿¬°á ¹®Á¦ÀÏ ¼ö ÀÖÀ¸¹Ç·Î... // RCDB ÀçÁ¢¼Ó ½Ãµµ. rcdb.PgClear(); rcdb.PgCloseDB(); sleep( 1 ); if( rcdb.PgOpenDB( m_rcdbInfo.m_strRcdbIp, m_rcdbInfo.m_nRcdbPort , m_rcdbInfo.m_strRcdbName, m_rcdbInfo.m_strRcdbAcct , m_rcdbInfo.m_strRcdbAcctPw ) == NULL ) { // RCDB Á¢¼Ó ½ÇÆÐ ¹®Á¦ÀÎ °æ¿ì.. // - º» ó¸® ÇÔ¼ö Á¾·á ó¸®ÇÏ¿© ´ÙÀ½ loop ¿¡¼­ Àç½ÃµµÅä·Ï ó¸®. LOG( LERR, "select query fail because RCDB connection error. [%d][%s]" , nResult, rcdb.GetErrorMessage().c_str()); rcdb.PgCloseDB(); return false; } else { // uri »ó¿¡ Ư¼ö ¹®ÀÚ ¹®Á¦·Î query ½ÇÆÐ½Ã // - Report ·Î±×¿¡ °ü·Ã ³»¿ª ±â·Ï // - queue ¿¡¼­ ÇØ´ç Á¤º¸¸¦ »èÁ¦ ó¸®ÇÑ ÈÄ °è¼Ó ¼öÇàÇÑ´Ù. LOG( LERR, "select query fail. queue forced pop.[%s][%d][%s]" , orgURI.c_str(), nResult, rcdb.GetErrorMessage().c_str() ); m_reportLog.Write( "WAR", "[%s][Replication contents RCDB insert fail. check uri.[%s]]" , PROG_NAME, orgURI.c_str()); rcdb.PgClear(); m_pCompleteQueue->Pop(); continue; } } // °á°ú Row ¼ö È®ÀÎ. nResult = rcdb.GetNoTuples(); if( nResult <= 0 ) { // Replication »ý¼ºµÈ content °¡ RCDB ¿¡ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì... // - RCDB ¿¡ ÀúÀåÇÏÁö ¾Ê°í ±×³É ¹ö¸°´Ù. // - ÀÌ·Î ÀÎÇØ FHS ¿¡ meta ±âÁØÀ¸·Î »èÁ¦ ºÒ°¡´ÉÇÑ ÆÄÀÏÀÌ ³²°Ô µÈ´Ù. _LOG( LINF, "Replication content[%s] not found in RCDB.", orgURI.c_str() ); rcdb.PgClear(); m_pCompleteQueue->Pop(); continue; } // Á¶È¸µÈ ¿øº» Á¤º¸¸¦ list ¿¡ ÀúÀå std::vector srcinfo; std::string strResult; for( int j = 0 ; j < 21; j++ ) { strResult = rcdb.GetValue( 0, j ); strResult = stringreplace( strResult, "'", "''" ); srcinfo.push_back( strResult ); } // Select Query ÀÇ °á°ú¸¦ Clear rcdb.PgClear(); // 4. Replication µÈ Content Á¤º¸¸¦ Meta Á¤º¸·Î Insert // INSERT ÀÛ¾÷½Ã ¾Õ¿¡¼­ Á¶È¸µÈ ¿øº» Á¤º¸¸¦ ÀÌ¿ëÇÏ¿© INSERT ÇÑ´Ù. sprintf( szQuery, "INSERT INTO t_dav_resource " "( " " sp_user_seq, sp_svc_tran_id, " " host_name, " " resource_type, uri, filename_org, filename_hash, " " depth, display_name, get_content_language, " " get_content_length, get_content_type, " " get_etag, get_lastmodified, creation_date, " " lock_discovery, source, supported_lock, deleted_yn, is_cache ,file_lastmodified) " "VALUES " "( " " %s, %s, " " '%s', " " %s, '%s', '%s', '%s', " " %s, '%s', '%s', " " %s, '%s', " " '%s', %s, %s, " " '%s', %s, '%s', '%s', '%s', %s );", // is_cache = R srcinfo[0].c_str(),srcinfo[1].c_str(),srcinfo[2].c_str(),srcinfo[3].c_str(), srcinfo[4].c_str(),srcinfo[5].c_str(),srcinfo[6].c_str(),srcinfo[7].c_str(), srcinfo[8].c_str(),srcinfo[9].c_str(),srcinfo[10].c_str(),srcinfo[11].c_str(), srcinfo[12].c_str(),srcinfo[13].c_str(),srcinfo[14].c_str(),srcinfo[15].c_str(), srcinfo[16].c_str(),srcinfo[17].c_str(),srcinfo[18].c_str(),srcinfo[19].c_str(),srcinfo[20].c_str() ); // INSERT query ¼öÇà rcdb.PgDoExec( szQuery ); nResult = rcdb.PgResult( DataBase::CLEAR ); if( nResult < 0 ) { // RCDB INSERT ÀÛ¾÷½Ã ¿À·ù°¡ ¹ß»ýÇÑ °æ¿ì... // - uri ¹®Á¦´Â ¾ÕÀÇ SELECT query ¿¡¼­ üũÇßÀ¸¹Ç·Î ¾Æ´Ï°í.... // - DB ¿¬°á ¹®Á¦ ¿ª½Ã ¹Ù·Î ¾Õ¿¡¼­ üũ ÇßÀ¸¹Ç·Î ¾Æ´Ò °¡´É¼ºÀÌ Å­. // - °¡Àå Å« ¿À·ù´Â Query ¿À·ùÀÏ °¡´É¼ºÀÌ Å©¹Ç·Î... // - Queue ¿¡ pop ó¸®ÇÑ´Ù. // Report ·Î±×¿¡ °ü·Ã ³»¿ª ±â·Ï LOG( LERR, "insert query fail. queue forced pop.[%s][%d][%s]" , orgURI.c_str(), nResult, rcdb.GetErrorMessage().c_str() ); m_reportLog.Write( "WAR", "[%s][Replication contents RCDB insert fail. Check query[%s][%s]]" , PROG_NAME, orgURI.c_str(), rcdb.GetErrorMessage().c_str() ); // queue ¿¡¼­ ÇØ´ç Á¤º¸¸¦ »èÁ¦ ó¸®ÇÑ ÈÄ °è¼Ó ¼öÇàÇÑ´Ù. rcdb.PgClear(); m_pCompleteQueue->Pop(); continue; } rcdb.PgClear(); // NEW 2012-09-24 huibong Replication ÃÖÁ¾ Á¤ÇÕ¼º °ËÁõ ±â´É Ãß°¡ // ¿øº» Á¸Àç ¿©ºÎ¸¦ È®ÀÎÇÑ ÈÄ Insert ¸¦ ¼öÇàÇÏÁö¸¸... // ÇØ´ç interval µ¿¾È ¿øº»ÀÌ MOVE ¶Ç´Â Rename, Delete µÇ´Â »óȲÀÌ ¹ß»ýÇÏ¿© À߸øµÈ ReplicationÀÌ ¹ß»ýÇϰí..ÀÌ·Î ÀÎÇØ ¼­ºñ½º Àå¾Ö°¡ ¹ß»ý °¡´É // INSERT ÀÛ¾÷ ÈÄ ¿øº»¿¡ ´ëÇÑ Á¤ÇÕ¼º ¿©ºÎ¸¦ ´Ù½Ã Çѹø È®ÀÎÇÏ¿© // ¿øº»ÀÌ º¯°æµÈ °æ¿ì INSERT µÈ Meta Á¤º¸¸¦ DELETE ó¸®ÇÑ´Ù. // 5. INSERT µÈ Meta Á¤º¸¿¡ ´ëÇØ ¿øº»ÀÌ Á¸ÀçÇÏ´ÂÁö ´Ù½Ã Çѹø È®ÀÎÇÏ¿© // ¿øº»ÀÌ º¯°æµÈ °æ¿ì INSERT µÈ Á¤º¸¸¦ DELETE ÇÑ´Ù. (deleted_yn = 'Y', ¹°¸® Content ÀÚµ¿ Á¦°Å ó¸® ¸ñÀû ) sprintf( szQuery, "SELECT " " uri, get_content_length, deleted_yn " "FROM t_dav_resource " "WHERE filename_hash = '%s' " "AND uri = '%s' " "AND get_content_length = %lld " "AND is_cache = 'N' AND host_name = '%s' AND deleted_yn = '%s' ;", resultData.m_OriginData.m_szFileNameHash.c_str(), orgURI.c_str(), resultData.m_OriginData.m_nContentLength, resultData.m_OriginData.m_szOriginHostName.c_str(), srcinfo[18].c_str() ); rcdb.PgDoExec( szQuery ); nResult = rcdb.PgResult( DataBase::NOT_CLEAR ); if( nResult < 0 ) { // ÃÖÁ¾ °ËÁõÀ» À§ÇÑ Check query °¡ ½ÇÆÐÇÑ °æ¿ì.. // query ±¸¹®Àº ¾ÕÀÇ 2¹ø query ¸¦ ÅëÇØ °ËÁõµÇ¾úÀ¸¹Ç·Î.. query ¹®Á¦°¡ ¾Æ´Ò µí. // º» ¿À·ù´Â ´ëºÎºÐ RCDB ¿¬°á °ü·Ã ¹®Á¦ÀÎ µí. // - ·Î±ë ó¸® ÈÄ // - RCDB ¿¡ ÀÌ¹Ì INSERT ó¸® µÇ¾úÀ¸¹Ç·Î... queue pop ó¸® // - DB ¼¼¼Ç Á¾·á ó¸® ÈÄ .. return ÇÏ¿©.. sleep ÈÄ ´ÙÀ½ ·çÇÁ°¡ µ¿ÀÛÇϵµ·Ï ó¸®. LOG(LERR, "replication last check query fail.[%s][%d][%s][%s]" , orgURI.c_str(), nResult, rcdb.GetErrorMessage().c_str(), szQuery ); rcdb.PgClear(); rcdb.PgCloseDB(); m_pCompleteQueue->Pop(); return false; } // Á¶È¸µÈ °á°ú row ¼ö È®ÀÎ nResult = rcdb.GetNoTuples(); rcdb.PgClear(); if( nResult <= 0 ) { // ¿øº»ÀÌ º¯°æµÈ °æ¿ì...... // ¾Õ¿¡¼­ INSERT µÈ Replication Á¤º¸¸¦ deleted_yn = 'Y' ó¸®ÇÑ´Ù. LOG( LWAR, "replication check source not found. insert replication value set deleted [%s]" , orgURI.c_str() ); sprintf( szQuery, "UPDATE t_dav_resource SET deleted_yn = 'Y', get_lastmodified = %lld " "WHERE uri = '%s' " " AND host_name = '%s' " " AND filename_hash = '%s' " " AND get_content_length = %lld " " AND is_cache = 'R' " " AND deleted_yn = 'N' ;", longtime_now(), orgURI.c_str(), resultData.m_szTargetHostName.c_str(), resultData.m_szTargetFileNameHash.c_str(), resultData.m_OriginData.m_nContentLength ); rcdb.PgDoExec( szQuery ); nResult = rcdb.PgResult( DataBase::CLEAR ); if( nResult < 0 ) { // »èÁ¦ ó¸® ÀÛ¾÷ÀÌ ½ÇÆÐÇÑ °æ¿ì... // RCDB ¿¬°á ¹®Á¦·Î ÀÎÇÑ °¡´É¼ºÀÌ °¡Àå Å©¹Ç·Î... // - ·Î±ë ÈÄ.. // - RCDB ¿¬°á ÇØÁ¦... // - queue pop ÈÄ ´ÙÀ½ ·çÇÁ¿¡¼­ ó¸®Åä·Ï return ó¸®. LOG( LERR, "invalid replication delete fail.[%s][%s]" , orgURI.c_str(), rcdb.GetErrorMessage().c_str()); m_reportLog.Write( "WAR", "[%s][Invalid replication contents exist.[%s]]" , PROG_NAME, orgURI.c_str() ); rcdb.PgClear(); rcdb.PgCloseDB(); m_pCompleteQueue->Pop(); return false; } } // 1 °³ replication content ¿¡ ´ëÇÑ RCDB insert ÀÛ¾÷ÀÌ ¿Ï·áµÈ °æ¿ì. // - RCDB clear ó¸®ÈÄ // - queue pop. rcdb.PgClear(); m_pCompleteQueue->Pop(); _LOG( LDBG, "replication rcdb Insert [%s|%s]->[%s|%s|%llu]" , resultData.m_OriginData.m_szOriginHostName.c_str() , resultData.m_OriginData.m_szURI.c_str() , resultData.m_szTargetHostName.c_str() , resultData.m_szTargetFileNameHash.c_str() , resultData.m_OriginData.m_nContentLength ); } // queue ¿¡ ÀúÀåµÈ Á¤º¸ ó¸® ÀÛ¾÷ÀÌ ¿Ï·áµÈ °æ¿ì... // - RCDB ¿¬°á ÇØÁ¦ ó¸®. rcdb.PgClear(); rcdb.PgCloseDB(); return true; } // RCDB »ó¿¡ º¹Á¦ ¿Ï·áµÈ content Á¤º¸¸¦ insert ó¸®ÇÑ´Ù. ( t_meta_xxx »ç¿ë ) // - ½Å±Ô RCDB °ü·Ã ¹Ì»ç¿ë Column Ç׸ñ Á¦°Å ó¸®. bool CReplicateInsert::InsertToDB() { // 1. RCDB ¿Í ¿¬°á ó¸®. DataBase rcdb; if( rcdb.PgOpenDB( m_rcdbInfo.m_strRcdbIp, m_rcdbInfo.m_nRcdbPort , m_rcdbInfo.m_strRcdbName, m_rcdbInfo.m_strRcdbAcct , m_rcdbInfo.m_strRcdbAcctPw ) == NULL ) { // RCDB Á¢¼ÓÀÌ ½ÇÆÐ LOG( LERR, "RCDB connection failed." ); return false; } // 2. ·çÇÁ¸¦ µ¹¸é¼­ queue ¿¡ ÀúÀåµÈ data ¸¦ ó¸®ÇÑ´Ù. // queue ¿¡¼­ ²¨³½ Á¤º¸¸¦ ÀúÀåÇϱâ À§ÇÑ º¯¼ö CCompleteData resultData; // Query ¹®Àå ÀúÀåÀ» À§ÇÑ ¹öÆÛ »ý¼º char szQuery[DEFAULT_QUERY_BUFFER_SIZE]; // Query ¼öÇà °á°ú°ª ÀúÀåÀ» À§ÇÑ º¯¼ö.. int nResult = 0; while( m_pCompleteQueue->GetSize() > 0 ) { // queue ¿¡ ÀúÀåµÈ ù¹øÂ° data º¹»ç (queue ¿¡¼­ »èÁ¦µÈ »óÅ ¾Æ´Ô) resultData = m_pCompleteQueue->Front(); // URIÀÇ '(ÀÛÀºµû¿ÈÇ¥) ¹®ÀÚ°¡ ÀÖÀ» °æ¿ì SQL ¿À·ù ¹æÁö¸¦ À§ÇÏ¿© °ü·Ã ¹®ÀÚ¸¦ ´Ù¸£°Ô º¯°æÇÔ std::string orgURI = stringreplace( resultData.m_OriginData.m_szURI, "'", "''" ); // ¿øº» Á¶È¸ ¼­ºê Äõ¸® Àý¿¡¼­ ºÐ¸®ÇÔ 2012.02.10 // PGPool °æ¿ì INSERT~SELECT »ç¿ë ÁöÇâ // ÇØ´ç ¼­ºêÀý¿¡ SELECT °ªÀÌ DB01,DB02 ¼­·Î ´Ù¸¥ °ªÀ» ÂüÁ¶µÉ ¼ö ÀÖ´Ù. // CHG 2015-02-12 huibong // ½Å±Ô RCDB Çü»ó¿¡ ¸Âµµ·Ï ó¸® Flow ´Ü¼øÈ­ (#21354) // - RCDB ±¸Á¶°¡ pgpool -> streaming replicaton ±¸Á¶·Î º¯°æµÊ // - ÀÌ¿¡ µû¶ó ±âÁ¸ SELECT ÈÄ INSERT, °Ë¼ö, DELETE flow ¿¡ ´ëÇÑ ´Ü¼øÈ­ °¡´ÉÇÔ. sprintf( szQuery, "INSERT INTO t_meta_%s " // ½ÅÇü RCDB Çü»ó "( " " sp_user_seq, sp_svc_tran_id, " " host_name, " " resource_type, uri, filename_org, filename_hash, " " depth, display_name, " " get_content_length, get_content_type, " " get_lastmodified, creation_date, " " source, deleted_yn, is_cache , file_lastmodified " ") " "SELECT " " sp_user_seq, sp_svc_tran_id, " " '%s', " " resource_type, uri, filename_org, '%s', " " depth, display_name, " " get_content_length, get_content_type, " " get_lastmodified, creation_date, " " source, deleted_yn, 'R', file_lastmodified " // is_cache = R "FROM t_meta_%s " // ½ÅÇü RCDB Çü»ó "WHERE filename_hash = '%s' " "AND uri = '%s' " "AND get_content_length = %lld " "AND is_cache = 'N' AND host_name = '%s' ;" , resultData.m_OriginData.m_szServiceSeq.c_str() , resultData.m_szTargetHostName.c_str() , resultData.m_szTargetFileNameHash.c_str() , resultData.m_OriginData.m_szServiceSeq.c_str() , resultData.m_OriginData.m_szFileNameHash.c_str() , orgURI.c_str() , resultData.m_OriginData.m_nContentLength , resultData.m_OriginData.m_szOriginHostName.c_str() ); // INSERT-SELECT query ¼öÇà rcdb.PgDoExec( szQuery ); nResult = rcdb.PgResult( DataBase::NOT_CLEAR ); if( nResult < 0 ) { // RCDB SELECT-INSERT ÀÛ¾÷½Ã ¿À·ù°¡ ¹ß»ýÇÑ °æ¿ì... // - RCDB ¿¬°á °ü·Ã ½ÇÆÐ½Ã : nResult = -4 // - uri »óÀÇ Æ¯¼ö¹®ÀÚ·Î ÀÎÇØ query ¿À·ù : nResult = -4 // - ±×¿Ü Query ¿À·ùÀÏ °¡´É¼ºÀÌ Á¸Àç std::string strPreviousErrorMessage = rcdb.GetErrorMessage(); // ¿ì¼± DB ¿¬°á ¹®Á¦ÀÏ ¼ö ÀÖÀ¸¹Ç·Î... RCDB ÀçÁ¢¼Ó ½Ãµµ. rcdb.PgClear(); rcdb.PgCloseDB(); sleep( 1 ); if( rcdb.PgOpenDB( m_rcdbInfo.m_strRcdbIp, m_rcdbInfo.m_nRcdbPort , m_rcdbInfo.m_strRcdbName, m_rcdbInfo.m_strRcdbAcct , m_rcdbInfo.m_strRcdbAcctPw ) == NULL ) { // RCDB Á¢¼Ó ½ÇÆÐ ¹®Á¦ÀÎ °æ¿ì.. // - º» ó¸® ÇÔ¼ö Á¾·á ó¸®ÇÏ¿© ´ÙÀ½ loop ¿¡¼­ Àç½ÃµµÅä·Ï ó¸®. LOG( LERR, "Query fail because New RCDB connection error. [%d][%s]" , nResult, rcdb.GetErrorMessage().c_str() ); rcdb.PgCloseDB(); return false; } else { // uri »ó¿¡ Ư¼ö ¹®ÀÚ ¶Ç´Â Query ¹®Á¦ÀÎ °æ¿ì... // - Report ·Î±×¿¡ °ü·Ã ³»¿ª ±â·Ï // - queue ¿¡¼­ ÇØ´ç Á¤º¸¸¦ »èÁ¦ ó¸®ÇÑ ÈÄ °è¼Ó ¼öÇàÇÑ´Ù. LOG( LERR, "insert-select query fail. queue forced pop.[%s][%d][%s]" , orgURI.c_str(), nResult, strPreviousErrorMessage.c_str() ); // Report ·Î±×¿¡ °ü·Ã ³»¿ª ±â·Ï m_reportLog.Write( "WAR", "[%s][Replication contents New RCDB insert fail. Check query[%s][%s]]" , PROG_NAME, orgURI.c_str(), strPreviousErrorMessage.c_str() ); rcdb.PgClear(); m_pCompleteQueue->Pop(); continue; } } // PgResult È£Ãâ½Ã NOT_CLEAR ¿É¼ÇÀ» »ç¿ëÇßÀ¸¹Ç·Î....INSERT ¼öÇà row ¼ö È®ÀÎÀ» À§ÇØ GetCmdTuples() ÇÔ¼ö¸¦ È£Ãâ°¡´É. nResult = rcdb.GetCmdTuples(); if( nResult > 0 ) { _LOG( LDBG, "replication rcdb Insert [%d] row, [%s|%s]->[%s|%s|%llu]" , nResult , resultData.m_OriginData.m_szOriginHostName.c_str() , resultData.m_OriginData.m_szURI.c_str() , resultData.m_szTargetHostName.c_str() , resultData.m_szTargetFileNameHash.c_str() , resultData.m_OriginData.m_nContentLength ); } else { // INSERT ó¸®µÈ row °¡ ¾ø´Â °æ¿ì.... // - »ý¼ºµÈ replicaton ÆÄÀÏÀº °í¾Æ ÆÄÀÏÀÌ µÊ. _LOG( LWAR, "replication rcdb Insert origin not found. orgin[%s|%s|%llu|%s] orphan[%s|%s|%llu]" , resultData.m_OriginData.m_szOriginHostName.c_str() , resultData.m_OriginData.m_szFileNameHash.c_str() , resultData.m_OriginData.m_nContentLength , resultData.m_OriginData.m_szURI.c_str() , resultData.m_szTargetHostName.c_str() , resultData.m_szTargetFileNameHash.c_str() , resultData.m_OriginData.m_nContentLength ); } // 1 °³ replication content ¿¡ ´ëÇÑ RCDB insert ÀÛ¾÷ÀÌ ¿Ï·áµÈ °æ¿ì. // - RCDB clear ó¸®ÈÄ // - queue pop. rcdb.PgClear(); m_pCompleteQueue->Pop(); } // queue ¿¡ ÀúÀåµÈ Á¤º¸ ó¸® ÀÛ¾÷ÀÌ ¿Ï·áµÈ °æ¿ì... // - RCDB ¿¬°á ÇØÁ¦ ó¸®. rcdb.PgClear(); rcdb.PgCloseDB(); return true; }