/* * Copyright (C) 2018 Codership Oy * * This file is part of wsrep-lib. * * Wsrep-lib is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * Wsrep-lib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with wsrep-lib. If not, see . */ #include "db_params.hpp" #include #include #include namespace { void validate_params(const db::params& params) { std::ostringstream os; if (params.n_servers != params.topology.size()) { if (params.topology.size() > 0) { os << "Error: --topology=" << params.topology << " does not " << "match the number of server --servers=" << params.n_servers << "\n"; } } if (os.str().size()) { throw std::invalid_argument(os.str()); } } } db::params db::parse_args(int argc, char** argv) { namespace po = boost::program_options; db::params params; po::options_description desc("Allowed options"); desc.add_options() ("help", "produce help message") ("wsrep-provider", po::value(¶ms.wsrep_provider)->required(), "wsrep provider to load") ("wsrep-provider-options", po::value(¶ms.wsrep_provider_options), "wsrep provider options") ("status-file", po::value(¶ms.status_file), "status output file") ("servers", po::value(¶ms.n_servers)->required(), "number of servers to start") ("topology", po::value(¶ms.topology), "replication topology (e.g. mm for multi master, ms for master/slave") ("clients", po::value(¶ms.n_clients)->required(), "number of clients to start per master") ("transactions", po::value(¶ms.n_transactions), "number of transactions run by a client") ("rows", po::value(¶ms.n_rows), "number of rows per table") ("max-data-size", po::value(¶ms.max_data_size), "maximum size of data payload (default 8)") ("random-data-size", po::value(¶ms.random_data_size), "randomized payload data size (default 0)") ("alg-freq", po::value(¶ms.alg_freq), "ALG frequency") ("sync-wait", po::value(¶ms.sync_wait), "Turn on sync wait for each transaction") ("debug-log-level", po::value(¶ms.debug_log_level), "debug logging level: 0 - none, 1 - verbose") ("fast-exit", po::value(¶ms.fast_exit), "exit from simulation without graceful shutdown") ("ti", po::value(¶ms.thread_instrumentation), "use instrumentation for threads/mutexes/condition variables" "(0 default disabled, 1 total counts, 2 per object)") ("ti-cond-checks", po::value(¶ms.cond_checks), "Enable checks for correct condition variable use. " " Effective only if thread-instrumentation is enabled") ("tls-service", po::value(¶ms.tls_service), "Configure TLS service stubs.\n0 default disabled\n1 enabled\n" "2 enabled with short read/write and renegotiation simulation\n" "3 enabled with error simulation.") ; try { po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); if (vm.count("help")) { std::cerr << desc << "\n"; exit(0); } po::notify(vm); validate_params(params); } catch (const po::error& e) { std::cerr << "Error parsing arguments: " << e.what() << "\n"; std::cerr << desc << "\n"; exit(1); } catch (...) { std::cerr << "Error parsing arguments\n"; std::cerr << desc << "\n"; exit(1); } return params; }