#include #include #include #include #include "Logger.h" #include "FtsdSocketControl.h" #define LOG_PATH "/user/service/logs" // Log ÆÄÀÏÀº /user/service/logs/sample/sample_³¯Â¥.log ·Î »ý¼ºµÊ. #define TRANSFER_LISTEN_PORT 14001 // ftsd ÀÇ Listen Port int main() { ///////////// 1. ±âº» Á¤º¸ ¼³Á¤ /////////////////// // Source Àåºñ Host Name std::string szSourceHostName = "bd-16-fhs001.ktsh.co.kr"; // Source ÆÄÀϸí ( Mount À§Ä¡±îÁö Æ÷ÇÔÇÔ Àüü °æ·Î ) //std::string szSourceFileNameHash = "/stg/node1/186/4b2d62b6357b548ac984894a12630e25"; //std::string szSourceFileNameHash = "/user2/dav_storage/186/00ace1da4678aeb61e7aac6708dcdcaa"; std::string szSourceFileNameHash = "/stg/node0/1/huibong.txt"; // Source ÆÄÀÏÀÇ Å©±â ( ¸¸¾à ÀÏÄ¡ÇÏÁö ¾ÊÀ» °æ¿ì ftsd ¿¡¼­ ¿À·ù·Î ó¸®ÇÔ) //unsigned long long nSourceFileSize = 100000000; unsigned long long nSourceFileSize = 42; // Target FHS Host Name Á¤º¸ ( ´ÙÁß Target »ç¿ë °¡´ÉÀ¸·Î ÀÎÇØ vector »ç¿ë) std::vector< std::string > vecTarget; //vecTarget.push_back( "bd-16-fhs002.ktsh.co.kr" ); //vecTarget.push_back( "bd-16-fhs003.ktsh.co.kr" ); //vecTarget.push_back( "222.122.153.81" ); vecTarget.push_back( "222.122.153.82" ); //vecTarget.push_back( "bd-04-fhs003.ktsh.co.kr" ); //vecTarget.push_back( "bd-04-fhs004.ktsh.co.kr" ); //vecTarget.push_back( "bd-04-fhs005.ktsh.co.kr" ); //vecTarget.push_back( "bd-04-fhs006.ktsh.co.kr" ); ///////////// 2. ¿É¼Ç ¼³Á¤ ////////////// // Àü¼Û¿Ï·áÈÄ Hash °Ë»ç Level, 0: ¾ÈÇÔ, 1: ¾ÕµÚ 1Mbyte¸¸ °Ë»ç, 2: ÆÄÀÏ Àüü°Ë»ç int nFileHashCheckLevel = 1; // ÆÄÀÏ Àü¼Û½Ã ³»ºÎ¸ÁÀ» »ç¿ëÇÒÁö ¿©ºÎ, RC ³» 󸮽ÿ¡´Â true ¼³Á¤, RC-RC °£ µ¿À۽ÿ¡´Â È¿À²¼ºÀ» À§ÇØ false ¼³Á¤ÇÒ °Í. bool bUseInternalIp = true; ////////////// Sample ÄÚµå ////////////// // Log ó¸®¿ë °´Ã¼ »ý¼º ¹× ÃʱâÈ­. if( CLogger::Init( PROG_NAME, LOG_PATH, LDBG ) == false ) { std::cout << "[error] Logger object created failed.." << std::endl; return 0; } // Start logging _LOG( LINF, "ftsd sample Start: Source[%s][%s][%llu]", szSourceHostName.c_str(), szSourceFileNameHash.c_str(), nSourceFileSize ); // ftsd ¿Í Åë½ÅÀ» ó¸®ÇÒ Socket Control °´Ã¼ »ý¼º ¹× Á¢¼Ó CFtsdSocketControl ftsdSocket; if( ftsdSocket.ConnectTarget( szSourceHostName, TRANSFER_LISTEN_PORT ) == false ) { // Source ftsd À¸·Î Á¢¼Ó ½ÇÆÐ½Ã _LOG( LERR, "Source FHS connect fail. [%s][%d]", szSourceHostName.c_str(), TRANSFER_LISTEN_PORT ); return EXIT_FAILURE; } // Source ftsd ·Î ÆÄÀÏ¿¡ ´ëÇÑ Replication ó¸® ¿äû // SendFileReplicationRequest() ÇÔ¼ö´Â FtsdSocketControl.h ÆÄÀÏ ÂüÁ¶. if( ftsdSocket.SendFileReplicationRequest( szSourceFileNameHash, nSourceFileSize, nFileHashCheckLevel, bUseInternalIp, vecTarget ) == false ) { // Source ftsd ·Î Replication ¿äû Àü¼Û ½ÇÆÐ½Ã _LOG( LERR, "Replication Request send fail.[%s][%s][%llu]", szSourceHostName.c_str(), szSourceFileNameHash.c_str(), nSourceFileSize); return EXIT_FAILURE; } // Replication ¿äû¿¡ ´ëÇÑ ÀÀ´ä ´ë±â int nResult = 0; int nTimeout = 5; // ÀÀ´ä ´ë±â ½Ã°£ ( sec ) bool bResultSuccess; // ó¸® °á°úÀÇ ¼º°ø/½ÇÆÐ ¿©ºÎ¸¦ ÀúÀåÇϱâ À§ÇÑ º¯¼ö. std::string szResultErrorMessage; // bResultSuccess= fale ÀÎ °æ¿ì ¿À·ù¸Þ½ÃÁö¸¦ ÀúÀåÇϱâ À§ÇÑ º¯¼ö. std::map< std::string, std::string> mapSuccessInfo; // ¼º°øÇÑ FHS Host¸í ¹× ÆÄÀÏÁ¤º¸¸¦ ÀúÀåÇϱâ À§ÇÑ list std::map< std::string, std::string> mapFailInfo; // ½ÇÆÐÇÑ FHS Host¸í ¹× °¢ FHSº° ¿À·ù¸Þ½ÃÁö¸¦ ÀúÀåÇϱâ À§ÇÑ list // ·çÇÁ¸¦ µ¹¸é¼­ Replication ¿äû¿¡ ´ëÇÑ ÀÀ´äÀ» ´ë±â while(1) { // nTimeout ¿¡ ÁöÁ¤µÈ ½Ã°£µ¿¾È ÀÀ´ä´ë±â ½Ãµµ // GetFileReplicationResult() ÇÔ¼ö´Â SocketControl.h ÆÄÀÏ Âü°í. nResult = ftsdSocket.GetFileReplicationResult( nTimeout, bResultSuccess, szResultErrorMessage, mapSuccessInfo, mapFailInfo ); if( nResult == -1 ) { // Socket Åë½Å °ü·Ã ¿À·ù ¶Ç´Â Á¢¼Ó Á¾·á°¡ ¹ß»ýÇÑ °æ¿ì. // ÇØ´ç ³»¿ª ·Î±ë ¹× ·çÇÁ Á¾·á _LOG( LERR, "ftsd Response wait fail by socket [%s][%s]", szSourceHostName.c_str(), szSourceFileNameHash.c_str() ); break; } else if( nResult == 0 ) { // ÁöÁ¤µÈ ½Ã°£ µ¿¾È ÀÀ´ä´ë±â Áß Ã³¸® °á°ú Á¤º¸°¡ ¾ÆÁ÷ ¼ö½ÅµÇÁö ¾ÊÀº °æ¿ì => Allive Check ÆÐŶ Çѹø ½î°í ´Ù½Ã Loop ·Î if( ftsdSocket.SendAliveCheck() == false ) { // Alive Àü¼Û ½ÇÆÐ½Ã => Socket Á¾·á ¹× ¿À·ù°¡ ¹ß»ýÇÑ °æ¿ìÀÓ. _LOG( LERR, "ftsd Response wait fail by socket2 [%s][%s]", szSourceHostName.c_str(), szSourceFileNameHash.c_str() ); break; } // Á¤»óÀûÀÎ °æ¿ì ´Ù½Ã ÀÀ´ä´ë±â. continue; } else if( nResult == 1 ) { // ¿äû¿¡ ´ëÇÑ Ã³¸®°á°ú Á¤º¸°¡ ¼ö½ÅµÈ °æ¿ì. // ÇØ´ç Á¤º¸ ·Î±ëó¸®. if( bResultSuccess == true ) { // ¿äû¿¡ ´ëÇÑ Ã³¸®°¡ ÀÏ´ÜÀº ¼öÇàµÈ °æ¿ì => ¼º°øÇÑ FHS Á¤º¸ ¿Í ½ÇÆÐÇÑ FHS Á¤º¸°¡ ³ªÅ¸³². std::map< std::string, std::string>::const_iterator it; // ¼º°øÇÑ FHS ¸ñ·Ï for( it = mapSuccessInfo.begin(); it != mapSuccessInfo.end(); it++ ) { // ¼º°øÇÑ °æ¿ì Target FHS Host Name ¹× ÀúÀåµÈ File Full Name Á¤º¸°¡ Ç¥½ÃµÊ. _LOG( LINF, "Result SUCCESS [%s][%s]", (it->first).c_str(), (it->second).c_str() ); } // ½ÇÆÐÇÑ FHS ¸ñ·Ï for( it = mapFailInfo.begin(); it != mapFailInfo.end(); it++ ) { // ½ÇÆÐÇÑ °æ¿ì Target FHS Host Name ¹× ¿À·ù¸Þ½ÃÁö Á¤º¸°¡ Ç¥½ÃµÊ. _LOG( LINF, "Result FAIL [%s][%s]", (it->first).c_str(), (it->second).c_str() ); } } else { // ¿äû¿¡ ´ëÇÑ Ã³¸®¸¦ ¾Æ¿¹ ¼öÇàÇÒ ¼ö ¾ø´Â °æ¿ì => Source FHS ÆÄÀÏ Á¤º¸ ¹× °¢ Á¤º¸ °Ë»ç½Ã ¿À·ù°¡ ¹ß»ýÇÑ °æ¿ì. ( Target FHS ·Î Á¢±Ù ÀÛ¾÷ Àü ) // ÀÎÀÚ·Î Àü´ÞÇÑ szResultErrorMessage »ó¿¡ ¿À·ù ¹ß»ýÁ¤º¸°¡ ÀúÀåµÊ. _LOG( LINF, "Replication result error [%s][%s][%s]", szSourceHostName.c_str(), szSourceFileNameHash.c_str(), szResultErrorMessage.c_str() ); } break; // ÀÀ´äÀ» ¹Þ¾ÒÀ¸´Ï ÀÀ´ä ´ë±â ·çÇÁ Á¾·á } else { // Replication ¿äû¿¡ ´ëÇÑ ÀÀ´äÆÐŶÀÌ ¾Æ´Ñ °æ¿ì. // ÇØ´ç ÆÐŶÀº ¹«½ÃÇÏ°í ´Ù½Ã Loop ·Î continue; } } // End logging _LOG( LINF, "ftsd sample process End [%s][%s][%llu]", szSourceHostName.c_str(), szSourceFileNameHash.c_str(), nSourceFileSize ); _LOG( LINF, "-------------------------------------------------------------------------------" ); CLogger::Exit(); return EXIT_SUCCESS; }