Browse Source

[2850] Add a sync() method and make reset() and the destructor call it

This is so that checksums and such are synchronized.
Mukund Sivaraman 12 years ago
parent
commit
39fba2a15c

+ 29 - 18
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) {
@@ -279,27 +285,32 @@ ZoneTableSegmentMapped::reset(MemorySegmentOpenMode mode,
 }
 
 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<size_t*>(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<uint32_t*>(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();
     }

+ 5 - 0
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,