static void do_test(const char *arg) { struct cluster_driver *driver; struct sd_node node; const char *option; size_t len = 4; void *msg; driver = find_cdrv(arg); if (!driver) return; option = get_cdrv_option(driver, arg); msg = xmalloc(len); assert_ret(driver->init(option), 0); assert_ret(driver->join(&node, msg, len), 0); LOOP_WHEN(method_nr_call(sd_join_handler) == 0); LOOP_WHEN(method_nr_call(sd_accept_handler) == 0); ck_assert_int_eq(method_nr_call(sd_join_handler), 1); ck_assert_int_eq(method_nr_call(sd_accept_handler), 1); assert_ret(driver->block(), 0); assert_ret(driver->block(), 0); LOOP_WHEN(method_nr_call(sd_block_handler) == 0); ck_assert_int_eq(method_nr_call(sd_block_handler), 1); assert_ret(driver->unblock(msg, len), 0); LOOP_WHEN(method_nr_call(sd_block_handler) == 1); ck_assert_int_eq(method_nr_call(sd_block_handler), 2); ck_assert_int_eq(method_nr_call(sd_notify_handler), 1); assert_ret(driver->unblock(msg, len), 0); LOOP_WHEN(method_nr_call(sd_notify_handler) == 1); ck_assert_int_eq(method_nr_call(sd_notify_handler), 2); free(msg); }
int main(int argc, char **argv) { int ch, longindex, ret, port = SD_LISTEN_PORT, io_port = SD_LISTEN_PORT; int rc = 1; const char *dirp = DEFAULT_OBJECT_DIR, *short_options; char *dir, *p, *pid_file = NULL, *bindaddr = NULL, log_path[PATH_MAX], *argp = NULL; bool explicit_addr = false; bool daemonize = true; int32_t nr_vnodes = -1; int64_t zone = -1; struct cluster_driver *cdrv; struct option *long_options; const char *http_options = NULL; static struct logger_user_info sheep_info; struct stat logdir_st; enum log_dst_type log_dst_type; sys->cinfo.flags |= SD_CLUSTER_FLAG_AUTO_VNODES; sys->node_status = SD_NODE_STATUS_INITIALIZATION; sys->rthrottling.max_exec_count = 0; sys->rthrottling.queue_work_interval = 0; sys->rthrottling.throttling = false; install_crash_handler(crash_handler); signal(SIGPIPE, SIG_IGN); install_sighandler(SIGHUP, sighup_handler, false); long_options = build_long_options(sheep_options); short_options = build_short_options(sheep_options); while ((ch = getopt_long(argc, argv, short_options, long_options, &longindex)) >= 0) { switch (ch) { case 'p': port = strtol(optarg, &p, 10); if (optarg == p || port < 1 || UINT16_MAX < port || *p != '\0') { sd_err("Invalid port number '%s'", optarg); exit(1); } break; case 'P': pid_file = optarg; break; case 'r': http_options = optarg; break; case 'l': if (option_parse(optarg, ",", log_parsers) < 0) exit(1); break; case 'n': sys->nosync = true; break; case 'y': if (!str_to_addr(optarg, sys->this_node.nid.addr)) { sd_err("Invalid address: '%s'", optarg); exit(1); } explicit_addr = true; break; case 'D': sys->backend_dio = true; break; case 'f': daemonize = false; break; case 'g': if (nr_vnodes > 0) { sd_err("Options '-g' and '-V' can not be both specified"); exit(1); } nr_vnodes = 0; break; case 'z': zone = strtol(optarg, &p, 10); if (optarg == p || zone < 0 || UINT32_MAX < zone || *p != '\0') { sd_err("Invalid zone id '%s': must be " "an integer between 0 and %u", optarg, UINT32_MAX); exit(1); } sys->this_node.zone = zone; break; case 'u': sys->upgrade = true; break; case 'c': sys->cdrv = find_cdrv(optarg); if (!sys->cdrv) { sd_err("Invalid cluster driver '%s'", optarg); fprintf(stderr, "Supported drivers:"); FOR_EACH_CLUSTER_DRIVER(cdrv) { fprintf(stderr, " %s", cdrv->name); } fprintf(stderr, "\n"); exit(1); } sys->cdrv_option = get_cdrv_option(sys->cdrv, optarg); break; case 'w': sys->enable_object_cache = true; sys->object_cache_size = 0; if (option_parse(optarg, ",", cache_parsers) < 0) exit(1); if (sys->object_cache_size == 0) { sd_err("object cache size is not set"); exit(1); } break; case 'i': if (option_parse(optarg, ",", ionic_parsers) < 0) exit(1); if (!str_to_addr(io_addr, sys->this_node.nid.io_addr)) { sd_err("Bad addr: '%s'", io_addr); exit(1); } if (io_pt) if (sscanf(io_pt, "%u", &io_port) != 1) { sd_err("Bad port '%s'", io_pt); exit(1); } sys->this_node.nid.io_port = io_port; break; case 'j': uatomic_set_true(&sys->use_journal); if (option_parse(optarg, ",", journal_parsers) < 0) exit(1); if (!jsize) { sd_err("you must specify size for journal"); exit(1); } break; case 'b': if (!inetaddr_is_valid(optarg)) exit(1); bindaddr = optarg; break; case 'h': usage(0); break; case 'R': if (option_parse(optarg, ",", recovery_parsers) < 0) exit(1); sys->rthrottling.max_exec_count = max_exec_count; sys->rthrottling.queue_work_interval = queue_work_interval; if (max_exec_count > 0 && queue_work_interval > 0) sys->rthrottling.throttling = true; break; case 'v': fprintf(stdout, "Sheepdog daemon version %s\n", PACKAGE_VERSION); exit(0); break; case 'V': sys->cinfo.flags &= ~SD_CLUSTER_FLAG_AUTO_VNODES; if (nr_vnodes == 0) { sd_err("Options '-g' and '-V' can not be both specified"); exit(1); } nr_vnodes = strtol(optarg, &p, 10); if (optarg == p || nr_vnodes < 1 || UINT16_MAX < nr_vnodes || *p != '\0') { sd_err("Invalid number of vnodes '%s': must be " "an integer between 1 and %u", optarg, UINT16_MAX); exit(1); } break; case 'W': wildcard_recovery = true; break; default: usage(1); break; } }
int main(int argc, char **argv) { int ch, longindex, ret, port = SD_LISTEN_PORT, io_port = SD_LISTEN_PORT; int log_level = SDOG_INFO, nr_vnodes = SD_DEFAULT_VNODES; const char *dirp = DEFAULT_OBJECT_DIR, *short_options; char *dir, *p, *pid_file = NULL, *bindaddr = NULL, path[PATH_MAX], *argp = NULL, *logdir = NULL; bool is_daemon = true, to_stdout = false, explicit_addr = false; int64_t zone = -1; struct cluster_driver *cdrv; struct option *long_options; const char *log_format = "server", *http_address = NULL; static struct logger_user_info sheep_info; install_crash_handler(crash_handler); signal(SIGPIPE, SIG_IGN); install_sighandler(SIGHUP, sighup_handler, false); long_options = build_long_options(sheep_options); short_options = build_short_options(sheep_options); while ((ch = getopt_long(argc, argv, short_options, long_options, &longindex)) >= 0) { switch (ch) { case 'p': port = strtol(optarg, &p, 10); if (optarg == p || port < 1 || UINT16_MAX < port || *p != '\0') { sd_err("Invalid port number '%s'", optarg); exit(1); } break; case 'P': pid_file = optarg; break; case 'r': http_address = optarg; break; case 'f': is_daemon = false; break; case 'l': log_level = strtol(optarg, &p, 10); if (optarg == p || log_level < SDOG_EMERG || SDOG_DEBUG < log_level || *p != '\0') { sd_err("Invalid log level '%s'", optarg); sdlog_help(); exit(1); } break; case 'L': logdir = realpath(optarg, NULL); if (!logdir) { sd_err("%m"); exit(1); } break; case 'n': sys->nosync = true; break; case 'y': if (!str_to_addr(optarg, sys->this_node.nid.addr)) { sd_err("Invalid address: '%s'", optarg); exit(1); } explicit_addr = true; break; case 'd': /* removed soon. use loglevel instead */ log_level = SDOG_DEBUG; break; case 'D': sys->backend_dio = true; break; case 'g': /* same as '-v 0' */ //printf("wyh\n"); nr_vnodes = 0; //nr_vnodes = 5; break; case 'o': to_stdout = true; break; case 'z': zone = strtol(optarg, &p, 10); if (optarg == p || zone < 0 || UINT32_MAX < zone || *p != '\0') { sd_err("Invalid zone id '%s': must be " "an integer between 0 and %u", optarg, UINT32_MAX); exit(1); } sys->this_node.zone = zone; break; case 'u': sys->upgrade = true; break; case 'c': sys->cdrv = find_cdrv(optarg); if (!sys->cdrv) { sd_err("Invalid cluster driver '%s'", optarg); fprintf(stderr, "Supported drivers:"); FOR_EACH_CLUSTER_DRIVER(cdrv) { fprintf(stderr, " %s", cdrv->name); } fprintf(stderr, "\n"); exit(1); } sys->cdrv_option = get_cdrv_option(sys->cdrv, optarg); break; case 'w': object_cache_set(optarg); break; case 'i': parse_arg(optarg, ",", init_io_arg); if (!str_to_addr(io_addr, sys->this_node.nid.io_addr)) { sd_err("Bad addr: '%s'", io_addr); exit(1); } if (io_pt) if (sscanf(io_pt, "%u", &io_port) != 1) { sd_err("Bad port '%s'", io_pt); exit(1); } sys->this_node.nid.io_port = io_port; break; case 'j': uatomic_set_true(&sys->use_journal); parse_arg(optarg, ",", init_journal_arg); if (!jsize) { sd_err("you must specify size for journal"); exit(1); } break; case 'b': if (!inetaddr_is_valid(optarg)) exit(1); bindaddr = optarg; break; case 'h': usage(0); break; case 'v': fprintf(stdout, "Sheepdog daemon version %s\n", PACKAGE_VERSION); exit(0); break; case 'F': log_format = optarg; break; default: usage(1); break; } }