Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
db38a4b
sm: nftables: return added-rule handles from Commit
Jul 2, 2026
c9b0b83
sm: networkmanager: bandwidth clear removes only the IFB device
Jul 2, 2026
c2e389c
sm: database: implement networkmanager storage transactions
Jul 23, 2026
17ff588
sm: networkmanager: firewall: implement batch apply and revert
Jul 23, 2026
954f60b
sm: networkmanager: trafficmonitor: implement batch apply and revert
Jul 23, 2026
2cd0fb0
sm: networkmanager: update bandwidth tests for IFB-only clear
Jul 23, 2026
53e39f9
sm: networkmanager: test firewall batch apply and revert
Jul 23, 2026
6ad8a54
sm: networkmanager: test traffic monitor batch apply and revert
Jul 23, 2026
ceb3171
sm: database: test networkmanager storage transactions
Jul 23, 2026
0e6f08a
sm: networkmanager: firewall: implement batch abort
Jul 23, 2026
5d3c241
sm: networkmanager: trafficmonitor: implement batch abort
Jul 23, 2026
7ae16ad
sm: networkmanager: trafficmonitor: drop staged state on failed flush
Jul 23, 2026
e09f3e9
sm: networkmanager: test traffic monitor state drop on failed flush
Jul 23, 2026
9007598
sm: nftables: return added rules with handles from Commit
Jul 23, 2026
1490364
sm: networkmanager: firewall: delete instance jumps by captured handle
Jul 23, 2026
9c13b7d
sm: networkmanager: trafficmonitor: delete instance jumps by captured…
Jul 23, 2026
c1bb464
sm: networkmanager: update firewall/traffic tests for handle-based te…
Jul 23, 2026
d5d46b5
sm: nftables: compile rule-parse regexes once
Jul 23, 2026
f737704
sm: nftables: parse only jump rules from batch Commit
Jul 24, 2026
34a49f6
sm: networkmanager: drop redundant lock_guard template argument
Aug 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions src/sm/database/database.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -812,6 +812,57 @@
return ErrorEnum::eNone;
}

Error Database::BeginTransaction()
{
std::lock_guard lock {mMutex};

LOG_DBG() << "Begin transaction";

try {
if (!mSession->isTransaction()) {
mSession->begin();
}
} catch (const std::exception& e) {

Check warning on line 825 in src/sm/database/database.cpp

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Catch a more specific exception instead of a generic one.

See more on https://sonarcloud.io/project/issues?id=aosedge_aos_core_cpp&issues=AZ-TwxQ4rjPsJWpG8TMT&open=AZ-TwxQ4rjPsJWpG8TMT&pullRequest=279
return AOS_ERROR_WRAP(common::utils::ToAosError(e));
}

return ErrorEnum::eNone;
}

Error Database::CommitTransaction()
{
std::lock_guard lock {mMutex};

LOG_DBG() << "Commit transaction";

try {
if (mSession->isTransaction()) {
mSession->commit();
}
} catch (const std::exception& e) {

Check warning on line 842 in src/sm/database/database.cpp

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Catch a more specific exception instead of a generic one.

See more on https://sonarcloud.io/project/issues?id=aosedge_aos_core_cpp&issues=AZ-TwxQ4rjPsJWpG8TMU&open=AZ-TwxQ4rjPsJWpG8TMU&pullRequest=279
return AOS_ERROR_WRAP(common::utils::ToAosError(e));
}

return ErrorEnum::eNone;
}

Error Database::RollbackTransaction()
{
std::lock_guard lock {mMutex};

LOG_DBG() << "Rollback transaction";

try {
if (mSession->isTransaction()) {
mSession->rollback();
}
} catch (const std::exception& e) {

Check warning on line 859 in src/sm/database/database.cpp

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Catch a more specific exception instead of a generic one.

See more on https://sonarcloud.io/project/issues?id=aosedge_aos_core_cpp&issues=AZ-TwxQ4rjPsJWpG8TMV&open=AZ-TwxQ4rjPsJWpG8TMV&pullRequest=279
return AOS_ERROR_WRAP(common::utils::ToAosError(e));
}

return ErrorEnum::eNone;
}

