tag chunkpicker for update more often
This commit is contained in:
parent
9e2911b36c
commit
07099e4832
@ -1372,7 +1372,7 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCEXT_ft1_have& e) {
|
|||||||
// we might not know yet
|
// we might not know yet
|
||||||
if (addParticipation(c, o)) {
|
if (addParticipation(c, o)) {
|
||||||
// something happend, update chunk picker
|
// something happend, update chunk picker
|
||||||
c.emplace_or_replace<ChunkPickerUpdateTag>();
|
//c.emplace_or_replace<ChunkPickerUpdateTag>();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& remote_have = o.get_or_emplace<Components::RemoteHaveBitset>().others;
|
auto& remote_have = o.get_or_emplace<Components::RemoteHaveBitset>().others;
|
||||||
@ -1381,42 +1381,50 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCEXT_ft1_have& e) {
|
|||||||
remote_have.emplace(c, Components::RemoteHaveBitset::Entry{false, num_total_chunks});
|
remote_have.emplace(c, Components::RemoteHaveBitset::Entry{false, num_total_chunks});
|
||||||
|
|
||||||
// new have? nice
|
// new have? nice
|
||||||
// (always update on biset, not always on have)
|
//c.emplace_or_replace<ChunkPickerUpdateTag>();
|
||||||
c.emplace_or_replace<ChunkPickerUpdateTag>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& remote_have_peer = remote_have.at(c);
|
auto& remote_have_peer = remote_have.at(c);
|
||||||
if (!remote_have_peer.have_all) {
|
if (remote_have_peer.have_all) {
|
||||||
assert(remote_have_peer.have.size_bits() >= num_total_chunks);
|
return true; // peer somehow already had all, ignoring
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto c_i : e.chunks) {
|
assert(remote_have_peer.have.size_bits() >= num_total_chunks);
|
||||||
if (c_i >= num_total_chunks) {
|
|
||||||
std::cerr << "SHA1_NGCFT1 error: remote sent have with out-of-range chunk index!!!\n";
|
|
||||||
std::cerr << info_hash << ": " << c_i << " >= " << num_total_chunks << "\n";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(c_i < num_total_chunks);
|
bool a_valid_change {false};
|
||||||
remote_have_peer.have.set(c_i);
|
for (const auto c_i : e.chunks) {
|
||||||
|
if (c_i >= num_total_chunks) {
|
||||||
|
std::cerr << "SHA1_NGCFT1 error: remote sent have with out-of-range chunk index!!!\n";
|
||||||
|
std::cerr << info_hash << ": " << c_i << " >= " << num_total_chunks << "\n";
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for completion?
|
assert(c_i < num_total_chunks);
|
||||||
// TODO: optimize
|
remote_have_peer.have.set(c_i);
|
||||||
bool test_all {true};
|
a_valid_change = true;
|
||||||
for (size_t i = 0; i < remote_have_peer.have.size_bits(); i++) {
|
}
|
||||||
if (!remote_have_peer.have[i]) {
|
|
||||||
test_all = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test_all) {
|
if (a_valid_change) {
|
||||||
// optimize
|
// new have? nice
|
||||||
remote_have_peer.have_all = true;
|
c.emplace_or_replace<ChunkPickerUpdateTag>();
|
||||||
remote_have_peer.have = BitSet{};
|
}
|
||||||
|
|
||||||
|
// check for completion?
|
||||||
|
// TODO: optimize
|
||||||
|
bool test_all {true};
|
||||||
|
for (size_t i = 0; i < remote_have_peer.have.size_bits(); i++) {
|
||||||
|
if (!remote_have_peer.have[i]) {
|
||||||
|
test_all = false;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (test_all) {
|
||||||
|
// optimize
|
||||||
|
remote_have_peer.have_all = true;
|
||||||
|
remote_have_peer.have = BitSet{};
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1491,7 +1499,6 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCEXT_ft1_bitset& e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// new have? nice
|
// new have? nice
|
||||||
// (always update on bitset, not always on have)
|
|
||||||
c.emplace_or_replace<ChunkPickerUpdateTag>();
|
c.emplace_or_replace<ChunkPickerUpdateTag>();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1530,7 +1537,6 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCEXT_ft1_have_all& e) {
|
|||||||
remote_have[c] = Components::RemoteHaveBitset::Entry{true, {}};
|
remote_have[c] = Components::RemoteHaveBitset::Entry{true, {}};
|
||||||
|
|
||||||
// new have? nice
|
// new have? nice
|
||||||
// (always update on have_all, not always on have)
|
|
||||||
c.emplace_or_replace<ChunkPickerUpdateTag>();
|
c.emplace_or_replace<ChunkPickerUpdateTag>();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user