agones
agones copied to clipboard
JSON Patch in GameServer Controller is Lossy on Int64
TL;DR:
JSON does not support Int64 well. The current recommendation is that anyone using the count
or capacity
values should avoid using extremely large numbers.
Issue with setting count or capacity for Counter to max(int64):
When the Counter capacity
or count
are set to max(int64) in the game server spec and running kubectl create -f fleet.yaml
we get an error:
spec.template.spec.counters.sessions.capacity: Invalid value: "number": spec.template.spec.counters.sessions.capacity in body must be of type integer: "number"
When the Counter capacity
or count
in the game server spec are close to, but not at, max(int64) kubectl create
does not error. However, when checking the details of the game server with kubectl describe
the values are truncated:
spec:
template:
spec:
counters:
sessions:
count: 8611686018427387904
capacity: 8611686018427387904
becomes
Spec:
Template:
Spec:
Counters:
Sessions:
Capacity: 8611686018427388000
Count: 8611686018427388000
Debugging:
@zmerlynn root-caused the issue #3608, and found that the source issue is with jsonpatch
translating values to scientific notation. A different repo ran into the same error and has a longer description of the issue https://github.com/evanphx/json-patch/issues/189. We're unable to switch to this repo because the fixed method CreateMergePatch
just gives back bytes, but in tests, etc. we use the jsonpatch structures. This will likely need to be an upstream fix in gomodules/jsonpatch or kubernetes-sigs/json. The takeaway is that JSON does not support int64 well, and if the controller is having this many issues there are likely other issues that would crop up elsewhere in the code, and other languages would have yet another set of issues.
Filed https://github.com/gomodules/jsonpatch/issues/39
'This issue is marked as Stale due to inactivity for more than 30 days. To avoid being marked as 'stale' please add 'awaiting-maintainer' label or add a comment. Thank you for your contributions '
Keeping this open to track the upstream work.