diff --git a/src/dht.cpp b/src/dht.cpp index d9969fe32e4f10f0885bafb2c1ae0f2e6b61118b..11d2081db02f7e46cb46a3fcdd439951e569769c 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -184,6 +184,11 @@ struct Dht::SearchNode { return not node->isExpired() and not token.empty() and last_get_reply >= now - Node::NODE_EXPIRE_TIME; } + + /** + * Could a "get" request be sent to this node now ? + * update: time of the last "get" op for the search. + */ bool canGet(time_point now, time_point update) const { return not node->isExpired() and (now > last_get_reply + Node::NODE_EXPIRE_TIME or update > last_get_reply) @@ -204,6 +209,9 @@ struct Dht::SearchNode { return listenStatus->reply_time + LISTEN_EXPIRE_TIME > now; } + /** + * Assumng the node is synced, should a "put" request be sent to this node now ? + */ time_point getAnnounceTime(AnnounceStatusMap::const_iterator ack, const ValueType& type) const { if (ack == acked.end() or not ack->second) return time_point::min(); @@ -214,12 +222,19 @@ struct Dht::SearchNode { return getAnnounceTime(acked.find(vid), type); } + /** + * Assumng the node is synced, should a "listen" request be sent to this node now ? + */ time_point getListenTime() const { if (not listenStatus) return time_point::min(); return listenStatus->pending() ? time_point::max() : listenStatus->reply_time + LISTEN_EXPIRE_TIME - REANNOUNCE_MARGIN; } + + /** + * Is this node expired or candidate + */ bool isBad() const { return !node || node->isExpired() || candidate; } @@ -290,6 +305,10 @@ struct Dht::Search { */ bool isSynced(time_point now) const; + /** + * Get the time of the last "get" operation performed on this search, + * or time_point::min() if no such operation have been performed. + */ time_point getLastGetTime() const; /** @@ -308,17 +327,23 @@ struct Dht::Search { unsigned getNumberOfBadNodes() const; /** - * ret = 0 : no announce required. - * ret > 0 : (re-)announce required at time ret. + * Returns the time of the next "announce" event for this search, + * or time_point::max() if no such event is planned. + * Only makes sense when the search is synced. */ time_point getAnnounceTime(const std::map<ValueType::Id, ValueType>& types, time_point now) const; /** - * ret = 0 : no listen required. - * ret > 0 : (re-)announce required at time ret. + * Returns the time of the next "listen" event for this search, + * or time_point::max() if no such event is planned. + * Only makes sense when the search is synced. */ time_point getListenTime(time_point now) const; + /** + * Returns the time of the next event for this search, + * or time_point::max() if no such event is planned. + */ time_point getNextStepTime(const std::map<ValueType::Id, ValueType>& types, time_point now) const; bool removeExpiredNode(time_point now);