EBCguide

Clunix Wiki
Yhkim (토론 | 기여) 사용자의 2014년 3월 19일 (수) 16:45 버전

목차

EBC Guide

이 문서는 EBC를 예제와 함께 설명한다.

EBC(ECM Base Channel)는 ECM(Extended Cluster Management)의 기본 통신 모듈로 ECM내에서 정의된 name space중 target부분에 해당하는 node, module에 대한 routing을 처리한다. 이외에 프로그래밍의 편의를 위해 callback을 제공하며 명시적인 callback의 호출이 가능하다

Install

  • ebcd 설치 유의사항
AC_CHECK_LIB(curses, getch)
AC_CHECK_LIB(history, add_history)
AC_CHECK_LIB(readline, readline)
AC_CHECK_LIB(m, log)
AC_CHECK_LIB(pthread, pthread_create)
AC_CHECK_LIB(rt, clock_gettime)
AC_CHECK_LIB(dl, dlopen)

기본적으로 설치시에 확인을 하긴 하지만, 오류가 나서 진행이 안되기 때문에 위와 같은 라이브러리가 있는지 확인해야한다.

설치했던 가상머신에서는 readline과 binutils가 없어서 아래와 같이 설치했다.

yum install readline-devel
yum install binutils-devel

일반적으로 개발용 리눅스 설치한 경우 별도 설치하지 않아도 된다.

추가적으로 ECM에서는 CLX_HOME이라는 환경변수를 사용한다. 위치는 /usr/clx이다.

export CLX_HOME=/usr/clx


설치법 (ECMcore에서 README 참고)

./configure
make
make install

설정방법

/usr/clx/etc/ebcd.tmp1.conf 를 가지고 ebcd.conf 만들고 값을 변경한다 (클러스터,노드 이름 등)
/usr/clx/bin/ecmconf load /usr/clx/etc/ebcd.conf (ecmconf를 통해 ebcd.conf를 로드한다)
/usr/clx/bin/ecmctl start (ecmctl 서비스를 시작한다)

확인방법

ps -ef | grep ebcd (ebcd가 올라와있는지 프로세스 목록 확인)
netstat -Na | grep 908 (908번 포트가 열려있는지 확인)


General

기본적으로 ebc daemon(ebcd)을 이용하여 ebc간 통신이 이루어진다. ebc 서버와 클라이언트로 나누어진다. 보통 사용되는 함수는 아래와 같다.

ebc_err_t
ebc_connect(const char *serverip, ecm_uint16 port, const char *mdname, ecm_uint32 timeout, ecm_ebc_t *pecm_ebc)
  • ebc_connect() : ebc 연결 (서버 주소, 포트, 모듈 이름, 타임아웃, ebc 타입)
void
ebc_close(ecm_ebc_t ecm_ebc)
  • ebc_close() : ebc 연결 종료
ebc_err_t
ebc_reconnect(ecm_ebc_t ecm_ebc)
  • ebc_reconnect() : ebc 재연결
ebc_err_t
ebc_call(ecm_ebc_t ecm_ebc, const char *dest, sr_t **psr)
  • ebc_call() : callback을 호출하는 request를 보내고 reply를 기다리는 snr type interface
ebc_err_t
ebc_call_oneway(ecm_ebc_t ecm_ebc, const char *dest, sr_t *sr)
  • ebc_call_oneway() : ebc_call()과 같으나 reply를 기다리지 않는 one-way send interface
ebc_err_t
ebc_ecb_add(ecm_ebc_t ecm_ebc, const char *pattern, ebc_mcbfunc_t mcb_func, ecm_ptr_t ctx)
  • ebc_ecb_add() : 콜백함수 등록 (ebc 타입, 패턴[콜백함수를 나타내는 문자열], 콜백함수명, 포인터)
ebc_err_t   
ebc_ecb_del(ecm_ebc_t ecm_ebc, const char *pattern)
  • ebc_ecb_del() : 콜백함수 삭제
ebc_err_t
ebc_app_loop(ecm_ebc_t ecm_ebc, ecm_uint32 timeout)
  • ebc_app_loop() : 콜백 모드 동작 루프 시작
void
ebc_exit_app_loop(ecm_ebc_t ecm_ebc)
  • ebc_exit_app_loop() : 콜백 모드 동작 루프 종료
ebc_err_t
ebc_route_add(ecm_ebc_t ecm_ebc, const char *addrspec)
  • ebc_route_add() : user route manipulation
ebc_err_t
ebc_route_del(ecm_ebc_t ecm_ebc, const char *addrspec)
  • ebc_route_del() : user route manipulation
ebc_err_t
ebc_send(ecm_ebc_t ecm_ebc, ebc_addr_t *paddr, sr_t *sr)
  • ebc_send() : ebc send interface
ebc_err_t
ebc_recv(ecm_ebc_t ecm_ebc, const char *pattern, ebc_addr_t *saddr, sr_t **psr)
  • ebc_recv() : ebc recv interface
