summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2026-05-01 16:12:11 +0000
committerJulian Andres Klode <jak@debian.org>2026-05-01 16:12:11 +0000
commit008936877d805ee2c1b7c8f6d22248bfdce4d05b (patch)
tree8304452c120d49c678b19f624a165f8b8ff5245f
parent9727b9faf3e033cd9c1c3fbd57df7017faf3cd5e (diff)
parent244bf4d107d7f17eb7a21b036717a161618387ae (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.cc18
-rw-r--r--apt-pkg/acquire-item.h4
-rw-r--r--apt-pkg/acquire.cc4
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();