void no_daemon_start(char * path, int nbCoreFiles, const char *name, void (*on_start) (void), void (*on_stop) (void), void (*on_hup) (void)) { int pid; DEBUG_FUNCTION; sprintf(pid_file, "%s%s", DAEMON_PID_DIRECTORY, name); // check if running if (read_pid(name, &pid) == 0 && kill(pid, 0) == 0) { fprintf(stderr, "%s already running as pid: %d\n", pid_file, pid); return; } rozofs_signals_declare (path,nbCoreFiles); if (write_pid(name) != 0) { fatal("write_pid failed: %s", strerror(errno)); return; } rozofs_attach_crash_cbk(remove_pid_file); if (on_stop) rozofs_attach_crash_cbk((rozofs_attach_crash_cbk_t)on_stop); if (on_hup) rozofs_attach_hgup_cbk((rozofs_attach_crash_cbk_t)on_hup); on_start(); }
/*----------------------------------------------------------------------------- ** ** MAIN file mover ** **---------------------------------------------------------------------------- */ int main(int argc, char *argv[]) { list_t jobs; int i; char name[128]; /* ** Get utility name and record it for syslog */ utility_name = basename(argv[0]); uma_dbg_record_syslog_name(utility_name); /* ** Set a signal handler */ rozofs_signals_declare(utility_name, 1); rozofs_mover_init(); list_init(&jobs); for (i=1;i<11; i++) { rozofs_mover_job_t * job; job = malloc(sizeof(rozofs_mover_job_t)); memset(job,0,sizeof(rozofs_mover_job_t)); job->cid = 2; job->sid[0] = 8; job->sid[1] = 7; job->sid[2] = 3; job->sid[3] = 4; job->sid[4] = 5; job->sid[5] = 6; job->sid[6] = 1; job->sid[7] = 2; sprintf(name,"@rozofs_uuid@00000000-0000-4000-0000-000000000018/f%d",i); job->name = strdup(name); list_init(&job->list); list_push_back(&jobs,&job->list); } rozofs_do_move_one_export("localhost", "/home/jean-pierre/rozoClients/develop/tests/SIMU/export_1", 10 /* 10 MB/s */, &jobs); /* ** Display statistics */ rozofs_mover_print_stat(uma_dbg_get_buffer()); printf("%s",uma_dbg_get_buffer()); return 0; }
/** * 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" ); }