rados: Handle commands that return 'inf' as a float value

For now, this appears to be limited to read balancer fields, which
show up in OSD dumps and pool details.
This commit is contained in:
Joshua Baergen 2024-09-23 11:18:36 -06:00
parent f87851df15
commit 0808753eb9
1 changed files with 16 additions and 0 deletions

View File

@ -120,6 +120,9 @@ func (c *RadosConn) MonCommand(args []byte) (buffer []byte, info string, err err
ll.Trace("start executing mon command")
buffer, info, err = c.conn.MonCommand(args)
if err == nil {
buffer = handleCephInf(buffer)
}
ll.WithError(err).Trace("complete executing mon command")
@ -132,6 +135,9 @@ func (c *RadosConn) MgrCommand(args [][]byte) (buffer []byte, info string, err e
ll.Trace("start executing mgr command")
buffer, info, err = c.conn.MgrCommand(args)
if err == nil {
buffer = handleCephInf(buffer)
}
ll.WithError(err).Trace("complete executing mgr command")
@ -163,3 +169,13 @@ func (c *RadosConn) GetPoolStats(pool string) (*ceph.PoolStat, error) {
return poolSt, nil
}
// Some Ceph commands can return "inf" as a float value; this is not allowed by
// the json spec or the golang parser (though it is apparently allowed by the
// Python parser), so we convert such cases to "null".
func handleCephInf(buf []byte) []byte {
buf = bytes.ReplaceAll(buf, []byte("\": inf"), []byte("\": null"))
buf = bytes.ReplaceAll(buf, []byte("\":inf"), []byte("\":null"))
return buf
}