← Back to team overview

launchpad-dev team mailing list archive

Re: tuesday - performance day!

 

On Tuesday 03 August 2010 11:57:00 Robert Collins wrote:
> On Tue, Aug 3, 2010 at 10:18 PM, Julian Edwards
> 
> <julian.edwards@xxxxxxxxxxxxx> wrote:
> > On Tuesday 03 August 2010 11:02:03 Robert Collins wrote:
> >> So what apparently happens here (this is where Tim helped out :)) is
> >> that lazr.restful is introspecting *every declared attribute*; so we
> >> have 'allmembers' which is a person property that does a (fairly
> >> cheap) query, and then that cheap query is expanded item by item,
> >> property-by-property. (Oh, and hint for finding the right method -
> >> grep for 'exported_as.*URL_SUFFIX' - e.g. exported_as.*participation -
> >> in the interfaces files.
> > 
> > The lesson is, don't hide complicated queries behind @property!  I've
> > converted some of IArchive's properties to methods before to stop them
> > getting queried when the webservice introspects the attributes.
> 
> Many of the queries are very simple. e.g. 'has the person signed any
> version of the CoC'. The problem is that when you have 40 people, that
> means 40 queries. The +participation page that triggers the same
> method does *800* queries.
> 
> > I'm intrigued as to this apparent recursiveness you describe though?  Or
> > am I misunderstanding?
> 
> inner level: person.karma
> outer level: generator of people
> 
> So the API hits
> person.allmembers
> which returns a generator (a resultset containing all the members
> (one, cheap, query))
> lazr.restful then does (psuedocode):
> result = []
> for person in generator:
>     result.append(to_json(person))
> 
> and to_json(person) does:
> properties = {}
> for attribute in interfaces_of(person):
>     properties[attribute] = getattr(person, attribute)
> 
> and that triggers a separate query for 'coc_signed', 'karma',
> 'emblems', 'packages_built' etc etc.
> 
> It doesn't recurse any deeper than that though, fortunately!
> 
> -Rob

So I guess the question is, does allmembers have to be a property?  It sounds 
like it needs to be a method to me.



Follow ups

References