On Wed Feb 27 16:06:23 2008, Peter Saint-Andre wrote:
Fabio Forno wrote:
> Though sending roster diffs helps. There is a new possible approach
> I've found only after the discussion we had: use just roster push,
> that must implemented regardlessly any optimization. The client asks > for the roster adding a timestamp of the last received push, and the
> server sends changes as pushes (all timestamped)

Yes, we have roster pushes so it seems like a good idea to use them (in
general I think we should make intelligent use of everything we've
already defined, such as presence and rosters and roster pushes and so
on -- other real-time communication technologies don't have these
features at the base level, so it's to our advantage to use them). I
think that something like what you suggest might work well.

Also, before the devcon Dave Cridland mentioned that he didn't like the XEP-0150 approach but at the devcon we somehow didn't hear from him on
this topic, so perhaps he could weigh in with his ideas here.

At the devcon, the more interesting discussion was concerning quiescing the stream, etc. We decided that, as I recall, we'd not bother discussing startup optimizations, mainly because we basically knew the score there, and with our unnamed external expert talking about other stuff, we concentrated on that.

So... There's three options in the roster push optimization space. All involve the client and server maintaining a "timestamp" for the roster as a whole, and/or each individual item within it. The timestamp might be opaque (like ETags), a strictly increasing sequence number, or a modified, strictly increasing, timestamp. It actually doesn't matter, but the latter two allow for interesting things.

Whichever, the server MUST include the timestamp-like thing in each roster push.

1) Client says "I got the roster at this point in time". Server says either "Then you have it." or "Then I'll send you the new roster."

This is basically the ETags method. I don't like this, because I add people to my Roster, and reorganize those that are there, relatively often, and this would incur a full dowload each time.

2) Client says "I have the roster as of this point in time". Server says "Here's all the changes since then.".

This is obviously the best option in terms of efficiency, but it, too, has problems. The key issue is that roster entries won't die - instead, they'll be maintained along with a timestamp when deleted, in order that the server can tell a client it's gone.

3) Client says "I have the roster as of this point in time". Server either says "Here's the changes" or "Here's the whole roster", depending on whether it can find all deletions.

This is basically addressing the shortfall of the above, and allows for a single RTT self-correcting error case. I like this one best, and it's pretty easy to implement.

I also have a fondness for modified strictly increasing timestamps, but implementors need to appreciate that computer clocks go backwards, so they need to remember to handle odd cases like that by "letting time catch up" - just using a few ms later than the last timestamp until the real time is greater than the last timestamp.

This would allow clients to show the "last changed" date/time of the roster entry in a mostly realistic manner.

Dave.
--
Dave Cridland - mailto:[EMAIL PROTECTED] - xmpp:[EMAIL PROTECTED]
 - acap://acap.dave.cridland.net/byowner/user/dwd/bookmarks/
 - http://dave.cridland.net/
Infotrope Polymer - ACAP, IMAP, ESMTP, and Lemonade

Reply via email to