fix: `date done` and `recently-active` not updated on state change (#6992)
* fix: update `date_done_` as long as the torrent is done * fix: `mark_change()` should be called as long as torrent state changes * chore: remove redundant completeness update in `tr_torrent::start_in_session_thread()` * fix: log whenever torrent state changes * chore: add comment to explain `recent_change` * chore: housekeeping * fix: recover torrents with missing date done
This commit is contained in:
parent
ab66f73c74
commit
89a88c6603
|
@ -712,7 +712,6 @@ void tr_torrent::start_in_session_thread()
|
|||
time_t const now = tr_time();
|
||||
|
||||
is_running_ = true;
|
||||
completeness_ = completion_.status();
|
||||
date_started_ = now;
|
||||
mark_changed();
|
||||
error().clear();
|
||||
|
@ -947,8 +946,8 @@ void tr_torrent::on_metainfo_completed()
|
|||
else
|
||||
{
|
||||
completion_.set_has_all();
|
||||
date_done_ = date_added_;
|
||||
recheck_completeness();
|
||||
date_done_ = date_added_; // Must be after recheck_completeness()
|
||||
|
||||
if (start_when_stable_)
|
||||
{
|
||||
|
@ -967,6 +966,8 @@ void tr_torrent::init(tr_ctor const& ctor)
|
|||
TR_ASSERT(session != nullptr);
|
||||
auto const lock = unique_lock();
|
||||
|
||||
auto const now_sec = tr_time();
|
||||
|
||||
queue_position_ = std::size(session->torrents());
|
||||
|
||||
on_metainfo_updated();
|
||||
|
@ -1000,7 +1001,7 @@ void tr_torrent::init(tr_ctor const& ctor)
|
|||
|
||||
mark_changed();
|
||||
|
||||
date_added_ = tr_time(); // this is a default that will be overwritten by the resume file
|
||||
date_added_ = now_sec; // this is a default that will be overwritten by the resume file
|
||||
|
||||
tr_resume::fields_t loaded = {};
|
||||
|
||||
|
@ -1100,6 +1101,12 @@ void tr_torrent::init(tr_ctor const& ctor)
|
|||
{
|
||||
set_local_error_if_files_disappeared(this, has_any_local_data);
|
||||
}
|
||||
|
||||
// Recover from the bug reported at https://github.com/transmission/transmission/issues/6899
|
||||
if (is_done() && date_done_ == time_t{})
|
||||
{
|
||||
date_done_ = now_sec;
|
||||
}
|
||||
}
|
||||
|
||||
void tr_torrent::set_metainfo(tr_torrent_metainfo tm)
|
||||
|
@ -1853,15 +1860,12 @@ void tr_torrent::recheck_completeness()
|
|||
bool const recent_change = bytes_downloaded_.during_this_session() != 0U;
|
||||
bool const was_running = is_running();
|
||||
|
||||
if (recent_change)
|
||||
{
|
||||
tr_logAddTraceTor(
|
||||
this,
|
||||
fmt::format(
|
||||
"State changed from {} to {}",
|
||||
get_completion_string(completeness_),
|
||||
get_completion_string(new_completeness)));
|
||||
}
|
||||
tr_logAddTraceTor(
|
||||
this,
|
||||
fmt::format(
|
||||
"State changed from {} to {}",
|
||||
get_completion_string(completeness_),
|
||||
get_completion_string(new_completeness)));
|
||||
|
||||
completeness_ = new_completeness;
|
||||
session->close_torrent_files(id());
|
||||
|
@ -1870,10 +1874,12 @@ void tr_torrent::recheck_completeness()
|
|||
{
|
||||
if (recent_change)
|
||||
{
|
||||
// https://www.bittorrent.org/beps/bep_0003.html
|
||||
// ...and one using completed is sent when the download is complete.
|
||||
// No completed is sent if the file was complete when started.
|
||||
tr_announcerTorrentCompleted(this);
|
||||
mark_changed();
|
||||
date_done_ = tr_time();
|
||||
}
|
||||
date_done_ = tr_time();
|
||||
|
||||
if (current_dir() == incomplete_dir())
|
||||
{
|
||||
|
@ -1886,6 +1892,7 @@ void tr_torrent::recheck_completeness()
|
|||
session->onTorrentCompletenessChanged(this, completeness_, was_running);
|
||||
|
||||
set_dirty();
|
||||
mark_changed();
|
||||
|
||||
if (is_done())
|
||||
{
|
||||
|
@ -2314,8 +2321,8 @@ void tr_torrent::set_download_dir(std::string_view path, bool is_new_torrent)
|
|||
else
|
||||
{
|
||||
completion_.set_has_all();
|
||||
date_done_ = date_added_;
|
||||
recheck_completeness();
|
||||
date_done_ = date_added_; // Must be after recheck_completeness()
|
||||
}
|
||||
}
|
||||
else if (error_.error_type() == TR_STAT_LOCAL_ERROR && !set_local_error_if_files_disappeared(this))
|
||||
|
|
|
@ -1095,7 +1095,7 @@ private:
|
|||
{
|
||||
n_secs += date_done_ - date_started_;
|
||||
}
|
||||
else if (date_done_ == 0)
|
||||
else if (date_done_ == time_t{})
|
||||
{
|
||||
n_secs += now - date_started_;
|
||||
}
|
||||
|
@ -1114,7 +1114,7 @@ private:
|
|||
{
|
||||
n_secs += now - date_done_;
|
||||
}
|
||||
else if (date_done_ != 0)
|
||||
else if (date_done_ != time_t{})
|
||||
{
|
||||
n_secs += now - date_started_;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue