Browse Source

[2853] Add a testcase using reset_memory_segment() and get_cached_zone_writer()

This test currently causes a segmentation fault. From a core,
it seems to be inside ZoneWriter::install(). See the lines which
modify that method as part of this commit. getHeader() segfaults.
Mukund Sivaraman 12 years ago
parent
commit
71de47f8d1

+ 2 - 1
src/lib/datasrc/memory/zone_writer.cc

@@ -139,7 +139,8 @@ ZoneWriter::install() {
     // segment. Once there is, we should provide the test.
     while (impl_->state_ != Impl::ZW_INSTALLED) {
         try {
-            ZoneTable* table(impl_->segment_.getHeader().getTable());
+            ZoneTableHeader& header = impl_->segment_.getHeader();
+            ZoneTable* table(header.getTable());
             if (!table) {
                 isc_throw(isc::Unexpected, "No zone table present");
             }

+ 61 - 0
src/lib/python/isc/datasrc/tests/clientlist_test.py

@@ -151,6 +151,67 @@ class ClientListTest(unittest.TestCase):
         self.assertRaises(TypeError, self.clist.find, "example.org")
         self.assertRaises(TypeError, self.clist.find)
 
+    def test_find_mapped(self):
+        """
+        Test find on a mapped segment.
+        """
+        self.clist = isc.datasrc.ConfigurableClientList(isc.dns.RRClass.IN)
+        self.clist.configure('''[{
+            "type": "MasterFiles",
+            "params": {
+                "example.org": "''' + TESTDATA_PATH + '''example.org.zone"
+            },
+            "cache-enable": true,
+            "cache-type": "mapped"
+        }]''', True)
+
+        self.clist.reset_memory_segment("MasterFiles", isc.datasrc.ConfigurableClientList.CREATE, '''{"mapped-file": "''' + os.environ['TESTDATA_WRITE_PATH'] + os.sep + '''testmappedx.mapped"}''')
+        result = self.clist.get_cached_zone_writer(isc.dns.Name("example.org"))
+        result[1].load()
+        result[1].install()
+        result[1].cleanup()
+
+        dsrc, finder, exact = self.clist.find(isc.dns.Name("sub.example.org"))
+        self.assertIsNotNone(dsrc)
+        self.assertTrue(isinstance(dsrc, isc.datasrc.DataSourceClient))
+        self.assertIsNotNone(finder)
+        self.assertTrue(isinstance(finder, isc.datasrc.ZoneFinder))
+        # Check the finder holds a reference to the data source
+        # Note that one reference is kept in the parameter list
+        # of getrefcount
+        self.assertEqual(3, sys.getrefcount(dsrc))
+        finder = None
+        self.assertEqual(2, sys.getrefcount(dsrc))
+        # We check an exact match in test_configure already
+        self.assertFalse(exact)
+        self.dsrc, self.finder, exact = \
+            self.clist.find(isc.dns.Name("sub.example.org"), False)
+        self.assertIsNotNone(self.dsrc)
+        self.assertTrue(isinstance(self.dsrc, isc.datasrc.DataSourceClient))
+        self.assertIsNotNone(self.finder)
+        self.assertTrue(isinstance(self.finder, isc.datasrc.ZoneFinder))
+        self.assertFalse(exact)
+        self.dsrc, self.finder, exact = \
+            self.clist.find(isc.dns.Name("sub.example.org"), True)
+        self.assertIsNone(self.dsrc)
+        self.assertIsNone(self.finder)
+        self.assertFalse(exact)
+        self.dsrc, self.finder, exact = \
+            self.clist.find(isc.dns.Name("sub.example.org"), False, False)
+        self.assertIsNotNone(self.dsrc)
+        self.assertTrue(isinstance(self.dsrc, isc.datasrc.DataSourceClient))
+        self.assertIsNotNone(self.finder)
+        self.assertTrue(isinstance(self.finder, isc.datasrc.ZoneFinder))
+        self.assertFalse(exact)
+        self.dsrc, self.finder, exact = \
+            self.clist.find(isc.dns.Name("sub.example.org"), True, False)
+        self.assertIsNone(self.dsrc)
+        self.assertIsNone(self.finder)
+        self.assertFalse(exact)
+        # Some invalid inputs
+        self.assertRaises(TypeError, self.clist.find, "example.org")
+        self.assertRaises(TypeError, self.clist.find)
+
 if __name__ == "__main__":
     isc.log.init("bind10")
     isc.log.resetUnitTestRootLogger()