mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 08:00:38 +03:00
delete expired tunnels
This commit is contained in:
parent
30b25e9eeb
commit
ab5576c744
26
NetDb.cpp
26
NetDb.cpp
@ -28,7 +28,6 @@ namespace data
|
|||||||
msg = i2p::garlic::routing.WrapSingleMessage (*router, msg);
|
msg = i2p::garlic::routing.WrapSingleMessage (*router, msg);
|
||||||
m_ExcludedPeers.insert (router->GetIdentHash ());
|
m_ExcludedPeers.insert (router->GetIdentHash ());
|
||||||
m_LastRouter = router;
|
m_LastRouter = router;
|
||||||
m_LastReplyTunnel = replyTunnel;
|
|
||||||
m_CreationTime = i2p::util::GetSecondsSinceEpoch ();
|
m_CreationTime = i2p::util::GetSecondsSinceEpoch ();
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
@ -39,7 +38,6 @@ namespace data
|
|||||||
i2p::context.GetRouterInfo ().GetIdentHash () , 0, false, &m_ExcludedPeers);
|
i2p::context.GetRouterInfo ().GetIdentHash () , 0, false, &m_ExcludedPeers);
|
||||||
m_ExcludedPeers.insert (floodfill);
|
m_ExcludedPeers.insert (floodfill);
|
||||||
m_LastRouter = nullptr;
|
m_LastRouter = nullptr;
|
||||||
m_LastReplyTunnel = nullptr;
|
|
||||||
m_CreationTime = i2p::util::GetSecondsSinceEpoch ();
|
m_CreationTime = i2p::util::GetSecondsSinceEpoch ();
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
@ -369,7 +367,6 @@ namespace data
|
|||||||
if (msgs.size () > 0)
|
if (msgs.size () > 0)
|
||||||
{
|
{
|
||||||
dest->ClearExcludedPeers ();
|
dest->ClearExcludedPeers ();
|
||||||
dest->SetLastOutboundTunnel (outbound);
|
|
||||||
outbound->SendTunnelDataMsg (msgs);
|
outbound->SendTunnelDataMsg (msgs);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -386,10 +383,7 @@ namespace data
|
|||||||
RequestedDestination * dest = CreateRequestedDestination (destination, false);
|
RequestedDestination * dest = CreateRequestedDestination (destination, false);
|
||||||
auto floodfill = GetClosestFloodfill (destination, dest->GetExcludedPeers ());
|
auto floodfill = GetClosestFloodfill (destination, dest->GetExcludedPeers ());
|
||||||
if (floodfill)
|
if (floodfill)
|
||||||
{
|
|
||||||
dest->SetLastOutboundTunnel (nullptr);
|
|
||||||
i2p::transports.SendMessage (floodfill->GetIdentHash (), dest->CreateRequestMessage (floodfill->GetIdentHash ()));
|
i2p::transports.SendMessage (floodfill->GetIdentHash (), dest->CreateRequestMessage (floodfill->GetIdentHash ()));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -438,8 +432,9 @@ namespace data
|
|||||||
RequestedDestination * dest = it->second;
|
RequestedDestination * dest = it->second;
|
||||||
if (num > 0)
|
if (num > 0)
|
||||||
{
|
{
|
||||||
i2p::tunnel::OutboundTunnel * outbound = dest->GetLastOutboundTunnel ();
|
auto exploratoryPool = i2p::tunnel::tunnels.GetExploratoryPool ();
|
||||||
const i2p::tunnel::InboundTunnel * inbound = dest->GetLastReplyTunnel ();
|
auto outbound = exploratoryPool ? exploratoryPool->GetNextOutboundTunnel () : nullptr;
|
||||||
|
auto inbound = exploratoryPool ? exploratoryPool->GetNextInboundTunnel () : nullptr;
|
||||||
std::vector<i2p::tunnel::TunnelMessageBlock> msgs;
|
std::vector<i2p::tunnel::TunnelMessageBlock> msgs;
|
||||||
|
|
||||||
for (int i = 0; i < num; i++)
|
for (int i = 0; i < num; i++)
|
||||||
@ -457,11 +452,10 @@ namespace data
|
|||||||
{
|
{
|
||||||
// router with ident not found or too old (1 hour)
|
// router with ident not found or too old (1 hour)
|
||||||
LogPrint ("Found new/outdated router. Requesting RouterInfo ...");
|
LogPrint ("Found new/outdated router. Requesting RouterInfo ...");
|
||||||
if (outbound && inbound)
|
if (outbound && inbound && dest->GetLastRouter ())
|
||||||
{
|
{
|
||||||
RequestedDestination * d1 = CreateRequestedDestination (router, false, false);
|
RequestedDestination * d1 = CreateRequestedDestination (router, false, false);
|
||||||
d1->SetLastOutboundTunnel (outbound);
|
auto msg = d1->CreateRequestMessage (dest->GetLastRouter (), inbound);
|
||||||
auto msg = d1->CreateRequestMessage (dest->GetLastRouter (), dest->GetLastReplyTunnel ());
|
|
||||||
msgs.push_back (i2p::tunnel::TunnelMessageBlock
|
msgs.push_back (i2p::tunnel::TunnelMessageBlock
|
||||||
{
|
{
|
||||||
i2p::tunnel::eDeliveryTypeRouter,
|
i2p::tunnel::eDeliveryTypeRouter,
|
||||||
@ -475,7 +469,7 @@ namespace data
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// reply to our destination. Try other floodfills
|
// reply to our destination. Try other floodfills
|
||||||
if (outbound && inbound)
|
if (outbound && inbound && dest->GetLastRouter ())
|
||||||
{
|
{
|
||||||
auto r = FindRouter (router);
|
auto r = FindRouter (router);
|
||||||
// do we have that floodfill router in our database?
|
// do we have that floodfill router in our database?
|
||||||
@ -492,7 +486,7 @@ namespace data
|
|||||||
CreateDatabaseStoreMsg ()
|
CreateDatabaseStoreMsg ()
|
||||||
});
|
});
|
||||||
// request destination
|
// request destination
|
||||||
auto msg = dest->CreateRequestMessage (r, dest->GetLastReplyTunnel ());
|
auto msg = dest->CreateRequestMessage (r, inbound);
|
||||||
msgs.push_back (i2p::tunnel::TunnelMessageBlock
|
msgs.push_back (i2p::tunnel::TunnelMessageBlock
|
||||||
{
|
{
|
||||||
i2p::tunnel::eDeliveryTypeRouter,
|
i2p::tunnel::eDeliveryTypeRouter,
|
||||||
@ -505,7 +499,6 @@ namespace data
|
|||||||
// request router
|
// request router
|
||||||
LogPrint ("Found new floodfill. Request it");
|
LogPrint ("Found new floodfill. Request it");
|
||||||
RequestedDestination * d2 = CreateRequestedDestination (router, false, false);
|
RequestedDestination * d2 = CreateRequestedDestination (router, false, false);
|
||||||
d2->SetLastOutboundTunnel (outbound);
|
|
||||||
I2NPMessage * msg = d2->CreateRequestMessage (dest->GetLastRouter (), inbound);
|
I2NPMessage * msg = d2->CreateRequestMessage (dest->GetLastRouter (), inbound);
|
||||||
msgs.push_back (i2p::tunnel::TunnelMessageBlock
|
msgs.push_back (i2p::tunnel::TunnelMessageBlock
|
||||||
{
|
{
|
||||||
@ -577,7 +570,6 @@ namespace data
|
|||||||
floodfills.insert (floodfill);
|
floodfills.insert (floodfill);
|
||||||
if (throughTunnels)
|
if (throughTunnels)
|
||||||
{
|
{
|
||||||
dest->SetLastOutboundTunnel (outbound);
|
|
||||||
msgs.push_back (i2p::tunnel::TunnelMessageBlock
|
msgs.push_back (i2p::tunnel::TunnelMessageBlock
|
||||||
{
|
{
|
||||||
i2p::tunnel::eDeliveryTypeRouter,
|
i2p::tunnel::eDeliveryTypeRouter,
|
||||||
@ -592,11 +584,7 @@ namespace data
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
dest->SetLastOutboundTunnel (nullptr);
|
|
||||||
dest->SetLastReplyTunnel (nullptr);
|
|
||||||
i2p::transports.SendMessage (floodfill->GetIdentHash (), dest->CreateRequestMessage (floodfill->GetIdentHash ()));
|
i2p::transports.SendMessage (floodfill->GetIdentHash (), dest->CreateRequestMessage (floodfill->GetIdentHash ()));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
DeleteRequestedDestination (dest);
|
DeleteRequestedDestination (dest);
|
||||||
|
10
NetDb.h
10
NetDb.h
@ -25,16 +25,13 @@ namespace data
|
|||||||
|
|
||||||
RequestedDestination (const IdentHash& destination, bool isLeaseSet, bool isExploratory = false):
|
RequestedDestination (const IdentHash& destination, bool isLeaseSet, bool isExploratory = false):
|
||||||
m_Destination (destination), m_IsLeaseSet (isLeaseSet), m_IsExploratory (isExploratory),
|
m_Destination (destination), m_IsLeaseSet (isLeaseSet), m_IsExploratory (isExploratory),
|
||||||
m_LastRouter (nullptr), m_LastReplyTunnel (nullptr), m_LastOutboundTunnel (nullptr),
|
m_LastRouter (nullptr), m_CreationTime (0) {};
|
||||||
m_CreationTime (0) {};
|
|
||||||
|
|
||||||
const IdentHash& GetDestination () const { return m_Destination; };
|
const IdentHash& GetDestination () const { return m_Destination; };
|
||||||
int GetNumExcludedPeers () const { return m_ExcludedPeers.size (); };
|
int GetNumExcludedPeers () const { return m_ExcludedPeers.size (); };
|
||||||
const std::set<IdentHash>& GetExcludedPeers () { return m_ExcludedPeers; };
|
const std::set<IdentHash>& GetExcludedPeers () { return m_ExcludedPeers; };
|
||||||
void ClearExcludedPeers ();
|
void ClearExcludedPeers ();
|
||||||
const RouterInfo * GetLastRouter () const { return m_LastRouter; };
|
const RouterInfo * GetLastRouter () const { return m_LastRouter; };
|
||||||
const i2p::tunnel::InboundTunnel * GetLastReplyTunnel () const { return m_LastReplyTunnel; };
|
|
||||||
void SetLastReplyTunnel (i2p::tunnel::InboundTunnel * tunnel) { m_LastReplyTunnel = tunnel; };
|
|
||||||
bool IsExploratory () const { return m_IsExploratory; };
|
bool IsExploratory () const { return m_IsExploratory; };
|
||||||
bool IsLeaseSet () const { return m_IsLeaseSet; };
|
bool IsLeaseSet () const { return m_IsLeaseSet; };
|
||||||
bool IsExcluded (const IdentHash& ident) const { return m_ExcludedPeers.count (ident); };
|
bool IsExcluded (const IdentHash& ident) const { return m_ExcludedPeers.count (ident); };
|
||||||
@ -42,17 +39,12 @@ namespace data
|
|||||||
I2NPMessage * CreateRequestMessage (const RouterInfo * router, const i2p::tunnel::InboundTunnel * replyTunnel);
|
I2NPMessage * CreateRequestMessage (const RouterInfo * router, const i2p::tunnel::InboundTunnel * replyTunnel);
|
||||||
I2NPMessage * CreateRequestMessage (const IdentHash& floodfill);
|
I2NPMessage * CreateRequestMessage (const IdentHash& floodfill);
|
||||||
|
|
||||||
i2p::tunnel::OutboundTunnel * GetLastOutboundTunnel () const { return m_LastOutboundTunnel; };
|
|
||||||
void SetLastOutboundTunnel (i2p::tunnel::OutboundTunnel * tunnel) { m_LastOutboundTunnel = tunnel; };
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
IdentHash m_Destination;
|
IdentHash m_Destination;
|
||||||
bool m_IsLeaseSet, m_IsExploratory;
|
bool m_IsLeaseSet, m_IsExploratory;
|
||||||
std::set<IdentHash> m_ExcludedPeers;
|
std::set<IdentHash> m_ExcludedPeers;
|
||||||
const RouterInfo * m_LastRouter;
|
const RouterInfo * m_LastRouter;
|
||||||
const i2p::tunnel::InboundTunnel * m_LastReplyTunnel;
|
|
||||||
i2p::tunnel::OutboundTunnel * m_LastOutboundTunnel;
|
|
||||||
uint64_t m_CreationTime;
|
uint64_t m_CreationTime;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -398,8 +398,8 @@ namespace tunnel
|
|||||||
auto pool = (*it)->GetTunnelPool ();
|
auto pool = (*it)->GetTunnelPool ();
|
||||||
if (pool)
|
if (pool)
|
||||||
pool->TunnelExpired (*it);
|
pool->TunnelExpired (*it);
|
||||||
|
delete *it;
|
||||||
it = m_OutboundTunnels.erase (it);
|
it = m_OutboundTunnels.erase (it);
|
||||||
// TODO: delete tunnel, but make nobody uses it
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
it++;
|
it++;
|
||||||
@ -431,8 +431,8 @@ namespace tunnel
|
|||||||
auto pool = it->second->GetTunnelPool ();
|
auto pool = it->second->GetTunnelPool ();
|
||||||
if (pool)
|
if (pool)
|
||||||
pool->TunnelExpired (it->second);
|
pool->TunnelExpired (it->second);
|
||||||
|
delete it->second;
|
||||||
it = m_InboundTunnels.erase (it);
|
it = m_InboundTunnels.erase (it);
|
||||||
// TODO: delete tunnel, but make nobody uses it
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
it++;
|
it++;
|
||||||
|
@ -34,6 +34,9 @@ namespace tunnel
|
|||||||
{
|
{
|
||||||
expiredTunnel->SetTunnelPool (nullptr);
|
expiredTunnel->SetTunnelPool (nullptr);
|
||||||
m_InboundTunnels.erase (expiredTunnel);
|
m_InboundTunnels.erase (expiredTunnel);
|
||||||
|
for (auto it: m_Tests)
|
||||||
|
if (it.second.second == expiredTunnel) it.second.second = nullptr;
|
||||||
|
|
||||||
}
|
}
|
||||||
m_LocalDestination.UpdateLeaseSet ();
|
m_LocalDestination.UpdateLeaseSet ();
|
||||||
}
|
}
|
||||||
@ -49,6 +52,8 @@ namespace tunnel
|
|||||||
{
|
{
|
||||||
expiredTunnel->SetTunnelPool (nullptr);
|
expiredTunnel->SetTunnelPool (nullptr);
|
||||||
m_OutboundTunnels.erase (expiredTunnel);
|
m_OutboundTunnels.erase (expiredTunnel);
|
||||||
|
for (auto it: m_Tests)
|
||||||
|
if (it.second.first == expiredTunnel) it.second.first = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,10 +110,16 @@ namespace tunnel
|
|||||||
{
|
{
|
||||||
LogPrint ("Tunnel test ", (int)it.first, " failed");
|
LogPrint ("Tunnel test ", (int)it.first, " failed");
|
||||||
// both outbound and inbound tunnels considered as invalid
|
// both outbound and inbound tunnels considered as invalid
|
||||||
it.second.first->SetFailed (true);
|
if (it.second.first)
|
||||||
it.second.second->SetFailed (true);
|
{
|
||||||
m_OutboundTunnels.erase (it.second.first);
|
it.second.first->SetFailed (true);
|
||||||
m_InboundTunnels.erase (it.second.second);
|
m_OutboundTunnels.erase (it.second.first);
|
||||||
|
}
|
||||||
|
if (it.second.second)
|
||||||
|
{
|
||||||
|
it.second.second->SetFailed (true);
|
||||||
|
m_InboundTunnels.erase (it.second.second);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_Tests.clear ();
|
m_Tests.clear ();
|
||||||
auto it1 = m_OutboundTunnels.begin ();
|
auto it1 = m_OutboundTunnels.begin ();
|
||||||
|
Loading…
Reference in New Issue
Block a user