[bind10-dev] Sprint Planning Meetings on 30 Nov/1 Dec
JINMEI Tatuya / 神明達哉
jinmei at isc.org
Thu Dec 2 07:41:33 UTC 2010
At Wed, 01 Dec 2010 23:49:31 +0900,
JINMEI Tatuya <jinmei at isc.org> wrote:
> > Planning
>
> Based on the above thought, my gut feeling is:
>
> > 1. Schedule for the next release cycle
> > 2. High-Level aims for the next release cycle
>
> The mid size story is "be able to load textual zone file(s) into
> memory, and be able to respond to queries to these zones" (no DNSSEC
> support, no zone transfer, no dynamic update, no reload). This may be
> too conservative, and perhaps we can do a bit more.
In yesterday's call, Stephen asked me to send more broken-down details
of my proposal. As is often the case with what's asked in conference
calls, I'm not sure if this is exactly what I was asked, but I'm
sending my idea anyway.
> And (examples of) small stories would be:
> - load a normalized zone file into memory and simply return an
> authoritative answer (no NXDOMAIN or NXRRSET, delegation, no
> additional section)
(and no authoritative section (like BIND 9's "minimal-responses"), no
wildcard, no CNAME/DNAME handling)
This is a way too incomplete server, but I chose it as the target for
the next sprint because
- I think (perhaps optimistically) we can complete it within two
weeks. Here, "complete" means merging to trunk after review.
- For a minor leaf domain, this is actually quite sufficient
functionality, that is, if an "example.com" server can return the
correct AAAA or A RRset for "www.example.com", that should cover the
vast majority of the need required for the server (if "example.com"
is a very minor domain). It would still not be for "production
use", but at least we can demonstrate how it works for one practical
scenario.
There may be other sub stories that meet the same high level
background, but assuming we use this as our goal for the next sprint,
I've broken down this story into small development tasks. Each task
is intended to be completed within a day or so, and is expected to be
reviewed and merged right after that. It's based on some optimistic
assumptions though: the tasks may still be too big; especially if so,
review may take more time and require more review-revise cycles. If
our consensus on some task is too big, we should divide it. Also, if
it turns out some task takes much longer than the agreed estimation,
we should use the lesson for the next sprint.
Common notes about tasks:
- below, newly introduced class/method names are tentative. we
may find better names as we actually consider design details and
implement them. Likewise, although the task description includes how
to implement it, it's a hint so that the task can be as clear as
possible, not a requirement. If the developer finds a better way to
achieve the goal, it should be preferred.
- All implementation tasks are assumed to be developed test driven. So
"tests" are naturally included in the task.
- About documentation: I've noticed that often "ready for review"
patches contain insufficient or almost no documentation. So I
included a "documentation task" for each implementation, so that we
can include the task load for it from the planning phase (like
tests, hopefully we'll eventually consider documentation as part of
the implementation task from the beginning, then we can unify these
two tasks). For this reason, it should be done by the developer who
works on the corresponding implementation task, and code review
cannot be called unless both the implementation and documentation
tasks are done.
- About python binding: ideally we should add python binding for all
new data source stuff at the same time when the corresponding C++
library is written (although it may be separate tasks). But for
this sprint I'd skip it, because this may be a tentative interface,
and we are not sure if we can complete the listed tasks (without
python bindings) within a single sprint.
Tasks:
1. complete outstanding review and merge: #415
2. complete outstanding review and merge: #418
3. complete the necessary stuff of RBT.
We only need add and find operations for our initial sprint.
Complete the implementation (+ documentation) for this part, review
and merge.
4. update to the ZoneTable class
so that it internally uses the RBT.
5. documentation on the update to ZoneTable
6. review and merge of task #4
7. implement MemoryDataSrc class.
The MemoryDataSrc contains a ZoneTable object, which consists of
(pointers to) MemoryZone (see below) objects.
For now, we don't make it a derived class of AbstractDataSrc because
the interface is so different (we'll eventually consider this as
part of the generalization work).
This class has two methods:
- addZone(): takes a (shared)pointer to MemoryZone and stores it to
the ZoneTable
- findZone(): takes a domain name and returns the best matching
MemoryZone in the form of ConstZonePtr
These two should be mostly trivial and I personally think it can be
done in a single task.
8. MemoryDataSrc class documentation.
9. review and merge of task #7.
10. A simple (master) zone file parser.
It parses a "normalized" zone file, where "normalized" mean:
- no directives ($xxx, @, etc)
- TTLs are numbers
- no multiline RR
- no comments
- no omission (owner name for RRs of the same owner name, TTL, RR Class)
- RRs of a single RRset are not interleaved with RRs of a different
RRset. That is, the following sequence shouldn't happen:
examle.com. 3600 IN A 192.0.2.1
examle.com. 3600 IN AAAA 2001:db8::1
examle.com. 3600 IN A 192.0.2.2
- no mixed ordering of RR parameters; only accept the form of
<owner name> <TTL> <RR class> <RR type> <Rdata (single line)>
(note: BIND 9's named-compilezone (from text to text) can convert an
arbitrary zone file in the "normalized" form:
% named-compilezone -f text -F text -o example.com.norm example.com example.com.zone)
This can be a simple free function (not a class), which takes a path
to the zone file, the origin name, and RR class, and a callback
functor. It calls the functor for every RRset built from the zone
file. Some level of validation against origin/RR class should
better be performed, but if it takes time it can be skipped at this
time. In either case it should be documented.
11. zone file parser documentation.
12. review and merge of task #10.
13. Introduce the MemoryZone class.
MemoryZone is a derived class of AbstractZone (see #418) dedicated
for the in memory data source. We begin with renaming the Zone
class currently implemented in #418 to MemoryZone, and move it to a
separate .h/.cc files. (AbstractZone to "zone.h", and MemoryZone to
a part of "memory_datasrc.h".
It internally contains an RBT, whose data entry is a (pointer to)
some kind of list of RRsets.
Major methods for MemoryZone are relatively complicated, so I'd
separate the task for them (below).
14. MemoryZone class documentation.
15. review and merge of task #14.
16. MemoryZone::load() implementation
This method takes a path to a zone file, and calls the zone file
parser function. In its callback, it adds the owner name of the
RRset to the RBT, and adds the given RRset to the list (which is the
data of the RBT node for the owner name). There may be some corner
cases, such as duplicate RR types. For now we can ignore them, but
it should be documented and addressed properly later.
17. MemoryZone::load() documentation
18. review and merge of task #16.
19. MemoryZone::find() implementation
This method takes a domain name and RR type, and searches the RBT
for the given name. If found, it searches the associated list, and
if it finds an RRset of the given RR type, return it. For now, we
only consider an exact match. Partial match (delegation case) can
(should) be ignored and treated as 'not found'.
20. MemoryZone::find() documentation
21. review and merge of task #19.
22. configuration knob
We should be able to specify tuples of "zone origin, RR class, path
to zone file" by updating auth.spec.pre.in, and
AuthSrv::updateConfig(). In updateConfig(), we'd create a new
MemoryDataSrc (if not exist yet) and a new MemoryZone for the
specified zone, load the zone file to the MemoryZone, and add the
zone to MemoryDataSrc.
23. configuration knob documentation
24. review and merge of task #22.
25. implement normal query processing
This is an update to #418. It should take MemoryDataSrc (instead of
a zone table). Also, if zone->find() is successful, add the
returned RRset to the answer section of the response. As part of
this task, we'd also update AuthSrvImpl::processNormalQuery() so
that if a memory data source is configured call the separate
Query::process() method instead of DataSRc::doQuery().
26. update document of query processing
27. review and merge of task #25.
- (optional) performance measurement
The resulting performance at this point is not so important (and
even if it's not good yet we shouldn't jump into optimization now),
but if we (someone) have time measuring it may be interesting.
---
JINMEI, Tatuya
More information about the bind10-dev
mailing list