Prevent Int64 Overflow#3605
Conversation
|
Build Failed 😱 Build Id: b886e664-8de1-4115-bf7c-de28307cdbc5 To get permission to view the Cloud Build view, join the agones-discuss Google Group. |
|
Build Succeeded 👏 Build Id: ecdf5262-fa85-4f70-86a0-f56d37ff858c The following development artifacts have been built, and will exist for the next 30 days:
A preview of the website (the last 30 builds are retained): To install this version:
|
igooch
left a comment
There was a problem hiding this comment.
Could you also add in unit tests for the functionality? They can go in TestControllerUpdateFleetCounterStatus for the fleet controller and TestComputeStatus for the gameserverset controller.
| } | ||
|
|
||
| // SafeAdd prevents overflow by limiting the sum to math.MaxInt64. | ||
| func SafeAdd(x, y int64) int64 { |
There was a problem hiding this comment.
This function should probably go in pkg/apis/agones/v1/common.go
|
Build Failed 😱 Build Id: 2877393a-b061-4dc9-8f0d-ab82a8ec57d9 To get permission to view the Cloud Build view, join the agones-discuss Google Group. |
|
Build Succeeded 👏 Build Id: a354c8fb-a61e-42d0-841b-928831cb43f8 The following development artifacts have been built, and will exist for the next 30 days:
A preview of the website (the last 30 builds are retained): To install this version:
|
|
Build Succeeded 👏 Build Id: 9528b86c-8336-4724-8768-a1a9d4a3fef9 The following development artifacts have been built, and will exist for the next 30 days:
A preview of the website (the last 30 builds are retained): To install this version:
|
igooch
left a comment
There was a problem hiding this comment.
For testing some edge cases you can change
gsSet1.Status.Counters = map[string]agonesv1.AggregatedCounterStatus{
"fullCounter": {
AllocatedCount: 1000,
AllocatedCapacity: 1000,
Capacity: 1000,
Count: 1000,
},
To have maxInt64:
gsSet1.Status.Counters = map[string]agonesv1.AggregatedCounterStatus{
"fullCounter": {
AllocatedCount: 9223372036854775807,
AllocatedCapacity: 9223372036854775807,
Capacity: 9223372036854775807,
Count: 9223372036854775807,
},
| assert.Equal(t, int64(30), fleet.Status.Counters["thirdCounter"].AllocatedCapacity) | ||
| assert.Equal(t, int64(400), fleet.Status.Counters["thirdCounter"].Capacity) | ||
| assert.Equal(t, int64(21), fleet.Status.Counters["thirdCounter"].Count) | ||
| assert.Equal(t, agonesv1.SafeAdd(1000, 100), fleet.Status.Counters["fullCounter"].AllocatedCount) |
There was a problem hiding this comment.
Here we want to leave assert.Equal(t, int64(21), fleet.Status.Counters["thirdCounter"].Count). The err := c.updateFleetStatus(ctx, fleet) will call the SafeAdd as part of the method, so that's part of what we're testing.
| AllocatedCapacity: 10, | ||
| Count: 50, | ||
| Capacity: 85, | ||
| AllocatedCount: agonesv1.SafeAdd(5, 0), |
There was a problem hiding this comment.
For these we'll want to leave as plain int64.
You can add another Counter under multiple game servers similar to:
gs1.Status.Counters = map[string]agonesv1.CounterStatus{
"firstCounter": {Count: 5, Capacity: 10},
"secondCounter": {Count: 100, Capacity: 1000},
"fullCounter": {Count: 9223372036854775807, Capacity: 9223372036854775807},
}
And under expected add:
"fullCounter": {
AllocatedCount: 9223372036854775807,
AllocatedCapacity: 9223372036854775807,
Count: 9223372036854775807,
Capacity: 9223372036854775807,
},
|
A general comment is that we noted there's an issue with jsonpatch here https://github.com/googleforgames/agones/blob/eb4035e1f78e7a8e0c147a013a5405f904ab9899/pkg/gameservers/controller.go#L260C21-L273 that's preventing the game server from taking an actual max(int64) value. There's a fix in a different json package evanphx/json-patch#194, but we need to incorporate that into our code. All that is to say this code mostly looks good, but the game server won't currently take max(int64) due to a separate bug. I don't think this PR needs to wait on that code, we can solve that issue separately. |
+1 on this. |
markmandel
left a comment
There was a problem hiding this comment.
LGTM me too. Can come out of draft.
|
Build Succeeded 👏 Build Id: 278dca47-49ac-466d-b094-008344c3b93a The following development artifacts have been built, and will exist for the next 30 days:
A preview of the website (the last 30 builds are retained): To install this version:
|
What type of PR is this?
/kind bug
What this PR does / Why we need it:
Which issue(s) this PR fixes:
Closes #3604
Special notes for your reviewer: