/***************************************************************************
           Content 에 대한 실제 Replication 처리를 수행하는 Thread class
                -----------------------------------------
    begin      : 2010/03/13
    copyright  : (C) 2010 Solbox Inc.
    author     : storage dev team
    email      : storage.sd@solbox.com
    version    : 3.3

    CopyRight(C) 2010 Solbox Inc. All Rights reserved.
    Redistribution and use in source and binary forms, with or with out
    modification, are not permitted in outside of Solbox Inc.
***************************************************************************/

#ifndef __REPLICATE_THREAD_H__
#define __REPLICATE_THREAD_H__


#include <vector>
#include <map>
#include <string>
#include <pthread.h>

#include "ProcessStatus.h"
#include "DataQueue.hpp"
#include "ReplicationData.h"

// CReplicateThread
// 전달받은 Content 에 대해 각 FHS 와 통신을 통해 실제 Replication 생성을 수행
// - Replicate 정보 및 FHS 정보를 SocketControl 을 이용하여 ftsd 로 전송
// - 처리 결과 수신 후 CompletQueue 또는 RetryQueue 상에 저장처리
// 내부적으로 Thread를 사용
class CReplicateThread
{
    public:
        
		// 생성자
		CReplicateThread( CProcessStatus* const pProcessStatus
			            , CDataQueue<CRetryData>* const pQueueRetry
						, CDataQueue<CCompleteData>* const pQueueComplete
						, CRetryData& dataJob
						, std::vector<std::string>& vecTargetFHS );

		// 소멸자
        ~CReplicateThread();
        
		// thread를 생성하여 업무 flow 를 시작.
        bool Start();
		        

    private:

		// 스레드 함수
		static void* threadFunc( void* arg );

		// 실제 Replication 생성 작업을 수행
		void Execute();

		// Replication 처리 관련 오류가 발생한 경우 처리 함수.
		// - 재시도 횟수를 확인하여
		// - Retry queue 에 저장 처리
		void DoFailProcess();

		// Replication 처리에 대해 FHS 에서 실패로 응답한 경우.
		// - 대부분 Replication 대상 content 가 존재하지 않거나 Size 변경 등이 발생한 경우임.
		// - 따라서 해당 Content 에 대해서는 Retry 하지 않고.. Report 로그에만 기록하고 끝낸다.
		void DoErrorProcess( std::string& szErrorMessage );
		
		// Replication 처리에 대해 FHS 에서 성공을 응답한 경우 처리함수
		// - 성공된 FHS 와 실패된 FHS 정보를 동시에 전달하므로 확인하여 처리해야 한다.
		void DoSuccessProcess();
		

	private:

        // 쓰레드 핸들
        pthread_t m_threadHandle;
        
		// 프로세스 상의 Queue, Thread 상태를 관리하는 CProcessStatus 객체에 대한 포인터
		// - 생성자를 통해 전달받음        
		CProcessStatus * m_pProcessStatus;
		        
		// 복제 처리 관련 재시도 Content 정보를 관리하는 Queue 객체에 대한 포인터
		// - 생성자를 통해 전달받음
		CDataQueue<CRetryData> * m_pRetryQueue;

		// 복제 완료된 Content 정보를 관리하는 Queue 객체에 대한 포인터
		// - 생성자를 통해 전달받음
		CDataQueue<CCompleteData> * m_pCompleteQueue;
        
		// 복제 대상 Content 정보 저장 객체
		// - 생성자를 통해 전달받음
		CRetryData m_dataJob;

		// 복제본을 저장할 Proper FHS 저장 객체
		// - 생성자를 통해 전달받음
		std::vector<std::string> m_vecTargetFHS;

		// ftsd 로 부터 정상 처리된 결과 정보를 수신하기 위한 멤버 객체
		// - success fhs host, hash_name
		std::map<std::string, std::string> m_mapSuccessFhs;

		// ftsd 로 부터 실패 처리된 결과 정보를 수신하기 위한 멤버 객체
		// - failed fhs host, error message
		std::map<std::string, std::string> m_mapFailFhs;

};
#endif // __REPLICATE_THREAD_H__
