|
|
@ -117,8 +117,6 @@ namespace data |
|
|
|
m_Thread = 0; |
|
|
|
m_Thread = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
m_LeaseSets.clear(); |
|
|
|
m_LeaseSets.clear(); |
|
|
|
for (auto r: m_RequestedDestinations) |
|
|
|
|
|
|
|
delete r.second; |
|
|
|
|
|
|
|
m_RequestedDestinations.clear (); |
|
|
|
m_RequestedDestinations.clear (); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -236,7 +234,6 @@ namespace data |
|
|
|
{ |
|
|
|
{ |
|
|
|
it->second->Success (r); |
|
|
|
it->second->Success (r); |
|
|
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex); |
|
|
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex); |
|
|
|
delete it->second; |
|
|
|
|
|
|
|
m_RequestedDestinations.erase (it); |
|
|
|
m_RequestedDestinations.erase (it); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -456,7 +453,7 @@ namespace data |
|
|
|
void NetDb::RequestDestination (const IdentHash& destination, RequestedDestination::RequestComplete requestComplete) |
|
|
|
void NetDb::RequestDestination (const IdentHash& destination, RequestedDestination::RequestComplete requestComplete) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// request RouterInfo directly
|
|
|
|
// request RouterInfo directly
|
|
|
|
RequestedDestination * dest = CreateRequestedDestination (destination, false); |
|
|
|
auto& dest = CreateRequestedDestination (destination, false); |
|
|
|
if (requestComplete) |
|
|
|
if (requestComplete) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (dest->IsRequestComplete ()) // if set already
|
|
|
|
if (dest->IsRequestComplete ()) // if set already
|
|
|
@ -475,7 +472,7 @@ namespace data |
|
|
|
{ |
|
|
|
{ |
|
|
|
LogPrint (eLogError, "No floodfills found"); |
|
|
|
LogPrint (eLogError, "No floodfills found"); |
|
|
|
dest->Fail (); |
|
|
|
dest->Fail (); |
|
|
|
DeleteRequestedDestination (dest); |
|
|
|
DeleteRequestedDestination (destination); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -566,7 +563,7 @@ namespace data |
|
|
|
auto it = m_RequestedDestinations.find (IdentHash (buf)); |
|
|
|
auto it = m_RequestedDestinations.find (IdentHash (buf)); |
|
|
|
if (it != m_RequestedDestinations.end ()) |
|
|
|
if (it != m_RequestedDestinations.end ()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
RequestedDestination * dest = it->second; |
|
|
|
auto& dest = it->second; |
|
|
|
bool deleteDest = true; |
|
|
|
bool deleteDest = true; |
|
|
|
if (num > 0) |
|
|
|
if (num > 0) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -615,7 +612,6 @@ namespace data |
|
|
|
{ |
|
|
|
{ |
|
|
|
// no more requests for the destinationation. delete it
|
|
|
|
// no more requests for the destinationation. delete it
|
|
|
|
it->second->Fail (); |
|
|
|
it->second->Fail (); |
|
|
|
delete it->second; |
|
|
|
|
|
|
|
m_RequestedDestinations.erase (it); |
|
|
|
m_RequestedDestinations.erase (it); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -623,7 +619,6 @@ namespace data |
|
|
|
{ |
|
|
|
{ |
|
|
|
// no more requests for detination possible. delete it
|
|
|
|
// no more requests for detination possible. delete it
|
|
|
|
it->second->Fail (); |
|
|
|
it->second->Fail (); |
|
|
|
delete it->second; |
|
|
|
|
|
|
|
m_RequestedDestinations.erase (it); |
|
|
|
m_RequestedDestinations.erase (it); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -787,7 +782,7 @@ namespace data |
|
|
|
for (int i = 0; i < numDestinations; i++) |
|
|
|
for (int i = 0; i < numDestinations; i++) |
|
|
|
{ |
|
|
|
{ |
|
|
|
rnd.GenerateBlock (randomHash, 32); |
|
|
|
rnd.GenerateBlock (randomHash, 32); |
|
|
|
RequestedDestination * dest = CreateRequestedDestination (IdentHash (randomHash), true); |
|
|
|
auto& dest = CreateRequestedDestination (IdentHash (randomHash), true); |
|
|
|
auto floodfill = GetClosestFloodfill (randomHash, dest->GetExcludedPeers ()); |
|
|
|
auto floodfill = GetClosestFloodfill (randomHash, dest->GetExcludedPeers ()); |
|
|
|
if (floodfill && !floodfills.count (floodfill.get ())) // request floodfill only once
|
|
|
|
if (floodfill && !floodfills.count (floodfill.get ())) // request floodfill only once
|
|
|
|
{ |
|
|
|
{ |
|
|
@ -811,7 +806,7 @@ namespace data |
|
|
|
i2p::transport::transports.SendMessage (floodfill->GetIdentHash (), dest->CreateRequestMessage (floodfill->GetIdentHash ())); |
|
|
|
i2p::transport::transports.SendMessage (floodfill->GetIdentHash (), dest->CreateRequestMessage (floodfill->GetIdentHash ())); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
DeleteRequestedDestination (dest); |
|
|
|
DeleteRequestedDestination (dest->GetDestination ()); |
|
|
|
} |
|
|
|
} |
|
|
|
if (throughTunnels && msgs.size () > 0) |
|
|
|
if (throughTunnels && msgs.size () > 0) |
|
|
|
outbound->SendTunnelDataMsg (msgs); |
|
|
|
outbound->SendTunnelDataMsg (msgs); |
|
|
@ -833,28 +828,24 @@ namespace data |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
RequestedDestination * NetDb::CreateRequestedDestination (const IdentHash& dest, bool isExploratory) |
|
|
|
std::unique_ptr<RequestedDestination>& NetDb::CreateRequestedDestination (const IdentHash& dest, bool isExploratory) |
|
|
|
{ |
|
|
|
{ |
|
|
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex); |
|
|
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex); |
|
|
|
auto it = m_RequestedDestinations.find (dest); |
|
|
|
auto it = m_RequestedDestinations.find (dest); |
|
|
|
if (it == m_RequestedDestinations.end ()) // not exist yet
|
|
|
|
if (it == m_RequestedDestinations.end ()) // not exist yet
|
|
|
|
{ |
|
|
|
{ |
|
|
|
RequestedDestination * d = new RequestedDestination (dest, isExploratory); |
|
|
|
auto d = new RequestedDestination (dest, isExploratory); |
|
|
|
m_RequestedDestinations[dest] = d; |
|
|
|
return m_RequestedDestinations.insert (std::make_pair (dest, |
|
|
|
return d; |
|
|
|
std::unique_ptr<RequestedDestination> (d))).first->second; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
return it->second; |
|
|
|
return it->second; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void NetDb::DeleteRequestedDestination (RequestedDestination * dest) |
|
|
|
void NetDb::DeleteRequestedDestination (IdentHash ident) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (dest) |
|
|
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex); |
|
|
|
{ |
|
|
|
m_RequestedDestinations.erase (ident); |
|
|
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex); |
|
|
|
|
|
|
|
m_RequestedDestinations.erase (dest->GetDestination ()); |
|
|
|
|
|
|
|
delete dest; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<const RouterInfo> NetDb::GetRandomRouter () const |
|
|
|
std::shared_ptr<const RouterInfo> NetDb::GetRandomRouter () const |
|
|
@ -982,7 +973,7 @@ namespace data |
|
|
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex); |
|
|
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex); |
|
|
|
for (auto it = m_RequestedDestinations.begin (); it != m_RequestedDestinations.end ();) |
|
|
|
for (auto it = m_RequestedDestinations.begin (); it != m_RequestedDestinations.end ();) |
|
|
|
{ |
|
|
|
{ |
|
|
|
auto dest = it->second; |
|
|
|
auto& dest = it->second; |
|
|
|
bool done = false; |
|
|
|
bool done = false; |
|
|
|
if (ts < dest->GetCreationTime () + 60) // request is worthless after 1 minute
|
|
|
|
if (ts < dest->GetCreationTime () + 60) // request is worthless after 1 minute
|
|
|
|
{ |
|
|
|
{ |
|
|
@ -1018,10 +1009,7 @@ namespace data |
|
|
|
done = true; |
|
|
|
done = true; |
|
|
|
|
|
|
|
|
|
|
|
if (done) |
|
|
|
if (done) |
|
|
|
{ |
|
|
|
|
|
|
|
delete dest; |
|
|
|
|
|
|
|
it = m_RequestedDestinations.erase (it); |
|
|
|
it = m_RequestedDestinations.erase (it); |
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
else |
|
|
|
it++; |
|
|
|
it++; |
|
|
|
} |
|
|
|
} |
|
|
|