+1 on this.  I saw this specific API leakage while working on KAFKA-376 and
was hoping it'd be refactored and fixed as part of the work involved in
KAFKA-501.

On Tue, Sep 18, 2012 at 1:37 PM, Jay Kreps <jay.kr...@gmail.com> wrote:

> Yes, after KAFKA-506 <https://issues.apache.org/jira/browse/KAFKA-506> I
> would like to do a little additional work on Log and LogManager. This could
> be post-0.8. The todo list is to support multiple data directories, get rid
> of the custom copy-on-write SegmentList and replace it with an
> off-the-shelf ConcurrentSkipListMap, and refactor a few APIs to be nicer.
>
> Filed KAFKA-521 (https://issues.apache.org/jira/browse/KAFKA-521) to cover
> that last one.
>
> -Jay
>
> On Tue, Sep 18, 2012 at 10:22 AM, Neha Narkhede <neha.narkh...@gmail.com
> >wrote:
>
> > +1
> >
> > On Tue, Sep 18, 2012 at 10:17 AM, Jun Rao <jun...@gmail.com> wrote:
> > > Makes sense. Could you file a jira to track this?
> > >
> > > Thanks,
> > >
> > > Jun
> > >
> > > On Tue, Sep 18, 2012 at 9:22 AM, Jay Kreps <jay.kr...@gmail.com>
> wrote:
> > >
> > >> Hey Guys,
> > >>
> > >> Just a friendly (and hopefully not too annoying) reminder about code
> > >> layering. We have a couple of different systems that need to remain
> > >> independent and not know about each other. Some examples of this are
> the
> > >> network layer, the log system, the replication system, the controller
> > code,
> > >> etc. Various pieces of API-specific logic sit on top of these layers
> and
> > >> integrate them into the functionality the system provides. The goal is
> > to
> > >> make these lower layers have the cleanest, most logical, and most
> > general
> > >> possible APIs that wrap up all the complicated stuff that they do.
> > >>
> > >> An easy way to tell if we are doing the right thing is to think about
> > how
> > >> well the lowest levels of code makes sense if picked up and used on
> its
> > own
> > >> without the rest of kafka.
> > >>
> > >> Here is an example where we ended up breaking that layering:
> > >>   Log.scala:
> > >>     def getOffsetsBefore(request: OffsetRequest): Array[Long]
> > >>
> > >> We clearly didn't get the layering right here either. The method
> takes a
> > >> OffsetRequest object, but the Log shouldn't know anything about the
> API
> > >> layer. The implementation of the method is a bunch of logic very
> > specific
> > >> to some of the oddities of this API.
> > >>
> > >> The right way to implement this would be to add a more general API to
> > get
> > >> LogSegments from the log. Then in the API layer add all the specific
> > types
> > >> of filtering and munging needed to fullfill the contract of the API.
> > What I
> > >> have seen is that when we don't focus on this we end up with lots and
> > lots
> > >> of odd APIs and it tends to make the code really hard to evolve or to
> > >> reason about what it is that the subsystem does.
> > >>
> > >> This is not a major problem, but being a little more rigorous at these
> > >> layers helps keep the code beautiful. :-)
> > >>
> > >> Cheers,
> > >>
> > >> -Jay
> > >>
> >
>

Reply via email to