cca leak fix and log reduction for release builds
This commit is contained in:
parent
211cce65de
commit
099abc3a09
2
external/solanaceae_tox
vendored
2
external/solanaceae_tox
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 70a234cdae751141f48b7a53a4e1cbedd84f31b2
|
Subproject commit dd596bdad8d71654ff21dd3a032d6eb2dd7139a8
|
@ -182,7 +182,7 @@ void NGCFT1::updateSendTransfer(float time_delta, uint32_t group_number, uint32_
|
|||||||
if (timeouts_set.count({idx, id})) {
|
if (timeouts_set.count({idx, id})) {
|
||||||
// TODO: can fail
|
// TODO: can fail
|
||||||
sendPKG_FT1_DATA(group_number, peer_number, idx, id, data.data(), data.size());
|
sendPKG_FT1_DATA(group_number, peer_number, idx, id, data.data(), data.size());
|
||||||
peer.cca.onLoss({idx, id}, false);
|
peer.cca->onLoss({idx, id}, false);
|
||||||
time_since_activity = 0.f;
|
time_since_activity = 0.f;
|
||||||
timeouts_set.erase({idx, id});
|
timeouts_set.erase({idx, id});
|
||||||
}
|
}
|
||||||
@ -201,7 +201,7 @@ void NGCFT1::updateSendTransfer(float time_delta, uint32_t group_number, uint32_
|
|||||||
|
|
||||||
// clean up cca
|
// clean up cca
|
||||||
tf.ssb.for_each(time_delta, [&](uint16_t id, const std::vector<uint8_t>& data, float& time_since_activity) {
|
tf.ssb.for_each(time_delta, [&](uint16_t id, const std::vector<uint8_t>& data, float& time_since_activity) {
|
||||||
peer.cca.onLoss({idx, id}, true);
|
peer.cca->onLoss({idx, id}, true);
|
||||||
timeouts_set.erase({idx, id});
|
timeouts_set.erase({idx, id});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -212,7 +212,7 @@ void NGCFT1::updateSendTransfer(float time_delta, uint32_t group_number, uint32_
|
|||||||
|
|
||||||
// if chunks in flight < window size (2)
|
// if chunks in flight < window size (2)
|
||||||
//while (tf.ssb.size() < ngc_ft1_ctx->options.packet_window_size) {
|
//while (tf.ssb.size() < ngc_ft1_ctx->options.packet_window_size) {
|
||||||
int64_t can_packet_size {static_cast<int64_t>(peer.cca.canSend())};
|
int64_t can_packet_size {static_cast<int64_t>(peer.cca->canSend())};
|
||||||
//if (can_packet_size) {
|
//if (can_packet_size) {
|
||||||
//std::cerr << "FT: can_packet_size: " << can_packet_size;
|
//std::cerr << "FT: can_packet_size: " << can_packet_size;
|
||||||
//}
|
//}
|
||||||
@ -226,7 +226,7 @@ void NGCFT1::updateSendTransfer(float time_delta, uint32_t group_number, uint32_
|
|||||||
size_t chunk_size = std::min<size_t>({
|
size_t chunk_size = std::min<size_t>({
|
||||||
//496u,
|
//496u,
|
||||||
//996u,
|
//996u,
|
||||||
peer.cca.MAXIMUM_SEGMENT_DATA_SIZE,
|
peer.cca->MAXIMUM_SEGMENT_DATA_SIZE,
|
||||||
static_cast<size_t>(can_packet_size),
|
static_cast<size_t>(can_packet_size),
|
||||||
tf.file_size - tf.file_size_current
|
tf.file_size - tf.file_size_current
|
||||||
});
|
});
|
||||||
@ -259,7 +259,7 @@ void NGCFT1::updateSendTransfer(float time_delta, uint32_t group_number, uint32_
|
|||||||
|
|
||||||
uint16_t seq_id = tf.ssb.add(std::move(new_data));
|
uint16_t seq_id = tf.ssb.add(std::move(new_data));
|
||||||
sendPKG_FT1_DATA(group_number, peer_number, idx, seq_id, tf.ssb.entries.at(seq_id).data.data(), tf.ssb.entries.at(seq_id).data.size());
|
sendPKG_FT1_DATA(group_number, peer_number, idx, seq_id, tf.ssb.entries.at(seq_id).data.data(), tf.ssb.entries.at(seq_id).data.size());
|
||||||
peer.cca.onSent({idx, seq_id}, chunk_size);
|
peer.cca->onSent({idx, seq_id}, chunk_size);
|
||||||
|
|
||||||
#if defined(EXTRA_LOGGING) && EXTRA_LOGGING == 1
|
#if defined(EXTRA_LOGGING) && EXTRA_LOGGING == 1
|
||||||
fprintf(stderr, "FT: sent data size: %ld (seq %d)\n", chunk_size, seq_id);
|
fprintf(stderr, "FT: sent data size: %ld (seq %d)\n", chunk_size, seq_id);
|
||||||
@ -280,7 +280,7 @@ void NGCFT1::updateSendTransfer(float time_delta, uint32_t group_number, uint32_
|
|||||||
//if (time_since_activity >= ngc_ft1_ctx->options.sending_resend_without_ack_after) {
|
//if (time_since_activity >= ngc_ft1_ctx->options.sending_resend_without_ack_after) {
|
||||||
if (timeouts_set.count({idx, id})) {
|
if (timeouts_set.count({idx, id})) {
|
||||||
sendPKG_FT1_DATA(group_number, peer_number, idx, id, data.data(), data.size());
|
sendPKG_FT1_DATA(group_number, peer_number, idx, id, data.data(), data.size());
|
||||||
peer.cca.onLoss({idx, id}, false);
|
peer.cca->onLoss({idx, id}, false);
|
||||||
time_since_activity = 0.f;
|
time_since_activity = 0.f;
|
||||||
timeouts_set.erase({idx, id});
|
timeouts_set.erase({idx, id});
|
||||||
}
|
}
|
||||||
@ -292,7 +292,7 @@ void NGCFT1::updateSendTransfer(float time_delta, uint32_t group_number, uint32_
|
|||||||
|
|
||||||
// clean up cca
|
// clean up cca
|
||||||
tf.ssb.for_each(time_delta, [&](uint16_t id, const std::vector<uint8_t>& data, float& time_since_activity) {
|
tf.ssb.for_each(time_delta, [&](uint16_t id, const std::vector<uint8_t>& data, float& time_since_activity) {
|
||||||
peer.cca.onLoss({idx, id}, true);
|
peer.cca->onLoss({idx, id}, true);
|
||||||
timeouts_set.erase({idx, id});
|
timeouts_set.erase({idx, id});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -308,7 +308,7 @@ void NGCFT1::updateSendTransfer(float time_delta, uint32_t group_number, uint32_
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NGCFT1::iteratePeer(float time_delta, uint32_t group_number, uint32_t peer_number, Group::Peer& peer) {
|
void NGCFT1::iteratePeer(float time_delta, uint32_t group_number, uint32_t peer_number, Group::Peer& peer) {
|
||||||
auto timeouts = peer.cca.getTimeouts();
|
auto timeouts = peer.cca->getTimeouts();
|
||||||
std::set<LEDBAT::SeqIDType> timeouts_set{timeouts.cbegin(), timeouts.cend()};
|
std::set<LEDBAT::SeqIDType> timeouts_set{timeouts.cbegin(), timeouts.cend()};
|
||||||
|
|
||||||
for (size_t idx = 0; idx < peer.send_transfers.size(); idx++) {
|
for (size_t idx = 0; idx < peer.send_transfers.size(); idx++) {
|
||||||
@ -425,7 +425,9 @@ bool NGCFT1::NGC_FT1_send_message_public(
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool NGCFT1::onEvent(const Events::NGCEXT_ft1_request& e) {
|
bool NGCFT1::onEvent(const Events::NGCEXT_ft1_request& e) {
|
||||||
|
//#if !NDEBUG
|
||||||
std::cout << "NGCFT1: FT1_REQUEST fk:" << e.file_kind << " [" << bin2hex(e.file_id) << "]\n";
|
std::cout << "NGCFT1: FT1_REQUEST fk:" << e.file_kind << " [" << bin2hex(e.file_id) << "]\n";
|
||||||
|
//#endif
|
||||||
|
|
||||||
// .... just rethrow??
|
// .... just rethrow??
|
||||||
// TODO: dont
|
// TODO: dont
|
||||||
@ -440,7 +442,9 @@ bool NGCFT1::onEvent(const Events::NGCEXT_ft1_request& e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool NGCFT1::onEvent(const Events::NGCEXT_ft1_init& e) {
|
bool NGCFT1::onEvent(const Events::NGCEXT_ft1_init& e) {
|
||||||
|
//#if !NDEBUG
|
||||||
std::cout << "NGCFT1: FT1_INIT fk:" << e.file_kind << " fs:" << e.file_size << " tid:" << int(e.transfer_id) << " [" << bin2hex(e.file_id) << "]\n";
|
std::cout << "NGCFT1: FT1_INIT fk:" << e.file_kind << " fs:" << e.file_size << " tid:" << int(e.transfer_id) << " [" << bin2hex(e.file_id) << "]\n";
|
||||||
|
//#endif
|
||||||
|
|
||||||
bool accept = false;
|
bool accept = false;
|
||||||
dispatch(
|
dispatch(
|
||||||
@ -466,7 +470,7 @@ bool NGCFT1::onEvent(const Events::NGCEXT_ft1_init& e) {
|
|||||||
|
|
||||||
auto& peer = groups[e.group_number].peers[e.peer_number];
|
auto& peer = groups[e.group_number].peers[e.peer_number];
|
||||||
if (peer.recv_transfers[e.transfer_id].has_value()) {
|
if (peer.recv_transfers[e.transfer_id].has_value()) {
|
||||||
std::cerr << "NGCFT1 warning: overwriting existing recv_transfer " << e.transfer_id << "\n";
|
std::cerr << "NGCFT1 warning: overwriting existing recv_transfer " << int(e.transfer_id) << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
peer.recv_transfers[e.transfer_id] = Group::Peer::RecvTransfer{
|
peer.recv_transfers[e.transfer_id] = Group::Peer::RecvTransfer{
|
||||||
@ -482,7 +486,9 @@ bool NGCFT1::onEvent(const Events::NGCEXT_ft1_init& e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool NGCFT1::onEvent(const Events::NGCEXT_ft1_init_ack& e) {
|
bool NGCFT1::onEvent(const Events::NGCEXT_ft1_init_ack& e) {
|
||||||
|
//#if !NDEBUG
|
||||||
std::cout << "NGCFT1: FT1_INIT_ACK\n";
|
std::cout << "NGCFT1: FT1_INIT_ACK\n";
|
||||||
|
//#endif
|
||||||
|
|
||||||
// we now should start sending data
|
// we now should start sending data
|
||||||
|
|
||||||
@ -513,7 +519,9 @@ bool NGCFT1::onEvent(const Events::NGCEXT_ft1_init_ack& e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool NGCFT1::onEvent(const Events::NGCEXT_ft1_data& e) {
|
bool NGCFT1::onEvent(const Events::NGCEXT_ft1_data& e) {
|
||||||
|
#if !NDEBUG
|
||||||
std::cout << "NGCFT1: FT1_DATA\n";
|
std::cout << "NGCFT1: FT1_DATA\n";
|
||||||
|
#endif
|
||||||
|
|
||||||
if (e.data.empty()) {
|
if (e.data.empty()) {
|
||||||
std::cerr << "NGCFT1 error: data of size 0!\n";
|
std::cerr << "NGCFT1 error: data of size 0!\n";
|
||||||
@ -579,7 +587,9 @@ bool NGCFT1::onEvent(const Events::NGCEXT_ft1_data& e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool NGCFT1::onEvent(const Events::NGCEXT_ft1_data_ack& e) {
|
bool NGCFT1::onEvent(const Events::NGCEXT_ft1_data_ack& e) {
|
||||||
|
#if !NDEBUG
|
||||||
std::cout << "NGCFT1: FT1_DATA_ACK\n";
|
std::cout << "NGCFT1: FT1_DATA_ACK\n";
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!groups.count(e.group_number)) {
|
if (!groups.count(e.group_number)) {
|
||||||
std::cerr << "NGCFT1 warning: data_ack for unknown group\n";
|
std::cerr << "NGCFT1 warning: data_ack for unknown group\n";
|
||||||
@ -613,7 +623,7 @@ bool NGCFT1::onEvent(const Events::NGCEXT_ft1_data_ack& e) {
|
|||||||
seqs.push_back({e.transfer_id, it});
|
seqs.push_back({e.transfer_id, it});
|
||||||
transfer.ssb.erase(it);
|
transfer.ssb.erase(it);
|
||||||
}
|
}
|
||||||
peer.cca.onAck(seqs);
|
peer.cca->onAck(seqs);
|
||||||
|
|
||||||
// delete if all packets acked
|
// delete if all packets acked
|
||||||
if (transfer.file_size == transfer.file_size_current && transfer.ssb.size() == 0) {
|
if (transfer.file_size == transfer.file_size_current && transfer.ssb.size() == 0) {
|
||||||
@ -701,6 +711,9 @@ bool NGCFT1::onToxEvent(const Tox_Event_Group_Peer_Exit* e) {
|
|||||||
it_opt.reset();
|
it_opt.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reset cca
|
||||||
|
peer.cca = std::make_unique<LEDBAT>(500-4); // TODO: replace with tox_group_max_custom_lossy_packet_length()-4
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
namespace Events {
|
namespace Events {
|
||||||
|
|
||||||
@ -138,7 +139,7 @@ class NGCFT1 : public ToxEventI, public NGCEXTEventI, public NGCFT1EventProvider
|
|||||||
|
|
||||||
struct Group {
|
struct Group {
|
||||||
struct Peer {
|
struct Peer {
|
||||||
LEDBAT cca{500-4}; // TODO: replace with tox_group_max_custom_lossy_packet_length()-4
|
std::unique_ptr<LEDBAT> cca = std::make_unique<LEDBAT>(500-4); // TODO: replace with tox_group_max_custom_lossy_packet_length()-4
|
||||||
|
|
||||||
struct RecvTransfer {
|
struct RecvTransfer {
|
||||||
uint32_t file_kind;
|
uint32_t file_kind;
|
||||||
|
@ -885,7 +885,7 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_done& e) {
|
|||||||
cc.have_count += 1;
|
cc.have_count += 1;
|
||||||
if (cc.have_count == info.chunks.size()) {
|
if (cc.have_count == info.chunks.size()) {
|
||||||
// debug check
|
// debug check
|
||||||
for (const bool it : cc.have_chunk) {
|
for ([[maybe_unused]] const bool it : cc.have_chunk) {
|
||||||
assert(it);
|
assert(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,8 +102,8 @@ class SHA1_NGCFT1 : public RegistryMessageModelEventI, public NGCFT1EventI {
|
|||||||
public: // TODO: config
|
public: // TODO: config
|
||||||
bool _udp_only {false};
|
bool _udp_only {false};
|
||||||
|
|
||||||
size_t _max_concurrent_in {8};
|
size_t _max_concurrent_in {4};
|
||||||
size_t _max_concurrent_out {4};
|
size_t _max_concurrent_out {6};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SHA1_NGCFT1(
|
SHA1_NGCFT1(
|
||||||
|
Loading…
Reference in New Issue
Block a user