From: Mukund Sivaraman Date: Mon, 6 May 2013 08:24:22 +0000 (+0530) Subject: [2850] Add a sync() method and make reset() and the destructor call it X-Git-Tag: bind10-1.2.0beta1-release~467^2~38 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=39fba2a15cb200dbe77ae3c9a4d894496f9eee66;p=thirdparty%2Fkea.git [2850] Add a sync() method and make reset() and the destructor call it This is so that checksums and such are synchronized. --- diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.cc b/src/lib/datasrc/memory/zone_table_segment_mapped.cc index 48e1a669b7..d7ef8e2226 100644 --- a/src/lib/datasrc/memory/zone_table_segment_mapped.cc +++ b/src/lib/datasrc/memory/zone_table_segment_mapped.cc @@ -41,6 +41,10 @@ ZoneTableSegmentMapped::ZoneTableSegmentMapped(const RRClass& rrclass) : { } +ZoneTableSegmentMapped::~ZoneTableSegmentMapped() { + sync(); +} + bool ZoneTableSegmentMapped::processChecksum(MemorySegmentMapped& segment, bool create, @@ -259,6 +263,8 @@ ZoneTableSegmentMapped::reset(MemorySegmentOpenMode mode, // mapped file. We cannot do this in many mode combinations // unless we close the existing mapped file. So just close it. clear(); + } else { + sync(); } switch (mode) { @@ -278,28 +284,33 @@ ZoneTableSegmentMapped::reset(MemorySegmentOpenMode mode, current_filename_ = filename; } +void +ZoneTableSegmentMapped::sync() +{ + // Synchronize checksum, etc. + if (mem_sgmt_ && isWritable()) { + // If there is a previously opened segment, and it was opened in + // read-write mode, update its checksum. + mem_sgmt_->shrinkToFit(); + const MemorySegment::NamedAddressResult result = + mem_sgmt_->getNamedAddress(ZONE_TABLE_CHECKSUM_NAME); + assert(result.first); + assert(result.second); + size_t* checksum = static_cast(result.second); + // First, clear the checksum so that getCheckSum() returns a + // consistent value. + *checksum = 0; + const size_t new_checksum = mem_sgmt_->getCheckSum(); + // Now, update it into place. + *checksum = new_checksum; + } +} + void ZoneTableSegmentMapped::clear() { if (mem_sgmt_) { - if (isWritable()) { - // If there is a previously opened segment, and it was - // opened in read-write mode, update its checksum. - mem_sgmt_->shrinkToFit(); - const MemorySegment::NamedAddressResult result = - mem_sgmt_->getNamedAddress(ZONE_TABLE_CHECKSUM_NAME); - assert(result.first); - assert(result.second); - uint32_t* checksum = static_cast(result.second); - // First, clear the checksum so that getCheckSum() returns - // a consistent value. - *checksum = 0; - const uint32_t new_checksum = mem_sgmt_->getCheckSum(); - // Now, update it into place. - *checksum = new_checksum; - } - // Close the segment here in case the code further below - // doesn't complete successfully. + sync(); header_ = NULL; mem_sgmt_.reset(); } diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.h b/src/lib/datasrc/memory/zone_table_segment_mapped.h index 2206630f45..208070c61c 100644 --- a/src/lib/datasrc/memory/zone_table_segment_mapped.h +++ b/src/lib/datasrc/memory/zone_table_segment_mapped.h @@ -43,6 +43,9 @@ protected: ZoneTableSegmentMapped(const isc::dns::RRClass& rrclass); public: + /// \brief Destructor + virtual ~ZoneTableSegmentMapped(); + /// \brief Return the ZoneTableHeader for the mapped zone table /// segment implementation. /// @@ -105,6 +108,8 @@ public: virtual void clear(); private: + void sync(); + bool processChecksum(isc::util::MemorySegmentMapped& segment, bool create, std::string& error_msg); bool processHeader(isc::util::MemorySegmentMapped& segment, bool create,