Browse Source

[2421] Handle exceptions when loading a zone

Mukund Sivaraman 12 years ago
parent
commit
cec4bf4314
2 changed files with 41 additions and 1 deletions
  1. 26 1
      src/lib/datasrc/client_list.cc
  2. 15 0
      src/lib/datasrc/datasrc_messages.mes

+ 26 - 1
src/lib/datasrc/client_list.cc

@@ -20,6 +20,7 @@
 #include "memory/zone_table_segment.h"
 #include "memory/zone_writer.h"
 #include "memory/zone_data_loader.h"
+#include "memory/zone_data_updater.h"
 #include "logger.h"
 #include <dns/masterload.h>
 #include <util/memory_segment_local.h>
@@ -37,6 +38,7 @@ using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
 using isc::datasrc::memory::InMemoryClient;
 using isc::datasrc::memory::ZoneTableSegment;
+using isc::datasrc::memory::ZoneDataUpdater;
 
 namespace isc {
 namespace datasrc {
@@ -178,6 +180,15 @@ ConfigurableClientList::configure(const ConstElementPtr& config,
                         } catch (const isc::dns::MasterLoadError& mle) {
                             LOG_ERROR(logger, DATASRC_MASTERLOAD_ERROR)
                                 .arg(mle.what());
+                        } catch (const ZoneDataUpdater::NullRRset& e) {
+                            LOG_ERROR(logger, DATASRC_LOAD_NULL_RRSET_ERROR)
+                                .arg(e.what());
+                        } catch (const ZoneDataUpdater::AddError& e) {
+                            LOG_ERROR(logger, DATASRC_LOAD_ADD_ERROR)
+                                .arg(e.what());
+                        } catch (const isc::datasrc::memory::EmptyZone& e) {
+                            LOG_ERROR(logger, DATASRC_LOAD_EMPTY_ZONE_ERROR)
+                                .arg(e.what());
                         }
                     } else {
                         ZoneIteratorPtr iterator;
@@ -192,7 +203,21 @@ ConfigurableClientList::configure(const ConstElementPtr& config,
                             isc_throw(isc::Unexpected, "Got NULL iterator "
                                       "for zone " << origin);
                         }
-                        cache->load(origin, *iterator);
+                        try {
+                            cache->load(origin, *iterator);
+                        } catch (const isc::dns::MasterLoadError& mle) {
+                            LOG_ERROR(logger, DATASRC_MASTERLOAD_ERROR)
+                                .arg(mle.what());
+                        } catch (const ZoneDataUpdater::NullRRset& e) {
+                            LOG_ERROR(logger, DATASRC_LOAD_NULL_RRSET_ERROR)
+                                .arg(e.what());
+                        } catch (const ZoneDataUpdater::AddError& e) {
+                            LOG_ERROR(logger, DATASRC_LOAD_ADD_ERROR)
+                                .arg(e.what());
+                        } catch (const isc::datasrc::memory::EmptyZone& e) {
+                            LOG_ERROR(logger, DATASRC_LOAD_EMPTY_ZONE_ERROR)
+                                .arg(e.what());
+                        }
                     }
                 }
             }

+ 15 - 0
src/lib/datasrc/datasrc_messages.mes

@@ -310,6 +310,21 @@ An error was found in the zone data for a MasterFiles zone. The zone
 is not loaded. The specific error is shown in the message, and should
 be addressed.
 
+% DATASRC_LOAD_ADD_ERROR %1
+An error was found in the zone data when it was being loaded. The zone
+was not loaded. The specific error is shown in the message, and should
+be addressed.
+
+% DATASRC_LOAD_NULL_RRSET_ERROR %1
+A NULL RRset was passed to be added to a zone. The zone was not
+loaded. The specific error is shown in the message, and should be
+addressed.
+
+% DATASRC_LOAD_EMPTY_ZONE_ERROR %1
+A zone was asked to be loaded without any zone data. The zone was not
+loaded. The specific error is shown in the message, and should be
+addressed.
+
 % DATASRC_MEM_ADD_RRSET adding RRset '%1/%2' into zone '%3'
 Debug information. An RRset is being added to the in-memory data source.