make max transfers configurable
This commit is contained in:
parent
92dcc81731
commit
2f1bb3fac2
@ -122,6 +122,8 @@ CommandLine::CommandLine(int argc, char** argv) {
|
|||||||
} else if (parser.parseParam("--ft_sending_resend_without_ack_after", ft_sending_resend_without_ack_after)) {
|
} else if (parser.parseParam("--ft_sending_resend_without_ack_after", ft_sending_resend_without_ack_after)) {
|
||||||
} else if (parser.parseParam("--ft_sending_give_up_after", ft_sending_give_up_after)) {
|
} else if (parser.parseParam("--ft_sending_give_up_after", ft_sending_give_up_after)) {
|
||||||
} else if (parser.parseParam("--ft_packet_window_size", ft_packet_window_size)) {
|
} else if (parser.parseParam("--ft_packet_window_size", ft_packet_window_size)) {
|
||||||
|
} else if (parser.parseParam("-I", max_incoming_transfers)) {
|
||||||
|
} else if (parser.parseParam("-O", max_outgoing_transfers)) {
|
||||||
} else {
|
} else {
|
||||||
std::cerr << "ERROR: unknown parameter '" << arg_sv << "' !\n\n";
|
std::cerr << "ERROR: unknown parameter '" << arg_sv << "' !\n\n";
|
||||||
PRINT_HELP_AND_BAIL;
|
PRINT_HELP_AND_BAIL;
|
||||||
@ -180,7 +182,8 @@ void CommandLine::printHelp(void) {
|
|||||||
<< " --ft_packet_window_size\n"
|
<< " --ft_packet_window_size\n"
|
||||||
<< "\n"
|
<< "\n"
|
||||||
<< " transfer logic:\n"
|
<< " transfer logic:\n"
|
||||||
<< " TODO\n"
|
<< " -I <max_incoming_transfers>\n"
|
||||||
|
<< " -O <max_outgoing_transfers>\n"
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,9 +70,12 @@ struct CommandLine {
|
|||||||
// ---- TODO ----
|
// ---- TODO ----
|
||||||
|
|
||||||
// advaced dl:
|
// advaced dl:
|
||||||
// -I max_incoming_transfers (default 16)
|
// -I max_incoming_transfers
|
||||||
// -O max_outgoing_transfers (default 4)
|
size_t max_incoming_transfers {32};
|
||||||
|
// -O max_outgoing_transfers
|
||||||
|
size_t max_outgoing_transfers {16};
|
||||||
// -u request chunks only from UDP-direct peers
|
// -u request chunks only from UDP-direct peers
|
||||||
|
bool request_only_from_udp_peer {false};
|
||||||
|
|
||||||
CommandLine(int argc, char** argv);
|
CommandLine(int argc, char** argv);
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
namespace States {
|
namespace States {
|
||||||
|
|
||||||
ReceiveStartSHA1::ReceiveStartSHA1(ToxClient& tcl, const CommandLine& cl) : StateI(tcl), _dump_dir(cl.receive_dump_dir) {
|
ReceiveStartSHA1::ReceiveStartSHA1(ToxClient& tcl, const CommandLine& cl) : StateI(tcl), _cl(cl), _dump_dir(cl.receive_dump_dir) {
|
||||||
if (cl.receive_id.empty()) {
|
if (cl.receive_id.empty()) {
|
||||||
throw std::runtime_error("receiver missing id");
|
throw std::runtime_error("receiver missing id");
|
||||||
}
|
}
|
||||||
@ -41,7 +41,7 @@ bool ReceiveStartSHA1::iterate(float delta) {
|
|||||||
|
|
||||||
// timout if not heard after 10s
|
// timout if not heard after 10s
|
||||||
if (time_since_remote_activity >= 10.f) {
|
if (time_since_remote_activity >= 10.f) {
|
||||||
std::cerr << "ReceiveStartSHA1 info tansfer timed out " << std::get<0>(*_transfer) << ":" << std::get<1>(*_transfer) << "." << std::get<2>(*_transfer) << "\n";
|
std::cerr << "ReceiveStartSHA1 info tansfer timed out " << std::get<0>(*_transfer) << ":" << std::get<1>(*_transfer) << "." << int(std::get<2>(*_transfer)) << "\n";
|
||||||
|
|
||||||
_transfer.reset();
|
_transfer.reset();
|
||||||
}
|
}
|
||||||
@ -114,6 +114,7 @@ std::unique_ptr<StateI> ReceiveStartSHA1::nextState(void) {
|
|||||||
std::cout << "ReceiveStartSHA1 switching state to SHA1\n";
|
std::cout << "ReceiveStartSHA1 switching state to SHA1\n";
|
||||||
return std::make_unique<SHA1>(
|
return std::make_unique<SHA1>(
|
||||||
_tcl,
|
_tcl,
|
||||||
|
_cl,
|
||||||
std::move(file_map),
|
std::move(file_map),
|
||||||
std::move(sha1_info),
|
std::move(sha1_info),
|
||||||
std::move(_sha1_info_data),
|
std::move(_sha1_info_data),
|
||||||
@ -148,7 +149,7 @@ bool ReceiveStartSHA1::onFT1ReceiveInitSHA1Info(uint32_t group_number, uint32_t
|
|||||||
_sha1_info_data.resize(file_size);
|
_sha1_info_data.resize(file_size);
|
||||||
|
|
||||||
_transfer = std::make_tuple(group_number, peer_number, transfer_id, 0.f);
|
_transfer = std::make_tuple(group_number, peer_number, transfer_id, 0.f);
|
||||||
std::cout << "ReceiveStartSHA1 accepted info transfer" << group_number << ":" << peer_number << "." << transfer_id << "\n";
|
std::cout << "ReceiveStartSHA1 accepted info transfer" << group_number << ":" << peer_number << "." << int(transfer_id) << "\n";
|
||||||
|
|
||||||
// accept
|
// accept
|
||||||
return true;
|
return true;
|
||||||
@ -174,7 +175,7 @@ void ReceiveStartSHA1::onFT1ReceiveDataSHA1Info(uint32_t group_number, uint32_t
|
|||||||
_sha1_info_data.clear();
|
_sha1_info_data.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "ReceiveStartSHA1 info tansfer finished " << group_number << ":" << peer_number << "." << transfer_id << "\n";
|
std::cout << "ReceiveStartSHA1 info tansfer finished " << group_number << ":" << peer_number << "." << int(transfer_id) << "\n";
|
||||||
_done = true;
|
_done = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ struct ReceiveStartSHA1 final : public StateI {
|
|||||||
void onFT1SendDataSHA1Chunk(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size) override;
|
void onFT1SendDataSHA1Chunk(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
const CommandLine& _cl;
|
||||||
std::string _dump_dir;
|
std::string _dump_dir;
|
||||||
|
|
||||||
//FTInfoSHA1 _sha1_info;
|
//FTInfoSHA1 _sha1_info;
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
namespace States {
|
namespace States {
|
||||||
|
|
||||||
SendStartSHA1::SendStartSHA1(ToxClient& tcl, const CommandLine& cl) : StateI(tcl), _file_path(cl.send_path) {
|
SendStartSHA1::SendStartSHA1(ToxClient& tcl, const CommandLine& cl) : StateI(tcl), _cl(cl), _file_path(cl.send_path) {
|
||||||
std::cout << "SendStartSHA1 start building sha1_info\n";
|
std::cout << "SendStartSHA1 start building sha1_info\n";
|
||||||
std::error_code err;
|
std::error_code err;
|
||||||
_file_map = mio::make_mmap_source(cl.send_path, 0, mio::map_entire_file, err);
|
_file_map = mio::make_mmap_source(cl.send_path, 0, mio::map_entire_file, err);
|
||||||
@ -72,6 +72,7 @@ std::unique_ptr<StateI> SendStartSHA1::nextState(void) {
|
|||||||
// we are done setting up
|
// we are done setting up
|
||||||
return std::make_unique<SHA1>(
|
return std::make_unique<SHA1>(
|
||||||
_tcl,
|
_tcl,
|
||||||
|
_cl,
|
||||||
std::move(new_file_map),
|
std::move(new_file_map),
|
||||||
std::move(_sha1_info),
|
std::move(_sha1_info),
|
||||||
std::move(_sha1_info_data),
|
std::move(_sha1_info_data),
|
||||||
|
@ -33,6 +33,8 @@ struct SendStartSHA1 final : public StateI {
|
|||||||
void onFT1SendDataSHA1Chunk(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size) override;
|
void onFT1SendDataSHA1Chunk(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
const CommandLine& _cl;
|
||||||
|
|
||||||
std::string _file_path;
|
std::string _file_path;
|
||||||
mio::mmap_source _file_map;
|
mio::mmap_source _file_map;
|
||||||
FTInfoSHA1 _sha1_info;
|
FTInfoSHA1 _sha1_info;
|
||||||
|
@ -11,6 +11,7 @@ namespace States {
|
|||||||
|
|
||||||
SHA1::SHA1(
|
SHA1::SHA1(
|
||||||
ToxClient& tcl,
|
ToxClient& tcl,
|
||||||
|
const CommandLine& cl,
|
||||||
mio::mmap_sink&& file_map,
|
mio::mmap_sink&& file_map,
|
||||||
const FTInfoSHA1&& sha1_info,
|
const FTInfoSHA1&& sha1_info,
|
||||||
const std::vector<uint8_t>&& sha1_info_data,
|
const std::vector<uint8_t>&& sha1_info_data,
|
||||||
@ -27,6 +28,9 @@ SHA1::SHA1(
|
|||||||
{
|
{
|
||||||
assert(_have_chunk.size() == _sha1_info.chunks.size());
|
assert(_have_chunk.size() == _sha1_info.chunks.size());
|
||||||
|
|
||||||
|
_max_concurrent_in = cl.max_incoming_transfers;
|
||||||
|
_max_concurrent_out = cl.max_incoming_transfers;
|
||||||
|
|
||||||
_have_all = true;
|
_have_all = true;
|
||||||
_have_count = 0;
|
_have_count = 0;
|
||||||
for (size_t i = 0; i < _have_chunk.size(); i++) {
|
for (size_t i = 0; i < _have_chunk.size(); i++) {
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "../state.hpp"
|
#include "../state.hpp"
|
||||||
|
|
||||||
#include "../ft_sha1_info.hpp"
|
#include "../ft_sha1_info.hpp"
|
||||||
|
#include "../command_line.hpp"
|
||||||
|
|
||||||
#include <mio/mio.hpp>
|
#include <mio/mio.hpp>
|
||||||
|
|
||||||
@ -20,6 +21,7 @@ struct SHA1 final : public StateI {
|
|||||||
public: // general interface
|
public: // general interface
|
||||||
SHA1(
|
SHA1(
|
||||||
ToxClient& tcl,
|
ToxClient& tcl,
|
||||||
|
const CommandLine& cl,
|
||||||
mio::mmap_sink&& file_map,
|
mio::mmap_sink&& file_map,
|
||||||
const FTInfoSHA1&& sha1_info,
|
const FTInfoSHA1&& sha1_info,
|
||||||
const std::vector<uint8_t>&& sha1_info_data,
|
const std::vector<uint8_t>&& sha1_info_data,
|
||||||
@ -75,8 +77,8 @@ struct SHA1 final : public StateI {
|
|||||||
// chunk_index -> time since request
|
// chunk_index -> time since request
|
||||||
std::map<size_t, float> _chunks_requested;
|
std::map<size_t, float> _chunks_requested;
|
||||||
|
|
||||||
const size_t _max_concurrent_out {16};
|
size_t _max_concurrent_in {32};
|
||||||
const size_t _max_concurrent_in {32};
|
size_t _max_concurrent_out {16};
|
||||||
|
|
||||||
std::minstd_rand _rng {1337};
|
std::minstd_rand _rng {1337};
|
||||||
std::uniform_int_distribution<size_t> _distrib;
|
std::uniform_int_distribution<size_t> _distrib;
|
||||||
|
Loading…
Reference in New Issue
Block a user