Skip to content

Commit 1ccd277

Browse files
committed
transaction: Store info about concurrently running transaction
If a transaction run fails because another transaction is running concurrently, record information about that transaction so it can be used later to generate a clearer error message.
1 parent ad6d5f5 commit 1ccd277

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

include/libdnf5/base/transaction.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#include "transaction_errors.hpp"
2525

26+
#include "libdnf5/base/active_transaction_info.hpp"
2627
#include "libdnf5/base/base_weak.hpp"
2728
#include "libdnf5/base/goal_elements.hpp"
2829
#include "libdnf5/base/log_event.hpp"
@@ -197,6 +198,9 @@ class LIBDNF_API Transaction {
197198
/// Retrieve captured RPM log messages
198199
std::vector<std::string> get_rpm_messages();
199200

201+
/// Retrieve metadat of concurrently running transaction
202+
const ActiveTransactionInfo * get_concurrent_transaction() const noexcept;
203+
200204
private:
201205
friend class TransactionEnvironment;
202206
friend class TransactionGroup;

libdnf5/base/transaction.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "transaction_package_impl.hpp"
3939
#include "utils/string.hpp"
4040

41+
#include "libdnf5/base/active_transaction_info.hpp"
4142
#include "libdnf5/base/base.hpp"
4243
#include "libdnf5/common/exception.hpp"
4344
#include "libdnf5/common/sack/exclude_flags.hpp"
@@ -954,6 +955,8 @@ Transaction::TransactionRunResult Transaction::Impl::_run(
954955
const std::optional<uint32_t> user_id,
955956
const std::string & comment,
956957
const bool test_only) {
958+
concurrent_transaction.reset();
959+
957960
// do not allow running a transaction multiple times
958961
if (history_db_id > 0) {
959962
return TransactionRunResult::ERROR_RERUN;
@@ -985,6 +988,8 @@ Transaction::TransactionRunResult Transaction::Impl::_run(
985988

986989
TransactionLocker transaction_locker(lock_file_path, info);
987990
if (!transaction_locker.write_lock()) {
991+
auto content = transaction_locker.read_content();
992+
concurrent_transaction = std::make_unique<ActiveTransactionInfo>(ActiveTransactionInfo::from_toml(content));
988993
return TransactionRunResult::ERROR_LOCK;
989994
}
990995
transaction_locker.write_transaction_metadata();
@@ -1605,4 +1610,8 @@ void Transaction::set_rpm_messages(std::vector<std::string> && rpm_messages) {
16051610
p_impl->set_rpm_messages(std::move(rpm_messages));
16061611
}
16071612

1613+
const ActiveTransactionInfo * Transaction::get_concurrent_transaction() const noexcept {
1614+
return p_impl->concurrent_transaction.get();
1615+
}
1616+
16081617
} // namespace libdnf5::base

libdnf5/base/transaction_impl.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#endif
2727
#include "rpm/solv/goal_private.hpp"
2828

29+
#include "libdnf5/base/active_transaction_info.hpp"
2930
#include "libdnf5/base/transaction.hpp"
3031
#include "libdnf5/base/transaction_environment.hpp"
3132
#include "libdnf5/base/transaction_group.hpp"
@@ -158,6 +159,10 @@ class Transaction::Impl {
158159
std::unordered_map<std::string, transaction::TransactionItemReason> rpm_reason_overrides;
159160
// Used during transaction replay to verify no extra packages were pulled into the transaction
160161
std::vector<std::tuple<std::unordered_set<std::string>, GoalJobSettings>> rpm_replays_nevra_cache;
162+
163+
// If a transaction run fails due to a concurrent transaction,
164+
// store information about that concurrent transaction.
165+
std::unique_ptr<base::ActiveTransactionInfo> concurrent_transaction{nullptr};
161166
};
162167

163168

0 commit comments

Comments
 (0)