Skip to content

Commit 12e53e9

Browse files
committed
search: combine callbacks in case of multiple equivalent puts
1 parent c70d8db commit 12e53e9

File tree

2 files changed

+21
-19
lines changed

2 files changed

+21
-19
lines changed

src/dht.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ Dht::shutdown(ShutdownCallback cb, bool stop)
9393
r.second.done_cb(false, {});
9494
sr.second->callbacks.clear();
9595
for (const auto& a : sr.second->announce) {
96-
if (a.callback) a.callback(false, {});
96+
for (auto& cb : a.callbacks) cb(false, {});
9797
}
9898
sr.second->announce.clear();
9999
sr.second->listeners.clear();

src/search.h

+20-18
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ struct Dht::Announce {
4545
bool permanent;
4646
Sp<Value> value;
4747
time_point created;
48-
DoneCallback callback;
48+
std::vector<DoneCallback> callbacks;
4949
};
5050

5151
struct Dht::SearchNode {
@@ -442,8 +442,9 @@ struct Dht::Search {
442442
g.second.done_cb = {};
443443
}
444444
for (auto& a : announce) {
445-
a.callback(false, {});
446-
a.callback = {};
445+
for (auto& cb : a.callbacks)
446+
cb(false, {});
447+
a.callbacks.clear();
447448
}
448449
}
449450

@@ -627,7 +628,9 @@ struct Dht::Search {
627628
return a.value->id == value->id;
628629
});
629630
if (a_sr == announce.end()) {
630-
announce.emplace_back(Announce {permanent, value, created, callback});
631+
auto& a = announce.emplace_back(Announce {permanent, value, created, {}} );
632+
if (callback)
633+
a.callbacks.emplace_back(std::move(callback));
631634
for (auto& n : nodes) {
632635
n->probe_query.reset();
633636
n->acked[value->id].req.reset();
@@ -641,18 +644,15 @@ struct Dht::Search {
641644
n->acked[value->id].req.reset();
642645
n->probe_query.reset();
643646
}
647+
} else {
648+
if (callback)
649+
a_sr->callbacks.emplace_back(std::move(callback));
644650
}
645651
if (isAnnounced(value->id)) {
646-
if (a_sr->callback)
647-
a_sr->callback(true, {});
648-
a_sr->callback = {};
649-
if (callback)
650-
callback(true, {});
652+
for (auto& cb: a_sr->callbacks)
653+
cb(true, {});
654+
a_sr->callbacks.clear();
651655
return;
652-
} else {
653-
if (a_sr->callback)
654-
a_sr->callback(false, {});
655-
a_sr->callback = callback;
656656
}
657657
}
658658
}
@@ -722,8 +722,8 @@ struct Dht::Search {
722722
std::vector<DoneCallback> a_cbs;
723723
a_cbs.reserve(announce.size());
724724
for (auto ait = announce.begin() ; ait != announce.end(); ) {
725-
if (ait->callback)
726-
a_cbs.emplace_back(std::move(ait->callback));
725+
a_cbs.insert(a_cbs.end(), std::make_move_iterator(ait->callbacks.begin()), std::make_move_iterator(ait->callbacks.end()));
726+
ait->callbacks.clear();
727727
if (not ait->permanent)
728728
ait = announce.erase(ait);
729729
else
@@ -747,9 +747,11 @@ struct Dht::Search {
747747
if (vid != Value::INVALID_ID and (!a.value || a.value->id != vid))
748748
return true;
749749
if (isAnnounced(a.value->id)) {
750-
if (a.callback) {
751-
a.callback(true, getNodes());
752-
a.callback = nullptr;
750+
if (!a.callbacks.empty()) {
751+
const auto& nodes = getNodes();
752+
for (auto& cb : a.callbacks)
753+
cb(true, nodes);
754+
a.callbacks.clear();
753755
}
754756
if (not a.permanent)
755757
return false;

0 commit comments

Comments
 (0)