BIND 10 #2746: allow loading log messages manually and use it for Python datasrc

BIND 10 Development do-not-reply at isc.org
Thu Feb 14 22:47:49 UTC 2013


#2746: allow loading log messages manually and use it for Python datasrc
-------------------------------------+-------------------------------------
                   Reporter:         |                 Owner:
  jinmei                             |                Status:  new
                       Type:         |             Milestone:  Next-Sprint-
  defect                             |  Proposed
                   Priority:         |              Keywords:
  medium                             |             Sensitive:  0
                  Component:         |           Sub-Project:  Core
  logging                            |  Estimated Difficulty:  0
               CVSS Scoring:         |           Total Hours:  0
            Defect Severity:  N/A    |
Feature Depending on Ticket:         |
        Add Hours to Ticket:  0      |
                  Internal?:  0      |
-------------------------------------+-------------------------------------
 The problem described in #2743 is because cfgmgr calls isc.log.init()
 in its module (called at import time) and then try to load datasrc
 module as a plugin when main() is called:
 {{{#!python
         for ppath in PLUGIN_PATHS:
             load_plugins(ppath, cm)
 }}}

 I suspect similar thing can happen for a C/C++ loadable module if the
 module has its own messages (defined in the module image) and is
 dynamically loaded, e.g., as a result of configuration update.

 So I propose generic solution that should work for all such cases:

 - update `PyInit_datasrc()` so that it'll call
   `MessageInitializer::loadDictionary()`

 This should be sufficient for the specific issue described in #2743.
 Note also that if we do this, we won't have to merge #2743
 (trac2145-revert).  But for a comprehensive fix I propose something
 more:

 - update `MessageInitializer::loadDictionary()` so it can take extra
   (optional) variable to ignore duplicates
 - in libdatasrc, define SQLite3 specific log messages separately
   (moving from datasrc_mesasges.mes to, e.g.,
   sqlite3_datasrc_messages.mes), build corresponding .cc only with
   the sqlite3 accessor loadable module, and call `loadDictionary()`
   from sqlite3_accessor_link.cc (probably from `createInstance()`).
   Confirm the log messages are really shown.  Enable "ignore dup" when
   calling `loadDictionary()` (otherwise if the module is unloaded and
   loaded again we'll see duplicate warning).  This will work as a
   proof-of-concept example.
 - (optional but) I also suggest changing `MessageInitializer` from a
   class to a namespace; it doesn't seem to have to be a class and
   actually only used as a namespace.  IMO it's an abuse of the concept
   of class and is confusing.
 - (optional and not directly related) I suggest clearing the
   "duplicate" vector in `LoggerManager::init` after warning about
   duplicates; otherwise the vector will potentially get larger and
   larger over time.  And, in doing so, I'd also suggest introducing a
   separate method/function to do so and let `getDuplicates()` return a
   const reference (Returning a mutable reference is generally a bad
   practice.)
 - create a wiki page or some other form of doc for tips of developing
   BIND 10 modules.  there, explain that native-C++ or python wrapper
   modules should call `MessageInitializer::loadDictionary()` if that
   module is supposed to use log messages.

-- 
Ticket URL: <http://bind10.isc.org/ticket/2746>
BIND 10 Development <http://bind10.isc.org>
BIND 10 Development


More information about the bind10-tickets mailing list