mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 13:27:17 +01:00
Compare commits
3 commits
9bc595a9a2
...
0086f8e27a
Author | SHA1 | Date | |
---|---|---|---|
0086f8e27a | |||
8a8277edda | |||
3f10f6651d |
|
@ -103,6 +103,7 @@ namespace http
|
|||
|
||||
bool URL::parse(std::string_view url)
|
||||
{
|
||||
if (url.empty ()) return false;
|
||||
std::size_t pos_p = 0; /* < current parse position */
|
||||
std::size_t pos_c = 0; /* < work position */
|
||||
if(url.at(0) != '/' || pos_p > 0)
|
||||
|
|
|
@ -412,9 +412,11 @@ namespace transport
|
|||
" is semi-full (size = ", m_SendQueue.size (), ", lag = ", queueLag / 1000, ", rtt = ", (int)m_RTT, ")");
|
||||
}
|
||||
}
|
||||
if (isSemiFull)
|
||||
{
|
||||
for (auto it: msgs)
|
||||
{
|
||||
if (isSemiFull && it->onDrop)
|
||||
if (it->onDrop)
|
||||
it->Drop (); // drop earlier because we can handle it
|
||||
else
|
||||
{
|
||||
|
@ -422,6 +424,12 @@ namespace transport
|
|||
m_SendQueue.push_back (std::move (it));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (auto& it: msgs) it->SetEnqueueTime (mts);
|
||||
m_SendQueue.splice (m_SendQueue.end (), msgs);
|
||||
}
|
||||
if (IsEstablished ())
|
||||
{
|
||||
SendQueue ();
|
||||
|
|
|
@ -305,7 +305,7 @@ namespace client
|
|||
identHash = hash;
|
||||
}
|
||||
|
||||
AddressBook::AddressBook (): m_Storage(nullptr), m_IsLoaded (false), m_IsDownloading (false),
|
||||
AddressBook::AddressBook (): m_Storage(nullptr), m_IsLoaded (false),
|
||||
m_NumRetries (0), m_DefaultSubscription (nullptr), m_SubscriptionsUpdateTimer (nullptr),
|
||||
m_IsEnabled (true)
|
||||
{
|
||||
|
@ -344,20 +344,28 @@ namespace client
|
|||
delete m_SubscriptionsUpdateTimer;
|
||||
m_SubscriptionsUpdateTimer = nullptr;
|
||||
}
|
||||
if (m_IsDownloading)
|
||||
bool isDownloading = m_Downloading.valid ();
|
||||
if (isDownloading)
|
||||
{
|
||||
if (m_Downloading.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
|
||||
isDownloading = false;
|
||||
else
|
||||
{
|
||||
LogPrint (eLogInfo, "Addressbook: Subscriptions are downloading, abort");
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
if (!m_IsDownloading)
|
||||
if (m_Downloading.wait_for(std::chrono::seconds(1)) == std::future_status::ready) // wait for 1 seconds
|
||||
{
|
||||
isDownloading = false;
|
||||
LogPrint (eLogInfo, "Addressbook: Subscriptions download complete");
|
||||
break;
|
||||
}
|
||||
std::this_thread::sleep_for (std::chrono::seconds (1)); // wait for 1 seconds
|
||||
}
|
||||
}
|
||||
if (!isDownloading)
|
||||
m_Downloading.get ();
|
||||
else
|
||||
LogPrint (eLogError, "Addressbook: Subscription download timeout");
|
||||
m_IsDownloading = false;
|
||||
}
|
||||
if (m_Storage)
|
||||
{
|
||||
|
@ -582,16 +590,15 @@ namespace client
|
|||
}
|
||||
else
|
||||
{
|
||||
LogPrint (eLogInfo, "Addressbook: Loading subscriptions from config file");
|
||||
LogPrint (eLogInfo, "Addressbook: Loading subscriptions from config");
|
||||
// using config file items
|
||||
std::string subscriptionURLs; i2p::config::GetOption("addressbook.subscriptions", subscriptionURLs);
|
||||
std::vector<std::string> subsList;
|
||||
boost::split(subsList, subscriptionURLs, boost::is_any_of(","), boost::token_compress_on);
|
||||
|
||||
for (const auto& s: subsList)
|
||||
{
|
||||
if (!s.empty ())
|
||||
m_Subscriptions.push_back (std::make_shared<AddressBookSubscription> (*this, s));
|
||||
}
|
||||
LogPrint (eLogInfo, "Addressbook: ", m_Subscriptions.size (), " subscriptions urls loaded");
|
||||
}
|
||||
}
|
||||
|
@ -645,7 +652,6 @@ namespace client
|
|||
|
||||
void AddressBook::DownloadComplete (bool success, const i2p::data::IdentHash& subscription, const std::string& etag, const std::string& lastModified)
|
||||
{
|
||||
m_IsDownloading = false;
|
||||
m_NumRetries++;
|
||||
int nextUpdateTimeout = m_NumRetries*CONTINIOUS_SUBSCRIPTION_RETRY_TIMEOUT;
|
||||
if (m_NumRetries > CONTINIOUS_SUBSCRIPTION_MAX_NUM_RETRIES || nextUpdateTimeout > CONTINIOUS_SUBSCRIPTION_UPDATE_TIMEOUT)
|
||||
|
@ -700,7 +706,13 @@ namespace client
|
|||
LogPrint(eLogWarning, "Addressbook: Missing local destination, skip subscription update");
|
||||
return;
|
||||
}
|
||||
if (!m_IsDownloading && dest->IsReady ())
|
||||
bool isDownloading = m_Downloading.valid ();
|
||||
if (isDownloading && m_Downloading.wait_for(std::chrono::seconds(0)) == std::future_status::ready) // still active?
|
||||
{
|
||||
m_Downloading.get ();
|
||||
isDownloading = false;
|
||||
}
|
||||
if (!isDownloading && dest->IsReady ())
|
||||
{
|
||||
if (!m_IsLoaded)
|
||||
{
|
||||
|
@ -709,17 +721,15 @@ namespace client
|
|||
std::string defaultSubURL; i2p::config::GetOption("addressbook.defaulturl", defaultSubURL);
|
||||
if (!m_DefaultSubscription)
|
||||
m_DefaultSubscription = std::make_shared<AddressBookSubscription>(*this, defaultSubURL);
|
||||
m_IsDownloading = true;
|
||||
std::thread load_hosts(std::bind (&AddressBookSubscription::CheckUpdates, m_DefaultSubscription));
|
||||
load_hosts.detach(); // TODO: use join
|
||||
m_Downloading = std::async (std::launch::async,
|
||||
std::bind (&AddressBookSubscription::CheckUpdates, m_DefaultSubscription));
|
||||
}
|
||||
else if (!m_Subscriptions.empty ())
|
||||
{
|
||||
// pick random subscription
|
||||
auto ind = rand () % m_Subscriptions.size();
|
||||
m_IsDownloading = true;
|
||||
std::thread load_hosts(std::bind (&AddressBookSubscription::CheckUpdates, m_Subscriptions[ind]));
|
||||
load_hosts.detach(); // TODO: use join
|
||||
m_Downloading = std::async (std::launch::async,
|
||||
std::bind (&AddressBookSubscription::CheckUpdates, m_Subscriptions[ind]));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -823,7 +833,7 @@ namespace client
|
|||
}
|
||||
}
|
||||
|
||||
AddressBookSubscription::AddressBookSubscription (AddressBook& book, const std::string& link):
|
||||
AddressBookSubscription::AddressBookSubscription (AddressBook& book, std::string_view link):
|
||||
m_Book (book), m_Link (link)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -11,10 +11,12 @@
|
|||
|
||||
#include <string.h>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <iostream>
|
||||
#include <mutex>
|
||||
#include <future>
|
||||
#include <memory>
|
||||
#include <boost/asio.hpp>
|
||||
#include "Base.h"
|
||||
|
@ -124,7 +126,8 @@ namespace client
|
|||
std::mutex m_LookupsMutex;
|
||||
std::map<uint32_t, std::string> m_Lookups; // nonce -> address
|
||||
AddressBookStorage * m_Storage;
|
||||
volatile bool m_IsLoaded, m_IsDownloading;
|
||||
volatile bool m_IsLoaded;
|
||||
std::future<void> m_Downloading;
|
||||
int m_NumRetries;
|
||||
std::vector<std::shared_ptr<AddressBookSubscription> > m_Subscriptions;
|
||||
std::shared_ptr<AddressBookSubscription> m_DefaultSubscription; // in case if we don't know any addresses yet
|
||||
|
@ -136,7 +139,7 @@ namespace client
|
|||
{
|
||||
public:
|
||||
|
||||
AddressBookSubscription (AddressBook& book, const std::string& link);
|
||||
AddressBookSubscription (AddressBook& book, std::string_view link);
|
||||
void CheckUpdates ();
|
||||
|
||||
private:
|
||||
|
|
Loading…
Reference in a new issue