assert(client_list);
datasrc::ConfigurableClientList::ReloadResult result;
- {
+ try {
typename MutexType::Locker locker(*map_mutex_);
result = client_list->reload(origin);
+ } catch (const isc::Exception& ex) {
+ // We catch our internal exceptions (which will be just ignored) and
+ // propagated others (which should generally be considered fatal and
+ // will make the thread terminate)
+ isc_throw(InternalCommandError, "failed to load a zone " << origin <<
+ "/" << rrclass << ": error occurred in reload: " <<
+ ex.what());
}
switch (result) {
case datasrc::ConfigurableClientList::ZONE_RELOADED:
find(Name("example.org"), RRType::SOA())->code);
}
+TEST_F(DataSrcClientsBuilderTest, loadBrokenZone) {
+ configureZones();
+
+ ASSERT_EQ(0, std::system(INSTALL_PROG " -c " TEST_DATA_DIR
+ "/test1-broken.zone.in "
+ TEST_DATA_BUILDDIR "/test1.zone.copied"));
+ // there's an error in the new zone file. reload will be rejected.
+ const Command loadzone_cmd(LOADZONE, isc::data::Element::fromJSON(
+ "{\"class\": \"IN\","
+ " \"origin\": \"test1.example\"}"));
+ EXPECT_THROW(builder.handleCommand(loadzone_cmd),
+ TestDataSrcClientsBuilder::InternalCommandError);
+ zoneChecks(clients_map, rrclass); // zone shouldn't be replaced
+}
+
+
} // unnamed namespace