From 65189597836edb5eb8377e8b47dbb050f9c1d23c Mon Sep 17 00:00:00 2001 From: wldhx Date: Thu, 18 Apr 2019 15:44:47 +0300 Subject: [PATCH 1/9] feat(test/test-dht): Cli-fy `get` --- test/test-dht.cpp | 100 +++++++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 42 deletions(-) diff --git a/test/test-dht.cpp b/test/test-dht.cpp index 2638d6b7..b152a11c 100644 --- a/test/test-dht.cpp +++ b/test/test-dht.cpp @@ -6,9 +6,10 @@ #include #include #include -#include +#include #include #include +#include #include "../src/cache/descidx.h" #include "../src/util/crypto.h" #include "../src/util/wait_condition.h" @@ -126,7 +127,6 @@ struct StressCmd { void parse_args( const vector& args , vector* ifaddrs - , optional* get_cmd , optional* put_cmd , optional* stress_cmd) { @@ -157,16 +157,6 @@ void parse_args( const vector& args } } - if (args[2] == "get") { - if (args.size() != 5) { - usage(std::cerr, args[0]); - exit(1); - } - GetCmd c; - c.public_key = *util::Ed25519PublicKey::from_hex(args[3]); - c.dht_key = args[4]; - *get_cmd = move(c); - } if (args[2] == "put") { if (args.size() != 6) { usage(std::cerr, args[0]); @@ -203,11 +193,10 @@ int main(int argc, const char** argv) vector ifaddrs; - optional get_cmd; optional put_cmd; optional stress_cmd; - parse_args(args, &ifaddrs, &get_cmd, &put_cmd, &stress_cmd); + parse_args(args, &ifaddrs, &put_cmd, &stress_cmd); for (auto addr : ifaddrs) { std::cout << "Spawning DHT node on " << addr << std::endl; @@ -238,40 +227,67 @@ int main(int argc, const char** argv) steady_clock::time_point start = steady_clock::now(); - if (get_cmd) { - auto salt = ouinet::util::sha1(get_cmd->dht_key); + boost::asio::posix::stream_descriptor input (ios, ::dup(STDIN_FILENO)); + boost::asio::posix::stream_descriptor output (ios, ::dup(STDOUT_FILENO)); + + boost::asio::streambuf buffer; + while (true) { + boost::asio::async_write(output, asio::buffer("> "), yield[ec]); + size_t n = asio::async_read_until(input, buffer, '\n', yield[ec]); + + vector cmd_toks; + { + char cbuf[buffer.size()+1]; int rc = buffer.sgetn (cbuf, sizeof cbuf); cbuf[rc] = 0; + std::string str (cbuf, rc); + boost::char_separator sep {" "}; + boost::tokenizer> tokens {str, sep}; + for (const auto& t : tokens) { cmd_toks.push_back(t); } + } - auto opt_data = dht->mutable_get( get_cmd->public_key - , as_string_view(salt) - , yield[ec], cancel); + if (cmd_toks[0] == "get") { + if (cmd_toks.size() != 3) { + cerr << "Bad command." << endl; + continue; + } + GetCmd get_cmd; + get_cmd.public_key = *util::Ed25519PublicKey::from_hex(cmd_toks[1]); + get_cmd.dht_key = cmd_toks[2]; - if (ec) { - cerr << "Error dht->mutable_get " << ec.message() << endl; - } - else { - if (opt_data) { - cerr << "Got Data!" << endl; - cerr << "seq: " << opt_data->sequence_number << endl; - // src/cache/descidx.h - auto desc_str = [&]() { - auto val = *opt_data->value.as_string(); - if (val.substr(0, ouinet::descriptor::zlib_prefix.size()) == ouinet::descriptor::zlib_prefix) { - auto desc_zlib(val.substr(ouinet::descriptor::zlib_prefix.length())); - return "zlib: " + util::zlib_decompress(desc_zlib, ec); - } - else { - return val; - } - }(); - if (ec) { - cerr << "Error: dht->mutable_get: decoding value: " << ec.message() << endl; - } - cerr << "value: " << desc_str << endl; + auto salt = ouinet::util::sha1(get_cmd.dht_key); + + auto opt_data = dht->mutable_get( get_cmd.public_key + , as_string_view(salt) + , yield[ec], cancel); + + if (ec) { + cerr << "Error dht->mutable_get " << ec.message() << endl; } else { - cerr << "No error, but also no data!" << endl; + if (opt_data) { + cerr << "Got Data!" << endl; + cerr << "seq: " << opt_data->sequence_number << endl; + // src/cache/descidx.h + auto desc_str = [&]() { + auto val = *opt_data->value.as_string(); + if (val.substr(0, ouinet::descriptor::zlib_prefix.size()) == ouinet::descriptor::zlib_prefix) { + auto desc_zlib(val.substr(ouinet::descriptor::zlib_prefix.length())); + return "zlib: " + util::zlib_decompress(desc_zlib, ec); + } + else { + return val; + } + }(); + if (ec) { + cerr << "Error: dht->mutable_get: decoding value: " << ec.message() << endl; + } + cerr << "value: " << desc_str << endl; + } + else { + cerr << "No error, but also no data!" << endl; + } } } + else { cerr << "Unknown command" << endl; } } if (put_cmd) { -- GitLab From ab576ad03f429765360cb75990c68558620262fd Mon Sep 17 00:00:00 2001 From: wldhx Date: Thu, 18 Apr 2019 15:57:14 +0300 Subject: [PATCH 2/9] feat(test/test-dht): Cli-fy `put` --- test/test-dht.cpp | 61 ++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/test/test-dht.cpp b/test/test-dht.cpp index b152a11c..187ea778 100644 --- a/test/test-dht.cpp +++ b/test/test-dht.cpp @@ -127,7 +127,6 @@ struct StressCmd { void parse_args( const vector& args , vector* ifaddrs - , optional* put_cmd , optional* stress_cmd) { if (args.size() == 2 && args[1] == "-h") { @@ -157,17 +156,6 @@ void parse_args( const vector& args } } - if (args[2] == "put") { - if (args.size() != 6) { - usage(std::cerr, args[0]); - exit(1); - } - PutCmd c; - c.private_key = *util::Ed25519PrivateKey::from_hex(args[3]); - c.dht_key = args[4]; - c.dht_value = args[5]; - *put_cmd = move(c); - } if (args[2] == "stress") { if (args.size() != 4) { usage(std::cerr, args[0]); @@ -193,10 +181,9 @@ int main(int argc, const char** argv) vector ifaddrs; - optional put_cmd; optional stress_cmd; - parse_args(args, &ifaddrs, &put_cmd, &stress_cmd); + parse_args(args, &ifaddrs, &stress_cmd); for (auto addr : ifaddrs) { std::cout << "Spawning DHT node on " << addr << std::endl; @@ -287,33 +274,41 @@ int main(int argc, const char** argv) } } } - else { cerr << "Unknown command" << endl; } - } + if (cmd_toks[0] == "put") { + if (args.size() != 4) { + cerr << "Bad command." << endl; + continue; + } + PutCmd put_cmd; + put_cmd.private_key = *util::Ed25519PrivateKey::from_hex(cmd_toks[1]); + put_cmd.dht_key = cmd_toks[2]; + put_cmd.dht_value = cmd_toks[3]; - if (put_cmd) { - auto salt = ouinet::util::sha1(put_cmd->dht_key); + auto salt = ouinet::util::sha1(put_cmd.dht_key); - using Time = boost::posix_time::ptime; - Time unix_epoch(boost::gregorian::date(1970, 1, 1)); - Time ts = boost::posix_time::microsec_clock::universal_time(); + using Time = boost::posix_time::ptime; + Time unix_epoch(boost::gregorian::date(1970, 1, 1)); + Time ts = boost::posix_time::microsec_clock::universal_time(); - auto seq = (ts - unix_epoch).total_milliseconds(); + auto seq = (ts - unix_epoch).total_milliseconds(); - cerr << "seq: " << seq << endl; + cerr << "seq: " << seq << endl; - auto item = MutableDataItem::sign( put_cmd->dht_value - , seq - , as_string_view(salt) - , put_cmd->private_key); + auto item = MutableDataItem::sign( put_cmd.dht_value + , seq + , as_string_view(salt) + , put_cmd.private_key); - dht->mutable_put(item, cancel, yield[ec]); + dht->mutable_put(item, cancel, yield[ec]); - if (ec) { - cerr << "FINISH: Error " << ec.message() << ", took:" << secs(now() - start) << "s\n"; - } - else { - cerr << "FINISH: Success, took:" << secs(now() - start) << "s\n"; + if (ec) { + cerr << "FINISH: Error " << ec.message() << ", took:" << secs(now() - start) << "s\n"; + } + else { + cerr << "FINISH: Success, took:" << secs(now() - start) << "s\n"; + } } + else { cerr << "Unknown command" << endl; } } if (stress_cmd) { -- GitLab From 7f0a4fd7e873aed71cc8069706e346ef252a688a Mon Sep 17 00:00:00 2001 From: wldhx Date: Thu, 18 Apr 2019 16:14:25 +0300 Subject: [PATCH 3/9] feat(test/test-dht): Cli-fy `stress` --- test/test-dht.cpp | 85 ++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 46 deletions(-) diff --git a/test/test-dht.cpp b/test/test-dht.cpp index 187ea778..23e6d428 100644 --- a/test/test-dht.cpp +++ b/test/test-dht.cpp @@ -126,8 +126,7 @@ struct StressCmd { }; void parse_args( const vector& args - , vector* ifaddrs - , optional* stress_cmd) + , vector* ifaddrs) { if (args.size() == 2 && args[1] == "-h") { usage(std::cout, args[0]); @@ -155,16 +154,6 @@ void parse_args( const vector& args exit(1); } } - - if (args[2] == "stress") { - if (args.size() != 4) { - usage(std::cerr, args[0]); - exit(1); - } - StressCmd c; - c.private_key = *util::Ed25519PrivateKey::from_hex(args[3]); - *stress_cmd = move(c); - } } int main(int argc, const char** argv) @@ -181,9 +170,7 @@ int main(int argc, const char** argv) vector ifaddrs; - optional stress_cmd; - - parse_args(args, &ifaddrs, &stress_cmd); + parse_args(args, &ifaddrs); for (auto addr : ifaddrs) { std::cout << "Spawning DHT node on " << addr << std::endl; @@ -308,50 +295,56 @@ int main(int argc, const char** argv) cerr << "FINISH: Success, took:" << secs(now() - start) << "s\n"; } } - else { cerr << "Unknown command" << endl; } - } + if (cmd_toks[0] == "stress") { + if (args.size() != 4) { + cerr << "Bad command." << endl; + continue; + } + StressCmd stress_cmd; + stress_cmd.private_key = *util::Ed25519PrivateKey::from_hex(cmd_toks[1]); - if (stress_cmd) { - WaitCondition wc(ios); + WaitCondition wc(ios); - std::srand(std::time(nullptr)); + std::srand(std::time(nullptr)); - string key_base = util::str("ouinet-stress-test-", std::rand()); + string key_base = util::str("ouinet-stress-test-", std::rand()); - for (unsigned int i = 0; i < 32; ++i) { - asio::spawn(ios, [&, i, lock = wc.lock()](asio::yield_context yield) { - steady_clock::time_point start = steady_clock::now(); + for (unsigned int i = 0; i < 32; ++i) { + asio::spawn(ios, [&, i, lock = wc.lock()](asio::yield_context yield) { + steady_clock::time_point start = steady_clock::now(); - auto key = util::str(key_base, "-", i, "-key"); - auto val = util::str(key_base, "-", i, "-val"); + auto key = util::str(key_base, "-", i, "-key"); + auto val = util::str(key_base, "-", i, "-val"); - auto salt = ouinet::util::sha1(key); + auto salt = ouinet::util::sha1(key); - using Time = boost::posix_time::ptime; - Time unix_epoch(boost::gregorian::date(1970, 1, 1)); - Time ts = boost::posix_time::microsec_clock::universal_time(); + using Time = boost::posix_time::ptime; + Time unix_epoch(boost::gregorian::date(1970, 1, 1)); + Time ts = boost::posix_time::microsec_clock::universal_time(); - auto seq = (ts - unix_epoch).total_milliseconds(); + auto seq = (ts - unix_epoch).total_milliseconds(); - cerr << "seq: " << seq << endl; + cerr << "seq: " << seq << endl; - auto item = MutableDataItem::sign( val - , seq - , as_string_view(salt) - , stress_cmd->private_key); + auto item = MutableDataItem::sign( val + , seq + , as_string_view(salt) + , stress_cmd.private_key); - dht->mutable_put(item, cancel, yield[ec]); + dht->mutable_put(item, cancel, yield[ec]); - if (ec) { - cerr << "FINISH" << i << ": Error " << ec.message() << ", took:" << secs(now() - start) << "s\n"; - } - else { - cerr << "FINISH" << i << ": Success, took:" << secs(now() - start) << "s\n"; - } - }); - } + if (ec) { + cerr << "FINISH" << i << ": Error " << ec.message() << ", took:" << secs(now() - start) << "s\n"; + } + else { + cerr << "FINISH" << i << ": Success, took:" << secs(now() - start) << "s\n"; + } + }); + } - wc.wait(yield); + wc.wait(yield); + } + else { cerr << "Unknown command" << endl; } } cerr << "End. Took " << secs(now() - start) << " seconds" << endl; -- GitLab From 203b068b60e5cacebeebb86277aecbbd590d309b Mon Sep 17 00:00:00 2001 From: wldhx Date: Thu, 18 Apr 2019 16:15:18 +0300 Subject: [PATCH 4/9] refactor(test/test-dht): No need to .size() buffer if we already have read bytes count --- test/test-dht.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test-dht.cpp b/test/test-dht.cpp index 23e6d428..17c104ff 100644 --- a/test/test-dht.cpp +++ b/test/test-dht.cpp @@ -211,7 +211,7 @@ int main(int argc, const char** argv) vector cmd_toks; { - char cbuf[buffer.size()+1]; int rc = buffer.sgetn (cbuf, sizeof cbuf); cbuf[rc] = 0; + char cbuf[n+1]; int rc = buffer.sgetn (cbuf, sizeof cbuf); cbuf[rc] = 0; std::string str (cbuf, rc); boost::char_separator sep {" "}; boost::tokenizer> tokens {str, sep}; -- GitLab From 7fa086ba43c2f2eb30cabdffc9e1dd69348af37a Mon Sep 17 00:00:00 2001 From: wldhx Date: Thu, 18 Apr 2019 16:15:45 +0300 Subject: [PATCH 5/9] feat(test/test-dht): Two args are enough now --- test/test-dht.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test-dht.cpp b/test/test-dht.cpp index 17c104ff..07c3e352 100644 --- a/test/test-dht.cpp +++ b/test/test-dht.cpp @@ -133,7 +133,7 @@ void parse_args( const vector& args exit(0); } - if (args.size() < 3) { + if (args.size() < 2) { usage(std::cerr, args[0], "Too few arguments"); exit(1); } -- GitLab From eca4c567f1bf2e1aebbdb80c35b3a459cc86717c Mon Sep 17 00:00:00 2001 From: wldhx Date: Thu, 18 Apr 2019 16:16:18 +0300 Subject: [PATCH 6/9] feat(test/test-dht): {OR=>XOR} parsing of cli cmds --- test/test-dht.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test-dht.cpp b/test/test-dht.cpp index 07c3e352..d74edb71 100644 --- a/test/test-dht.cpp +++ b/test/test-dht.cpp @@ -261,7 +261,7 @@ int main(int argc, const char** argv) } } } - if (cmd_toks[0] == "put") { + else if (cmd_toks[0] == "put") { if (args.size() != 4) { cerr << "Bad command." << endl; continue; @@ -295,7 +295,7 @@ int main(int argc, const char** argv) cerr << "FINISH: Success, took:" << secs(now() - start) << "s\n"; } } - if (cmd_toks[0] == "stress") { + else if (cmd_toks[0] == "stress") { if (args.size() != 4) { cerr << "Bad command." << endl; continue; -- GitLab From e07ee98b39be9d36c494690adb36fd9bbfaf087b Mon Sep 17 00:00:00 2001 From: wldhx Date: Thu, 18 Apr 2019 16:44:22 +0300 Subject: [PATCH 7/9] fix(test/test-dht): Measure stress --- test/test-dht.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/test-dht.cpp b/test/test-dht.cpp index d74edb71..54156855 100644 --- a/test/test-dht.cpp +++ b/test/test-dht.cpp @@ -343,12 +343,11 @@ int main(int argc, const char** argv) } wc.wait(yield); + cerr << "End. Took " << secs(now() - start) << " seconds" << endl; } else { cerr << "Unknown command" << endl; } } - cerr << "End. Took " << secs(now() - start) << " seconds" << endl; - dht.reset(); }); -- GitLab From d4ab063cf70e90398004a31cdb230b1229894258 Mon Sep 17 00:00:00 2001 From: wldhx Date: Thu, 18 Apr 2019 16:44:43 +0300 Subject: [PATCH 8/9] feat(test/test-dht): SIGINT handler --- test/test-dht.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/test-dht.cpp b/test/test-dht.cpp index 54156855..29d281fc 100644 --- a/test/test-dht.cpp +++ b/test/test-dht.cpp @@ -347,8 +347,12 @@ int main(int argc, const char** argv) } else { cerr << "Unknown command" << endl; } } + }); + boost::asio::signal_set signals(ios, SIGINT); + signals.async_wait([&](const boost::system::error_code& error , int signal_number) { dht.reset(); + ios.stop(); }); ios.run(); -- GitLab From 57072559781018df75f9f4e2862d3ef43296e2d5 Mon Sep 17 00:00:00 2001 From: wldhx Date: Thu, 18 Apr 2019 16:53:29 +0300 Subject: [PATCH 9/9] feat(test/test-dht): Display usage instead of "bad command" --- test/test-dht.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test-dht.cpp b/test/test-dht.cpp index 29d281fc..7c328596 100644 --- a/test/test-dht.cpp +++ b/test/test-dht.cpp @@ -220,7 +220,7 @@ int main(int argc, const char** argv) if (cmd_toks[0] == "get") { if (cmd_toks.size() != 3) { - cerr << "Bad command." << endl; + usage(std::cout, args[0]); continue; } GetCmd get_cmd; @@ -263,7 +263,7 @@ int main(int argc, const char** argv) } else if (cmd_toks[0] == "put") { if (args.size() != 4) { - cerr << "Bad command." << endl; + usage(std::cout, args[0]); continue; } PutCmd put_cmd; @@ -297,7 +297,7 @@ int main(int argc, const char** argv) } else if (cmd_toks[0] == "stress") { if (args.size() != 4) { - cerr << "Bad command." << endl; + usage(std::cout, args[0]); continue; } StressCmd stress_cmd; -- GitLab