Revision | 22fe4d08aaa9a1622c3918221ba4e22c21761fd0 (tree) |
---|---|
Time | 2014-04-09 15:23:37 |
Author | Hiroaki Nakano <nakano.hiroaki@nttc...> |
Commiter | Hiroaki Nakano |
edit途中。
Signed-off-by: Hiroaki Nakano <nakano.hiroaki@nttcom.co.jp>
@@ -47,4 +47,6 @@ | ||
47 | 47 | |
48 | 48 | extern char l7vs_module_path[]; /*! protocol module path */ |
49 | 49 | |
50 | +#define P_FIFO "/tmp/l7vsd/l7vsd.parent" /*! sever named pipe pathname */ | |
51 | + | |
50 | 52 | #endif /* L7VS_H */ |
@@ -45,7 +45,9 @@ typedef uint32_t handle_t; | ||
45 | 45 | #define TEMP_SERVICEHANDLE UINT32_MAX |
46 | 46 | #define BPS_DEFAULT_INTERVAL 1000000ULL |
47 | 47 | |
48 | -// virtual service definition datatype | |
48 | +#define NAMED_PIPE_PATH /tmp/l7vs | |
49 | + | |
50 | +// virtual service definition datatype for child | |
49 | 51 | struct l7vs_service{ |
50 | 52 | handle_t handle; //! l7vs_service_handle |
51 | 53 | struct l7vs_lsock* lsock; //! listen socket struct pointer |
@@ -78,7 +80,7 @@ struct l7vs_service{ | ||
78 | 80 | int qos_down_flag; //! QoS to client intervention flag (DOWN Direction) |
79 | 81 | }; |
80 | 82 | |
81 | -// virtual service definition, external representation. | |
83 | +// virtual service definition, external representation for parent. | |
82 | 84 | struct l7vs_service_arg{ |
83 | 85 | size_t len; //! structure size |
84 | 86 | struct sockaddr_in addr; //! server address |
@@ -86,6 +88,8 @@ struct l7vs_service_arg{ | ||
86 | 88 | int persist; //! persistency |
87 | 89 | int backlog; //! listen(2) backlog length |
88 | 90 | |
91 | + pid_t child_pid[MAX_CHILD]; //! child process pid list | |
92 | + | |
89 | 93 | char protomod[L7VS_MODNAME_LEN]; //! protocol module name |
90 | 94 | char schedmod[L7VS_MODNAME_LEN]; //! scheduler |
91 | 95 |
@@ -607,6 +607,9 @@ l7vs_config_add_vs(union l7vs_config_req *arg, | ||
607 | 607 | struct l7vs_service *srv; |
608 | 608 | struct iovec iov; |
609 | 609 | |
610 | + int status; | |
611 | + int i; | |
612 | + | |
610 | 613 | if(logger_get_log_level(LOG_CAT_L7VSD_NETWORK) == LOG_LV_DEBUG){ |
611 | 614 | LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_NETWORK,16, |
612 | 615 | "in_fuction: void l7vs_config_add_vs (union l7vs_config_req *arg, struct sockaddr_un *addr)" |
@@ -639,15 +642,15 @@ l7vs_config_add_vs(union l7vs_config_req *arg, | ||
639 | 642 | |
640 | 643 | srv = l7vs_service_create(sarg, &rsp.code); |
641 | 644 | if (srv == NULL) { |
642 | - if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){ | |
643 | - LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,2,"ADD_VS: service already exists"); | |
644 | - } | |
645 | - l7vs_config_iomux->status = iomux_config_command_vs_create_error; | |
646 | - goto out; | |
645 | + if(logger_get_log_level(LOG_CAT_L7VSD_VIRTUAL_SERVICE) == LOG_LV_DEBUG){ | |
646 | + LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,2,"ADD_VS: service already exists"); | |
647 | + } | |
648 | + l7vs_config_iomux->status = iomux_config_command_vs_create_error; | |
649 | + goto out; | |
647 | 650 | } else { |
648 | - l7vs_config_iomux->status = iomux_config_command_add_vs_vs_created; | |
649 | - LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_VIRTUAL_SERVICE,1,"ADD_VS: IFRM001: created a service "); | |
650 | - } | |
651 | + l7vs_config_iomux->status = iomux_config_command_add_vs_vs_created; | |
652 | + LOGGER_PUT_LOG_INFO(LOG_CAT_L7VSD_VIRTUAL_SERVICE,1,"ADD_VS: IFRM001: created a service "); | |
653 | + } | |
651 | 654 | |
652 | 655 | l7vs_config_iomux->status = iomux_config_command_add_vs_succeeded; |
653 | 656 |
@@ -28,6 +28,7 @@ | ||
28 | 28 | #include <sys/types.h> |
29 | 29 | #include <sys/stat.h> |
30 | 30 | #include <sys/socket.h> |
31 | +#include <sys/wait.h> | |
31 | 32 | #include <signal.h> |
32 | 33 | #include <unistd.h> |
33 | 34 | #include <stdlib.h> |
@@ -55,6 +56,22 @@ l7vs::Logger l7vs::Logger::instance; | ||
55 | 56 | l7vs::Parameter l7vs::Parameter::instance; |
56 | 57 | |
57 | 58 | /*! |
59 | + * create server named pipe | |
60 | + */ | |
61 | +static void | |
62 | +create_server_pipe() | |
63 | +{ | |
64 | + int ret; | |
65 | + | |
66 | + ret = mkfifo(P_FIFO, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); | |
67 | + if(ret < 0){ | |
68 | + perror("mkfifo"); | |
69 | + } | |
70 | + | |
71 | + return ret; | |
72 | +} | |
73 | + | |
74 | +/*! | |
58 | 75 | * exit signal handler |
59 | 76 | * |
60 | 77 | * @param[in] sig signal |
@@ -288,8 +305,8 @@ usage(FILE *fp, char *ident) | ||
288 | 305 | * @return int exit status |
289 | 306 | */ |
290 | 307 | int |
291 | -//l7vsd_main(int argc, char *argv[]) | |
292 | -main(int argc, char *argv[]) | |
308 | +l7vsd_main(int argc, char *argv[]) | |
309 | +//child(int idx) | |
293 | 310 | { |
294 | 311 | //parameter set function register |
295 | 312 | parameter_register_function_pointer( PARAM_COMP_SNMPAGENT, l7vs_snmpbridge_reload_config ); |
@@ -310,9 +327,9 @@ main(int argc, char *argv[]) | ||
310 | 327 | } |
311 | 328 | *(argv_str + pos) = '\0'; |
312 | 329 | LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,17, |
313 | - "in_function: int main(int argc, char *argv[]) " | |
314 | - "argc=%d, argv=%s", | |
315 | - argc, argv_str); | |
330 | + "in_function: int child(int idx) " | |
331 | + "idx=%d\n", | |
332 | + idx); | |
316 | 333 | } |
317 | 334 | /*------ DEBUG LOG END ------*/ |
318 | 335 |
@@ -367,7 +384,7 @@ main(int argc, char *argv[]) | ||
367 | 384 | /*-------- DEBUG LOG --------*/ |
368 | 385 | if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) { |
369 | 386 | LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,19, |
370 | - "out_function: int main(int argc, char *argv[]) " | |
387 | + "out_function: int child(int idx) " | |
371 | 388 | "return_value: 1"); |
372 | 389 | } |
373 | 390 | /*------ DEBUG LOG END ------*/ |
@@ -388,7 +405,7 @@ main(int argc, char *argv[]) | ||
388 | 405 | /*-------- DEBUG LOG --------*/ |
389 | 406 | if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) { |
390 | 407 | LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,20, |
391 | - "out_function: int main(int argc, char *argv[]) " | |
408 | + "out_function: int child(int idx) " | |
392 | 409 | "return_value: 1"); |
393 | 410 | } |
394 | 411 | /*------ DEBUG LOG END ------*/ |
@@ -412,7 +429,7 @@ main(int argc, char *argv[]) | ||
412 | 429 | /*-------- DEBUG LOG --------*/ |
413 | 430 | if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) { |
414 | 431 | LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,21, |
415 | - "out_function: int main(int argc, char *argv[]) " | |
432 | + "out_function: int child(int idx) " | |
416 | 433 | "return_value: 1"); |
417 | 434 | } |
418 | 435 | /*------ DEBUG LOG END ------*/ |
@@ -421,6 +438,9 @@ main(int argc, char *argv[]) | ||
421 | 438 | _exit(1); |
422 | 439 | } |
423 | 440 | |
441 | + ret = create_server_pipe(); | |
442 | + if(ret < 0) exit(1); | |
443 | + | |
424 | 444 | l7vs_module_init(NULL); |
425 | 445 | l7vs_lsock_init(); |
426 | 446 | l7vs_replication_init(); |
@@ -452,12 +472,13 @@ main(int argc, char *argv[]) | ||
452 | 472 | /*-------- DEBUG LOG --------*/ |
453 | 473 | if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_L7VSD_PROGRAM)) { |
454 | 474 | LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_PROGRAM,22, |
455 | - "out_function: int main(int argc, char *argv[]) " | |
475 | + "out_function: int child(int idx) " | |
456 | 476 | "return_value: 0"); |
457 | 477 | } |
458 | 478 | /*------ DEBUG LOG END ------*/ |
459 | 479 | fflush(stdout); |
460 | 480 | fsync(1); |
481 | + | |
461 | 482 | _exit(0); |
462 | 483 | return 0; /* this instruction never called ;-) */ |
463 | 484 | } |
@@ -208,6 +208,7 @@ l7vs_lsock_get(struct sockaddr_in *sin, uint8_t proto, int backlog) | ||
208 | 208 | } |
209 | 209 | |
210 | 210 | setsockopt(lsock->iom->fd, SOL_SOCKET, SO_REUSEADDR, (char*) &on, sizeof(int)); |
211 | + setsockopt(lsock->iom->fd, SOL_SOCKET, SO_REUSEPORT, (char*) &on, sizeof(int)); | |
211 | 212 | ret = bind(lsock->iom->fd, (struct sockaddr *)sin, sizeof(*sin)); //binding the socket for incoming client request |
212 | 213 | if (ret < 0) { |
213 | 214 | char addr_str[DEBUG_STR_LEN]={0}; |
@@ -48,6 +48,7 @@ | ||
48 | 48 | |
49 | 49 | //! service list pointer |
50 | 50 | static GList * l7vs_service_list; |
51 | +static Glist * l7vs_service_arg_list; | |
51 | 52 | |
52 | 53 | //! service handle |
53 | 54 | uint32_t service_handle_base = 0; |
@@ -604,6 +605,63 @@ l7vs_service_list_dest_arg(struct l7vs_service *srv, | ||
604 | 605 | } |
605 | 606 | |
606 | 607 | /*! |
608 | + * check child process when create service. and send information for adding service. | |
609 | + * @param[in] | |
610 | + * @param[out] | |
611 | + * @return | |
612 | + */ | |
613 | +int | |
614 | +l7vs_child_precess_check() | |
615 | +{ | |
616 | + GList *l; | |
617 | + int i, writefifo; | |
618 | + int srv_sock_check_flg; | |
619 | + pid_t pid; | |
620 | + char *fifoname; | |
621 | + | |
622 | + /* IP, port and protomod duplication check */ | |
623 | + srv_sock_check_flg = 0; | |
624 | + for(l = g_list_first(l7vs_service_arg_list); l != NULL; l = g_list_next(l)) { | |
625 | + saref = (struct l7vs_service_arg *)l->data; | |
626 | + /* IPとportの重複チェック */ | |
627 | + if((saref->addr.sin_addr.s_addr != arg->srv_arg.addr.sin_addr.s_addr) || (saref->addr.sin_port != arg->srv_arg.addr.sin_port)) { | |
628 | + continue; | |
629 | + }else{ | |
630 | + /* IPとportが一緒だったら、プロトコルモジュール名を比較 */ | |
631 | + srv_sock_check_flg = 1; | |
632 | + if(saref->protomod != arg->srv_arg->protomod) { | |
633 | + /* 子プロセスにプロトコルモジュール通知 */ | |
634 | + /* l7vs_service.h struct l7vs_service_arg(child_pid[]) */ | |
635 | + /* IP,portからpidのリストを取得 */ | |
636 | + for( i =0; i < MAX_CHILD; i++) { | |
637 | + pid = saref->child_pid[i]; | |
638 | + /* pidからファイルパス名生成 */ | |
639 | + /* 既存/tmp/l7vsd_ip_port/l7vsd.pid をwriteで開いて書き込み */ | |
640 | + if((writefifo = open(fifoname, O_WRONLY, 0)) < 0) { | |
641 | + perror("open"); | |
642 | + continue; | |
643 | + }else{ | |
644 | + /* VS作成用テキスト情報を構築 */ | |
645 | + /* 名前付きパイプに情報を書き込み */ | |
646 | + ret = write(writefifo, saref->protomod, n); | |
647 | + if(ret < 0){ | |
648 | + perror("write"); | |
649 | + } | |
650 | + close(writefifo); | |
651 | + } | |
652 | + } | |
653 | + }else{ | |
654 | + /* サービス重複エラー */ | |
655 | + LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_VIRTUAL_SERVICE,2, "Virtual service already exists" ); | |
656 | + return srv_sock_check_flg; | |
657 | + } | |
658 | + } | |
659 | + } | |
660 | + | |
661 | + return srv_sock_check_flg; | |
662 | +} | |
663 | + | |
664 | +/*! | |
607 | 665 | * create service instance. and set service value. |
608 | 666 | * @param[in] *arg l7vs_service_arg pointer |
609 | 667 | * @param[out] *err error code |
@@ -615,13 +673,21 @@ l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) | ||
615 | 673 | struct l7vs_protomod *pmod; |
616 | 674 | struct l7vs_scheduler *sched; |
617 | 675 | struct l7vs_service *srv, *sref; |
676 | + struct l7vs_service_arg *saref; | |
618 | 677 | struct l7vs_lsock *lsock; |
619 | 678 | struct l7vs_dest *sorry_dest; //! sorry-server destination |
620 | 679 | // struct l7vs_service_repdata * service_replicationdata; |
621 | 680 | |
681 | + int srv_sock_check_flg = 0; | |
682 | + int srv_mod_check_flg = 0; | |
622 | 683 | int ret = 0; |
684 | + int i, readid, writeid; | |
685 | + pid_t pid; | |
623 | 686 | GList *l; |
624 | 687 | |
688 | + char fifoname[256]; | |
689 | + char childinfo[64]; | |
690 | + | |
625 | 691 | if( NULL == arg ){ |
626 | 692 | LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_PROGRAM,15, "Could not create service : argument \"arg\" is NULL" ); |
627 | 693 | return NULL; |
@@ -654,213 +720,236 @@ l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) | ||
654 | 720 | return NULL; |
655 | 721 | } |
656 | 722 | |
657 | - lsock = l7vs_lsock_get(&arg->srv_arg.addr, arg->srv_arg.proto, arg->srv_arg.backlog); | |
658 | - if (lsock == NULL) { | |
659 | - LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_VIRTUAL_SERVICE,1, "Could not create listen socket" ); | |
660 | - *err = L7VS_CONFIG_ERR_NOSOCK; | |
661 | - //debug output | |
662 | - if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
663 | - char debugstr[DEBUG_STR_LEN]; | |
664 | - memset( debugstr, 0, DEBUG_STR_LEN ); | |
665 | - sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_lsock_get)" ); | |
666 | - LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,31, debugstr ); | |
667 | - } | |
668 | - return NULL; | |
669 | - } | |
670 | - | |
671 | - pmod = l7vs_protomod_get(arg->srv_arg.protomod); | |
672 | - if (pmod == NULL) { | |
673 | - l7vs_lsock_put(lsock); | |
674 | - *err = L7VS_CONFIG_ERR_NOMEM; | |
675 | - //debug output | |
676 | - if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
677 | - char debugstr[DEBUG_STR_LEN]; | |
678 | - memset( debugstr, 0, DEBUG_STR_LEN ); | |
679 | - sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_protomod_get)" ); | |
680 | - LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,32, debugstr ); | |
681 | - } | |
682 | - return NULL; | |
683 | - } | |
684 | - | |
685 | - sched = l7vs_sched_get(arg->srv_arg.schedmod); | |
686 | - if (sched == NULL) { | |
687 | - l7vs_protomod_put(pmod); | |
688 | - l7vs_lsock_put(lsock); | |
689 | - *err = L7VS_CONFIG_ERR_NOSCHED; | |
690 | - //debug output | |
691 | - if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
692 | - char debugstr[DEBUG_STR_LEN]; | |
693 | - memset( debugstr, 0, DEBUG_STR_LEN ); | |
694 | - sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_sched_get)" ); | |
695 | - LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,33, debugstr ); | |
696 | - } | |
697 | - return NULL; | |
698 | - } | |
699 | - | |
700 | - // create new destination for sorry-server (weight not set) | |
701 | - // FIXME ignore IPv6 address??? | |
702 | - sorry_dest = (struct l7vs_dest *)l7vs_dest_create((struct sockaddr_in *)&arg->srv_arg.sorry_addr, 0); | |
703 | - if (sorry_dest == NULL) { | |
704 | - l7vs_sched_put(sched); | |
705 | - l7vs_protomod_put(pmod); | |
706 | - l7vs_lsock_put(lsock); | |
707 | - *err = L7VS_CONFIG_ERR_NOMEM; | |
708 | - //debug output | |
709 | - if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
710 | - char debugstr[DEBUG_STR_LEN]; | |
711 | - memset( debugstr, 0, DEBUG_STR_LEN ); | |
712 | - sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_dest_create)" ); | |
713 | - LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,34, debugstr ); | |
714 | - } | |
715 | - return NULL; | |
716 | - } | |
717 | - | |
718 | - srv = (struct l7vs_service *) calloc(1, sizeof(struct l7vs_service)); | |
719 | - if (srv == NULL) { | |
720 | - l7vs_dest_destroy(sorry_dest); | |
721 | - l7vs_sched_put(sched); | |
722 | - l7vs_protomod_put(pmod); | |
723 | - l7vs_lsock_put(lsock); | |
724 | - *err = L7VS_CONFIG_ERR_NOMEM; | |
725 | - LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_SYSTEM_MEMORY,5, "l7vs_service memory allocate error" ); | |
726 | - return NULL; | |
727 | - } | |
728 | - //DEBUG output | |
729 | - if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
730 | - char debugstr[DEBUG_STR_LEN]; | |
731 | - memset( debugstr, 0, DEBUG_STR_LEN ); | |
732 | - sprintf( debugstr, "memory allocated : address = %p , size = %zu", srv, sizeof(struct l7vs_service ) ); | |
733 | - LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,35, debugstr ); | |
734 | - } | |
735 | - | |
736 | - srv->handle = ++service_handle_base; | |
737 | - if( TEMP_SERVICEHANDLE == srv->handle ){ | |
738 | - srv->handle = ++service_handle_base; | |
739 | - } | |
740 | - ret = pmod->create(&arg->protomod_arg, srv->handle); | |
741 | - if (ret != 0) { | |
742 | - //DEBUG output | |
743 | - if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
744 | - char debugstr[DEBUG_STR_LEN]; | |
745 | - memset( debugstr, 0, DEBUG_STR_LEN ); | |
746 | - sprintf( debugstr, "memory free : address = %p", srv ); | |
747 | - LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,36, debugstr ); | |
748 | - } | |
749 | - free(srv); | |
750 | - l7vs_dest_destroy(sorry_dest); | |
751 | - l7vs_sched_put(sched); | |
752 | - l7vs_protomod_put(pmod); | |
753 | - l7vs_lsock_put(lsock); | |
754 | - *err = L7VS_CONFIG_ERR_NOMEM; | |
755 | - //debug output | |
756 | - if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
757 | - char debugstr[DEBUG_STR_LEN]; | |
758 | - memset( debugstr, 0, DEBUG_STR_LEN ); | |
759 | - sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure pmod create)" ); | |
760 | - LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,37, debugstr ); | |
761 | - } | |
762 | - return NULL; | |
763 | - } | |
764 | - | |
765 | - for (l = g_list_first(l7vs_service_list); l != NULL; | |
766 | - l = g_list_next(l)) { | |
767 | - sref = (struct l7vs_service *)l->data; | |
768 | - | |
769 | - if (lsock != sref->lsock) { | |
770 | - continue; | |
771 | - } | |
772 | - | |
773 | - if (pmod != sref->pm) { | |
774 | - continue; | |
775 | - } | |
776 | - | |
777 | - if (pmod->compare(srv->handle, sref->handle) != 0) { | |
723 | + /* IPとportの重複チェック、proto_modだけ違うものならproto_mod追加 */ | |
724 | + srv_sock_check_flg = l7vs_child_precess_check(); | |
725 | + | |
726 | + /* IPとportが重複しない場合は子プロセスを作る */ | |
727 | + if( srv_sock_check_flg == 0 ) { | |
728 | + for( i=0; i < fork_num; i++ ){ | |
729 | + pid_t pid = fork(); | |
730 | + /* 子プロセスを生成したら親プロセスでIP,portとPIDの対応リストを作る */ | |
731 | + | |
732 | + /* 子ならgetpidして親に名前付きパイプで通知 */ | |
733 | + if( pid == 0 ){ | |
734 | + /* ソケット作成 */ | |
735 | + lsock = l7vs_lsock_get(&arg->srv_arg.addr, arg->srv_arg.proto, arg->srv_arg.backlog); | |
736 | + if(lsock == NULL) { | |
737 | + LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_VIRTUAL_SERVICE,1, "Could not create listen socket" ); | |
738 | + *err = L7VS_CONFIG_ERR_NOSOCK; | |
739 | + //debug output | |
740 | + if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
741 | + char debugstr[DEBUG_STR_LEN]; | |
742 | + memset( debugstr, 0, DEBUG_STR_LEN ); | |
743 | + sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_lsock_get)" ); | |
744 | + LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,31, debugstr ); | |
745 | + } | |
746 | + return NULL; | |
747 | + } | |
748 | + | |
749 | + /* プロトコルモジュールロード */ | |
750 | + pmod = l7vs_protomod_get(arg->srv_arg.protomod); | |
751 | + if (pmod == NULL) { | |
752 | + l7vs_lsock_put(lsock); | |
753 | + *err = L7VS_CONFIG_ERR_NOMEM; | |
754 | + //debug output | |
755 | + if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
756 | + char debugstr[DEBUG_STR_LEN]; | |
757 | + memset( debugstr, 0, DEBUG_STR_LEN ); | |
758 | + sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_protomod_get)" ); | |
759 | + LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,32, debugstr ); | |
760 | + } | |
761 | + return NULL; | |
762 | + } | |
763 | + | |
764 | + /* スケジュールモジュールロード */ | |
765 | + sched = l7vs_sched_get(arg->srv_arg.schedmod); | |
766 | + if (sched == NULL) { | |
767 | + l7vs_protomod_put(pmod); | |
768 | + l7vs_lsock_put(lsock); | |
769 | + *err = L7VS_CONFIG_ERR_NOSCHED; | |
770 | + //debug output | |
771 | + if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
772 | + char debugstr[DEBUG_STR_LEN]; | |
773 | + memset( debugstr, 0, DEBUG_STR_LEN ); | |
774 | + sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_sched_get)" ); | |
775 | + LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,33, debugstr ); | |
776 | + } | |
777 | + return NULL; | |
778 | + } | |
779 | + | |
780 | + // create new destination for sorry-server (weight not set) | |
781 | + // FIXME ignore IPv6 address??? | |
782 | + sorry_dest = (struct l7vs_dest *)l7vs_dest_create((struct sockaddr_in *)&arg->srv_arg.sorry_addr, 0); | |
783 | + if (sorry_dest == NULL) { | |
784 | + l7vs_sched_put(sched); | |
785 | + l7vs_protomod_put(pmod); | |
786 | + l7vs_lsock_put(lsock); | |
787 | + *err = L7VS_CONFIG_ERR_NOMEM; | |
788 | + //debug output | |
789 | + if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
790 | + char debugstr[DEBUG_STR_LEN]; | |
791 | + memset( debugstr, 0, DEBUG_STR_LEN ); | |
792 | + sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure l7vs_dest_create)" ); | |
793 | + LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,34, debugstr ); | |
794 | + } | |
795 | + return NULL; | |
796 | + } | |
797 | + | |
798 | + /* サービス構造体作成 */ | |
799 | + srv = (struct l7vs_service *) calloc(1, sizeof(struct l7vs_service)); | |
800 | + if (srv == NULL) { | |
801 | + l7vs_dest_destroy(sorry_dest); | |
802 | + l7vs_sched_put(sched); | |
803 | + l7vs_protomod_put(pmod); | |
804 | + l7vs_lsock_put(lsock); | |
805 | + *err = L7VS_CONFIG_ERR_NOMEM; | |
806 | + LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_SYSTEM_MEMORY,5, "l7vs_service memory allocate error" ); | |
807 | + return NULL; | |
808 | + } | |
809 | + //DEBUG output | |
810 | + if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
811 | + char debugstr[DEBUG_STR_LEN]; | |
812 | + memset( debugstr, 0, DEBUG_STR_LEN ); | |
813 | + sprintf( debugstr, "memory allocated : address = %p , size = %zu", srv, sizeof(struct l7vs_service ) ); | |
814 | + LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,35, debugstr ); | |
815 | + } | |
816 | + | |
817 | + srv->handle = ++service_handle_base; | |
818 | + if( TEMP_SERVICEHANDLE == srv->handle ){ | |
819 | + srv->handle = ++service_handle_base; | |
820 | + } | |
821 | + ret = pmod->create(&arg->protomod_arg, srv->handle); | |
822 | + if (ret != 0) { | |
823 | + //DEBUG output | |
824 | + if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
825 | + char debugstr[DEBUG_STR_LEN]; | |
826 | + memset( debugstr, 0, DEBUG_STR_LEN ); | |
827 | + sprintf( debugstr, "memory free : address = %p", srv ); | |
828 | + LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,36, debugstr ); | |
829 | + } | |
830 | + free(srv); | |
831 | + l7vs_dest_destroy(sorry_dest); | |
832 | + l7vs_sched_put(sched); | |
833 | + l7vs_protomod_put(pmod); | |
834 | + l7vs_lsock_put(lsock); | |
835 | + *err = L7VS_CONFIG_ERR_NOMEM; | |
836 | + //debug output | |
837 | + if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
838 | + char debugstr[DEBUG_STR_LEN]; | |
839 | + memset( debugstr, 0, DEBUG_STR_LEN ); | |
840 | + sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (failure pmod create)" ); | |
841 | + LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,37, debugstr ); | |
842 | + } | |
843 | + return NULL; | |
844 | + } | |
845 | + | |
846 | + srv->lsock = lsock; | |
847 | + srv->pm = pmod; | |
848 | + l7vs_sched_bind(sched, srv); | |
849 | + | |
850 | + // set sorry data | |
851 | + srv->sorry_cc = arg->srv_arg.sorry_cc; | |
852 | + srv->sorry_dest = sorry_dest; | |
853 | + srv->sorry_flag = arg->srv_arg.sorry_flag; | |
854 | + // set QoS value | |
855 | + srv->qos_threshold_up = arg->srv_arg.qos_threshold_up; | |
856 | + srv->qos_threshold_down = arg->srv_arg.qos_threshold_down; | |
857 | + | |
858 | + l7vs_lsock_add_service(lsock, srv); | |
859 | + l7vs_service_list = g_list_append(l7vs_service_list, srv); | |
860 | + | |
861 | + // create g_hash_table | |
862 | + srv->conn_hash = g_hash_table_new( NULL, NULL ); | |
863 | + | |
864 | + // set replicationmode | |
865 | + // get the replication area. | |
866 | + unsigned int r_size = 0; | |
867 | + l7vs_service_repdata * repdata = (l7vs_service_repdata*)l7vs_replication_pay_memory( REP_COMP_SV, &r_size ); | |
868 | + // if repdata is NULL, Cansel to replication mode | |
869 | + if( NULL != repdata ){ | |
870 | + // if virtuar service number is 1, change mode and copy to the data. | |
871 | + if( 1 == g_list_length( l7vs_service_list ) ){ | |
872 | + l7vs_replication_switch_to_master(); | |
873 | + // when Syb->Act, Data is saved in a preliminary area of original Service. | |
874 | + // The replication data area is calculated. | |
875 | + rep_size_num = (r_size * DATA_SIZE) / sizeof(struct l7vs_service_repdata); | |
876 | + // get mirror area. | |
877 | + rep_mirror = (struct l7vs_service_repdata*)calloc( rep_size_num, sizeof(struct l7vs_service_repdata) ); | |
878 | + // Copy to the data | |
879 | + if( NULL != rep_mirror )memcpy( rep_mirror, repdata, (rep_size_num * sizeof(struct l7vs_service_repdata)) ); | |
880 | + //DEBUG output | |
881 | + if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
882 | + char debugstr[DEBUG_STR_LEN]; | |
883 | + memset( debugstr, 0, DEBUG_STR_LEN ); | |
884 | + sprintf( debugstr, "memory allocated : address = %p , size = %d", rep_mirror, (rep_size_num * sizeof(struct l7vs_service_repdata)) ); | |
885 | + LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE, 100, debugstr ); | |
886 | + } | |
887 | + } | |
888 | + // if replication data mirror isn't NULL, get a rep_mirror area. | |
889 | + if( NULL != rep_mirror )set_replication_data( rep_size_num, rep_mirror, srv ); | |
890 | + //make replication data | |
891 | + make_replication_data( rep_size_num, repdata ); | |
892 | + } | |
893 | + | |
894 | + /* 名前付きパイプ作成 */ | |
895 | + pid = getpid(); | |
896 | + snprintf(filename, sizeof(filename), "/tmp/l7vsd_%s_%d/l7vsd.%d", ip, port, pid); | |
897 | + ret = mkfifo(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); | |
898 | + if(ret == -1){ | |
899 | + perror("mkfifo"); | |
900 | + /* 各種アンロード */ | |
901 | + return NULL; | |
902 | + } | |
903 | + | |
904 | + /* 親PIPEを開いてPIDとIP,portを親に通知 */ | |
905 | + snprintf(child_info, sizeof(child_info), "%s %d %d", ip, port, pid); | |
906 | + len = strlen(child_info); | |
907 | + if((writefifo = open(P_FIFO, O_WRONLY, 0)) < 0) { | |
908 | + perror("open"); | |
909 | + /* 各種アンロード */ | |
778 | 910 | continue; |
911 | + }else{ | |
912 | + /* 名前付きパイプに情報を書き込み */ | |
913 | + ret = write(writefifo, child_info, sizeof(child_info)); | |
914 | + if(ret < 0){ | |
915 | + perror("write"); | |
916 | + /* 各種アンロード */ | |
917 | + } | |
918 | + close(writefifo); | |
919 | + } | |
920 | + | |
921 | + //debug output | |
922 | + if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
923 | + char debugstr[DEBUG_STR_LEN]; | |
924 | + memset( debugstr, 0, DEBUG_STR_LEN ); | |
925 | + sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err)" ); | |
926 | + l7vs_service_c_str( debugstr, srv ); | |
927 | + LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,40, debugstr ); | |
928 | + } | |
929 | + | |
930 | + return srv; | |
931 | + | |
932 | + }else if( pid > 0 ){ | |
933 | + /* 親プロセス処理 */ | |
934 | + | |
935 | + /* 子プロが書き込んだ情報を受け取る */ | |
936 | + if((readfifo = open("/tmp/l7vsd.parent", O_RDONLY, 0)) < 0) { | |
937 | + perror("open"); | |
938 | + return NULL; | |
939 | + }else{ | |
940 | + ret = read(readfifo,child_info,n); | |
941 | + if(ret < 0){ | |
942 | + perror("read"); | |
943 | + /* 各種アンロード */ | |
944 | + } | |
945 | + close(readfifo); | |
946 | + } | |
947 | + }else if( pid < 0 ){ | |
948 | + /* 子プロセス作成失敗 */ | |
949 | + perror( "fork" ); | |
950 | + return NULL; | |
779 | 951 | } |
780 | - | |
781 | - LOGGER_PUT_LOG_ERROR( LOG_CAT_L7VSD_VIRTUAL_SERVICE,2, "Virtual service already exists" ); | |
782 | - l7vs_dest_destroy(sorry_dest); | |
783 | - l7vs_sched_put(sched); | |
784 | - l7vs_protomod_put(pmod); | |
785 | - l7vs_lsock_put(lsock); | |
786 | - pmod->destroy(srv->handle); | |
787 | - //DEBUG output | |
788 | - if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
789 | - char debugstr[DEBUG_STR_LEN]; | |
790 | - memset( debugstr, 0, DEBUG_STR_LEN ); | |
791 | - sprintf( debugstr, "memory free : address = %p", srv ); | |
792 | - LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,38, debugstr ); | |
793 | - } | |
794 | - free(srv); | |
795 | - *err = L7VS_CONFIG_ERR_VS_EXISTS; | |
796 | - //debug output | |
797 | - if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
798 | - char debugstr[DEBUG_STR_LEN]; | |
799 | - memset( debugstr, 0, DEBUG_STR_LEN ); | |
800 | - sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err) return : NULL (Duplication service)" ); | |
801 | - LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,39, debugstr ); | |
802 | - } | |
803 | - return NULL; | |
804 | - } | |
805 | - | |
806 | - srv->lsock = lsock; | |
807 | - srv->pm = pmod; | |
808 | - l7vs_sched_bind(sched, srv); | |
809 | - | |
810 | - // set sorry data | |
811 | - srv->sorry_cc = arg->srv_arg.sorry_cc; | |
812 | - srv->sorry_dest = sorry_dest; | |
813 | - srv->sorry_flag = arg->srv_arg.sorry_flag; | |
814 | - // set QoS value | |
815 | - srv->qos_threshold_up = arg->srv_arg.qos_threshold_up; | |
816 | - srv->qos_threshold_down = arg->srv_arg.qos_threshold_down; | |
817 | - | |
818 | - l7vs_lsock_add_service(lsock, srv); | |
819 | - l7vs_service_list = g_list_append(l7vs_service_list, srv); | |
820 | - | |
821 | - // create g_hash_table | |
822 | - srv->conn_hash = g_hash_table_new( NULL, NULL ); | |
823 | - | |
824 | - // set replicationmode | |
825 | - // get the replication area. | |
826 | - unsigned int r_size = 0; | |
827 | - l7vs_service_repdata * repdata = (l7vs_service_repdata*)l7vs_replication_pay_memory( REP_COMP_SV, &r_size ); | |
828 | - // if repdata is NULL, Cansel to replication mode | |
829 | - if( NULL != repdata ){ | |
830 | - // if virtuar service number is 1, change mode and copy to the data. | |
831 | - if( 1 == g_list_length( l7vs_service_list ) ){ | |
832 | - l7vs_replication_switch_to_master(); | |
833 | - // when Syb->Act, Data is saved in a preliminary area of original Service. | |
834 | - // The replication data area is calculated. | |
835 | - rep_size_num = (r_size * DATA_SIZE) / sizeof(struct l7vs_service_repdata); | |
836 | - // get mirror area. | |
837 | - rep_mirror = (struct l7vs_service_repdata*)calloc( rep_size_num, sizeof(struct l7vs_service_repdata) ); | |
838 | - // Copy to the data | |
839 | - if( NULL != rep_mirror )memcpy( rep_mirror, repdata, (rep_size_num * sizeof(struct l7vs_service_repdata)) ); | |
840 | - //DEBUG output | |
841 | - if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
842 | - char debugstr[DEBUG_STR_LEN]; | |
843 | - memset( debugstr, 0, DEBUG_STR_LEN ); | |
844 | - sprintf( debugstr, "memory allocated : address = %p , size = %d", rep_mirror, (rep_size_num * sizeof(struct l7vs_service_repdata)) ); | |
845 | - LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE, 100, debugstr ); | |
846 | - } | |
847 | - } | |
848 | - // if replication data mirror isn't NULL, get a rep_mirror area. | |
849 | - if( NULL != rep_mirror )set_replication_data( rep_size_num, rep_mirror, srv ); | |
850 | - //make replication data | |
851 | - make_replication_data( rep_size_num, repdata ); | |
852 | - } | |
853 | - | |
854 | - //debug output | |
855 | - if( LOG_LV_DEBUG == logger_get_log_level( LOG_CAT_L7VSD_VIRTUAL_SERVICE ) ){ | |
856 | - char debugstr[DEBUG_STR_LEN]; | |
857 | - memset( debugstr, 0, DEBUG_STR_LEN ); | |
858 | - sprintf( debugstr, "function l7vs_service_create(struct l7vs_service_arg_multi *arg, int *err)" ); | |
859 | - l7vs_service_c_str( debugstr, srv ); | |
860 | - LOGGER_PUT_LOG_DEBUG( LOG_CAT_L7VSD_VIRTUAL_SERVICE,40, debugstr ); | |
861 | - } | |
862 | - | |
863 | - return srv; | |
952 | + } | |
864 | 953 | } |
865 | 954 | |
866 | 955 |
@@ -1675,3 +1764,12 @@ l7vs_service_update_throughput( struct l7vs_service* srv, unsigned long long cur | ||
1675 | 1764 | LOGGER_PUT_LOG_DEBUG(LOG_CAT_L7VSD_VIRTUAL_SERVICE,98,"out_function: void l7vs_service_update_throughput(struct l7vs_service* srv, unsigned long long current_time)"); |
1676 | 1765 | } |
1677 | 1766 | } |
1767 | + | |
1768 | +void | |
1769 | +send_pid(int readid) | |
1770 | +{ | |
1771 | + size_t len; | |
1772 | + ssize_t n; | |
1773 | + char *ptr; | |
1774 | + | |
1775 | +} |