RSS fixes (exponential back-off), handling feed errors with retries

This commit is contained in:
Arvid Norberg 2012-02-22 08:26:42 +00:00
parent 9a651847f5
commit 28e74a79b7
3 changed files with 21 additions and 9 deletions

View File

@ -144,7 +144,7 @@ namespace libtorrent
void on_feed(error_code const& ec, http_parser const& parser void on_feed(error_code const& ec, http_parser const& parser
, char const* data, int size); , char const* data, int size);
void update_feed(); int update_feed();
aux::session_impl& session() const { return m_ses; } aux::session_impl& session() const { return m_ses; }
@ -186,6 +186,8 @@ namespace libtorrent
time_t m_last_update; time_t m_last_update;
// refresh rate of this feed in minutes // refresh rate of this feed in minutes
int m_ttl; int m_ttl;
// the number of update failures in a row
int m_failures;
// true while waiting for the server to respond // true while waiting for the server to respond
bool m_updating; bool m_updating;
feed_settings m_settings; feed_settings m_settings;

View File

@ -50,11 +50,13 @@ struct feed_state
{ {
feed_state(feed& r) feed_state(feed& r)
: in_item(false) : in_item(false)
, num_items(0)
, type(none) , type(none)
, ret(r) , ret(r)
{} {}
bool in_item; bool in_item;
int num_items;
std::string current_tag; std::string current_tag;
enum feed_type enum feed_type
{ {
@ -215,7 +217,10 @@ void parse_feed(feed_state& f, int token, char const* name, char const* val)
f.in_item = false; f.in_item = false;
if (!f.current_item.title.empty() if (!f.current_item.title.empty()
&& !f.current_item.url.empty()) && !f.current_item.url.empty())
{
f.ret.add_item(f.current_item); f.ret.add_item(f.current_item);
++f.num_items;
}
f.current_item = feed_item(); f.current_item = feed_item();
} }
f.current_tag = ""; f.current_tag = "";
@ -263,7 +268,6 @@ void parse_feed(feed_state& f, int token, char const* name, char const* val)
case xml_declaration_tag: return; case xml_declaration_tag: return;
case xml_comment: return; case xml_comment: return;
} }
} }
torrent_handle add_feed_item(session& s, feed_item const& fi torrent_handle add_feed_item(session& s, feed_item const& fi
@ -300,6 +304,7 @@ feed::feed(aux::session_impl& ses, feed_settings const& sett)
: m_last_attempt(0) : m_last_attempt(0)
, m_last_update(0) , m_last_update(0)
, m_ttl(-1) , m_ttl(-1)
, m_failures(0)
, m_updating(false) , m_updating(false)
, m_settings(sett) , m_settings(sett)
, m_ses(ses) , m_ses(ses)
@ -330,6 +335,7 @@ void feed::on_feed(error_code const& ec
if (ec && ec != asio::error::eof) if (ec && ec != asio::error::eof)
{ {
++m_failures;
m_error = ec; m_error = ec;
if (m_ses.m_alerts.should_post<rss_alert>()) if (m_ses.m_alerts.should_post<rss_alert>())
{ {
@ -341,6 +347,7 @@ void feed::on_feed(error_code const& ec
if (parser.status_code() != 200) if (parser.status_code() != 200)
{ {
++m_failures;
m_error = error_code(parser.status_code(), get_http_category()); m_error = error_code(parser.status_code(), get_http_category());
if (m_ses.m_alerts.should_post<rss_alert>()) if (m_ses.m_alerts.should_post<rss_alert>())
{ {
@ -350,6 +357,8 @@ void feed::on_feed(error_code const& ec
return; return;
} }
m_failures = 0;
char* buf = const_cast<char*>(data); char* buf = const_cast<char*>(data);
feed_state s(*this); feed_state s(*this);
@ -392,7 +401,7 @@ void feed::on_feed(error_code const& ec
m_last_update = now; m_last_update = now;
// keep history of the typical feed size times 5 // keep history of the typical feed size times 5
int max_history = (std::max)(int(m_items.size()) * 5, 100); int max_history = (std::max)(s.num_items * 5, 100);
// this is not very efficient, but that's probably OK for now // this is not very efficient, but that's probably OK for now
while (int(m_added.size()) > max_history) while (int(m_added.size()) > max_history)
@ -557,9 +566,10 @@ void feed::add_item(feed_item const& item)
m_items.push_back(item); m_items.push_back(item);
} }
void feed::update_feed() // returns the number of seconds until trying again
int feed::update_feed()
{ {
if (m_updating) return; if (m_updating) return 60;
m_last_attempt = time(0); m_last_attempt = time(0);
m_last_update = 0; m_last_update = 0;
@ -577,6 +587,8 @@ void feed::update_feed()
m_updating = true; m_updating = true;
feed->get(m_settings.url, seconds(30), 0, 0, 5, m_ses.m_settings.user_agent); feed->get(m_settings.url, seconds(30), 0, 0, 5, m_ses.m_settings.user_agent);
return 60 + m_failures * m_failures * 60;
} }
void feed::get_feed_status(feed_status* ret) const void feed::get_feed_status(feed_status* ret) const

View File

@ -3880,10 +3880,8 @@ namespace aux {
feed& f = **i; feed& f = **i;
int delta = f.next_update(now_posix); int delta = f.next_update(now_posix);
if (delta <= 0) if (delta <= 0)
{ delta = f.update_feed();
f.update_feed(); TORRENT_ASSERT(delta >= 0);
continue;
}
ptime next_update = now + seconds(delta); ptime next_update = now + seconds(delta);
if (next_update < min_update) min_update = next_update; if (next_update < min_update) min_update = next_update;
} }