/***************************************************************************
                Proper FHS management class
                -----------------------------------------
    begin      : 2010/03/31
    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 __PROPER_FHS_H__
#define __PROPER_FHS_H__


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

#include "RcdbInfo.h"


// CProperFhs
// RCDB t_fhs_top_status 테이블에 저장된 Available FHS 정보를 주기적으로 갱신 처리
// 각 모듈에 인터페이스 제공을 통해 Available FHS 정보를 전달.
class CProperFhs
{
	public:
		
		// 생성자
		CProperFhs();
		
		// 소멸자
		~CProperFhs();

		// 객체 초기화 함수		
		bool Init();

		// thread를 생성하여 업무 flow 를 시작.
		bool Start();
				
		// 현재 저장된 FHS 의 수를 반환.
		int GetFhsCount();

		// 적절한 FHS들의 정보를 전달한다.
		// @param [in] nCount FHS정보의 요청 개수.
		// @param [out] vecRet 적절한 FHS의 host정보를 vector 타입으로 전달 한다.
		// @param [in] listIgnoreFhs 무시할 host정보를 입력한다.
		// @return 성공은 return true, 그렇지 않으면 false. 
		// @note return false를 해도 nCount만큼은 못보내지만 일부 리스트가 전달 될 수 있다.		
		bool GetProperFhs( unsigned int nCount, std::vector<std::string> &vecRet, std::list<std::string> &listIgnoreFhs );
		
	
	private:

		// available fhs 정보를 저장하기 위한 vector 객체
		std::vector<std::string> m_vecFHS;

		// 쓰레드 핸들
		pthread_t m_threadHandle;

		// RCDB 접속 정보를 저장할 변수.
		CRcdbInfo m_rcdbInfo;
		
		// ProperFHS를 RoundRobin으로 순서에 따라 전달 하기 위한 변수
		int m_indexRoundRobin;

		// lock 처리 관련
		pthread_mutex_t m_mutexLock;

		// Thread Loop 마다 Sleep Time 정보를 저장하기 위한 변수
		unsigned int m_uSleep;

			
	private:

		// 스레드 함수
		static void* threadFunc( void* arg );
	
		// 스레드 내에서 각 loop 단위 처리 호출 함수.
		bool Execute();
	
		// Proper fhs의 목록을 RCDB t_fhs_top_status 에서 조회.
		// CHG 2014-06-24 huibong
		// #19042 의 팀회의 결과에 따라
		// - RCDB 연결 실패 및 Query 오류 발생시 이전 FHS 목록 유지
		// - RCDB 에서 조회된 Proper FHS 가 없는 경우.. Proper FHS 목록 Clear 처리
		// - 그외 정상 처리.
		bool UpdateFromDB();
		        
};

#endif // __PROPER_FHS_H__ 
