BIND 10 #2435: implement datasrc version of RRsetCollection
BIND 10 Development
do-not-reply at isc.org
Thu Jan 24 04:56:31 UTC 2013
#2435: implement datasrc version of RRsetCollection
-------------------------------------+-------------------------------------
Reporter: jinmei | Owner:
Type: task | jinmei
Priority: medium | Status:
Component: data source | reviewing
Keywords: | Milestone:
Sensitive: 0 | Sprint-20130205
Sub-Project: DNS | Resolution:
Estimated Difficulty: 4 | CVSS Scoring:
Total Hours: 0 | Defect Severity: N/A
| Feature Depending on Ticket:
| loadzone-ng
| Add Hours to Ticket: 0
| Internal?: 0
-------------------------------------+-------------------------------------
Changes (by muks):
* owner: muks => jinmei
Comment:
Hi Jinmei
Replying to [comment:20 jinmei]:
> I think the interface is now okay. Remaining issues are mostly
> editorial/documentation/cleanup. So I suggest merging the branch at
> this point so other tasks can move forward, and address the remaining
> issues separately.
The `trac2435` branch was merged to `master`. The following comments
apply to `trac2435_2` which was freshly branched from `master`.
> As for `RRsetCollectionPtr`, I'd personally rather remove it based on
> YAGNI, unless we are *sure* we'll need it in a near future update.
Removed.
> '''datasrc/rrset_collection_base.h'''
>
> - This shouldn't be necessary if you include zone.h:
> {{{#!cpp
> /// \brief A forward declaration
> class ZoneUpdater;
> }}}
It seems to be necessary (which is why it was added). Both classes
refer to each other.
> - maybe a matter of wording, but to me this `RRsetCollectionBase`
> looks like the "default implementation" rather than an abstract
> class.
> {{{#!cpp
> /// This is an abstract class that adds datasrc related detail to
> /// \c isc::dns::RRsetCollectionBase. Derived classes need to complete
> /// the implementation (add iterator support, etc.) before using it.
> }}}
> Although it's not clear what we'll need to do for the iterator case,
> it may still be possible to provide the default implementation only
> using public updater interfaces.
> - do `getBeginning` and `getEnd` have to be declared as pure virtual?
> These are inherited from the very base class and are already pure
> virtual. It may also be related to the question of "default
> implementation" vs "abstract class" (above). Especially if we
> consider it the former, I guess we'd rather add the default
> implementation (which currently just throws) in this "base" class.
It was abstract before, but I've updated it now as suggested to include
the iterator stub implementation.
> - documentation of this class (design decisions, restrictions, how
> it's expected to be used, etc) still seems to be insufficient. in
> general, it should contain the detailed points we've discussed in
> this ticket.
This has been added, and it also points to `ZoneUpdater` class doc to
avoid duplication.
> '''database.cc'''
>
> - this is not very accurate:
> {{{#!cpp
> /// \brief datasrc implementation of RRsetCollectionBase.
> }}}
> it's specific to DBs
Updated.
> - destructor doesn't have to be defined explicitly in this case.
There was a discussion on Jabber about 2 weeks back on whether to
include empty destructors anyway in derived classes to show up the
`virtual` keyword (though it's unnecessary). I don't know what the
coding style is here, so based on that discussion I added it.
It's removed now.
> '''zone.h'''
>
> - not necessary:
> {{{#!cpp
> /// \brief A forward declaration
> class RRsetCollectionBase;
> }}}
Please see the comment above.
> - I'd like to see an explanation of why we have this restriction:
> {{{#!cpp
> /// Implementations of \c ZoneUpdater may not allow adding or
> /// deleting RRsets after \c getRRsetCollection() is called.
> }}}
> - Likewise. And also, if this means the user of the base class
> shouldn't use the collection after commit (unless it knows a
> particular derived implementation that loosens the restriction),
> I'd note that explicitly.
> {{{#!cpp
> /// Implementations of \c ZoneUpdater may disable a previously
> /// returned \c RRsetCollection after \c commit() is called. If an
> /// \c RRsetCollection is disabled, using methods such as \c find()
> /// and using its iterator would cause an exception to be
> /// thrown. See \c isc::datasrc::RRsetCollectionBase for details.
> }}}
> - Likewise as the above two points.
> {{{#!cpp
> /// Implementations of \c ZoneUpdater may not allow adding or
> /// deleting RRsets after \c getRRsetCollection() is called. In this
> /// case, implementations throw an \c InvalidOperation exception.
> }}}
> (There are two copies of this text, btw)
These have been addressed too.
> '''database_unittest.cc'''
>
> - I'd avoid C-style cast:
> {{{#!cpp
> (void) this->updater_->getRRsetCollection();
> }}}
> In this case you could probably use a simple (though redundant in
> some sense) test using find(), for example.
Updated using a `find()` call as suggested.
> ''' (dns)rrset_collection_base.h'''
>
> - s/an/a/ ?
> {{{#!cpp
> /// This exception is thrown when an calling implementation of
> }}}
It was meant to read "... when calling an implementation...". This has
been fixed.
> - I suspect this is not the main difficulty of RRSIG. One fundamental
> issue is that it's not clear whether we want to return all RRSIGs
> of the given name covering any RR types (in which case how), or we
> need to extend the interface so we can specify the covered type.
> Also, I suspect the simple libdns++ version of collection could
> actually match RRSIG RRsets because its add interface doesn't reject
> the direction addition of RRSIGs. So, what should be documented is
> that we have such fundamental open questions, and that a specific
> derived implementation may happen to return something if type RRSIG
> is specified, but nothing can be assumed as the base class interface
> (and we might say we may clarify and implement it in the future)
> {{{#!cpp
> /// This method's implementations currently are not specified to
> /// handle \c RRTypes such as RRSIG and NSEC3. RRSIGs are attached
> /// to their corresponding \c RRset and it is not straightforward to
> /// search for them. Searching for RRSIGs will return \c false
> /// always. Support for RRSIGs may be added in the future.
> }}}
This comment has been updated.
> - This doesn't seem to be very accurate.
> {{{#!cpp
> /// Non-concrete types such as ANY and AXFR are unsupported and will
> /// return \c false always.
> }}}
> If that's the case, we should implement derived classes that way and
> test the behavior (but I don't think it's the case). Similar to the
> case of RRSIG, the fact is that specific implementation may return
> something for these (we can create a type AXFR RRset and pass it to
> libdns++ collection, for example). But, unlike the case of RRSIGs,
> these types of RRsets are not expected to be included in any
> implementation of collection in the first place (by definition of
> "meta types"), so asking for such types is basically an invalid
> operation. While the API doesn't require implementations check this
> condition (and reject it), it should be considered an "undefined
> behavior". (and that wouldn't change in future versions).
This comment has been updated.
--
Ticket URL: <http://bind10.isc.org/ticket/2435#comment:22>
BIND 10 Development <http://bind10.isc.org>
BIND 10 Development
More information about the bind10-tickets
mailing list