Error Database::AddInstanceNetworkInfo(const sm::networkmanager::InstanceNetworkInfo& info)
{
std::lock_guard lock {mMutex};
Expand Down
22 changes: 22 additions & 0 deletions src/sm/database/database.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

namespace aos::sm::database {

class Database : public DatabaseItf, public sm::alerts::StorageItf {

Check warning on line 26 in src/sm/database/database.hpp

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Class has 38 methods, which is greater than the 35 authorized. Split it into smaller classes.

See more on https://sonarcloud.io/project/issues?id=aosedge_aos_core_cpp&issues=AZ-TwxOcrjPsJWpG8TMS&open=AZ-TwxOcrjPsJWpG8TMS&pullRequest=279
public:
/**
* Creates database instance.
Expand Down Expand Up @@ -208,6 +208,28 @@
*/
Error RemoveTrafficMonitorData(const String& chain) override;

/**
* Begins a SQLite transaction so subsequent writes commit together (one
* fsync) on CommitTransaction.
*
* @return Error.
*/
Error BeginTransaction() override;

/**
* Commits the current SQLite transaction.
*
* @return Error.
*/
Error CommitTransaction() override;

/**
* Rolls back the current SQLite transaction, discarding its writes.
*
* @return Error.
*/
Error RollbackTransaction() override;

// sm::alerts::StorageItf interface

/**
Expand Down
96 changes: 96 additions & 0 deletions src/sm/database/tests/database.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,102 @@ TEST_F(DatabaseTest, SetUpdateAndRemoveTrafficMonitorDataSucceeds)
ASSERT_TRUE(mDB.GetTrafficMonitorData(chain, resTime, resValue).Is(aos::ErrorEnum::eNotFound));
}

TEST_F(DatabaseTest, TransactionCommitPersistsWrites)
{
ASSERT_TRUE(mDB.Init(mWorkingDir.string(), mMigrationConfig).IsNone());

aos::sm::networkmanager::InstanceNetworkInfo info1;
info1.mInstanceID = "instance-1";
info1.mNetworkID = "network-1";
info1.mHostIfName = "veth-initial";

aos::sm::networkmanager::InstanceNetworkInfo info2;
info2.mInstanceID = "instance-2";
info2.mNetworkID = "network-2";

ASSERT_TRUE(mDB.BeginTransaction().IsNone());

ASSERT_TRUE(mDB.AddInstanceNetworkInfo(info1).IsNone());

info1.mHostIfName = "veth-updated";

ASSERT_TRUE(mDB.UpdateInstanceNetworkInfo(info1).IsNone());
ASSERT_TRUE(mDB.AddInstanceNetworkInfo(info2).IsNone());

ASSERT_TRUE(mDB.CommitTransaction().IsNone());

aos::StaticArray<aos::sm::networkmanager::InstanceNetworkInfo, 2> result;

ASSERT_TRUE(mDB.GetInstanceNetworksInfo(result).IsNone());

ASSERT_EQ(result.Size(), 2);

EXPECT_EQ(result[0].mInstanceID, info1.mInstanceID);
EXPECT_EQ(result[0].mHostIfName, info1.mHostIfName);
EXPECT_EQ(result[1].mInstanceID, info2.mInstanceID);
}

TEST_F(DatabaseTest, TransactionRollbackDiscardsWrites)
{
ASSERT_TRUE(mDB.Init(mWorkingDir.string(), mMigrationConfig).IsNone());

aos::sm::networkmanager::InstanceNetworkInfo committed;
committed.mInstanceID = "instance-0";
committed.mNetworkID = "network-0";

ASSERT_TRUE(mDB.AddInstanceNetworkInfo(committed).IsNone());

aos::sm::networkmanager::InstanceNetworkInfo staged;
staged.mInstanceID = "instance-1";
staged.mNetworkID = "network-1";

ASSERT_TRUE(mDB.BeginTransaction().IsNone());

ASSERT_TRUE(mDB.AddInstanceNetworkInfo(staged).IsNone());
ASSERT_TRUE(mDB.SetTrafficMonitorData("chain", aos::Time::Now(), 100).IsNone());

ASSERT_TRUE(mDB.RollbackTransaction().IsNone());

aos::StaticArray<aos::sm::networkmanager::InstanceNetworkInfo, 2> result;

ASSERT_TRUE(mDB.GetInstanceNetworksInfo(result).IsNone());

ASSERT_EQ(result.Size(), 1);
EXPECT_EQ(result[0].mInstanceID, committed.mInstanceID);

aos::Time resTime;
uint64_t resValue = 0;

EXPECT_TRUE(mDB.GetTrafficMonitorData("chain", resTime, resValue).Is(aos::ErrorEnum::eNotFound));
}

TEST_F(DatabaseTest, TransactionCommitAndRollbackWithoutBeginAreNoOp)
{
ASSERT_TRUE(mDB.Init(mWorkingDir.string(), mMigrationConfig).IsNone());

EXPECT_TRUE(mDB.CommitTransaction().IsNone());
EXPECT_TRUE(mDB.RollbackTransaction().IsNone());

aos::sm::networkmanager::InstanceNetworkInfo info;
info.mInstanceID = "instance-1";
info.mNetworkID = "network-1";

ASSERT_TRUE(mDB.AddInstanceNetworkInfo(info).IsNone());

ASSERT_TRUE(mDB.BeginTransaction().IsNone());
ASSERT_TRUE(mDB.CommitTransaction().IsNone());

EXPECT_TRUE(mDB.CommitTransaction().IsNone());
EXPECT_TRUE(mDB.RollbackTransaction().IsNone());

aos::StaticArray<aos::sm::networkmanager::InstanceNetworkInfo, 1> result;

ASSERT_TRUE(mDB.GetInstanceNetworksInfo(result).IsNone());

ASSERT_EQ(result.Size(), 1);
EXPECT_EQ(result[0].mInstanceID, info.mInstanceID);
}

/***********************************************************************************************************************
* Tests - alerts::StorageItf
**********************************************************************************************************************/
Expand Down
26 changes: 4 additions & 22 deletions src/sm/networkmanager/bandwidth.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,31 +122,13 @@ Error Bandwidth::Clear(const String& ifName)
{
LOG_DBG() << "Clear bandwidth" << Log::Field("ifName", ifName);

Error err;

if (auto rootErr = mTC->DelRootTBFQDisc(ifName); !rootErr.IsNone()) {
LOG_ERR() << "Failed to delete root TBF qdisc" << Log::Field(rootErr);

err = AOS_ERROR_WRAP(rootErr);
}

if (auto ingErr = mTC->DelIngressQDisc(ifName); !ingErr.IsNone()) {
LOG_ERR() << "Failed to delete ingress qdisc" << Log::Field(ingErr);

if (err.IsNone()) {
err = AOS_ERROR_WRAP(ingErr);
}
}

if (auto ifbErr = mIfMgr->DeleteLink(IFBName(ifName)); !ifbErr.IsNone() && !ifbErr.Is(ErrorEnum::eNotFound)) {
LOG_ERR() << "Failed to delete IFB" << Log::Field(ifbErr);
if (auto err = mIfMgr->DeleteLink(IFBName(ifName)); !err.IsNone() && !err.Is(ErrorEnum::eNotFound)) {
LOG_ERR() << "Failed to delete IFB" << Log::Field(err);

if (err.IsNone()) {
err = AOS_ERROR_WRAP(ifbErr);
}
return AOS_ERROR_WRAP(err);
}

return err;
return ErrorEnum::eNone;
}

/***********************************************************************************************************************
Expand Down
Loading
Loading