Browse Source

Merge pull request #17885 from Chocobo1/shutdown

Revise "save resume data" handling on shutdown
adaptive-webui-19844
Chocobo1 2 years ago committed by GitHub
parent
commit
dcfd367ff8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 48
      src/base/bittorrent/sessionimpl.cpp
  2. 1
      src/base/bittorrent/sessionimpl.h
  3. 9
      src/base/bittorrent/torrentimpl.cpp

48
src/base/bittorrent/sessionimpl.cpp

@ -1030,11 +1030,12 @@ void SessionImpl::setGlobalMaxSeedingMinutes(int minutes)
// Main destructor // Main destructor
SessionImpl::~SessionImpl() SessionImpl::~SessionImpl()
{ {
saveStatistics(); // Do some bittorrent related saving
// After this, (ideally) no more important alerts will be generated/handled
// Do some BT related saving
saveResumeData(); saveResumeData();
saveStatistics();
// We must delete FilterParserThread // We must delete FilterParserThread
// before we delete lt::session // before we delete lt::session
delete m_filterParser; delete m_filterParser;
@ -2444,6 +2445,12 @@ void SessionImpl::handleTorrentSaveResumeDataRequested(const TorrentImpl *torren
++m_numResumeData; ++m_numResumeData;
} }
void SessionImpl::handleTorrentSaveResumeDataFailed(const TorrentImpl *torrent)
{
Q_UNUSED(torrent);
--m_numResumeData;
}
QVector<Torrent *> SessionImpl::torrents() const QVector<Torrent *> SessionImpl::torrents() const
{ {
QVector<Torrent *> result; QVector<Torrent *> result;
@ -2892,29 +2899,38 @@ void SessionImpl::saveResumeData()
++m_numResumeData; ++m_numResumeData;
} }
QElapsedTimer timer;
timer.start();
while (m_numResumeData > 0) while (m_numResumeData > 0)
{ {
const std::vector<lt::alert *> alerts = getPendingAlerts(lt::seconds {30}); const lt::seconds waitTime {5};
if (alerts.empty()) const lt::seconds expireTime {30};
const std::vector<lt::alert *> alerts = getPendingAlerts(waitTime);
bool hasWantedAlert = false;
for (const lt::alert *a : alerts)
{ {
LogMsg(tr("Aborted saving resume data. Number of outstanding torrents: %1").arg(QString::number(m_numResumeData)) if (const int alertType = a->type();
, Log::CRITICAL); (alertType == lt::save_resume_data_alert::alert_type)
break; || (alertType == lt::save_resume_data_failed_alert::alert_type))
{
hasWantedAlert = true;
handleAlert(a);
}
} }
for (const lt::alert *a : alerts) if (hasWantedAlert)
{ {
switch (a->type()) timer.start();
}
else if (timer.hasExpired(lt::total_milliseconds(expireTime)))
{ {
case lt::save_resume_data_failed_alert::alert_type: LogMsg(tr("Aborted saving resume data. Number of outstanding torrents: %1").arg(QString::number(m_numResumeData))
--m_numResumeData; , Log::CRITICAL);
break;
case lt::save_resume_data_alert::alert_type:
dispatchTorrentAlert(static_cast<const lt::torrent_alert *>(a));
break; break;
} }
} }
}
} }
void SessionImpl::saveTorrentsQueue() const void SessionImpl::saveTorrentsQueue() const

1
src/base/bittorrent/sessionimpl.h

@ -410,6 +410,7 @@ namespace BitTorrent
// Torrent interface // Torrent interface
void handleTorrentNeedSaveResumeData(const TorrentImpl *torrent); void handleTorrentNeedSaveResumeData(const TorrentImpl *torrent);
void handleTorrentSaveResumeDataRequested(const TorrentImpl *torrent); void handleTorrentSaveResumeDataRequested(const TorrentImpl *torrent);
void handleTorrentSaveResumeDataFailed(const TorrentImpl *torrent);
void handleTorrentShareLimitChanged(TorrentImpl *const torrent); void handleTorrentShareLimitChanged(TorrentImpl *const torrent);
void handleTorrentNameChanged(TorrentImpl *const torrent); void handleTorrentNameChanged(TorrentImpl *const torrent);
void handleTorrentSavePathChanged(TorrentImpl *const torrent); void handleTorrentSavePathChanged(TorrentImpl *const torrent);

9
src/base/bittorrent/torrentimpl.cpp

@ -1949,8 +1949,13 @@ void TorrentImpl::prepareResumeData(const lt::add_torrent_params &params)
void TorrentImpl::handleSaveResumeDataFailedAlert(const lt::save_resume_data_failed_alert *p) void TorrentImpl::handleSaveResumeDataFailedAlert(const lt::save_resume_data_failed_alert *p)
{ {
Q_UNUSED(p); if (p->error != lt::errors::resume_data_not_modified)
Q_ASSERT_X(false, Q_FUNC_INFO, "This point should be unreachable since libtorrent 1.2.11"); {
LogMsg(tr("Generate resume data failed. Torrent: \"%1\". Reason: \"%2\"")
.arg(name(), QString::fromLocal8Bit(p->error.message().c_str())), Log::CRITICAL);
}
m_session->handleTorrentSaveResumeDataFailed(this);
} }
void TorrentImpl::handleFastResumeRejectedAlert(const lt::fastresume_rejected_alert *p) void TorrentImpl::handleFastResumeRejectedAlert(const lt::fastresume_rejected_alert *p)

Loading…
Cancel
Save