Re: Breaking matchmaking deadlocks

James Robertson <[email protected]> Thu, 08 Jul 2010 10:12:50 +0200
Newsgroups gmane.games.devel.sweng
Message-ID <[email protected]>
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-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