Re: Breaking matchmaking deadlocks
Blair Holloway <[email protected]> Fri, 9 Jul 2010 11:35:47 +1000
| Newsgroups | gmane.games.devel.sweng |
|---|---|
| Message-ID | <[email protected]> |
Interesting concept! Using a logical clock would seem to swap one problem for another, though: instead of having identical timestamps, you can still get collisions between identical logical clock values. On Thu, Jul 8, 2010 at 7:19 PM, Morten Brodersen <[email protected]> wrote: > A general comment: using real-time clocks to syncronize a distributed > algorithm simply doesn't work in all cases. > > You need a logical clock or something similar. More info here: > > http://en.wikipedia.org/wiki/Lamport_timestamps > > Morten > > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of > James Robertson > Sent: Thursday, 8 July 2010 6:13 PM > To: [email protected] > Subject: Re: [Sweng-Gamedev] Breaking matchmaking deadlocks > > > If your join requests have timestamps, you can reject a join request > from A if you have already requested to join A's game and the time your > request was sent was before A sent his. In the remote possibility that > two requests are sent at *exactly* the same time you reject as well and > let each client retry. Eventually one will succeed and the other will > fail. > > > > Blair Holloway wrote: > > For sure, rejecting a duplicate connection like this will work in > > cases > > where the connection is fully established. However, I'm not sure that > it > > works if both machines join each other's games simultaneously. Let me > > demonstrate with ASCII! > > > > (If the formatting is stuffed, try pastebin: > > http://pastebin.com/U1YP7Ain) > > > > A -----a---c---* > > \ / \ / > > X X > > / \ / \ > > B -----b---d---* > > > > A = machine A's timeline > > B = machine B's timeline > > > > a = machine A sends request to join machine B's game > > b = machine B sends request to join machine A's game > > c = machine A receives request to join from machine B, accepts, sends > > back response > > d = machine B receives request to join from machine A, accepts, sends > > back response > > > > * = both machines suddenly realise that they are connected to each > > other's games > > > > Because each machine is responding to each other's join requests in > > their "cone of silence" -- the time between their request to join a > game > > and receiving the result -- they can't know to turn the other > machine's > > request away; therefore, they end up becoming doubly connected to one > > another. > > > > - Blair > > > > On Thu, Jul 8, 2010 at 3:14 PM, Conor Stokes > > <[email protected] > > <mailto:[email protected]>> wrote: > > > > Maintain a shared set of connections (in a hash or something) for > > both in-coming and out-going (hunting and gathering), protected by > a > > lock and keyed by user. Then don't allow inserts/drop the > connection > > into the shared set if you find a connection already there. It's a > > small relatively constant time operation and you should be able to > > set it up for the right order of operations such that you won't > end > > up with an inconsistent set between players. > > > > Cheers, > > Conor > > > > > ------------------------------------------------------------------------ > > *From:* Blair Holloway <[email protected] > > <mailto:[email protected]>> > > *To:* [email protected] > > <mailto:[email protected]> > > *Sent:* Thu, 8 July, 2010 10:50:25 AM > > *Subject:* [Sweng-Gamedev] Breaking matchmaking deadlocks > > > > Rather than taking the typical "join session/host session" > approach > > with our upcoming title, we're going to adopt a matchmaking > solution > > - the user selects the "find players" option, and under the covers > > the game deals with creating and joining as necessary. > > > > We've been examining the matchmaking system described in "E > Pluribus > > Unum: Matchmaking in HALO 3"[1], and decided to take a similar > > approach -- when matchmaking begins, a "gatherer" task hosts a > > session, and waits for players to connect to it, whilst a "hunter" > > task enumerates a list of sessions and tries to join each in turn. > > > > Since these tasks happen simultaneously, it's possible to end up > in > > a quasi-deadlock -- the hunter task from machine A can connect to > > the gatherer's session on machine B, whilst machine B's hunter > > simultaneously connects to machine A's gatherer; both machines > would > > be simultaneously hosting two sessions, and each machine would be > > participating in both. > > > > The easiest solution to this is perhaps to avoid the "deadlock" in > > the first place, and not simultaneously search and host. Indeed, > the > > system described in Halo 3 seems to randomly decide at the start > of > > matchmaking whether a machine is a hunter or a gatherer, and > simply > > sticks to that choice until a timeout occur. > > > > However, Halo has the advantage of a huge player base to make this > > work; we're expecting a few orders-of-magnitude less players, and > > are worried that when, say only a few tens of people are online at > > any given time, only gathering or hunting will make the > matchmaking > > experience slow for the user. Therefore, we'd like to both gather > > and hunt at the same time, and try to avoid the deadlocks and > > "break" them when they occur -- i.e. when detecting simultaneous > > connections, choose one session to destroy, whilst keeping the > > other. > > > > Does anyone have any suggestions for how to break these > > "deadlocks"? > > > > Cheers, > > > > - Blair > > > > [1] > > http://www.bungie.net/images/Inside/publications/presentations/gdc2008 > > _butcher_chris_matchmaking.ppt > > > > > > > > _______________________________________________ > > Sweng-Gamedev mailing list > > [email protected] > > <mailto:[email protected]> > > > > http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryde > > r.com > > > > > > > > ---------------------------------------------------------------------- > > -- > > > > _______________________________________________ > > Sweng-Gamedev mailing list [email protected] > > > http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryder. > com > _______________________________________________ > Sweng-Gamedev mailing list [email protected] > http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryder. > com > > _______________________________________________ > Sweng-Gamedev mailing list > [email protected] > http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryder.com > _______________________________________________ Sweng-Gamedev mailing list [email protected] http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryder.com