storage: Fix float->uint conversions on some compilers.

See https://github.com/prometheus/prometheus/issues/887, which will at
least be partially fixed by this.

From the spec https://golang.org/ref/spec#Conversions:

"In all non-constant conversions involving floating-point or complex
values, if the result type cannot represent the value the conversion
succeeds but the result value is implementation-dependent."

This ended up setting the converted values to 0 on Debian's Go 1.4.2
compiler, at least on 32-bit Debians.
This commit is contained in:
Julius Volz 2015-07-13 11:19:11 +02:00
parent 87b9813be4
commit acbc2b8cb6
2 changed files with 6 additions and 6 deletions

View File

@ -156,11 +156,11 @@ func (c deltaEncodedChunk) add(s *metric.SamplePair) []chunk {
case d0: case d0:
// No-op. Constant value is stored as base value. // No-op. Constant value is stored as base value.
case d1: case d1:
c[offset] = byte(dv) c[offset] = byte(int8(dv))
case d2: case d2:
binary.LittleEndian.PutUint16(c[offset:], uint16(dv)) binary.LittleEndian.PutUint16(c[offset:], uint16(int16(dv)))
case d4: case d4:
binary.LittleEndian.PutUint32(c[offset:], uint32(dv)) binary.LittleEndian.PutUint32(c[offset:], uint32(int32(dv)))
// d8 must not happen. Those samples are encoded as float64. // d8 must not happen. Those samples are encoded as float64.
default: default:
panic("invalid number of bytes for integer delta") panic("invalid number of bytes for integer delta")

View File

@ -164,11 +164,11 @@ func (c doubleDeltaEncodedChunk) add(s *metric.SamplePair) []chunk {
case d0: case d0:
// No-op. Constant delta is stored as base value. // No-op. Constant delta is stored as base value.
case d1: case d1:
c[offset] = byte(ddv) c[offset] = byte(int8(ddv))
case d2: case d2:
binary.LittleEndian.PutUint16(c[offset:], uint16(ddv)) binary.LittleEndian.PutUint16(c[offset:], uint16(int16(ddv)))
case d4: case d4:
binary.LittleEndian.PutUint32(c[offset:], uint32(ddv)) binary.LittleEndian.PutUint32(c[offset:], uint32(int32(ddv)))
// d8 must not happen. Those samples are encoded as float64. // d8 must not happen. Those samples are encoded as float64.
default: default:
panic("invalid number of bytes for integer delta") panic("invalid number of bytes for integer delta")