FlexMatch large match backfill not working

Hello,

I am having trouble getting flexmatch working, when I initiate the first matchmaking request everything goes well a session is created, the placement works and I get a player session in the created game session. But this only works as long as I have available game session slots, every time I create a matchmaking request it tries to create a new game session, so I end up with game sessions with 1 player. I have back fill set to automatic and yet it does not place players in existing game sessions with empty slots. Even after a game session is completely empty with nobody inside of it, it still won’t assign the player to the server so I end up with servers empty or with only 1 player.

I don’t know what else to do, I read that UpdateGameSession has to be implemented but nowhere can I find documentation on what I am supposed to do in this function, is there an AWS call to make to tell GameLift that it was handled ?

EDIT: So I modified my RuleSet, that had a max count of 100 to less than 40, when it’s not running Large match mode it works fine, is this a bug of the large match algorithm ?

Thanks,
Max

@yamashi - I’m sorry you are having problems with FlexMatch.

It seems like you did you get regular matchmaking working how you liked. The only difference between regular and backfill, is that in backfill you are providing some pre-filled teams; the same rules are still applied.

Theres a lot that could be going on, so its worth checking if:

  • Your matchmaking rules could be too restrictive meaning that no players can be backfilled into the game session. I would look at your rules and expansions and ensure players trying to backfill could be placed in an active game session.
  • Your incoming ticket rate is too low for your expansions/relaxations or timeout values. Incoming player rate is important to bear in mind, you may need much more generous values when debugging/developing.

Wrt to UpdateGameSession I believe you are talking about the onUpdateGameSession callback rather than the actual UpdateGameSession.

This is a callback from GameLift to let you know that the game sessions is being modified. Its recommend that you should log the update reason here to aid troubleshooting, but theres no callback to make to say you handled it as its just providing information.

The expectation is that the server owns the matchmaking data, so you should be mapping it some internal state so your server can handle player disconnects etc. Typically servers keep their own internal map of players to connected states etc.

For example:

void Server::OnUpdateGameSession(Aws::GameLift::Server::Model::UpdateGameSession updateGameSession)
{
        Aws::GameLift::Server::Model::GameSession gameSession = updateGameSession.GetGameSession();
        Aws::GameLift::Server::Model::UpdateReason updateReason = updateGameSession.GetUpdateReason();

        log("OnUpdateGameSession with GameSession : %s, UpdateReason : %s, and backfillTicketId : %s",
            gameSession.GetGameSessionId(), Aws::GameLift::Server::Model::UpdateReasonMapper::GetNameForUpdateReason(updateReason), updateGameSession.GetBackfillTicketId());
 
        if (updateReason == Aws::GameLift::Server::Model::UpdateReason::MATCHMAKING_DATA_UPDATED)
        {
            // pull out new player data into internal representations
        }

        if (updateReason == Aws::GameLift::Server::Model::UpdateReason::BACKFILL_CANCELLED ||
            updateReason == Aws::GameLift::Server::Model::UpdateReason::BACKFILL_FAILED ||
            updateReason == Aws::GameLift::Server::Model::UpdateReason::BACKFILL_TIMED_OUT)
        {
	        // as automatic backfill failed, may want to take manual action etc.
        }
    }
}

But as you report this is specifically with large matchmaking, it may be worth providing your matchmaking config id, rule set id etc and a time range where you made requests that didn’t work as you expected, and I can get the GameLift service team to take a look.

If you have it, it would also be useful to provide your server SDK version and language used.

Thank you very much for the detailed reply, I understand now what the callback is supposed to do.

I don’t have any restrictions on my ruleset as there is no skill or any other metric to place players, the goal is here is just to fill the game sessions and create new ones if no player slot is available, so I just send the same skill for every player.

Regarding the large match ids here they are :

  • Config id : arn:aws:gamelift:eu-west-1:906229713436:matchmakingconfiguration/TestProjectMatchMaker
  • Queue id : arn:aws:gamelift:eu-west-1:906229713436:gamesessionqueue/TestProjectQueue
  • Rule set id : TestProjectBatchingRuleSet (could not find an ARN for it)
  • First matchmaking ticket id that goes well : 32db0260-e574-4aa3-9ccf-a0ceaf9db49d ( “StartTime”: “2020-06-27T12:00:19.361000+02:00” )
  • Second matchmaking ticket id that never gets filled : 6dbcdb54-194c-4f1d-9364-03e8462f8660 ( “StartTime”: “2020-06-27T12:00:47.456000+02:00” )

I am using the latest GameLift sdk 04_16_2020 and C++.

Thanks,
Max

Hello,

Just checking in to know if there is indeed an internal issue as this is a blocker for us and we cannot use GameLift if we don’t get it working.

Best
Max

Apologies for the delay in getting back to you but I was out for a while.

I didn’t see any other open issues with GameLift large match support currently so there doesn’t seem to be a problem with the service (that I know of).

I pinged the GameLift service team with your details so they can take a look and will let you know if theres an update.

Hopefully you read about the differences here wrt to building rules for large match support: https://aws.amazon.com/blogs/gametech/large-match-support/ (I can’t look at your ruleset, but the GameLift can)

Also in future, if you have a urgent/blocking issue consider open an issue with AWS support (esp if you get to running live games). Forums support is always best effort and can be delayed at times (we do love to help but theres always a lot going on).

Apologies again for the late followup here.

Hi!

Apologies for the lag time, the holiday in the US delayed getting to this. For the second match there are a couple of things which look a little strange.

  1. It looks like as part of the second matchmaking ticket you included a player session which was actually already included in another ticket (auto-backfill-81d3592f-b544-4806-9385-0156b5f979f0). That ticket was attempting to backfill the match with 1/100 players, but was cancelled because the previous ticket was created with that player id (we cancel the backfill ticket to avoid a player being ‘placed’ into both games).

  2. The second matchmaking ticket timed out, which was because it attempted to create a new game with the player referenced above instead of backfilling into an existing match. The fleet did not have an available game session to place in, so after several attempts to place the ticket timed out.

It looks like when you are triggering the startmatchmaking for that player it is clobbering your autobackfill process. What you should make sure of is that you arent submitting a new matchmaking request on behalf of a player that is already in a game, that is what causes the collision. That would prevent the timeout as well because matchmaking would not try to create a new game.

Hello @AlexE-aws

I have tried everything with very simple commands and I still cannot get backfill to work with large match.
I issue the following commands :
aws gamelift start-matchmaking --configuration-name TestProjectMatchMaker --players PlayerId=Test01,PlayerAttributes={skill={N=1000}}
aws gamelift start-matchmaking --configuration-name TestProjectMatchMaker --players PlayerId=Test02,PlayerAttributes={skill={N=1000}}

Only Test01 gets a game session.
Test01 has ticket id 7e9e343d-a985-40cd-9505-7a1351aab11c
Test02 has ticket id b9d830b6-b085-4656-94eb-6cc5049f5c05

If I do the exact same thing but without large match it works fine.

Best,
Max