Advertisement
Guest User

Untitled

a guest
Sep 27th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.79 KB | None | 0 0
  1. #include "main.hpp"
  2.  
  3. #include <chrono>
  4. #include <fstream>
  5.  
  6. #include "arguments.hpp"
  7. #include "arguments_parser.hpp"
  8. #include "benchmark.hpp"
  9. #include "driver.hpp"
  10. #include "endpoint.hpp"
  11. #include "endpoint_parser.hpp"
  12. #include "json_parser.hpp"
  13. #include "logger.hpp"
  14. #include "pod_type.hpp"
  15. #include "result.hpp"
  16. #include "test.hpp"
  17. #include "test_manager.hpp"
  18.  
  19. #include "pods/trtechargableevents.hpp"
  20. #include "pods/trtecounters.hpp"
  21. #include "pods/ttaconsumptionbuckets.hpp"
  22.  
  23. int main(int argc, const char* argv[]) {
  24. logger& l = logger::instance();
  25.  
  26. arguments args;
  27.  
  28. arguments_parser parser(args);
  29. if (!parser(argc, argv)) {
  30. l(log_level::error) << "Failed to parse arguments." << std::endl;
  31. return EXIT_FAILURE;
  32. }
  33.  
  34. test_manager manager;
  35.  
  36. if (args.list_tests) {
  37. std::vector<std::reference_wrapper<test>> tests;
  38. manager.tests(tests);
  39.  
  40. for (const test& t : tests) {
  41. std::cout << "- " << t << std::endl;
  42. }
  43.  
  44. return EXIT_SUCCESS;
  45. }
  46.  
  47. if (args.databases.empty()) {
  48. l(log_level::error) << "List of databases is empty." << std::endl;
  49. return EXIT_FAILURE;
  50. }
  51.  
  52. std::size_t maximum_space = args.databases.size();
  53.  
  54. std::vector<driver::client> clients;
  55. clients.reserve(maximum_space);
  56.  
  57. std::vector<stdx::optional<driver::database>> databases;
  58. databases.reserve(maximum_space);
  59.  
  60. std::transform(args.databases.begin(), args.databases.end(),
  61. std::back_inserter(databases),
  62. [&l, &clients](const stdx::string_view& database)
  63. -> stdx::optional<driver::database> {
  64.  
  65. endpoint e;
  66. endpoint_parser parser(e);
  67.  
  68. if (!parser(database)) {
  69. l(log_level::warning)
  70. << "Failed to parse database uri." << std::endl;
  71. return {};
  72. }
  73.  
  74. driver::type type;
  75. try {
  76. type = driver::types.at(e.type);
  77. } catch (...) {
  78. l(log_level::warning) << "Invalid database type ("
  79. << e.type << ")." << std::endl;
  80. return {};
  81. }
  82.  
  83. clients.emplace_back(type);
  84. driver::client& cl = clients.back();
  85.  
  86. auto res = cl.connect(std::string(e.host), e.port);
  87. if (!res) {
  88. l(log_level::warning)
  89. << "Cannot connect to the database." << std::endl;
  90. l(log_level::warning)
  91. << res.what() << " ("
  92. << static_cast<int>(res.get_error_code()) << ")"
  93. << std::endl;
  94.  
  95. clients.pop_back();
  96. return {};
  97. }
  98.  
  99. driver::database db = cl[e.database.data()];
  100. if (!db) {
  101. l(log_level::warning) << "Missing database (" << e.type
  102. << ")." << std::endl;
  103.  
  104. clients.pop_back();
  105. return {};
  106. }
  107.  
  108. return db;
  109. });
  110.  
  111. int available_databases = std::count_if(
  112. databases.begin(), databases.end(),
  113. [](const stdx::optional<driver::database>& db) { return db; });
  114.  
  115. if (available_databases == 0) {
  116. l(log_level::error) << "Any database is not available." << std::endl;
  117. return EXIT_FAILURE;
  118. }
  119.  
  120. std::map<pod_type, std::vector<driver::object>> datasets;
  121.  
  122. std::for_each(args.datasets.begin(), args.datasets.end(),
  123. [&](const stdx::string_view& dataset) {
  124. std::fstream file(dataset.data());
  125.  
  126. if (!file) {
  127. l(log_level::warning) << "File \"" << dataset
  128. << "\" is missing." << std::endl;
  129. return;
  130. }
  131.  
  132. std::string header;
  133. if (!std::getline(file, header)) {
  134. l(log_level::warning) << "Header is missing." << std::endl;
  135. return;
  136. }
  137.  
  138. pod_type type;
  139. try {
  140. type = pod_types.at(header);
  141. } catch (...) {
  142. l(log_level::warning) << "Invalid header type."
  143. << std::endl;
  144. return;
  145. }
  146.  
  147. json_parser parser;
  148.  
  149. for (std::string line; std::getline(file, line);) {
  150. datasets[type].push_back(parser(line));
  151. }
  152. });
  153.  
  154. int available_datasets = std::count_if(
  155. datasets.begin(), datasets.end(),
  156. [](const std::pair<pod_type, std::vector<driver::object>>& pair) {
  157. return !pair.second.empty();
  158. });
  159.  
  160. if (available_datasets == 0) {
  161. l(log_level::error) << "Any dataset is not available." << std::endl;
  162. return EXIT_FAILURE;
  163. }
  164.  
  165. std::map<driver::type, double> bulk_times;
  166.  
  167. std::for_each(
  168. datasets.begin(), datasets.end(),
  169. [&](const std::pair<pod_type, std::vector<driver::object>>& pair) {
  170. for (const auto& db : databases) {
  171. if (!db) {
  172. continue;
  173. }
  174.  
  175. stdx::string_view table;
  176. try {
  177. table = pod_tables.at(pair.first);
  178. } catch (...) {
  179. l(log_level::error) << "Missing table name." << std::endl;
  180. std::exit(EXIT_FAILURE);
  181. }
  182.  
  183. auto& cl = db->get_client();
  184.  
  185. std::chrono::time_point<std::chrono::system_clock> start =
  186. std::chrono::system_clock::now();
  187.  
  188. auto res = cl.bulk_refs(db.value(), std::string(table), pair.second);
  189. if (!res) {
  190. l(log_level::warning)
  191. << "Cannot bulk " << to_string(pair.first) << " to database ("
  192. << std::string(driver::to_string(cl.get_driver_type())) << ")."
  193. << std::endl;
  194. }
  195.  
  196. std::chrono::time_point<std::chrono::system_clock> end =
  197. std::chrono::system_clock::now();
  198.  
  199. std::chrono::duration<double> elapsed_seconds = end - start;
  200. bulk_times[cl.get_driver_type()] = elapsed_seconds.count();
  201. }
  202. });
  203.  
  204. std::cout << "import-datasets" << std::endl;
  205. std::for_each(bulk_times.begin(), bulk_times.end(),
  206. [](const std::pair<driver::type, double>& pair) {
  207. std::cout << std::string(driver::to_string(pair.first))
  208. << ": " << pair.second << std::endl;
  209. });
  210. std::cout << std::endl;
  211.  
  212. std::vector<stdx::optional<std::reference_wrapper<test>>> tests;
  213. tests.reserve(args.tests.size());
  214.  
  215. std::transform(args.tests.begin(), args.tests.end(),
  216. std::back_inserter(tests),
  217. [&manager, &l](const stdx::string_view& test_name)
  218. -> stdx::optional<std::reference_wrapper<test>> {
  219. test& t = manager[test_name];
  220. if (!t) {
  221. l(log_level::warning) << "Invalid test." << std::endl;
  222. return {};
  223. }
  224.  
  225. return {t};
  226. });
  227.  
  228. int available_tests = std::count_if(
  229. tests.begin(), tests.end(),
  230. [](const stdx::optional<std::reference_wrapper<test>>& t) { return t; });
  231.  
  232. if (available_tests == 0) {
  233. l(log_level::error) << "Any test is not available." << std::endl;
  234. return EXIT_FAILURE;
  235. }
  236.  
  237. std::vector<result> results;
  238. results.reserve(available_tests);
  239.  
  240. std::for_each(tests.begin(), tests.end(),
  241. [&](const stdx::optional<std::reference_wrapper<test>>& opt) {
  242. if (!opt) {
  243. return;
  244. }
  245.  
  246. test& t = opt.value();
  247. benchmark bench(t);
  248.  
  249. result res(t, args);
  250.  
  251. for (const auto& db : databases) {
  252. if (!db) {
  253. continue;
  254. }
  255.  
  256. auto& cl = db->get_client();
  257.  
  258. for (std::size_t i = 0; i < args.iterations; i++) {
  259. res.add_time(cl.get_driver_type(), bench(db.value()));
  260. }
  261. }
  262.  
  263. results.emplace_back(res);
  264. });
  265.  
  266. std::cout << std::fixed;
  267. for (const auto& res : results) {
  268. std::cout << res << std::endl;
  269. }
  270.  
  271. return EXIT_SUCCESS;
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement