BIND 10 #2218: update InMemoryZoneFinder::findNSEC3 using memory-efficient version
BIND 10 Development
do-not-reply at isc.org
Wed Sep 26 14:29:01 UTC 2012
#2218: update InMemoryZoneFinder::findNSEC3 using memory-efficient version
-------------------------------------+-------------------------------------
Reporter: | Owner: jinmei
jinmei | Status: reviewing
Type: task | Milestone:
Priority: | Sprint-20121009
medium | Resolution:
Component: data | Sensitive: 0
source | Sub-Project: DNS
Keywords: | Estimated Difficulty: 5
Defect Severity: N/A | Total Hours: 0
Feature Depending on Ticket: |
scalable inmemory |
Add Hours to Ticket: 0 |
Internal?: 0 |
-------------------------------------+-------------------------------------
Changes (by muks):
* owner: muks => jinmei
Comment:
Hi Jinmei
Replying to [comment:15 jinmei]:
> Replying to [comment:12 jinmei]:
>
> The revised version looks pretty good. I have a few more, relatively
> minor things to discuss though.
>
> '''domaintree.h'''
>
> - A minor point: I don't think DomainTreeNodeChain::level_count_ has
> to be uint32_t because the structure size concern doesn't apply
> here.
Changed back to `size_t`. :)
> - I'd note largestNode() never throws.
Added.
> - I intended to suggest making some comments about why we use uint32_t
> for node_count_, but the revised code doesn't have it. I've added
> my suggested text at commit 40d4887.
Looks good.
> - I have sympathy with keeping the now unused getLargestInSubTree() and
> its tests (within if 0), but I'd like to clean them up unless we know
> we need it soon (and I don't think that's the case). If we really
> worry about the risk of reimplementing it from the scratch if and
> when we see the need for it, I'd just leave one line comment that we
> previously implemented it experimentally and removed it as we didn't
> see the need for it at that time.
Removed.
>
> '''memory_client.cc'''
>
> - what's the purpose of the changes at
> e05f1d87c3764033b920fa8a227cfd05dc3ca3b8?
> {{{
> [2218] Call setSigned(true) when NSEC3Data is set
> }}}
> The commit log doesn't explain the reason, and no test fails even
> without the changes. It's probably more about the semantics of "is
> signed" in general - from a quick look, we don't seem to have a
consistent
> interpretation between the zone finder, (document on possible
> implementation of) zone data, and your implementation of the memory
> client. Maybe it's a subject of a separate ticket. But in any
> event, if you want to introduce a change like this (that changes the
> state of the data), I think there should be some corresponding test
case that
> would fail without the change. So we must either provide a test or
> defer the change to the later ticket.
From a reading of ZoneData's api doc, I thought `setSigned()` would also
be called with `true` whenever NSEC3 data existed. I've added tests to
assert this.
> - is there a test for this?
> {{{
> + if ((salt_len > 0) &&
> (std::memcmp(&salt_data_2[0], salt_data, salt_len) !=
0)) {
> isc_throw(AddError,
> "NSEC3 with inconsistent parameters: " <<
> ...
> + if ((salt_len > 0) &&
> }}}
> the code is obviously correct, but in general it's better to confirm
> it by tests.
Added.
> '''memory_client.h, cc'''
> - these comments seem to have to be updated:
> {{{#!cpp
> /// This derived version of the method never throws an exception.
> /// For other details see \c DataSourceClient::findZone().
> }}}
> at least the first line isn't correct (it's not "derived" any
> more). I'm also not sure if the second line makes sense.
Updated.
> - I'd suggest changing the return type of findZoneData() to
> `const ZoneData*`. That's sufficient for the tests (which seem to
> be the only use case for it), and will help when we eventually work
> on #2292 (where we should also change zone_data to a const pointer).
> I'm attaching a diff to implement it.
The patch looks good. I've committed it and also fixed some more new tests
for it.
> - memory_client.h shouldn't rely on datasrc/zonetable.h, which will be
> gone when we complete the migration (the diff in the previous bullet
> makes this cleanup).
Nod.
>
> '''domaintree_unittest.cc'''
> - largestNode test should at least include a test case for an empty
> tree. I guess there could be some more test cases ideally, but I
> don't have a specific idea, so it's probably okay with just adding
> the empty case.
Added.
>
> '''zone_finder_unittest.cc'''
>
> - does addZoneData() need everything for the NSEC3 case? It seems to
> be almost a duplicate of the main code, which is not generally good.
> For example, if the test data aren't expected to contain
> inconsistent NSEC3 param, it's probably better just to skip the
> check.
Let's keep this for now as the worst thing it does is check more. :) I
want to finish up the other loose ends and merge this.
> '''zone_finder.cc'''
>
> I have a few more suggestions
> - InMemoryZoneFinder::getOrigin() is expensive and should better be
> avoided whenever possible. It looks like possible to use the label
> sequence of the origin node and use LabelSequence based interfaces
> in both cases.
Done. I've also made it use the previous-chain relative `find()` which was
added in a recent bug to search relative to the origin node.
> - it should be possible to define salt and hash outside of the loop
> {{{#!cpp
> for (unsigned int labels = qlabels; labels >= olabels; --labels) {
> const std::vector<uint8_t> salt(nsec3_data->getSaltData(),
> (nsec3_data->getSaltData() +
> nsec3_data->getSaltLen()));
> const std::auto_ptr<NSEC3Hash> hash
> (NSEC3Hash::create(nsec3_data->hashalg,
> nsec3_data->iterations,
> salt));
> }}}
> - If we adopt the suggested interface for NSEC3Hash::create (below),
> we could omit the construction of salt:
> {{{#!cpp
> const std::auto_ptr<NSEC3Hash> hash
> (NSEC3Hash::create(nsec3_data->hashalg,
> nsec3_data->iterations,
> nsec3_data->getSaltData(),
> nsec3_data->getSaltDataLen()));
> }}}
Done.
> - boost::scoped_ptr would be slightly better than auto_ptr because we
> don't have to copy hash.
Done.
>
> '''nsec3hash.h,cc'''
>
> - A minor, and possibly controversial point: for the new signature of
> factory, it might be better to take `const uint8_t*` and `size_t`
> instead of `vector<uint8_t>`, considering this is a relatively lower
> level primitive when performance is important. If we require a
> vector, the caller needs to prepare for it, which might be expensive
> depending on the context (see above).
>
It's been changed now. `NSEC3Hash` was internally refactored for it.
> - I'd describe the parameters more specifically for this
> {{{#!cpp
> /// \brief Factory method of NSECHash from args.
> ///
> /// This is similar to the other version, but uses the arguments
> /// passed as the parameters for hash calculation.
> static NSEC3Hash* create(uint8_t algorithm, uint16_t iterations,
> const std::vector<uint8_t>& salt);
> }}}
> because it's not as obvious as the other two cases.
Done.
--
Ticket URL: <http://bind10.isc.org/ticket/2218#comment:17>
BIND 10 Development <http://bind10.isc.org>
BIND 10 Development
More information about the bind10-tickets
mailing list