influxdata / influxdata/kapacitor

[bug] Panic on division by zero (panic: runtime error: integer divide by zero)

Open
#1,467 0 comments 0 reactions 0 assignees View on GitHub
bug ready
Dominant language
Go
Stars
2.4k
Forks
479
Avg merge
4d 16h
Merged PRs (30d)
4

Description

```
[run] 2017/07/04 11:13:55 I! Kapacitor starting, version 1.3.1, branch master, commit 3b5512f7276483326577907803167e4bb213c613
[run] 2017/07/04 11:13:55 I! Go version go1.7.5
[srv] 2017/07/04 11:13:55 I! Kapacitor hostname: 172.17.0.1

[...]

[edge:interface_derivate_normalize|eval24->union29] 2017/07/04 11:10:40 D! closing c: 0 e: 0
panic: runtime error: integer divide by zero

goroutine 32184 [running]:
panic(0x1cd0de0, 0xc42000a050)
/usr/local/go/src/runtime/panic.go:500 +0x1a1
github.com/influxdata/kapacitor/tick/stateful.glob..func51(0xc4217f7f00, 0xc420e2de90, 0x2e34060, 0xc420026288, 0x2e34060, 0xc420026290, 0x0, 0x0, 0x0, 0x0, ...)
/root/go/src/github.com/influxdata/kapacitor/tick/stateful/evaluation_funcs.go:1037 +0x258
github.com/influxdata/kapacitor/tick/stateful.(*EvalBinaryNode).eval(0xc420921bc0, 0xc4217f7f00, 0xc420e2de90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/root/go/src/github.com/influxdata/kapacitor/tick/stateful/eval_binary_node.go:249 +0xb3
github.com/influxdata/kapacitor/tick/stateful.(*EvalBinaryNode).EvalInt(0xc420921bc0, 0xc4217f7f00, 0xc420e2de90, 0x0, 0x7f13f379a960, 0x0)
/root/go/src/github.com/influxdata/kapacitor/tick/stateful/eval_binary_node.go:226 +0x5a
github.com/influxdata/kapacitor/tick/stateful.glob..func51(0xc4217f7f00, 0xc420e2de90, 0x2e33ce0, 0xc420921bc0, 0x2e33f60, 0xc420858ce8, 0x0, 0x0, 0x0, 0x0, ...)
/root/go/src/github.com/influxdata/kapacitor/tick/stateful/evaluation_funcs.go:1029 +0x8d
github.com/influxdata/kapacitor/tick/stateful.(*EvalBinaryNode).eval(0xc420921b80, 0xc4217f7f00, 0xc420e2de90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/root/go/src/github.com/influxdata/kapacitor/tick/stateful/eval_binary_node.go:249 +0xb3
github.com/influxdata/kapacitor/tick/stateful.(*EvalBinaryNode).EvalInt(0xc420921b80, 0xc4217f7f00, 0xc420e2de90, 0x20000c42122a000, 0x1d, 0x100000000400202)
/root/go/src/github.com/influxdata/kapacitor/tick/stateful/eval_binary_node.go:226 +0x5a
github.com/influxdata/kapacitor/tick/stateful.(*expression).EvalInt(0xc42122a000, 0xc4217f7f00, 0xc4217f7f00, 0xc42122a002, 0x0)
/root/go/src/github.com/influxdata/kapacitor/tick/stateful/expr.go:72 +0x46
github.com/influxdata/kapacitor/tick/stateful.(*expression).Eval(0xc42122a000, 0xc4217f7f00, 0x2, 0x2, 0xed0ed6eaf, 0x0)
/root/go/src/github.com/influxdata/kapacitor/tick/stateful/expr.go:99 +0x287
github.com/influxdata/kapacitor.(*EvalNode).eval(0xc421712580, 0xed0ed6eaf, 0x0, 0x2e6dc40, 0xc4217ae150, 0x26, 0xc420e2d290, 0xc4217a88a0, 0x0, 0x0, ...)
/root/go/src/github.com/influxdata/kapacitor/eval.go:154 +0x282
github.com/influxdata/kapacitor.(*EvalNode).runEval(0xc421712580, 0x0, 0x0, 0x0, 0xc420724758, 0xc420724768)
/root/go/src/github.com/influxdata/kapacitor/eval.go:85 +0x23f
github.com/influxdata/kapacitor.(*EvalNode).(github.com/influxdata/kapacitor.runEval)-fm(0x0, 0x0, 0x0, 0xc420724780, 0xc421882b40)
/root/go/src/github.com/influxdata/kapacitor/eval.go:67 +0x48
github.com/influxdata/kapacitor.(*node).start.func1(0xc421712580, 0x0, 0x0, 0x0)
/root/go/src/github.com/influxdata/kapacitor/node.go:140 +0x8e
created by github.com/influxdata/kapacitor.(*node).start
/root/go/src/github.com/influxdata/kapacitor/node.go:141 +0x5d
```

Part of the TICKScript:
```
var data_normalized = data_raw
|eval(lambda: "meas" / "total" / 1000)
.as('norm')
```
With `meas` and `total` NOT having the same types (e.g. int and float). While this is a clearly an error in the TICKScript, I do not expect kapacitor to panic. (panic doesn't happen when defining the script, but when data arrives)

Contributor guide

Open the contributing guide

Research direction

Start in tick/stateful/evaluation_funcs.go around lines 1029-1037 and follow the call path through eval_binary_node.go, expr.go, and eval.go. Reproduce the mixed integer/float division from the reported TICKScript when data arrives, then add coverage for the case. Done means this invalid expression no longer causes Kapacitor to panic at runtime.

Written by the indexing model from the issue text.

Assessment

Tech stack
go
Domain
backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.