static ebc_err_t
ebc_snr_sr(ebc_t *ec, ebc_addr_t *daddr, ecm_uint32 timeout, sr_t **psr, ebc_msgt_t msgt, ECMBOOL nofree)
  • ebc_snr_sr() : send&receive data in one function
const char *
ebc_get_clname(ecm_ebc_t ecm_ebc)
  • ebc_get_clname() : get cluster name
const char *
ebc_get_ndname(ecm_ebc_t ecm_ebc)
  • ebc_get_ndname() : get node name
const char *
ebc_get_mdname(ecm_ebc_t ecm_ebc)
  • ebc_get_mdname() : get module name


Server

다음 예제는 ebc 서버 예제이다.

static void
run_scenario_6(void)
{
	ecm_ebc_t	ec;
	ebc_err_t	err;

	if ((err = ebc_connect("127.0.0.1", 908, "mytest", 5000, &ec)) != EBC_OK)
		ecm_test_failed("cannot connect: err: %d\n", err);

	if ((err = ebc_ecb_add(ec, "test", cb_test, NULL)) != EBC_OK) {
		ecm_test_failed("ecb_ecb_add failed(): err: %d\n", err);
	}
	if ((err = ebc_app_loop(ec, 30000)) < 0) {
		if (err != -ERR_EBC_INTERRUPTED)
			ecm_test_failed("ebc_app_loop() failed: %d", err);
	}

	ebc_close(ec);
}
  • ebc_connect 함수를 통해 ebc에 접속한다.
  • ebc_ecb_add 함수를 통해 ebc에 콜백함수를 등록시킨다.
  • ebc_app_loop 함수를 통해 서버 프로그램을 타임아웃만큼 동작시킨다.

다음 예제는 콜백함수 예제이다.

static sr_t *
cb_test(ecm_ebc_t ec_peer, ebc_addr_t *saddr, ebc_addr_t *daddr, sr_t *sr, ecm_ptr_t ctx)
{
	sr_t * sr_res, *sr_services, *sr_ebcd;

	sr_res = sr_create_dir();
	sr_createc_int(sr_res, "ebc_port", ST_INT, 10010);
	sr_services = sr_createc_dir(sr_res, "services");
	sr_ebcd = sr_createc_dir(sr_services, "ebcd");

	sr_createc_bool(sr_ebcd, "enabled", ST_BOOL, 1);
	sr_createc_str(sr_ebcd, "clname", ST_STR, "ECMCluster");
	sr_createc_str(sr_ebcd, "ndname", ST_STR, "node");
	sr_createc_int(sr_ebcd, "detection_interval", ST_INT, 0);
	sr_createc_str(sr_ebcd, "bdcast_addr", ST_STR, "255.255.255.255");
}
  • 콜백함수명은 cb_test이다. argument는 위와 같다
  • cb_test 콜백함수가 불려지면 간단한 SR값을 리턴한다.
<dir> {
        ebc_port <int>10010;
        services <dir> {
                ebcd <dir> {
                        enabled <bool>true;
                        clname <str>ECMCluster;
                        ndname <str>node;
                        detection_interval <int>0;
                        bdcast_addr <str>"255.255.255.255";
                };
         };
};


Client

다음 예제는 Client 예제이다.

typedef void    *ecm_ebc_t;
typedef int     ebc_err_t;
static ebc_t    *ec;

void
cmd_connect(const char *serverip, ecm_uint16 port, const char *mdname)
{
        ebc_t   *ec_new;

        if (port == 0)
                port = ebc_port;
        if (ebc_connect(serverip, port, mdname, timeout, (ecm_ebc_t *)&ec_new) == EBC_OK) {
                ebc_close(ec);
                ec = ec_new;
        }
        else
                fprintf(stderr, "cannot connect\n");
}


void
cmd_call(char *target, ecm_uint32 timeout, char *asr)
{
        sr_t    *sr_arg;
        ebc_err_t       err;

        sr_arg = sr_asr_scan(asr);
        if (timeout > 0)
                err = ebc_call_timeout(ec, target, &sr_arg, timeout);
        else
                err = ebc_call(ec, target, &sr_arg);
        if (err != EBC_OK) {
                fprintf(stderr, "can't EBC call to [%s]: %d\n", target, err);
                sr_fancy_print(stdout, sr_arg, SR_RECUR, NULL);
        }           
        else
                sr_fancy_print(stdout, sr_arg, SR_RECUR, NULL);
        sr_free(sr_arg);
        ecm_free(target);
        ecm_free(asr);
}
  • Client에서도 동일하게 ebc_connect 함수를 이용하여 ebc에 접속한다.
  • asr 형식과 ebc_call 함수를 이용하여 해당 서버의 콜백함수를 부른다.
  • ebc_call 함수는 다음과 같은 값을 입력받는다.
ecm_ebc_t ecm_ebc, const char *dest, sr_t **psr)
dest : PA 문자열, psr : ASR 형식

ex) pa/./ebcd/echo test <str>test
  • SR 관련 사항은 SRguide 를 참고하면 된다.
부서별 위키