Skip to content

Commit 1c39557

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 3a0d218 commit 1c39557

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"
@@ -191,6 +192,9 @@ class LIBDNF_API Transaction {
191192
/// Retrieve captured RPM log messages
192193
std::vector<std::string> get_rpm_messages();
193194

195+
/// Retrieve metadat of concurrently running transaction
196+
const ActiveTransactionInfo * get_concurrent_transaction() const noexcept;
197+
194198
private:
195199
friend class TransactionEnvironment;
196200
friend class TransactionGroup;

libdnf5/base/transaction.cpp

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

40+
#include "libdnf5/base/active_transaction_info.hpp"
4041
#include "libdnf5/base/base.hpp"
4142
#include "libdnf5/common/exception.hpp"
4243
#include "libdnf5/common/sack/exclude_flags.hpp"
@@ -953,6 +954,8 @@ Transaction::TransactionRunResult Transaction::Impl::_run(
953954
const std::optional<uint32_t> user_id,
954955
const std::string & comment,
955956
const bool test_only) {
957+
concurrent_transaction.reset();
958+
956959
// do not allow running a transaction multiple times
957960
if (history_db_id > 0) {
958961
return TransactionRunResult::ERROR_RERUN;
@@ -984,6 +987,8 @@ Transaction::TransactionRunResult Transaction::Impl::_run(
984987

985988
TransactionLocker transaction_locker(lock_file_path, info);
986989
if (!transaction_locker.write_lock()) {
990+
auto content = transaction_locker.read_content();
991+
concurrent_transaction = std::make_unique<ActiveTransactionInfo>(ActiveTransactionInfo::from_toml(content));
987992
return TransactionRunResult::ERROR_LOCK;
988993
}
989994
transaction_locker.write_transaction_metadata();
@@ -1588,4 +1593,8 @@ void Transaction::set_rpm_messages(std::vector<std::string> && rpm_messages) {
15881593
p_impl->set_rpm_messages(std::move(rpm_messages));
15891594
}
15901595

1596+
const ActiveTransactionInfo * Transaction::get_concurrent_transaction() const noexcept {
1597+
return p_impl->concurrent_transaction.get();
1598+
}
1599+
15911600
} // 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)