1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
/*
* Copyright (C) 2018 Codership Oy <info@codership.com>
*
* 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 <https://www.gnu.org/licenses/>.
*/
#include "db_params.hpp"
#include <boost/program_options.hpp>
#include <iostream>
#include <stdexcept>
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<std::string>(¶ms.wsrep_provider)->required(),
"wsrep provider to load")
("wsrep-provider-options",
po::value<std::string>(¶ms.wsrep_provider_options),
"wsrep provider options")
("status-file",
po::value<std::string>(¶ms.status_file),
"status output file")
("servers", po::value<size_t>(¶ms.n_servers)->required(),
"number of servers to start")
("topology", po::value<std::string>(¶ms.topology),
"replication topology (e.g. mm for multi master, ms for master/slave")
("clients", po::value<size_t>(¶ms.n_clients)->required(),
"number of clients to start per master")
("transactions", po::value<size_t>(¶ms.n_transactions),
"number of transactions run by a client")
("rows", po::value<size_t>(¶ms.n_rows),
"number of rows per table")
("max-data-size", po::value<size_t>(¶ms.max_data_size),
"maximum size of data payload (default 8)")
("random-data-size", po::value<bool>(¶ms.random_data_size),
"randomized payload data size (default 0)")
("alg-freq", po::value<size_t>(¶ms.alg_freq),
"ALG frequency")
("sync-wait", po::value<bool>(¶ms.sync_wait),
"Turn on sync wait for each transaction")
("debug-log-level", po::value<int>(¶ms.debug_log_level),
"debug logging level: 0 - none, 1 - verbose")
("fast-exit", po::value<int>(¶ms.fast_exit),
"exit from simulation without graceful shutdown")
("ti",
po::value<int>(¶ms.thread_instrumentation),
"use instrumentation for threads/mutexes/condition variables"
"(0 default disabled, 1 total counts, 2 per object)")
("ti-cond-checks",
po::value<bool>(¶ms.cond_checks),
"Enable checks for correct condition variable use. "
" Effective only if thread-instrumentation is enabled")
("tls-service",
po::value<int>(¶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.")
("check-sequential-consistency",
po::value<bool>(¶ms.check_sequential_consistency),
"Check if the provider provides sequential consistency")
("do-2pc",
po::value<bool>(¶ms.do_2pc),
"Run commits in 2pc")
;
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;
}
|