Compare commits
2 Commits
6e681aa3fd
...
31253f5708
Author | SHA1 | Date | |
---|---|---|---|
31253f5708 | |||
eff25cb10b |
@ -111,6 +111,16 @@ struct PickerStrategyRandomSequential {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// TODO: return bytes instead, so it can be done chunk size independent
|
||||||
|
static constexpr size_t flowWindowToRequestCount(size_t flow_window) {
|
||||||
|
// based on 500KiB/s with ~0.05s delay looks fine
|
||||||
|
// increase to 4 at wnd >= 25*1024
|
||||||
|
if (flow_window >= 25*1024) {
|
||||||
|
return 4u;
|
||||||
|
}
|
||||||
|
return 3u;
|
||||||
|
}
|
||||||
|
|
||||||
void ChunkPicker::updateParticipation(
|
void ChunkPicker::updateParticipation(
|
||||||
Contact3Handle c,
|
Contact3Handle c,
|
||||||
ObjectRegistry& objreg
|
ObjectRegistry& objreg
|
||||||
@ -188,6 +198,7 @@ std::vector<ChunkPicker::ContentChunkR> ChunkPicker::updateChunkRequests(
|
|||||||
ObjectRegistry& objreg,
|
ObjectRegistry& objreg,
|
||||||
ReceivingTransfers& rt,
|
ReceivingTransfers& rt,
|
||||||
const size_t open_requests
|
const size_t open_requests
|
||||||
|
//const size_t flow_window
|
||||||
//NGCFT1& nft
|
//NGCFT1& nft
|
||||||
) {
|
) {
|
||||||
if (!static_cast<bool>(c)) {
|
if (!static_cast<bool>(c)) {
|
||||||
@ -212,8 +223,12 @@ std::vector<ChunkPicker::ContentChunkR> ChunkPicker::updateChunkRequests(
|
|||||||
const size_t num_ongoing_transfers = rt.sizePeer(group_number, peer_number);
|
const size_t num_ongoing_transfers = rt.sizePeer(group_number, peer_number);
|
||||||
// TODO: account for open requests
|
// TODO: account for open requests
|
||||||
const int64_t num_total = num_ongoing_transfers + open_requests;
|
const int64_t num_total = num_ongoing_transfers + open_requests;
|
||||||
|
|
||||||
// TODO: base max on rate(chunks per sec), gonna be ass with variable chunk size
|
// TODO: base max on rate(chunks per sec), gonna be ass with variable chunk size
|
||||||
const size_t num_requests = std::max<int64_t>(0, int64_t(max_tf_chunk_requests)-num_total);
|
//const size_t num_max = std::max(max_tf_chunk_requests, flowWindowToRequestCount(flow_window));
|
||||||
|
const size_t num_max = max_tf_chunk_requests;
|
||||||
|
|
||||||
|
const size_t num_requests = std::max<int64_t>(0, int64_t(num_max)-num_total);
|
||||||
std::cerr << "CP: want " << num_requests << "(rt:" << num_ongoing_transfers << " or:" << open_requests << ") from " << group_number << ":" << peer_number << "\n";
|
std::cerr << "CP: want " << num_requests << "(rt:" << num_ongoing_transfers << " or:" << open_requests << ") from " << group_number << ":" << peer_number << "\n";
|
||||||
|
|
||||||
// while n < X
|
// while n < X
|
||||||
|
@ -30,7 +30,7 @@ struct ChunkPickerTimer {
|
|||||||
struct ChunkPicker {
|
struct ChunkPicker {
|
||||||
// max transfers
|
// max transfers
|
||||||
static constexpr size_t max_tf_info_requests {1};
|
static constexpr size_t max_tf_info_requests {1};
|
||||||
static constexpr size_t max_tf_chunk_requests {3}; // TODO: dynamic, function/factor of (window(delay*speed)/chunksize)
|
static constexpr size_t max_tf_chunk_requests {4}; // TODO: dynamic, function/factor of (window(delay*speed)/chunksize)
|
||||||
|
|
||||||
// TODO: cheaper init? tls rng for deep seeding?
|
// TODO: cheaper init? tls rng for deep seeding?
|
||||||
std::minstd_rand _rng{std::random_device{}()};
|
std::minstd_rand _rng{std::random_device{}()};
|
||||||
@ -70,6 +70,7 @@ struct ChunkPicker {
|
|||||||
ObjectRegistry& objreg,
|
ObjectRegistry& objreg,
|
||||||
ReceivingTransfers& rt,
|
ReceivingTransfers& rt,
|
||||||
const size_t open_requests
|
const size_t open_requests
|
||||||
|
//const size_t flow_window
|
||||||
//NGCFT1& nft
|
//NGCFT1& nft
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -7,11 +7,13 @@
|
|||||||
#include <solanaceae/util/bitset.hpp>
|
#include <solanaceae/util/bitset.hpp>
|
||||||
|
|
||||||
#include <entt/container/dense_set.hpp>
|
#include <entt/container/dense_set.hpp>
|
||||||
|
#include <entt/container/dense_map.hpp>
|
||||||
|
|
||||||
#include "./ft1_sha1_info.hpp"
|
#include "./ft1_sha1_info.hpp"
|
||||||
#include "./hash_utils.hpp"
|
#include "./hash_utils.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <deque>
|
||||||
|
|
||||||
|
|
||||||
// TODO: rename to object components
|
// TODO: rename to object components
|
||||||
@ -94,5 +96,34 @@ namespace Components {
|
|||||||
uint64_t offset_into_file {0u};
|
uint64_t offset_into_file {0u};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// this is per object/content
|
||||||
|
// more aplicable than "separated", so should be supported by most backends
|
||||||
|
struct TransferStats {
|
||||||
|
// in bytes per second
|
||||||
|
float rate_up {0.f};
|
||||||
|
float rate_down {0.f};
|
||||||
|
|
||||||
|
// bytes
|
||||||
|
uint64_t total_up {0u};
|
||||||
|
uint64_t total_down {0u};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TransferStatsSeparated {
|
||||||
|
entt::dense_map<Contact3, TransferStats> stats;
|
||||||
|
};
|
||||||
|
|
||||||
|
// used to populate stats
|
||||||
|
struct TransferStatsTally {
|
||||||
|
struct Peer {
|
||||||
|
struct Entry {
|
||||||
|
float time_since {0.f};
|
||||||
|
size_t bytes {0u};
|
||||||
|
};
|
||||||
|
std::deque<Entry> recently_sent;
|
||||||
|
std::deque<Entry> recently_received;
|
||||||
|
};
|
||||||
|
entt::dense_map<Contact3, Peer> tally;
|
||||||
|
};
|
||||||
|
|
||||||
} // Components
|
} // Components
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ class SHA1_NGCFT1 : public ToxEventI, public RegistryMessageModelEventI, public
|
|||||||
bool _udp_only {false};
|
bool _udp_only {false};
|
||||||
|
|
||||||
size_t _max_concurrent_in {4}; // info only
|
size_t _max_concurrent_in {4}; // info only
|
||||||
size_t _max_concurrent_out {3*4}; // HACK: allow ideal number for 4 peers
|
size_t _max_concurrent_out {4*10}; // HACK: allow "ideal" number for 10 peers
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SHA1_NGCFT1(
|
SHA1_NGCFT1(
|
||||||
|
Loading…
Reference in New Issue
Block a user