Browse Source

[2268] Use a single NSEC3Hash instance inside ZoneDataUpdater

Mukund Sivaraman 12 years ago
parent
commit
23d2eaf5f8

+ 17 - 7
src/lib/datasrc/memory/zone_data_updater.cc

@@ -16,7 +16,6 @@
 #include <datasrc/zone.h>
 
 #include <dns/rdataclass.h>
-#include <dns/nsec3hash.h>
 
 #include <boost/scoped_ptr.hpp>
 
@@ -231,6 +230,22 @@ ZoneDataUpdater::validate(const isc::dns::ConstRRsetPtr rrset) const {
     }
 }
 
+const NSEC3Hash*
+ZoneDataUpdater::getNSEC3Hash() {
+    if (hash_ == NULL) {
+        NSEC3Data* nsec3_data = zone_data_.getNSEC3Data();
+        // This should never be NULL in this codepath.
+        assert(nsec3_data != NULL);
+
+        hash_ = NSEC3Hash::create(nsec3_data->hashalg,
+                                  nsec3_data->iterations,
+                                  nsec3_data->getSaltData(),
+                                  nsec3_data->getSaltLen());
+    }
+
+    return (hash_);
+}
+
 template <typename T>
 void
 ZoneDataUpdater::setupNSEC3(const ConstRRsetPtr rrset) {
@@ -245,12 +260,7 @@ ZoneDataUpdater::setupNSEC3(const ConstRRsetPtr rrset) {
         zone_data_.setNSEC3Data(nsec3_data);
         zone_data_.setSigned(true);
     } else {
-        const boost::scoped_ptr<NSEC3Hash> hash
-            (NSEC3Hash::create(nsec3_data->hashalg,
-                               nsec3_data->iterations,
-                               nsec3_data->getSaltData(),
-                               nsec3_data->getSaltLen()));
-
+        const NSEC3Hash* hash = getNSEC3Hash();
         if (!hash->match(nsec3_rdata)) {
             isc_throw(AddError,
                       rrset->getType() << " with inconsistent parameters: "

+ 8 - 3
src/lib/datasrc/memory/zone_data_updater.h

@@ -20,6 +20,7 @@
 #include <dns/name.h>
 #include <dns/rrclass.h>
 #include <dns/rrset.h>
+#include <dns/nsec3hash.h>
 #include <util/memory_segment.h>
 
 #include <boost/noncopyable.hpp>
@@ -37,12 +38,14 @@ public:
        mem_sgmt_(mem_sgmt),
        rrclass_(rrclass),
        zone_name_(zone_name),
-       zone_data_(zone_data)
+       zone_data_(zone_data),
+       hash_(NULL)
     {}
 
     /// The destructor.
-    ~ZoneDataUpdater()
-    {}
+    ~ZoneDataUpdater() {
+        delete hash_;
+    }
 
     //@}
 
@@ -109,6 +112,7 @@ private:
     // the strong exception guarantee.
     void validate(const isc::dns::ConstRRsetPtr rrset) const;
 
+    const isc::dns::NSEC3Hash* getNSEC3Hash();
     template <typename T>
     void setupNSEC3(const isc::dns::ConstRRsetPtr rrset);
     void addNSEC3(const isc::dns::ConstRRsetPtr rrset,
@@ -121,6 +125,7 @@ private:
     const isc::dns::Name& zone_name_;
     ZoneData& zone_data_;
     RdataEncoder encoder_;
+    isc::dns::NSEC3Hash* hash_;
 };
 
 } // namespace memory