/** * This function is the entry point for setting rozofs in non-blocking mode @param args->ch: reference of the fuse channnel @param args->se: reference of the fuse session @param args->max_transactions: max number of transactions that can be handled in parallel @retval -1 on error @retval : no retval -> only on fatal error */ int rozofs_stat_start(void *args) { uma_dbg_thread_add_self("Main"); int ret; //sem_t semForEver; /* semaphore for blocking the main thread doing nothing */ args_p = args; exportclt_t *exportclt_p = (exportclt_t*)args_p->exportclt; uint16_t debug_port = args_p->debug_port; uint16_t export_listening_port = (uint16_t)exportclt_p->listen_port; info("exportd listening port %d",export_listening_port); /* ** allocate memory for bandwidth computation */ rozofs_throughput_counter_init(); ret = ruc_init(FALSE, debug_port,export_listening_port); if (ret != RUC_OK) { /* ** fatal error */ return -1; } { char name[32]; sprintf(name, "rozofsmount %d", args_p->instance); uma_dbg_set_name(name); } /* ** Send the file lock reset request to remove old locks ** (NB This is not actually a low level fuse API....) */ rozofs_ll_clear_client_file_lock(exportclt.eid,rozofs_client_hash); /* ** init of the fuse part */ ret = rozofs_fuse_init(args_p->ch, args_p->se, args_p->max_transactions); if (ret != RUC_OK) { /* ** fatal error */ return -1; } #if 0 NO MORE LBG MASTER. USE ONLY LBG EXPORTD. /* ** Perform the init with exportd--> setup of the TCP connection associated with the load balancing group */ uint16_t export_nb_port = rozofs_get_service_port_export_master_eproto(); if (export_lbg_initialize((exportclt_t*) args_p->exportclt, EXPORT_PROGRAM, EXPORT_VERSION, export_nb_port, (af_stream_poll_CBK_t) rozofs_export_lbg_cnx_polling) != 0) { severe("Cannot setup the load balancing group towards Exportd"); } #endif //#warning storcli instances are hardcoded if (storcli_lbg_initialize((exportclt_t*) args_p->exportclt,"rozofsmount", args_p->instance, 1, 2) != 0) { severe("Cannot setup the load balancing group towards StorCli"); } rozofs_signals_declare("rozofsmount", common_config.nb_core_file); /* ** change the priority of the main thread */ #if 1 { struct sched_param my_priority; int policy=-1; int ret= 0; pthread_getschedparam(pthread_self(),&policy,&my_priority); info("storio main thread Scheduling policy = %s\n", (policy == SCHED_OTHER) ? "SCHED_OTHER" : (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : "???"); #if 1 my_priority.sched_priority= 98; policy = SCHED_RR; ret = pthread_setschedparam(pthread_self(),policy,&my_priority); if (ret < 0) { severe("error on sched_setscheduler: %s",strerror(errno)); } pthread_getschedparam(pthread_self(),&policy,&my_priority); DEBUG("RozoFS thread Scheduling policy (prio %d) = %s\n",my_priority.sched_priority, (policy == SCHED_OTHER) ? "SCHED_OTHER" : (policy == SCHED_FIFO) ? "SCHED_FIFO" : (policy == SCHED_RR) ? "SCHED_RR" : "???"); #endif } #endif /* ** start the file KPI service */ rzkpi_file_service_init(); /* ** create the fuse threads */ info("FDL RozoFs Instance %d",args_p->instance); ret = rozofs_fuse_thread_intf_create("localhost",args_p->instance,3); if (ret < 0) { fatal("Cannot create fuse threads"); } fuse_reply_thread_init(); uma_dbg_addTopic("fuse_reply_thread", show_fuse_reply_thread); /* ** main loop */ while (1) { ruc_sockCtrl_selectWait(); } fatal( "main() code is rotten" ); }
uint32_t ruc_init(uint32_t test,uint16_t dbg_port,uint16_t exportd_instance) { int ret; uint32_t mx_tcp_client = 2; uint32_t mx_tcp_server = 2; uint32_t mx_tcp_server_cnx = 10; uint32_t mx_af_unix_ctx = 512; uint32_t mx_lbg_north_ctx = 64; //#warning TCP configuration ressources is hardcoded!! /* ** init of the system ticker */ rozofs_init_ticker(); /* ** trace buffer initialization */ ruc_traceBufInit(); #if 1 /* ** Not needed since there is already done ** by libUtil */ /* catch the sigpipe signal for socket ** connections with RELC(s) in this way when a RELC ** connection breaks an errno is set on a recv or send ** socket primitive */ struct sigaction sigAction; sigAction.sa_flags=SA_RESTART; sigAction.sa_handler = SIG_IGN; /* Mask SIGPIPE */ if(sigaction (SIGPIPE, &sigAction, NULL) < 0) { exit(0); } #if 0 sigAction.sa_flags=SA_RESTART; sigAction.sa_handler = hand; /* */ if(sigaction (SIGUSR1, &sigAction, NULL) < 0) { exit(0); } #endif #endif /* ** initialize the socket controller: ** for: NPS, Timer, Debug, etc... */ //#warning set the number of contexts for socketCtrl to 256 ret = ruc_sockctl_init(256); if (ret != RUC_OK) { fatal( " socket controller init failed" ); } /* ** Timer management init */ ruc_timer_moduleInit(FALSE); while(1) { /* **-------------------------------------- ** configure the number of TCP connection ** supported **-------------------------------------- ** */ ret = uma_tcp_init(mx_tcp_client+mx_tcp_server+mx_tcp_server_cnx); if (ret != RUC_OK) break; /* **-------------------------------------- ** configure the number of TCP server ** context supported **-------------------------------------- ** */ ret = ruc_tcp_server_init(mx_tcp_server); if (ret != RUC_OK) break; #if 0 /* **-------------------------------------- ** configure the number of TCP client ** context supported **-------------------------------------- ** */ ret = ruc_tcp_clientinit(mx_tcp_client); if (ret != RUC_OK) break; #endif /* **-------------------------------------- ** configure the number of AF_UNIX ** context supported **-------------------------------------- ** */ ret = af_unix_module_init(mx_af_unix_ctx, 32,1024*32, // xmit(count,size) 32,1024*32 // recv(count,size) ); if (ret != RUC_OK) break; /* **-------------------------------------- ** configure the number of Load Balancer ** contexts supported **-------------------------------------- ** */ ret = north_lbg_module_init(mx_lbg_north_ctx); if (ret != RUC_OK) break; /* ** init of the rpc client module */ ret = rozofs_rpc_module_init(); if (ret != RUC_OK) break; /* ** Init of the module that handles the configuration channel with main process of exportd */ ret = expgwc_int_chan_moduleInit(); if (ret != RUC_OK) break; ret = rozofs_tx_module_init(EXPORTNB_SOUTH_TX_CNT, // transactions count EXPORTNB_SOUTH_TX_RECV_BUF_CNT,EXPORTNB_SOUTH_TX_RECV_BUF_SZ, // xmit small [count,size] EXPORTNB_SOUTH_TX_RECV_BUF_CNT,EXPORTNB_SOUTH_TX_RECV_BUF_SZ, // xmit large [count,size] EXPORTNB_SOUTH_TX_RECV_BUF_CNT,EXPORTNB_SOUTH_TX_RECV_BUF_SZ, // recv small [count,size] EXPORTNB_SOUTH_TX_RECV_BUF_CNT,EXPORTNB_SOUTH_TX_RECV_BUF_SZ); // recv large [count,size]; break; } /* ** internal debug init */ //ruc_debug_init(); /* **-------------------------------------- ** D E B U G M O D U L E **-------------------------------------- */ uma_dbg_init(10,INADDR_ANY,dbg_port); { char name[32]; sprintf(name, "exportd %d ", exportd_instance); uma_dbg_set_name(name); } //#warning Start of specific application initialization code return ret; }