diff --git a/src/dht.cpp b/src/dht.cpp index 4c6f7b1e2995a0ff74710dc67dcdd7e2516d2d50..970d8e237d3a59c57116ebf4f4fbf642a2366944 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -153,7 +153,7 @@ struct Dht::Storage { size_t listener_token {1}; /** - * Changes caused by an operation on the storage. + * Changes caused by an operation on the storage. */ struct StoreDiff { /** Difference in stored size caused by the op */ @@ -1167,41 +1167,42 @@ void Dht::paginate(std::weak_ptr<Search> ws, std::shared_ptr<Query> query, Searc auto sr = ws.lock(); if (not sr) return; auto select_q = std::make_shared<Query>(Select {}.field(Value::Field::Id), query ? query->where : Where {}); - auto onSelectDone = - [this,ws,query](const net::Request& status, net::NetworkEngine::RequestAnswer&& answer) mutable - { - if (auto sr = ws.lock()) { - if (auto sn = sr->getNode(status.node)) { - if (answer.fields.empty()) { - searchNodeGetDone(status, std::move(answer), ws, query); - return; - } else { - for (const auto& fvi : answer.fields) { - try { - auto vid = fvi->index.at(Value::Field::Id).getInt(); - if (vid == Value::INVALID_ID) continue; - auto query_for_vid = std::make_shared<Query>(Select {}, Where {}.id(vid)); - sn->pagination_queries[query].push_back(query_for_vid); - DHT_LOG.w(sr->id, sn->node->id, "[search %s] [node %s] sending %s", - sr->id.toString().c_str(), sn->node->toString().c_str(), query_for_vid->toString().c_str()); - sn->getStatus[query_for_vid] = network_engine.sendGetValues(status.node, - sr->id, - *query_for_vid, - -1, - std::bind(&Dht::searchNodeGetDone, this, _1, _2, ws, query), - std::bind(&Dht::searchNodeGetExpired, this, _1, _2, ws, query_for_vid) - ); - } catch (std::out_of_range&) { - DHT_LOG.e(sr->id, sn->node->id, "[search %s] [node %s] received non-id field in response to "\ - "'SELECT id' request...", - sr->id.toString().c_str(), sn->node->toString().c_str()); - } - } - } - - } + auto onSelectDone = [this,ws,query](const net::Request& status, + net::NetworkEngine::RequestAnswer&& answer) mutable { + // retreive search + auto sr = ws.lock(); + if (not sr) return; + const auto& id = sr->id; + // retreive search node + auto sn = sr->getNode(status.node); + if (not sn) return; + // backward compatibility + if (answer.fields.empty()) { + searchNodeGetDone(status, std::move(answer), ws, query); + return; + } + for (const auto& fvi : answer.fields) { + try { + auto vid = fvi->index.at(Value::Field::Id).getInt(); + if (vid == Value::INVALID_ID) continue; + auto query_for_vid = std::make_shared<Query>(Select {}, Where {}.id(vid)); + sn->pagination_queries[query].push_back(query_for_vid); + DHT_LOG.w(id, sn->node->id, "[search %s] [node %s] sending %s", + id.toString().c_str(), sn->node->toString().c_str(), query_for_vid->toString().c_str()); + sn->getStatus[query_for_vid] = network_engine.sendGetValues(status.node, + id, + *query_for_vid, + -1, + std::bind(&Dht::searchNodeGetDone, this, _1, _2, ws, query), + std::bind(&Dht::searchNodeGetExpired, this, _1, _2, ws, query_for_vid) + ); + } catch (const std::out_of_range&) { + DHT_LOG.e(id, sn->node->id, "[search %s] [node %s] received non-id field in response to "\ + "'SELECT id' request...", + id.toString().c_str(), sn->node->toString().c_str()); } - }; + } + }; /* add pagination query key for tracking ongoing requests. */ n->pagination_queries[query].push_back(select_q);