report errors in read_piece_alert
This commit is contained in:
parent
ac5743cfbe
commit
2aacf1cd66
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue