/****************************************************************************
				rc_balanced content copy control thread header 
				-----------------------------------------

	begin      : 2019/03/13
	copyright  : (C) 2005 Solbox Inc.
	author     : huibong
	email      : huibong@solbox.com
	version    : 3.5

	CopyRight(C) 2005 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 __COPY_CONTROL_THREAD_H__
#define __COPY_CONTROL_THREAD_H__

#include <pthread.h>

#include "RebalanceData.h"
#include "DataQueue.hpp"
#include "RcdbInfo.h"
#include "ShmInfoThread.h"
#include "Database.h"


// 2021-01-07 NEW huibong 이동 대상 content 선택 관련 mode 기능 추가 (#33306)
// - copy 작업 관련 ignore list 에 의한 FHS 선정 실패가 본 횟수를 초과되는 경우.. 
// - content select mode (ContentSelectMode) 를 big size 순서-> RANDOM 모드로 변경 처리
#define TARGET_FHS_SELECT_MAX_FAIL		5


// CCopyControlThread class
// - Move 대기 queue 에 들어 있는 content 를 pop 하여...
// - Move target FHS 를 선택한 후...
// - Target FHS 로 content copy 처리를 수행하고...
// - 최종 해당 Content 를 RCDB update 처리를 위한 대기 queue 에 push 처리를 수행

class CCopyControlThread
{
	public:

		// 생성자
		CCopyControlThread( 
			CDataQueue<CRebalanceData> * const pQueueMoveStandby
			, CDataQueue<CRebalanceData> * const pQueueUpdateStandby
			, CShmInfoThread * const pShmInfoThread
		);

		// 소멸자
		~CCopyControlThread();

		// Thread 를 생성하여 주기적으로 job 을 처리한다.
		bool Start( void );

		// COPY 처리 thread 의 현재 count 값을 1 증가시킨다. (Copy Thread 접근 허용을 위해 public 처리)
		void PlusCopyThreadCount( void );

		// COPY 처리 thread 의 현재 count 값을 1 감소시킨다. (Copy Thread 접근 허용을 위해 public 처리)
		void MinusCopyThreadCount( void );

		// Copy 처리 thread 의 현재 count 값을 반환한다.. ( no lock)
		int GetCopyThreadCount( void );

		// Copy 처리 thread 의 MAX 제한값을 반환한다.. ( no lock)
		int GetMaxCopyThreadCount( void );



	private:

		// Thread handle
		pthread_t m_threadHandle;

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


		// Move 처리할 대상을 저장하는 queueMoveStandby 객체에 대한 포인터
		CDataQueue<CRebalanceData> * m_pQueueMoveStandby;

		// FHS Copy 처리 완료 후 RCDB 업데이트 대상 content 정보를 저장하는 queueUpdateStandby 객체에 대한 포인터
		CDataQueue<CRebalanceData> * m_pQueueUpdateStandby;

		// Sharde memory 정보를 추출하여 관리하는 Thread 객체에 대한 포인터
		CShmInfoThread * m_pShmInfoThread;

		// RCDB 연결 정보 관리 객체
		CRcdbInfo m_rcdbInfo;

		// COPY 처리 thread 의 현재 count 값을 저장하기 위한 변수 및 lock 객체
		int m_nCurrentCopyThreadCount;
		pthread_mutex_t m_mutexCopyThreadCount;

		// 2021-01-07 NEW huibong 이동 대상 content 선택 관련 mode 기능 추가 (#33306)
		// - copy 작업 관련 ignore list 에 의한 FHS 선정 실패 횟수 count;
		// - move 대기 queue 가 0 인 경우 count reset 처리;
		unsigned int m_uTargetFhsSelectFailCount;


	private:

		// Thread loop base function
		static void * threadFunc( void * arg );

		// 실제 Content Copy 처리를 control 하는 함수
		void Execute( void );
		
		// 생성 가능한 Copy Thread count 를 반환한다.
		unsigned int GetCopyThreadEnableCount( void );

		// RCDB 로 부터 해당 content를 가진 FHS 정보를 조회하여 반환한다.
		bool GetMetaHostList( CRebalanceData & data, DataBase & rcdb, std::list<std::string> & listHost );

		
};

#endif /* __COPY_CONTROL_THREAD_H__ */

