BIND 10 trac2541, updated. 3666cb4d97d21903f1637796edab95bb466c213e [2541] Update in-code comment
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Dec 12 22:25:43 UTC 2012
The branch, trac2541 has been updated
via 3666cb4d97d21903f1637796edab95bb466c213e (commit)
via 42c5261913f5277e51be25a4e3de08223cf8949a (commit)
via fe8a9e7c2c315207cf643f27115a78e8b2b4eb7f (commit)
from f4c12ef1784ce3abe462de0328446ab5c7702339 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 3666cb4d97d21903f1637796edab95bb466c213e
Author: Jelte Jansen <jelte at isc.org>
Date: Wed Dec 12 23:25:29 2012 +0100
[2541] Update in-code comment
commit 42c5261913f5277e51be25a4e3de08223cf8949a
Author: Jelte Jansen <jelte at isc.org>
Date: Wed Dec 12 23:18:59 2012 +0100
[2541] Add two more tests to database_unittest
commit fe8a9e7c2c315207cf643f27115a78e8b2b4eb7f
Author: Jelte Jansen <jelte at isc.org>
Date: Wed Dec 12 22:57:29 2012 +0100
[2541] Use other fixture and startUpdateZone in locked test
-----------------------------------------------------------------------
Summary of changes:
src/lib/datasrc/database.cc | 7 +---
src/lib/datasrc/tests/database_unittest.cc | 31 ++++++++++++++
src/lib/datasrc/tests/sqlite3_accessor_unittest.cc | 43 +++++++++-----------
3 files changed, 53 insertions(+), 28 deletions(-)
-----------------------------------------------------------------------
diff --git a/src/lib/datasrc/database.cc b/src/lib/datasrc/database.cc
index 62da2e0..b65bc08 100644
--- a/src/lib/datasrc/database.cc
+++ b/src/lib/datasrc/database.cc
@@ -1397,11 +1397,8 @@ public:
logger.info(DATASRC_DATABASE_UPDATER_ROLLBACK)
.arg(zone_name_).arg(zone_class_).arg(db_name_);
} catch (const DataSourceError& e) {
- // We generally expect that rollback always succeeds, and
- // it should in fact succeed in a way we execute it. But
- // as the public API allows rollback() to fail and
- // throw, we should expect it. Obviously we cannot re-throw
- // it. The best we can do is to log it as a critical error.
+ // See The destructor ~TransactionHolder() for the
+ // reason to catch this.
logger.error(DATASRC_DATABASE_UPDATER_ROLLBACKFAIL)
.arg(zone_name_).arg(zone_class_).arg(db_name_)
.arg(e.what());
diff --git a/src/lib/datasrc/tests/database_unittest.cc b/src/lib/datasrc/tests/database_unittest.cc
index 294bdbf..32c3453 100644
--- a/src/lib/datasrc/tests/database_unittest.cc
+++ b/src/lib/datasrc/tests/database_unittest.cc
@@ -4103,6 +4103,7 @@ TYPED_TEST(DatabaseClientTest, createZone) {
const DataSourceClient::FindResult
zone(this->client_->findZone(new_name));
ASSERT_EQ(result::NOTFOUND, zone.code);
+
// The mock implementation does not do createZone,
// in which case it should throw NotImplemented (from
// the base class)
@@ -4120,4 +4121,34 @@ TYPED_TEST(DatabaseClientTest, createZone) {
}
}
+TYPED_TEST(DatabaseClientTest, createZoneRollbackOnLocked) {
+ // skip test for mock
+ if (this->is_mock_) {
+ return;
+ }
+
+ const Name new_name("example.com");
+ isc::datasrc::ZoneUpdaterPtr updater =
+ this->client_->getUpdater(isc::dns::Name(this->zname_), true);
+ ASSERT_THROW(this->client_->createZone(new_name), DataSourceError);
+ // createZone started a transaction as well, but since it failed,
+ // it should have been rolled back. Roll back the other one as
+ // well, and the next attempt should succeed
+ updater.reset();
+ ASSERT_TRUE(this->client_->createZone(new_name));
+}
+
+TYPED_TEST(DatabaseClientTest, createZoneRollbackOnExists) {
+ // skip test for mock
+ if (this->is_mock_) {
+ return;
+ }
+
+ const Name new_name("example.com");
+ ASSERT_FALSE(this->client_->createZone(this->zname_));
+ // createZone started a transaction, but since it failed,
+ // it should have been rolled back, and the next attempt should succeed
+ ASSERT_TRUE(this->client_->createZone(new_name));
+}
+
}
diff --git a/src/lib/datasrc/tests/sqlite3_accessor_unittest.cc b/src/lib/datasrc/tests/sqlite3_accessor_unittest.cc
index d45d672..dbe57a9 100644
--- a/src/lib/datasrc/tests/sqlite3_accessor_unittest.cc
+++ b/src/lib/datasrc/tests/sqlite3_accessor_unittest.cc
@@ -725,29 +725,6 @@ TEST_F(SQLite3Create, addZoneDifferentClass) {
EXPECT_EQ(new_zone_id_CH, accessor->getZone(zone_name).second);
}
-// Test addZone fails correctly if the entire db is locked
-TEST_F(SQLite3Create, addZoneWhileLocked) {
- const std::string zone_name("example.com.");
-
- boost::shared_ptr<SQLite3Accessor> accessor(
- new SQLite3Accessor(SQLITE_NEW_DBFILE, "IN"));
- accessor->startTransaction();
-
- // Manually make an exclusive lock
- sqlite3* db;
- ASSERT_EQ(SQLITE_OK, sqlite3_open(SQLITE_NEW_DBFILE, &db));
- sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", NULL, NULL, NULL);
-
- // addZone should throw exception that it is locket
- ASSERT_THROW(accessor->addZone(zone_name), DataSourceError);
-
- sqlite3_exec(db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
-
- // Despite commit, zone should not exist
- accessor->commit();
- EXPECT_FALSE(accessor->getZone(zone_name).first);
-}
-
TEST_F(SQLite3Create, emptytest) {
ASSERT_FALSE(isReadable(SQLITE_NEW_DBFILE));
@@ -1619,4 +1596,24 @@ TEST_F(SQLite3Update, addDiffWithUpdate) {
checkDiffs(expected_stored, accessor->getDiffs(zone_id, 1234, 1300));
}
+
+TEST_F(SQLite3Update, addZoneWhileLocked) {
+ const std::string existing_zone = "example.com.";
+ const std::string new_zone = "example2.com.";
+
+ // Start 'replacing' an existing zone, it should lock the db
+ zone_id = accessor->startUpdateZone(existing_zone, true).second;
+
+ // addZone should throw an exception that it is locked
+ another_accessor->startTransaction();
+ EXPECT_THROW(another_accessor->addZone(new_zone), DataSourceError);
+ // Commit should do nothing, but not fail
+ another_accessor->commit();
+
+ // New zone should not exist
+ EXPECT_FALSE(accessor->getZone(new_zone).first);
+
+ accessor->rollback();
+}
+
} // end anonymous namespace
More information about the bind10-changes
mailing list