report errors in read_piece_alert

This commit is contained in:
Arvid Norberg 2013-01-29 02:18:32 +00:00
parent ac5743cfbe
commit 2aacf1cd66
6 changed files with 39 additions and 16 deletions

View File

@ -1,3 +1,4 @@
* report errors in read_piece_alert
* DHT memory optimization * DHT memory optimization
* improve DHT lookup speed * improve DHT lookup speed
* improve support for windows XP and earlier * improve support for windows XP and earlier

View File

@ -6314,6 +6314,10 @@ e.g::
case read_piece_alert::alert_type: case read_piece_alert::alert_type:
{ {
read_piece_alert* p = (read_piece_alert*)a.get(); read_piece_alert* p = (read_piece_alert*)a.get();
if (p->ec) {
// read_piece failed
break;
}
// use p // use p
break; break;
} }
@ -6432,11 +6436,14 @@ is 0. If successful, ``buffer`` points to a buffer containing all the data
of the piece. ``piece`` is the piece index that was read. ``size`` is the of the piece. ``piece`` is the piece index that was read. ``size`` is the
number of bytes that was read. number of bytes that was read.
If the operation fails, ec will indicat what went wrong.
:: ::
struct read_piece_alert: torrent_alert struct read_piece_alert: torrent_alert
{ {
// ... // ...
error_code ec;
boost::shared_ptr<char> buffer; boost::shared_ptr<char> buffer;
int piece; int piece;
int size; int size;

View File

@ -145,12 +145,20 @@ namespace libtorrent
, size(s) , size(s)
{} {}
read_piece_alert(torrent_handle h, int p, error_code e)
: torrent_alert(h)
, ec(e)
, piece(p)
, size(0)
{}
TORRENT_DEFINE_ALERT(read_piece_alert); TORRENT_DEFINE_ALERT(read_piece_alert);
const static int static_category = alert::storage_notification; const static int static_category = alert::storage_notification;
virtual std::string message() const; virtual std::string message() const;
virtual bool discardable() const { return false; } virtual bool discardable() const { return false; }
error_code ec;
boost::shared_array<char> buffer; boost::shared_array<char> buffer;
int piece; int piece;
int size; int size;

View File

@ -191,6 +191,7 @@ namespace libtorrent
boost::shared_array<char> piece_data; boost::shared_array<char> piece_data;
int blocks_left; int blocks_left;
bool fail; bool fail;
error_code error;
}; };
void read_piece(int piece); void read_piece(int piece);
void on_disk_read_complete(int ret, disk_io_job const& j, peer_request r, read_piece_struct* rp); void on_disk_read_complete(int ret, disk_io_job const& j, peer_request r, read_piece_struct* rp);

View File

@ -79,8 +79,16 @@ namespace libtorrent {
std::string read_piece_alert::message() const std::string read_piece_alert::message() const
{ {
char msg[200]; char msg[200];
snprintf(msg, sizeof(msg), "%s: piece %s %u", torrent_alert::message().c_str() if (ec)
, buffer ? "successful" : "failed", piece); {
snprintf(msg, sizeof(msg), "%s: read_piece %u failed: %s"
, torrent_alert::message().c_str() , piece, ec.message().c_str());
}
else
{
snprintf(msg, sizeof(msg), "%s: read_piece %u successful"
, torrent_alert::message().c_str() , piece);
}
return msg; return msg;
} }

View File

@ -939,13 +939,8 @@ namespace libtorrent
if (m_abort) if (m_abort)
{ {
// failed // failed
// TODO: 3 add an error code to the read_piece alert
// to indicate what went wrong. operation_aborted in this
// case. It also has to be included in the cases where
// a time_critical_piece is aborted by setting its priority
// to zero.
m_ses.m_alerts.post_alert(read_piece_alert( m_ses.m_alerts.post_alert(read_piece_alert(
get_handle(), piece, boost::shared_array<char>(), 0)); get_handle(), piece, error_code(boost::system::errc::operation_canceled, get_system_category())));
return; return;
} }
@ -1137,6 +1132,7 @@ namespace libtorrent
if (ret != r.length) if (ret != r.length)
{ {
rp->fail = true; rp->fail = true;
rp->error = j.error;
handle_disk_error(j); handle_disk_error(j);
} }
else else
@ -1149,12 +1145,14 @@ namespace libtorrent
int size = m_torrent_file->piece_size(r.piece); int size = m_torrent_file->piece_size(r.piece);
if (rp->fail) if (rp->fail)
{ {
rp->piece_data.reset(); m_ses.m_alerts.post_alert(read_piece_alert(
size = 0; get_handle(), r.piece, rp->error));
}
else
{
m_ses.m_alerts.post_alert(read_piece_alert(
get_handle(), r.piece, rp->piece_data, size));
} }
m_ses.m_alerts.post_alert(read_piece_alert(
get_handle(), r.piece, rp->piece_data, size));
delete rp; delete rp;
} }
} }
@ -3705,7 +3703,7 @@ namespace libtorrent
if (flags & torrent_handle::alert_when_available) if (flags & torrent_handle::alert_when_available)
{ {
m_ses.m_alerts.post_alert(read_piece_alert( m_ses.m_alerts.post_alert(read_piece_alert(
get_handle(), piece, boost::shared_array<char>(), 0)); get_handle(), piece, error_code(boost::system::errc::operation_canceled, get_system_category())));
} }
return; return;
} }
@ -3821,7 +3819,7 @@ namespace libtorrent
{ {
// post an empty read_piece_alert to indicate it failed // post an empty read_piece_alert to indicate it failed
m_ses.m_alerts.post_alert(read_piece_alert( m_ses.m_alerts.post_alert(read_piece_alert(
get_handle(), piece, boost::shared_array<char>(), 0)); get_handle(), piece, error_code(boost::system::errc::operation_canceled, get_system_category())));
} }
m_time_critical_pieces.erase(i); m_time_critical_pieces.erase(i);
return; return;
@ -3840,7 +3838,7 @@ namespace libtorrent
{ {
// post an empty read_piece_alert to indicate it failed // post an empty read_piece_alert to indicate it failed
m_ses.m_alerts.post_alert(read_piece_alert( m_ses.m_alerts.post_alert(read_piece_alert(
get_handle(), i->piece, boost::shared_array<char>(), 0)); get_handle(), i->piece, error_code(boost::system::errc::operation_canceled, get_system_category())));
} }
i = m_time_critical_pieces.erase(i); i = m_time_critical_pieces.erase(i);
continue; continue;