Fix int32 overflow issues (#12978)
On a 32 bit architecture the size of int is 32 bits. Thus converting from int64, uint64 can overflow it and flip the sign. Try for yourself in playground: package main import "fmt" func main() { x := int64(0x1F0000001) y := int64(1) z := int32(x - y) // numerically this is 0x1F0000000 fmt.Printf("%v\n", z) } Prints -268435456 as if x was smaller. Followup to #12650 Signed-off-by: György Krajcsovits <gyorgy.krajcsovits@grafana.com>
This commit is contained in:
parent
dcaca86958
commit
7d7b9eacff
|
@ -458,7 +458,16 @@ func analyzeBlock(ctx context.Context, path, blockID string, limit int, runExten
|
||||||
postingInfos := []postingInfo{}
|
postingInfos := []postingInfo{}
|
||||||
|
|
||||||
printInfo := func(postingInfos []postingInfo) {
|
printInfo := func(postingInfos []postingInfo) {
|
||||||
slices.SortFunc(postingInfos, func(a, b postingInfo) int { return int(b.metric) - int(a.metric) })
|
slices.SortFunc(postingInfos, func(a, b postingInfo) int {
|
||||||
|
switch {
|
||||||
|
case b.metric < a.metric:
|
||||||
|
return -1
|
||||||
|
case b.metric > a.metric:
|
||||||
|
return 1
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
for i, pc := range postingInfos {
|
for i, pc := range postingInfos {
|
||||||
if i >= limit {
|
if i >= limit {
|
||||||
|
|
|
@ -201,7 +201,14 @@ func (c *LeveledCompactor) Plan(dir string) ([]string, error) {
|
||||||
|
|
||||||
func (c *LeveledCompactor) plan(dms []dirMeta) ([]string, error) {
|
func (c *LeveledCompactor) plan(dms []dirMeta) ([]string, error) {
|
||||||
slices.SortFunc(dms, func(a, b dirMeta) int {
|
slices.SortFunc(dms, func(a, b dirMeta) int {
|
||||||
return int(a.meta.MinTime - b.meta.MinTime)
|
switch {
|
||||||
|
case a.meta.MinTime < b.meta.MinTime:
|
||||||
|
return -1
|
||||||
|
case a.meta.MinTime > b.meta.MinTime:
|
||||||
|
return 1
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
res := c.selectOverlappingDirs(dms)
|
res := c.selectOverlappingDirs(dms)
|
||||||
|
|
27
tsdb/db.go
27
tsdb/db.go
|
@ -580,7 +580,14 @@ func (db *DBReadOnly) Blocks() ([]BlockReader, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
slices.SortFunc(loadable, func(a, b *Block) int {
|
slices.SortFunc(loadable, func(a, b *Block) int {
|
||||||
return int(a.Meta().MinTime - b.Meta().MinTime)
|
switch {
|
||||||
|
case a.Meta().MinTime < b.Meta().MinTime:
|
||||||
|
return -1
|
||||||
|
case a.Meta().MinTime > b.Meta().MinTime:
|
||||||
|
return 1
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
blockMetas := make([]BlockMeta, 0, len(loadable))
|
blockMetas := make([]BlockMeta, 0, len(loadable))
|
||||||
|
@ -1448,7 +1455,14 @@ func (db *DB) reloadBlocks() (err error) {
|
||||||
db.metrics.blocksBytes.Set(float64(blocksSize))
|
db.metrics.blocksBytes.Set(float64(blocksSize))
|
||||||
|
|
||||||
slices.SortFunc(toLoad, func(a, b *Block) int {
|
slices.SortFunc(toLoad, func(a, b *Block) int {
|
||||||
return int(a.Meta().MinTime - b.Meta().MinTime)
|
switch {
|
||||||
|
case a.Meta().MinTime < b.Meta().MinTime:
|
||||||
|
return -1
|
||||||
|
case a.Meta().MinTime > b.Meta().MinTime:
|
||||||
|
return 1
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// Swap new blocks first for subsequently created readers to be seen.
|
// Swap new blocks first for subsequently created readers to be seen.
|
||||||
|
@ -1518,7 +1532,14 @@ func deletableBlocks(db *DB, blocks []*Block) map[ulid.ULID]struct{} {
|
||||||
// Sort the blocks by time - newest to oldest (largest to smallest timestamp).
|
// Sort the blocks by time - newest to oldest (largest to smallest timestamp).
|
||||||
// This ensures that the retentions will remove the oldest blocks.
|
// This ensures that the retentions will remove the oldest blocks.
|
||||||
slices.SortFunc(blocks, func(a, b *Block) int {
|
slices.SortFunc(blocks, func(a, b *Block) int {
|
||||||
return int(b.Meta().MaxTime - a.Meta().MaxTime)
|
switch {
|
||||||
|
case b.Meta().MaxTime < a.Meta().MaxTime:
|
||||||
|
return -1
|
||||||
|
case b.Meta().MaxTime > a.Meta().MaxTime:
|
||||||
|
return 1
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, block := range blocks {
|
for _, block := range blocks {
|
||||||
|
|
|
@ -63,6 +63,15 @@ func (m *maxHeap) push(item Stat) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *maxHeap) get() []Stat {
|
func (m *maxHeap) get() []Stat {
|
||||||
slices.SortFunc(m.Items, func(a, b Stat) int { return int(b.Count - a.Count) })
|
slices.SortFunc(m.Items, func(a, b Stat) int {
|
||||||
|
switch {
|
||||||
|
case b.Count < a.Count:
|
||||||
|
return -1
|
||||||
|
case b.Count > a.Count:
|
||||||
|
return 1
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
})
|
||||||
return m.Items
|
return m.Items
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,16 +179,44 @@ type chunkMetaAndChunkDiskMapperRef struct {
|
||||||
|
|
||||||
func refLessByMinTimeAndMinRef(a, b chunkMetaAndChunkDiskMapperRef) int {
|
func refLessByMinTimeAndMinRef(a, b chunkMetaAndChunkDiskMapperRef) int {
|
||||||
if a.meta.MinTime == b.meta.MinTime {
|
if a.meta.MinTime == b.meta.MinTime {
|
||||||
return int(a.meta.Ref - b.meta.Ref)
|
switch {
|
||||||
|
case a.meta.Ref < b.meta.Ref:
|
||||||
|
return -1
|
||||||
|
case a.meta.Ref > b.meta.Ref:
|
||||||
|
return 1
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch {
|
||||||
|
case a.meta.MinTime < b.meta.MinTime:
|
||||||
|
return -1
|
||||||
|
case a.meta.MinTime > b.meta.MinTime:
|
||||||
|
return 1
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
return int(a.meta.MinTime - b.meta.MinTime)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func lessByMinTimeAndMinRef(a, b chunks.Meta) int {
|
func lessByMinTimeAndMinRef(a, b chunks.Meta) int {
|
||||||
if a.MinTime == b.MinTime {
|
if a.MinTime == b.MinTime {
|
||||||
return int(a.Ref - b.Ref)
|
switch {
|
||||||
|
case a.Ref < b.Ref:
|
||||||
|
return -1
|
||||||
|
case a.Ref > b.Ref:
|
||||||
|
return 1
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch {
|
||||||
|
case a.MinTime < b.MinTime:
|
||||||
|
return -1
|
||||||
|
case a.MinTime > b.MinTime:
|
||||||
|
return 1
|
||||||
|
default:
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
return int(a.MinTime - b.MinTime)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (oh *OOOHeadIndexReader) Postings(ctx context.Context, name string, values ...string) (index.Postings, error) {
|
func (oh *OOOHeadIndexReader) Postings(ctx context.Context, name string, values ...string) (index.Postings, error) {
|
||||||
|
|
Loading…
Reference in New Issue