int init_workers(int desired_workers) { worker_process **wps; int i; if (desired_workers <= 0) { desired_workers = 4; } if (workers_alive() == desired_workers) return 0; /* can't shrink the number of workers (yet) */ if (desired_workers < num_workers) return -1; wps = calloc(desired_workers, sizeof(worker_process *)); if (!wps) return -1; if (workers) { if (num_workers < desired_workers) { for (i = 0; i < num_workers; i++) { wps[i] = workers[i]; } } free(workers); } workers = wps; for (i = 0; i < desired_workers; i++) { int ret; worker_process *wp; if (wps[i]) continue; wp = spawn_worker(worker_init_func, (void *)get_global_macros()); if (!wp) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Failed to spawn worker: %s\n", strerror(errno)); free_worker_memory(0); return ERROR; } set_socket_options(wp->sd, 256 * 1024); wps[i] = wp; ret = iobroker_register(nagios_iobs, wp->sd, wp, handle_worker_result); if (ret < 0) { printf("Failed to register worker socket with iobroker %p\n", nagios_iobs); exit(1); } } num_workers = desired_workers; logit(NSLOG_INFO_MESSAGE, TRUE, "Workers spawned: %d\n", num_workers); return 0; }
int init_workers(int desired_workers) { specialized_workers = dkhash_create(512); if (!specialized_workers) { logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to allocate specialized worker table.\n"); return -1; } /* Register our query handler before launching workers, so other workers * can join us whenever they're ready. */ if (!qh_register_handler("wproc", "Worker process management and info", 0, wproc_query_handler)) logit(NSLOG_INFO_MESSAGE, TRUE, "wproc: Successfully registered manager as @wproc with query handler\n"); else logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to register manager with query handler\n"); if (desired_workers <= 0) { int cpus = online_cpus(); /* Always at least 1 CPU. */ if (desired_workers < 0) { /* @note This is an undocumented case of questionable utility, and * should be removed. Users reading this note have been warned. */ desired_workers = cpus - desired_workers; /* desired_workers is now > 0. */ } else { desired_workers = cpus * 1.5; if (desired_workers < 4) { /* Use at least 4 workers when autocalculating so we have some * level of parallelism. */ desired_workers = 4; } else if (desired_workers > 48) { /* Limit the autocalculated workers so we don't spawn too many * on systems with many schedulable cores (>32). */ desired_workers = 48; } } } wproc_num_workers_desired = desired_workers; if (workers_alive() == desired_workers) return 0; /* can't shrink the number of workers (yet) */ if (desired_workers < (int)workers.len) return -1; while (desired_workers-- > 0) spawn_core_worker(); return 0; }
int init_workers(int desired_workers) { int i; /* * we register our query handler before launching workers, * so other workers can join us whenever they're ready */ specialized_workers = dkhash_create(512); if(!qh_register_handler("wproc", "Worker process management and info", 0, wproc_query_handler)) logit(NSLOG_INFO_MESSAGE, TRUE, "wproc: Successfully registered manager as @wproc with query handler\n"); else logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to register manager with query handler\n"); i = desired_workers; if (desired_workers <= 0) { int cpus = online_cpus(); if(desired_workers < 0) { desired_workers = cpus - desired_workers; } if(desired_workers <= 0) { desired_workers = cpus * 1.5; /* min 4 workers, as it's tested and known to work */ if(desired_workers < 4) desired_workers = 4; } } wproc_num_workers_desired = desired_workers; if (workers_alive() == desired_workers) return 0; /* can't shrink the number of workers (yet) */ if (desired_workers < (int)workers.len) return -1; for (i = 0; i < desired_workers; i++) spawn_core_worker(); return 0; }