A few comments on recent work on Gadget.
Dafydd Harries
dafydd.harries at collabora.co.uk
Fri Jun 20 15:12:10 EDT 2008
Ar 17/06/2008 am 19:53, ysgrifennodd Michael Stone:
> Dear Daf & Guillaume,
>
> I read through Guillaume's 'activity' branch a few days ago and recorded
> several comments which I'd like to forward to you. I hope they help.
>
> * Thanks for the nice documentation linked to from
>
> http://wiki.laptop.org/go/Gadget
>
> I really appreciate the effort spent here.
>
> * It seems that we're using more naive algorithms than when I
> last looked. activity_by_participants() is even marked FIXME. Have
> you been able to execute any scaling tests on the server to see
> whether these algorithms are problematic?
Not yet.
>
> * We're still maintaining an entirely in-memory database.
> - How much memory does each additional connection, view, activity,
> etc. cost us?
> - How will the component respond to low-memory conditions?
> - Can we easily test this by rlimit()-ing the component separate
> from the rest of the system?
When I started writing the database I wrote two prototypes, one using SQLite
and one in Python. I then wrote a simulator for database access and timed both
prototypes; the Python one was faster. Porting this simulator to the database
we currently have is on my todo list.
> * I see that much of the parsing code is wrapped in try/except blocks
> which log parsing exceptions.
> - Does the parsing code never throw other errors?
> - If an uncaught exception propagates, how much of the component
> dies? Is it just the connection which generated the exception or
> will the whole component go down?
The Twisted mainloop will catch the exception and log it with a traceback. The
net effect would be the same as if the message was never received, assuming
that Gadget doesn't make any changes to its state before the message parsing
fails.
> * Thanks for keeping the unit tests up to date with the rest of the
> code.
> - Any progress on random-data tests or on load/scaling tests?
No.
> * I see that we're beginning to use xpath queries instead of manually
> destructuring our input.
> - Are there any downsides to using xpath here?
I'm not sure. It's not really xpath; it's an xpath-like language that
twisted.words implements. The motivation for using it was to simplify the
code, but I'm not entirely happy with the results. I think there's probably a
ground between manually destructuring and using xpath, but my explorations in
that direction didn't yield anything I considered worth using.
Some of the Twisted developers have expressed a desire to use an XML library
like lxml as the basis for twisted.words.protocols.jabber as opposed to the
current home-grown API but this isn't something I've looked into in detail.
>
> * I'm glad to see the use of __slots__ to reduce memory usage of
> several common objects.
> - How much memory is consumed under each of your test loads?
> - Have you done any testing for memory leaks?
> - If not, how long is the longest period of time you've left the
> component running under load (and idle?)?
I haven't made any measurements yet. Certainly malicious clients could make
Gadget consume a lot of memory.
>
> * I see several places where we've got big if/elif trees.
> - Perhaps these should turn into dictionary lookups or method
> dispatch on objects?
Absolutely. We dispatch <iq> messages from a table, and I think we have some
FIXME comments for doing something similar with <presence> and <message>
messages.
> * It seems that when handling an multi-part query, the server
> accumulates all its results in memory, then serializes them, then,
> transmits them.
> - How much memory/time could be consumed by a big query?
> - Could we profitably stream the results back to the client rather
> than batching them?
Good question. This seems like something we should measure to see if it's
worth optimising.
>
> * I infer that "views" contain stored queries and cached results. This
> should be explained somewhere in the code. More generally, the code
> should contain pointers to the relevent wiki documentation. (Or
> vice-versa).
Agreed.
>
> * The "search", "random", and "all" logic seems to be duplicated
> throughout the code. We could profitably abstract this into a small
> class hierarchy for queries.
Agreed.
>
> * The activity_update() logic seems clunky to me. Why not just inform
> all the views of the request and let them apply their own update
> logic?
I don't follow; could you elaborate?
> * I see a couple of instances of map and filter in this code.
> Unfortunately, this isn't Haskell. Think about using generators or
> regular iteration. Fuse your own loops.
I assume you mean the roster code. I agree that it could be nicer; I've
made some attempt to clean it up:
http://dev.laptop.org/git?p=users/daf/gadget;a=shortlog;h=roster
> * It seems that the Roster code doesn't adequately handle exceptions
> which occur during file loading. Please comment.
Good point; I filed a ticket about this:
http://dev.laptop.org/ticket/7321
>
> * How confident in are you in the unicode-safety of your code. Why?
Not particularly confident, because our tests don't really cover it. Certainly
something to work on. Ticket:
http://dev.laptop.org/ticket/7323
> I'll try to get another person from 1cc or the general community
> to review this code and to give you some more feedback. I've also
> started reading the telepathy-gabble-gadget branch and will offer
> feedback on it as I'm able. Please speak up loudly when you've got
> something that you like someone else to review.
Now that the code-review list exists, perhaps it would be an appropriate forum
for requesting and posting Gadget reviews.
You ask several good questions which I don't have answers to yet. Writing some
stress tests so I can answer them better is a priority. Ticket:
http://dev.laptop.org/ticket/7322
Thanks for the feedback!
--
Dafydd
More information about the Devel
mailing list