diff options
| author | Julian Andres Klode <jak@debian.org> | 2026-05-01 16:12:11 +0000 |
|---|---|---|
| committer | Julian Andres Klode <jak@debian.org> | 2026-05-01 16:12:11 +0000 |
| commit | 008936877d805ee2c1b7c8f6d22248bfdce4d05b (patch) | |
| tree | 8304452c120d49c678b19f624a165f8b8ff5245f | |
| parent | 9727b9faf3e033cd9c1c3fbd57df7017faf3cd5e (diff) | |
| parent | 244bf4d107d7f17eb7a21b036717a161618387ae (diff) | |
Merge branch 'apt-update-stuck' into 'main'
Fix issues that can lead to "apt update" being stuck with outdated lists
See merge request apt-team/apt!559
| -rw-r--r-- | apt-pkg/acquire-item.cc | 18 | ||||
| -rw-r--r-- | apt-pkg/acquire-item.h | 4 | ||||
| -rw-r--r-- | apt-pkg/acquire.cc | 4 |
3 files changed, 24 insertions, 2 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index 21ed7b242..b77bccc9d 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -870,6 +870,10 @@ std::string pkgAcquire::Item::ShortDesc() const /*{{{*/ return DescURI(); } /*}}}*/ +void pkgAcquire::Item::Cancelled() /*{{{*/ +{ +} + /*}}}*/ void pkgAcquire::Item::Finished() /*{{{*/ { } @@ -1334,7 +1338,7 @@ void pkgAcqMetaBase::CommitTransaction() switch (TransactionManager->State) { case TransactionStarted: break; - case TransactionAbort: _error->Fatal("Transaction %s was already committed and is now aborted", TransactionManager->Target.URI.c_str()); return; + case TransactionAbort: _error->Fatal("Transaction %s was already aborted and is now committed", TransactionManager->Target.URI.c_str()); return; case TransactionCommit: _error->Fatal("Transaction %s was already committed and is again committed", TransactionManager->Target.URI.c_str()); return; } TransactionManager->State = TransactionCommit; @@ -1344,8 +1348,12 @@ void pkgAcqMetaBase::CommitTransaction() for (std::vector<pkgAcqTransactionItem*>::iterator I = Transaction.begin(); I != Transaction.end(); ++I) { - (*I)->TransactionState(TransactionCommit); + if (*I != this) + (*I)->TransactionState(TransactionCommit); } + // commit ourselves last to not end up with fresh InRelease + // that doesn't match other files when killed mid-commit + TransactionState(TransactionCommit); Transaction.clear(); } /*}}}*/ @@ -2006,6 +2014,12 @@ string pkgAcqMetaClearSig::Custom600Headers() const return Header; } /*}}}*/ +void pkgAcqMetaClearSig::Cancelled() /*{{{*/ +{ + if (TransactionManager->State == TransactionStarted) + TransactionManager->AbortTransaction(); +} + /*}}}*/ void pkgAcqMetaClearSig::Finished() /*{{{*/ { if(_config->FindB("Debug::Acquire::Transaction", false) == true) diff --git a/apt-pkg/acquire-item.h b/apt-pkg/acquire-item.h index 5861d48be..1182e415e 100644 --- a/apt-pkg/acquire-item.h +++ b/apt-pkg/acquire-item.h @@ -253,6 +253,9 @@ class APT_PUBLIC pkgAcquire::Item : public WeakPointable /*{{{*/ */ virtual std::string ShortDesc() const; + /** \brief Invoked by the worker when the download is cancelled before completion. */ + virtual void Cancelled(); + /** \brief Invoked by the worker when the download is completely done. */ virtual void Finished(); @@ -575,6 +578,7 @@ class APT_HIDDEN pkgAcqMetaClearSig final : public pkgAcqMetaIndex bool VerifyDone(std::string const &Message, pkgAcquire::MethodConfig const *Cnf) override; void Done(std::string const &Message, HashStringList const &Hashes, pkgAcquire::MethodConfig const *Cnf) override; + void Cancelled() override; void Finished() override; /** \brief Starts downloading the individual index files. diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc index 95b6391cd..62d477f95 100644 --- a/apt-pkg/acquire.cc +++ b/apt-pkg/acquire.cc @@ -794,6 +794,10 @@ stop: for (Queue *I = Queues; I != 0; I = I->Next) I->Shutdown(false); + if (WasCancelled) + for (ItemIterator I = Items.begin(); I != Items.end(); ++I) + (*I)->Cancelled(); + // Shut down the items for (auto &Item : Items) Item->Finished(); |
