/****************************************************************************
                Shared memory define for csagentd
                -----------------------------------------

    begin      : 2015/04/20
    copyright  : (C) 2005 Solbox Inc.
    author     : Dev Storage Team
    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 __SHM_DEFINE_H__
#define __SHM_DEFINE_H__

#include <unistd.h>
#include <sys/types.h>


// hostname 최대 길이.
#define HOST_NAME_MAX_LENGTH    63


// Service 상태 코드 정의
// TODO : 서비스 상태 코드 추가시 다음 작업 수행해야 함.
//        - SERVICE_STAT_MAX 값을 최대 값으로 변경 처리.
//        - CFhsShm 생성자에 화면 출력용 문자열 추가 및 변경 .
#define SERVICE_STAT_OK        0   // 정상 상태
#define SERVICE_STAT_OUT       1   // 수동 중지 상태
#define SERVICE_STAT_DISABLE   2   // 서비스 불가 상태
#define SERVICE_STAT_RONLY     3   // Read Only 상태
#define SERVICE_STAT_MAX       3   // Service 상태 코드 범위 Check 를 위한 값



// 독립 worker 프로세스가 storage 에 대한 write/read 테스트 수행하여 성공시 공유메모리에 시간 정보 기록
// 지정된 시간 동안 테스트를 성공하지 못하는 경우 Hang 으로 판단하여 서비스 disable 처리를 위한
// timeout 값 (단위 sec)
#define TIMEOUT_STORAGE_CHECK	30 


// 독립 Worker 프로세스인 system collector 는 정보 수집 시작 시간을 공유메모리에 기록
// 만약 시스템 Hang 상황으로 system 관련 정보 추출 함수 block 발생시
// 이에 대한 timeout 을 판단하여 서비스 disable 상태로 변경하기 위한 timeout 값 (단위 sec)
#define TIMEOUT_SYSTEM_COLLECT	40	


// 독립 Worker 프로세스인 service check 는 정보 수집 시작 시간을 공유메모리에 기록
// 만약 시스템 Hang 상황으로 service check 관련 함수 block 발생시
// 이에 대한 timeout 을 판단하여 서비스 disable 상태로 변경하기 위한 timeout 값 (단위 sec)
#define TIMEOUT_SERVICE_CHECK	15


// 2018-02-07 NEW huibong disk busy 상황시 Read Only 상태로 변경 처리를 위한 기준값 선언 (#31701)
// - Disk Busy 상황시 응답 지연 발생 또는 장비 Hang 상황인 것으로 판단됨
// - 2018-01 SK 에서 발생한 응답 지연으로 인한 SolProxy 오류 확인 결과... 
// - queue 가 7 이상 & disk busy 50 % 이상인 경우 응답 지연 발생됨
// - 따라서 이에 대한 기준값을 정의하고.. 해당 값 이상인 경우 Read Only 상태로 변경할 수 있도록 한다.
#define DISK_BUSY_MIN_QUEUE_COUNT	7		// disk max queue 가 해당 값 이상인 경우 Disk Busy 상황으로 판단
#define DISK_BUSY_MIN_BUSY_PERCENT	50.0	// disk maxy busy 값이 해당 값 이상인 경우 Disk Busy 상황으로 판단




#ifdef __cplusplus
extern "C" {
#endif
	
	// System info
	struct SystemInfo {

		char   hostname[HOST_NAME_MAX_LENGTH + 1];   // hostname, 최대 63자까지만 허용.
		double load_avg[3];                          // load average.

		uint64_t  memory_total;                      // Total memory size (byte 단위)
		uint64_t  memory_free;                       // Free  memory size (byte 단위)
		int       memory_usage;                      // memory 사용률 (%)

		uint64_t  swap_total;                        // Total swap size (byte 단위)
		uint64_t  swap_used;                         // Used  swap size (byte 단위)
		int       swap_usage;                        // swap 사용률 (%)

		uint64_t storage_total;                      // Total Storage size (byte 단위)
		uint64_t storage_avail;                      // Available Storage size (byte 단위)
		int      storage_max_usage;                  // Storage 중 최대 사용률 (%)
		
		uint64_t disk_max_queue;                     // Disk 상태 정보 중 Max Queue Length
		double   disk_max_busy;                      // Disk 상태 정보 중 Max busy(%)

		uint64_t network_packet_in;                  // Network inbound packet 평균 count (count/sec)
		uint64_t network_packet_out;                 // Network outbound packet 평균 count (count/sec)
		uint64_t network_traffic_in;                 // Network inbound 평균 traffic (Byte/sec)
		uint64_t network_traffic_out;                // Network outbound 평균 traffic (Byte/sec)

		unsigned int tcp_total;                      // TCP 세션 total count
		unsigned int tcp_80;                         // TCP 세션 중 local 80 port 를 사용하는 세션 count
		unsigned int tcp_80_establish;               // TCP 세션 중 local 80 port 를 사용하고.. ESTABLISH 상태인 세션 count

	};

	// Service status 
	struct ServiceStatus {

		int stat;            // Service stat code.
	};

	
	
	// Shared momory
	struct FhsInfo {

		// 2018-01-30 NEW huibong 마지막 system 정보 추출 시작 시간 (#31701)
		// - 추출 관련 hang 상황 발생시 expire 처리를 위한 시간값
		// - 시간 동기화 영향을 없애기 위해  clock_gettime(CLOCK_MONOTONIC) 을 통해 추출된 sec 정보임
		time_t	time_system_check_start_sec;	
		struct SystemInfo    system;

		// 2018-01-30 NEW huibong 마지막 service check 시작 시간 (#31701)
		// - service check 관련 hang 상황 발생시 expire 처리를 위한 시간값
		// - 시간 동기화 영향을 없애기 위해  clock_gettime(CLOCK_MONOTONIC) 을 통해 추출된 sec 정보임
		time_t time_service_check_start_sec;
		struct ServiceStatus service;

		// 2018-01-30 NEW huibong 신규로 추가한 Storage check 관련 last check 성공 시간 (#31701)
		// - storage check 실패, hang 상황 발생시 expire 처리를 위한 시간값
		// - 시간 동기화 영향을 없애기 위해  clock_gettime(CLOCK_MONOTONIC) 을 통해 추출된 sec 정보임
		// -   0 : 최초 공유메모리 초기화시
		// -  -1 : storage check 실패 발생시
		// -  그외 : storage check 를 마지막으로 성공한 시간 sec 정보 -> storage check hang 발생 가능하므로 expire 처리 필요.
		time_t time_storage_check_ok_sec;
	
	};
	


#ifdef __cplusplus
}
#endif


#endif /* __SHM_DEFINE_H__ */

