mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-09 11:27:53 +00:00
don't delete RouterInfo's buffer right a way
This commit is contained in:
parent
50d9252ba9
commit
8981e406f5
@ -646,6 +646,11 @@ namespace data
|
|||||||
for (auto& it: m_RouterInfos)
|
for (auto& it: m_RouterInfos)
|
||||||
{
|
{
|
||||||
if (!it.second || it.second == own) continue; // skip own
|
if (!it.second || it.second == own) continue; // skip own
|
||||||
|
if (it.second->IsBufferScheduledToDelete ()) // from previous SaveUpdated, we assume m_PersistingRouters complete
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> l(m_RouterInfosMutex); // possible collision between DeleteBuffer and Update
|
||||||
|
it.second->DeleteBuffer ();
|
||||||
|
}
|
||||||
std::string ident = it.second->GetIdentHashBase64();
|
std::string ident = it.second->GetIdentHashBase64();
|
||||||
if (it.second->IsUpdated ())
|
if (it.second->IsUpdated ())
|
||||||
{
|
{
|
||||||
@ -655,8 +660,8 @@ namespace data
|
|||||||
std::shared_ptr<RouterInfo::Buffer> buffer;
|
std::shared_ptr<RouterInfo::Buffer> buffer;
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> l(m_RouterInfosMutex); // possible collision between DeleteBuffer and Update
|
std::lock_guard<std::mutex> l(m_RouterInfosMutex); // possible collision between DeleteBuffer and Update
|
||||||
buffer = it.second->GetSharedBuffer ();
|
buffer = it.second->CopyBuffer ();
|
||||||
it.second->DeleteBuffer ();
|
it.second->ScheduleBufferToDelete ();
|
||||||
}
|
}
|
||||||
if (buffer && !it.second->IsUnreachable ()) // don't save bad router
|
if (buffer && !it.second->IsUnreachable ()) // don't save bad router
|
||||||
saveToDisk.push_back(std::make_pair(ident, buffer));
|
saveToDisk.push_back(std::make_pair(ident, buffer));
|
||||||
|
@ -45,8 +45,9 @@ namespace data
|
|||||||
|
|
||||||
RouterInfo::RouterInfo (const std::string& fullPath):
|
RouterInfo::RouterInfo (const std::string& fullPath):
|
||||||
m_FamilyID (0), m_IsUpdated (false), m_IsUnreachable (false), m_IsFloodfill (false),
|
m_FamilyID (0), m_IsUpdated (false), m_IsUnreachable (false), m_IsFloodfill (false),
|
||||||
m_SupportedTransports (0),m_ReachableTransports (0), m_PublishedTransports (0),
|
m_IsBufferScheduledToDelete (false), m_SupportedTransports (0),
|
||||||
m_Caps (0), m_Version (0), m_Congestion (eLowCongestion)
|
m_ReachableTransports (0), m_PublishedTransports (0), m_Caps (0), m_Version (0),
|
||||||
|
m_Congestion (eLowCongestion)
|
||||||
{
|
{
|
||||||
m_Addresses = AddressesPtr(new Addresses ()); // create empty list
|
m_Addresses = AddressesPtr(new Addresses ()); // create empty list
|
||||||
m_Buffer = RouterInfo::NewBuffer (); // always RouterInfo's
|
m_Buffer = RouterInfo::NewBuffer (); // always RouterInfo's
|
||||||
@ -1140,6 +1141,7 @@ namespace data
|
|||||||
if (len > m_Buffer->size ()) len = m_Buffer->size ();
|
if (len > m_Buffer->size ()) len = m_Buffer->size ();
|
||||||
memcpy (m_Buffer->data (), buf, len);
|
memcpy (m_Buffer->data (), buf, len);
|
||||||
m_Buffer->SetBufferLen (len);
|
m_Buffer->SetBufferLen (len);
|
||||||
|
m_IsBufferScheduledToDelete = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<RouterInfo::Buffer> RouterInfo::CopyBuffer () const
|
std::shared_ptr<RouterInfo::Buffer> RouterInfo::CopyBuffer () const
|
||||||
|
@ -290,9 +290,11 @@ namespace data
|
|||||||
const uint8_t * GetBuffer () const { return m_Buffer ? m_Buffer->data () : nullptr; };
|
const uint8_t * GetBuffer () const { return m_Buffer ? m_Buffer->data () : nullptr; };
|
||||||
const uint8_t * LoadBuffer (const std::string& fullPath); // load if necessary
|
const uint8_t * LoadBuffer (const std::string& fullPath); // load if necessary
|
||||||
size_t GetBufferLen () const { return m_Buffer ? m_Buffer->GetBufferLen () : 0; };
|
size_t GetBufferLen () const { return m_Buffer ? m_Buffer->GetBufferLen () : 0; };
|
||||||
void DeleteBuffer () { m_Buffer = nullptr; };
|
void DeleteBuffer () { m_Buffer = nullptr; m_IsBufferScheduledToDelete = false; };
|
||||||
std::shared_ptr<Buffer> GetSharedBuffer () const { return m_Buffer; };
|
std::shared_ptr<Buffer> GetSharedBuffer () const { return m_Buffer; };
|
||||||
std::shared_ptr<Buffer> CopyBuffer () const;
|
std::shared_ptr<Buffer> CopyBuffer () const;
|
||||||
|
void ScheduleBufferToDelete () { m_IsBufferScheduledToDelete = false; };
|
||||||
|
bool IsBufferScheduledToDelete () const { return m_IsBufferScheduledToDelete; };
|
||||||
|
|
||||||
bool IsUpdated () const { return m_IsUpdated; };
|
bool IsUpdated () const { return m_IsUpdated; };
|
||||||
void SetUpdated (bool updated) { m_IsUpdated = updated; };
|
void SetUpdated (bool updated) { m_IsUpdated = updated; };
|
||||||
@ -354,7 +356,7 @@ namespace data
|
|||||||
#else
|
#else
|
||||||
AddressesPtr m_Addresses;
|
AddressesPtr m_Addresses;
|
||||||
#endif
|
#endif
|
||||||
bool m_IsUpdated, m_IsUnreachable, m_IsFloodfill;
|
bool m_IsUpdated, m_IsUnreachable, m_IsFloodfill, m_IsBufferScheduledToDelete;
|
||||||
CompatibleTransports m_SupportedTransports, m_ReachableTransports, m_PublishedTransports;
|
CompatibleTransports m_SupportedTransports, m_ReachableTransports, m_PublishedTransports;
|
||||||
uint8_t m_Caps;
|
uint8_t m_Caps;
|
||||||
char m_BandwidthCap;
|
char m_BandwidthCap;
|
||||||
|
Loading…
Reference in New Issue
Block a user