mirror of https://github.com/tidwall/tile38.git
Add timeout subcommand to scan/search commands.
Use per-query timeout for those commands, if it was given.
This commit is contained in:
parent
0aecef6a5c
commit
e514a0287f
|
@ -13,6 +13,11 @@ func New(deadline time.Time) *Deadline {
|
|||
return &Deadline{unixNano: deadline.UnixNano()}
|
||||
}
|
||||
|
||||
// Update the deadline from a given time object
|
||||
func (deadline *Deadline) Update(newDeadline time.Time) {
|
||||
deadline.unixNano = newDeadline.UnixNano()
|
||||
}
|
||||
|
||||
// Check the deadline and panic when reached
|
||||
//go:noinline
|
||||
func (deadline *Deadline) Check() {
|
||||
|
|
|
@ -55,6 +55,9 @@ func (c *Server) cmdScan(msg *Message) (res resp.Value, err error) {
|
|||
wr.WriteString(`{"ok":true`)
|
||||
}
|
||||
sw.writeHead()
|
||||
if s.timeout != 0 {
|
||||
msg.Deadline.Update(start.Add(s.timeout))
|
||||
}
|
||||
if sw.col != nil {
|
||||
if sw.output == outputCount && len(sw.wheres) == 0 &&
|
||||
len(sw.whereins) == 0 && sw.globEverything == true {
|
||||
|
|
|
@ -370,6 +370,9 @@ func (server *Server) cmdNearby(msg *Message) (res resp.Value, err error) {
|
|||
wr.WriteString(`{"ok":true`)
|
||||
}
|
||||
sw.writeHead()
|
||||
if s.timeout != 0 {
|
||||
msg.Deadline.Update(start.Add(s.timeout))
|
||||
}
|
||||
if sw.col != nil {
|
||||
iter := func(id string, o geojson.Object, fields []float64, dist float64) bool {
|
||||
meters := 0.0
|
||||
|
@ -480,6 +483,9 @@ func (server *Server) cmdWithinOrIntersects(cmd string, msg *Message) (res resp.
|
|||
wr.WriteString(`{"ok":true`)
|
||||
}
|
||||
sw.writeHead()
|
||||
if s.timeout != 0 {
|
||||
msg.Deadline.Update(start.Add(s.timeout))
|
||||
}
|
||||
if sw.col != nil {
|
||||
if cmd == "within" {
|
||||
sw.col.Within(s.obj, s.sparse, sw, msg.Deadline, func(
|
||||
|
@ -570,6 +576,9 @@ func (server *Server) cmdSearch(msg *Message) (res resp.Value, err error) {
|
|||
wr.WriteString(`{"ok":true`)
|
||||
}
|
||||
sw.writeHead()
|
||||
if s.timeout != 0 {
|
||||
msg.Deadline.Update(start.Add(s.timeout))
|
||||
}
|
||||
if sw.col != nil {
|
||||
if sw.output == outputCount && len(sw.wheres) == 0 && sw.globEverything == true {
|
||||
count := sw.col.Count() - int(s.cursor)
|
||||
|
|
|
@ -1024,7 +1024,7 @@ func (server *Server) handleInputCommand(client *Client, msg *Message) error {
|
|||
// No locking for pubsub
|
||||
}
|
||||
res, d, err := func() (res resp.Value, d commandDetails, err error) {
|
||||
if client.timeout != 0 && !write {
|
||||
if !write {
|
||||
msg.Deadline = deadline.New(start.Add(client.timeout))
|
||||
defer func() {
|
||||
if msg.Deadline.Hit() {
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
"math"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/yuin/gopher-lua"
|
||||
)
|
||||
|
@ -247,6 +248,7 @@ type searchScanBaseTokens struct {
|
|||
sparse uint8
|
||||
desc bool
|
||||
clip bool
|
||||
timeout time.Duration
|
||||
}
|
||||
|
||||
func (c *Server) parseSearchScanBaseTokens(
|
||||
|
@ -579,6 +581,20 @@ func (c *Server) parseSearchScanBaseTokens(
|
|||
}
|
||||
t.clip = true
|
||||
continue
|
||||
case "timeout":
|
||||
vs = nvs
|
||||
var valStr string
|
||||
if vs, valStr, ok = tokenval(vs); !ok || valStr == "" {
|
||||
err = errInvalidNumberOfArguments
|
||||
return
|
||||
}
|
||||
timeout, _err := strconv.ParseFloat(valStr, 64)
|
||||
if _err != nil || timeout < 0 {
|
||||
err = errInvalidArgument(valStr)
|
||||
return
|
||||
}
|
||||
t.timeout = time.Duration(timeout * float64(time.Second))
|
||||
continue
|
||||
}
|
||||
}
|
||||
break
|
||||
|
|
Loading…
Reference in New Issue