Skip to content

Commit cde0ef7

Browse files
committed
Do not throw Lua nil access error during scans
This commit omits errors when attempting to access non existent fields during whereeval scans
1 parent 1f5b487 commit cde0ef7

File tree

2 files changed

+28
-19
lines changed

2 files changed

+28
-19
lines changed

internal/server/scan.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package server
22

33
import (
44
"bytes"
5-
"errors"
65
"time"
76

87
"github.com/tidwall/resp"
@@ -33,11 +32,11 @@ func (s *Server) cmdScan(msg *Message) (res resp.Value, err error) {
3332
if args.usingLua() {
3433
defer args.Close()
3534
defer func() {
36-
if r := recover(); r != nil {
37-
res = NOMessage
38-
err = errors.New(r.(string))
39-
return
40-
}
35+
// if r := recover(); r != nil {
36+
// res = NOMessage
37+
// err = fmt.Errorf("%v", r)
38+
// return
39+
// }
4140
}()
4241
}
4342
if err != nil {

internal/server/token.go

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"strings"
99

1010
"github.com/tidwall/tile38/internal/field"
11+
"github.com/tidwall/tile38/internal/log"
1112
lua "github.com/yuin/gopher-lua"
1213
luajson "layeh.com/gopher-json"
1314
)
@@ -160,41 +161,50 @@ func luaSetField(tbl *lua.LTable, name string, val field.Value) {
160161
}
161162

162163
func (whereeval whereevalT) match(fieldsWithNames map[string]field.Value,
163-
id string, props string) (bool, error,
164+
id string, props string) (ok bool, err error,
164165
) {
165166
fieldsTbl := whereeval.luaState.CreateTable(0, len(fieldsWithNames))
166167
for name, val := range fieldsWithNames {
167168
luaSetField(fieldsTbl, name, val)
168169
}
169-
var lprops lua.LValue
170+
propsTbl := lua.LValue(whereeval.luaState.CreateTable(0, 0))
170171
if props != "" {
171172
var err error
172-
lprops, err = luajson.Decode(whereeval.luaState, []byte(props))
173-
if err != nil {
174-
lprops = lua.LNil
173+
tbl, err := luajson.Decode(whereeval.luaState, []byte(props))
174+
if err == nil {
175+
propsTbl = tbl
175176
}
176177
}
177-
// lua.LTString
178178
luaSetRawGlobals(
179179
whereeval.luaState, map[string]lua.LValue{
180180
"ID": lua.LString(id),
181181
"FIELDS": fieldsTbl,
182-
"PROPERTIES": lprops,
183-
})
184-
defer luaSetRawGlobals(
185-
whereeval.luaState, map[string]lua.LValue{
186-
"ID": lua.LNil,
187-
"FIELDS": lua.LNil,
188-
"PROPERTIES": lua.LNil,
182+
"PROPERTIES": propsTbl,
189183
})
184+
defer func() {
185+
luaSetRawGlobals(
186+
whereeval.luaState, map[string]lua.LValue{
187+
"ID": lua.LNil,
188+
"FIELDS": lua.LNil,
189+
"PROPERTIES": lua.LNil,
190+
})
191+
}()
190192

191193
whereeval.luaState.Push(whereeval.fn)
192194
if err := whereeval.luaState.PCall(0, 1, nil); err != nil {
195+
emsg := err.Error()
196+
if strings.Contains(emsg, "attempt to index a non-table") {
197+
log.Debugf("Lua error: %v", emsg)
198+
return false, nil
199+
}
193200
return false, err
194201
}
195202
ret := whereeval.luaState.Get(-1)
196203
whereeval.luaState.Pop(1)
197204

205+
if ret == nil {
206+
return false, nil
207+
}
198208
// Make bool out of returned lua value
199209
switch ret.Type() {
200210
case lua.LTNil:

0 commit comments

Comments
 (0)