EBCguide
Clunix Wiki
(버전 사이의 차이)
잔글 (→General) |
|||
(한 사용자의 중간의 편집 2개 숨겨짐) | |||
4번째 줄: | 4번째 줄: | ||
이 문서는 EBC를 예제와 함께 설명한다. | 이 문서는 EBC를 예제와 함께 설명한다. | ||
</pre> | </pre> | ||
+ | EBC(ECM Base Channel)는 ECM(Extended Cluster Management)의 기본 통신 모듈로 | ||
+ | ECM내에서 정의된 name space중 target부분에 해당하는 node, module에 대한 routing을 처리한다. | ||
+ | 이외에 프로그래밍의 편의를 위해 callback을 제공하며 명시적인 callback의 호출이 가능하다 | ||
+ | |||
+ | === Install === | ||
+ | * ebcd 설치 유의사항 | ||
+ | <pre> | ||
+ | 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) | ||
+ | </pre> | ||
+ | 기본적으로 설치시에 확인을 하긴 하지만, 오류가 나서 진행이 안되기 때문에 | ||
+ | 위와 같은 라이브러리가 있는지 확인해야한다. | ||
+ | |||
+ | 설치했던 가상머신에서는 readline과 binutils가 없어서 아래와 같이 설치했다. | ||
+ | <pre> | ||
+ | yum install readline-devel | ||
+ | yum install binutils-devel | ||
+ | </pre> | ||
+ | 일반적으로 개발용 리눅스 설치한 경우 별도 설치하지 않아도 된다. | ||
+ | |||
+ | 추가적으로 ECM에서는 CLX_HOME이라는 환경변수를 사용한다. | ||
+ | 위치는 /usr/clx이다. | ||
+ | |||
+ | export CLX_HOME=/usr/clx | ||
+ | |||
+ | |||
+ | 설치법 (ECMcore에서 README 참고) | ||
+ | <pre> | ||
+ | ./configure | ||
+ | make | ||
+ | make install | ||
+ | </pre> | ||
+ | |||
+ | 설정방법 | ||
+ | <pre> | ||
+ | /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 서비스를 시작한다) | ||
+ | </pre> | ||
+ | |||
+ | 확인방법 | ||
+ | <pre> | ||
+ | ps -ef | grep ebcd (ebcd가 올라와있는지 프로세스 목록 확인) | ||
+ | netstat -Na | grep 908 (908번 포트가 열려있는지 확인) | ||
+ | </pre> | ||
+ | |||
=== General === | === General === | ||
기본적으로 ebc daemon(ebcd)을 이용하여 ebc간 통신이 이루어진다. | 기본적으로 ebc daemon(ebcd)을 이용하여 ebc간 통신이 이루어진다. | ||
ebc 서버와 클라이언트로 나누어진다. | ebc 서버와 클라이언트로 나누어진다. | ||
+ | ebc 사용시 Main함수에서 ebc_initialize()를 호출해야한다. | ||
+ | |||
보통 사용되는 함수는 아래와 같다. | 보통 사용되는 함수는 아래와 같다. | ||
<pre> | <pre> | ||
13번째 줄: | 66번째 줄: | ||
ebc_connect(const char *serverip, ecm_uint16 port, const char *mdname, ecm_uint32 timeout, ecm_ebc_t *pecm_ebc) | ebc_connect(const char *serverip, ecm_uint16 port, const char *mdname, ecm_uint32 timeout, ecm_ebc_t *pecm_ebc) | ||
</pre> | </pre> | ||
− | * ebc 연결 (서버 주소, 포트, 모듈 이름, 타임아웃, ebc 타입) | + | * ebc_connect() : ebc 연결 (서버 주소, 포트, 모듈 이름, 타임아웃, ebc 타입) |
<pre> | <pre> | ||
void | void | ||
ebc_close(ecm_ebc_t ecm_ebc) | ebc_close(ecm_ebc_t ecm_ebc) | ||
− | + | </pre> | |
− | + | * ebc_close() : ebc 연결 종료 | |
− | + | <pre> | |
+ | ebc_err_t | ||
+ | ebc_reconnect(ecm_ebc_t ecm_ebc) | ||
</pre> | </pre> | ||
− | * ebc | + | * ebc_reconnect() : ebc 재연결 |
+ | |||
<pre> | <pre> | ||
− | + | ebc_err_t | |
− | + | ebc_call(ecm_ebc_t ecm_ebc, const char *dest, sr_t **psr) | |
+ | </pre> | ||
+ | * ebc_call() : callback을 호출하는 request를 보내고 reply를 기다리는 snr type interface | ||
+ | |||
+ | <pre> | ||
+ | ebc_err_t | ||
+ | ebc_call_oneway(ecm_ebc_t ecm_ebc, const char *dest, sr_t *sr) | ||
+ | </pre> | ||
+ | * ebc_call_oneway() : ebc_call()과 같으나 reply를 기다리지 않는 one-way send interface | ||
+ | |||
+ | <pre> | ||
+ | ebc_err_t | ||
+ | ebc_ecb_add(ecm_ebc_t ecm_ebc, const char *pattern, ebc_mcbfunc_t mcb_func, ecm_ptr_t ctx) | ||
+ | </pre> | ||
+ | * ebc_ecb_add() : 콜백함수 등록 (ebc 타입, 패턴[콜백함수를 나타내는 문자열], 콜백함수명, 포인터) | ||
+ | |||
+ | <pre> | ||
+ | ebc_err_t | ||
+ | ebc_ecb_del(ecm_ebc_t ecm_ebc, const char *pattern) | ||
</pre> | </pre> | ||
− | * | + | * ebc_ecb_del() : 콜백함수 삭제 |
<pre> | <pre> | ||
34번째 줄: | 108번째 줄: | ||
ebc_app_loop(ecm_ebc_t ecm_ebc, ecm_uint32 timeout) | ebc_app_loop(ecm_ebc_t ecm_ebc, ecm_uint32 timeout) | ||
</pre> | </pre> | ||
− | * | + | * ebc_app_loop() : 콜백 모드 동작 루프 시작 |
+ | |||
+ | <pre> | ||
+ | void | ||
+ | ebc_exit_app_loop(ecm_ebc_t ecm_ebc) | ||
+ | </pre> | ||
+ | * ebc_exit_app_loop() : 콜백 모드 동작 루프 종료 | ||
<pre> | <pre> | ||
ebc_err_t | ebc_err_t | ||
− | + | ebc_route_add(ecm_ebc_t ecm_ebc, const char *addrspec) | |
</pre> | </pre> | ||
− | * | + | * ebc_route_add() : user route manipulation |
<pre> | <pre> | ||
ebc_err_t | ebc_err_t | ||
− | + | ebc_route_del(ecm_ebc_t ecm_ebc, const char *addrspec) | |
− | + | ||
− | + | ||
− | + | ||
</pre> | </pre> | ||
− | * | + | * ebc_route_del() : user route manipulation |
+ | <pre> | ||
+ | ebc_err_t | ||
+ | ebc_send(ecm_ebc_t ecm_ebc, ebc_addr_t *paddr, sr_t *sr) | ||
+ | </pre> | ||
+ | * ebc_send() : ebc send interface | ||
+ | |||
+ | <pre> | ||
+ | ebc_err_t | ||
+ | ebc_recv(ecm_ebc_t ecm_ebc, const char *pattern, ebc_addr_t *saddr, sr_t **psr) | ||
+ | </pre> | ||
+ | * ebc_recv() : ebc recv interface | ||
+ | |||
+ | <pre> | ||
+ | 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) | ||
+ | </pre> | ||
+ | * ebc_snr_sr() : send&receive data in one function | ||
+ | |||
+ | <pre> | ||
+ | const char * | ||
+ | ebc_get_clname(ecm_ebc_t ecm_ebc) | ||
+ | </pre> | ||
+ | * ebc_get_clname() : get cluster name | ||
+ | |||
+ | <pre> | ||
+ | const char * | ||
+ | ebc_get_ndname(ecm_ebc_t ecm_ebc) | ||
+ | </pre> | ||
+ | * ebc_get_ndname() : get node name | ||
+ | |||
+ | <pre> | ||
+ | const char * | ||
+ | ebc_get_mdname(ecm_ebc_t ecm_ebc) | ||
+ | </pre> | ||
+ | * ebc_get_mdname() : get module name | ||
=== Server === | === Server === | ||
다음 예제는 ebc 서버 예제이다. | 다음 예제는 ebc 서버 예제이다. | ||
+ | |||
<pre> | <pre> | ||
static void | static void | ||
115번째 줄: | 228번째 줄: | ||
</pre> | </pre> | ||
+ | |||
+ | |||
=== Client === | === Client === |
2014년 3월 19일 (수) 16:47 현재 판
목차 |
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 사용시 Main함수에서 ebc_initialize()를 호출해야한다.
보통 사용되는 함수는 아래와 같다.
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 를 참고하면 된다.