From: Mukund Sivaraman Date: Thu, 18 Oct 2012 05:21:47 +0000 (+0530) Subject: [2208] Update InMemoryClient to take a ZoneTableSegment in its constructor X-Git-Tag: trac2487_base~21^2~8^2~8^2~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8334de9f905bc792b0ec866a03a2dde05e5330fe;p=thirdparty%2Fkea.git [2208] Update InMemoryClient to take a ZoneTableSegment in its constructor --- diff --git a/src/lib/datasrc/memory/memory_client.cc b/src/lib/datasrc/memory/memory_client.cc index 2f5fe67d97..0b754b1612 100644 --- a/src/lib/datasrc/memory/memory_client.cc +++ b/src/lib/datasrc/memory/memory_client.cc @@ -42,12 +42,14 @@ using namespace std; using namespace isc::dns; using namespace isc::dns::rdata; using namespace isc::datasrc::memory; +using namespace isc::util; namespace isc { namespace datasrc { namespace memory { using detail::SegmentObjectHolder; +using boost::shared_ptr; namespace { // unnamed namespace @@ -64,25 +66,20 @@ public: } // end of unnamed namespace -InMemoryClient::InMemoryClient(util::MemorySegment& mem_sgmt, +InMemoryClient::InMemoryClient(shared_ptr zone_table_segment, RRClass rrclass) : - mem_sgmt_(mem_sgmt), + zone_table_segment_(zone_table_segment), rrclass_(rrclass), - zone_count_(0) + zone_count_(0), + file_name_tree_(FileNameTree::create( + zone_table_segment_->getMemorySegment(), false)) { - SegmentObjectHolder holder( - mem_sgmt_, ZoneTable::create(mem_sgmt_, rrclass), rrclass_); - - file_name_tree_ = FileNameTree::create(mem_sgmt_, false); - - zone_table_ = holder.release(); } InMemoryClient::~InMemoryClient() { + MemorySegment& mem_sgmt = zone_table_segment_->getMemorySegment(); FileNameDeleter deleter; - FileNameTree::destroy(mem_sgmt_, file_name_tree_, deleter); - - ZoneTable::destroy(mem_sgmt_, zone_table_, rrclass_); + FileNameTree::destroy(mem_sgmt, file_name_tree_, deleter); } result::Result @@ -90,8 +87,9 @@ InMemoryClient::loadInternal(const isc::dns::Name& zone_name, const std::string& filename, ZoneData* zone_data) { + MemorySegment& mem_sgmt = zone_table_segment_->getMemorySegment(); SegmentObjectHolder holder( - mem_sgmt_, zone_data, rrclass_); + mem_sgmt, zone_data, rrclass_); LOG_DEBUG(logger, DBG_TRACE_BASIC, DATASRC_MEMORY_MEM_ADD_ZONE). arg(zone_name).arg(rrclass_); @@ -99,7 +97,7 @@ InMemoryClient::loadInternal(const isc::dns::Name& zone_name, // Set the filename in file_name_tree_ now, so that getFileName() // can use it (during zone reloading). FileNameNode* node(NULL); - switch (file_name_tree_->insert(mem_sgmt_, zone_name, &node)) { + switch (file_name_tree_->insert(mem_sgmt, zone_name, &node)) { case FileNameTree::SUCCESS: case FileNameTree::ALREADYEXISTS: // These are OK @@ -114,9 +112,10 @@ InMemoryClient::loadInternal(const isc::dns::Name& zone_name, const std::string* tstr = node->setData(new std::string(filename)); delete tstr; - const ZoneTable::AddResult result(zone_table_->addZone(mem_sgmt_, rrclass_, - zone_name, - holder.release())); + ZoneTable* zone_table = zone_table_segment_->getHeader().getTable(); + const ZoneTable::AddResult result(zone_table->addZone(mem_sgmt, rrclass_, + zone_name, + holder.release())); if (result.code == result::SUCCESS) { // Only increment the zone count if the zone doesn't already // exist. @@ -124,7 +123,7 @@ InMemoryClient::loadInternal(const isc::dns::Name& zone_name, } // Destroy the old instance of the zone if there was any if (result.zone_data != NULL) { - ZoneData::destroy(mem_sgmt_, result.zone_data, rrclass_); + ZoneData::destroy(mem_sgmt, result.zone_data, rrclass_); } return (result.code); @@ -145,7 +144,8 @@ InMemoryClient::findZone(const isc::dns::Name& zone_name) const { LOG_DEBUG(logger, DBG_TRACE_DATA, DATASRC_MEMORY_MEM_FIND_ZONE).arg(zone_name); - ZoneTable::FindResult result(zone_table_->findZone(zone_name)); + const ZoneTable* zone_table = zone_table_segment_->getHeader().getTable(); + ZoneTable::FindResult result(zone_table->findZone(zone_name)); ZoneFinderPtr finder; if (result.code != result::NOTFOUND) { @@ -157,7 +157,8 @@ InMemoryClient::findZone(const isc::dns::Name& zone_name) const { const ZoneData* InMemoryClient::findZoneData(const isc::dns::Name& zone_name) { - ZoneTable::FindResult result(zone_table_->findZone(zone_name)); + const ZoneTable* zone_table = zone_table_segment_->getHeader().getTable(); + ZoneTable::FindResult result(zone_table->findZone(zone_name)); return (result.zone_data); } @@ -168,14 +169,16 @@ InMemoryClient::load(const isc::dns::Name& zone_name, LOG_DEBUG(logger, DBG_TRACE_BASIC, DATASRC_MEMORY_MEM_LOAD).arg(zone_name). arg(filename); - ZoneData* zone_data = loadZoneData(mem_sgmt_, rrclass_, zone_name, + MemorySegment& mem_sgmt = zone_table_segment_->getMemorySegment(); + ZoneData* zone_data = loadZoneData(mem_sgmt, rrclass_, zone_name, filename); return (loadInternal(zone_name, filename, zone_data)); } result::Result InMemoryClient::load(const isc::dns::Name& zone_name, ZoneIterator& iterator) { - ZoneData* zone_data = loadZoneData(mem_sgmt_, rrclass_, zone_name, + MemorySegment& mem_sgmt = zone_table_segment_->getMemorySegment(); + ZoneData* zone_data = loadZoneData(mem_sgmt, rrclass_, zone_name, iterator); return (loadInternal(zone_name, string(), zone_data)); } @@ -306,7 +309,8 @@ public: ZoneIteratorPtr InMemoryClient::getIterator(const Name& name, bool separate_rrs) const { - ZoneTable::FindResult result(zone_table_->findZone(name)); + const ZoneTable* zone_table = zone_table_segment_->getHeader().getTable(); + ZoneTable::FindResult result(zone_table->findZone(name)); if (result.code != result::SUCCESS) { isc_throw(DataSourceError, "No such zone: " + name.toText()); } diff --git a/src/lib/datasrc/memory/memory_client.h b/src/lib/datasrc/memory/memory_client.h index 3313c5bc77..b3417d2616 100644 --- a/src/lib/datasrc/memory/memory_client.h +++ b/src/lib/datasrc/memory/memory_client.h @@ -20,8 +20,11 @@ #include #include #include +#include #include +#include + #include namespace isc { @@ -60,7 +63,7 @@ public: /// This constructor internally involves resource allocation, and if /// it fails, a corresponding standard exception will be thrown. /// It never throws an exception otherwise. - InMemoryClient(util::MemorySegment& mem_sgmt, + InMemoryClient(boost::shared_ptr zone_table_segment, isc::dns::RRClass rrclass); /// The destructor. @@ -186,10 +189,9 @@ private: const std::string& filename, ZoneData* zone_data); - util::MemorySegment& mem_sgmt_; + boost::shared_ptr zone_table_segment_; const isc::dns::RRClass rrclass_; unsigned int zone_count_; - ZoneTable* zone_table_; FileNameTree* file_name_tree_; }; diff --git a/src/lib/datasrc/tests/memory/memory_client_unittest.cc b/src/lib/datasrc/tests/memory/memory_client_unittest.cc index 8785a107df..e6a53db807 100644 --- a/src/lib/datasrc/tests/memory/memory_client_unittest.cc +++ b/src/lib/datasrc/tests/memory/memory_client_unittest.cc @@ -36,16 +36,21 @@ #include #include "memory_segment_test.h" +#include "zone_table_segment_test.h" #include +#include + #include // for bad_alloc +using namespace isc::data; using namespace isc::dns; using namespace isc::dns::rdata; using namespace isc::datasrc; using namespace isc::datasrc::memory; using namespace isc::testutils; +using boost::shared_ptr; using std::vector; namespace { @@ -156,20 +161,22 @@ public: class MemoryClientTest : public ::testing::Test { protected: MemoryClientTest() : zclass_(RRClass::IN()), - client_(new InMemoryClient(mem_sgmt_, zclass_)) + segment_(new test::ZoneTableSegmentTest( + zclass_, mem_sgmt_)), + client_(new InMemoryClient(segment_, zclass_)) {} ~MemoryClientTest() { - if (client_ != NULL) { - delete client_; - } + delete client_; } void TearDown() { delete client_; client_ = NULL; + segment_.reset(); EXPECT_TRUE(mem_sgmt_.allMemoryDeallocated()); // catch any leak here. } const RRClass zclass_; test::MemorySegmentTest mem_sgmt_; + shared_ptr segment_; InMemoryClient* client_; }; @@ -292,11 +299,15 @@ TEST_F(MemoryClientTest, loadMemoryAllocationFailures) { SCOPED_TRACE("For throw count = " + i); mem_sgmt_.setThrowCount(i); EXPECT_THROW({ + shared_ptr ztable_segment( + new test::ZoneTableSegmentTest( + zclass_, mem_sgmt_)); + // Include the InMemoryClient construction too here. Now, // even allocations done from InMemoryClient constructor // fail (due to MemorySegmentTest throwing) and we check for // leaks when this happens. - InMemoryClient client2(mem_sgmt_, zclass_); + InMemoryClient client2(ztable_segment, zclass_); client2.load(Name("example.org"), TEST_DATA_DIR "/example.org.zone"); }, std::bad_alloc);