Repository :
http://git.fedorahosted.org/cgit/firewalld-recode.git
On branch : master
---------------------------------------------------------------
commit fe19b51e257e951380db70f164be7da3e1dfbe9e
Author: Daniel Kopecek <dkopecek(a)redhat.com>
Date: Tue Oct 14 16:57:41 2014 +0200
Remove the transaction if the commit operation was successful
---------------------------------------------------------------
src/Daemon/Firewall/Backend.cpp | 19 +++++++++++++++++++
src/Daemon/Firewall/Backend.hpp | 3 ++-
src/Daemon/Firewall/Transaction.cpp | 10 ++++++++++
src/Daemon/Firewall/Transaction.hpp | 4 ++++
4 files changed, 35 insertions(+), 1 deletions(-)
diff --git a/src/Daemon/Firewall/Backend.cpp b/src/Daemon/Firewall/Backend.cpp
index 1dfb2ad..43dc1ae 100644
--- a/src/Daemon/Firewall/Backend.cpp
+++ b/src/Daemon/Firewall/Backend.cpp
@@ -40,6 +40,7 @@ namespace firewalld
for (size_t i = 0; i < transaction->countOperations(); ++i) {
processOperation(transaction->operation(i));
}
+ removeTransactionUnlocked(transaction->identifier());
} catch(const TransactionError& ex) {
// Undo completed operations
if (ex.rollbackNeeded()) {
@@ -54,6 +55,24 @@ namespace firewalld
return;
}
+ void Backend::removeTransaction(const String& identifier)
+ {
+ std::lock_guard<std::mutex> backend_lock(_backend_mutex);
+ removeTransactionUnlocked(identifier);
+ }
+
+ void Backend::removeTransactionUnlocked(const String& identifier)
+ {
+ size_t i = 0;
+ for (Pointer<const Transaction> member : _transactions) {
+ if (member->identifier() == identifier) {
+ _transactions.erase(_transactions.begin() + i);
+ return;
+ }
+ ++i;
+ }
+ }
+
size_t Backend::countTransactions() const
{
std::lock_guard<std::mutex> backend_lock(_backend_mutex);
diff --git a/src/Daemon/Firewall/Backend.hpp b/src/Daemon/Firewall/Backend.hpp
index 58298e8..97eb0ca 100644
--- a/src/Daemon/Firewall/Backend.hpp
+++ b/src/Daemon/Firewall/Backend.hpp
@@ -33,11 +33,12 @@ namespace firewalld
virtual const UString& identifier() const = 0;
Pointer<Transaction> createTransaction();
void commitTransaction(Pointer<Transaction> transaction);
- void removeTransaction(const UString& identifier);
+ void removeTransaction(const String& identifier);
size_t countTransactions() const;
protected:
virtual void processOperation(const UStringList& op, bool undo = false) = 0;
+ void removeTransactionUnlocked(const String& identifier);
private:
PointerVector<Transaction> _transactions;
diff --git a/src/Daemon/Firewall/Transaction.cpp b/src/Daemon/Firewall/Transaction.cpp
index 1505e69..b9f59f4 100644
--- a/src/Daemon/Firewall/Transaction.cpp
+++ b/src/Daemon/Firewall/Transaction.cpp
@@ -27,6 +27,11 @@ namespace firewalld
_identifier = identifier;
}
+ const String& Transaction::identifier() const
+ {
+ return _identifier;
+ }
+
const UStringList& Transaction::operation(size_t index) const
{
return _operations.at(index);
@@ -51,6 +56,11 @@ namespace firewalld
_operations.erase(_operations.begin() + index);
}
+ bool Transaction::operator==(const Transaction& rhs) const
+ {
+ return (_identifier == rhs._identifier);
+ }
+
TransactionError::TransactionError(Pointer<Transaction> transaction, size_t
failed_op_index, const UString& message)
: std::runtime_error("Transaction error")
{
diff --git a/src/Daemon/Firewall/Transaction.hpp b/src/Daemon/Firewall/Transaction.hpp
index 2978039..5b23a48 100644
--- a/src/Daemon/Firewall/Transaction.hpp
+++ b/src/Daemon/Firewall/Transaction.hpp
@@ -31,12 +31,16 @@ namespace firewalld
public:
Transaction(const String& identifier);
+ const String& identifier() const;
+
const UStringList& operation(size_t index) const;
size_t countOperations() const;
size_t appendOperation(const UStringList& op);
void removeOperation(size_t index);
+ bool operator==(const Transaction& rhs) const;
+
private:
String _identifier;
std::vector<UStringList> _operations;