Enable ability to set a global query timeout duration
This commit is contained in:
parent
9f0ea3ee61
commit
7f6d1565ff
3 changed files with 23 additions and 0 deletions
|
@ -95,6 +95,8 @@ func init() {
|
||||||
startCmd.PersistentFlags().DurationVar(&opts.DB.Proc.Sync, "db-sync", 0, flag("sync"))
|
startCmd.PersistentFlags().DurationVar(&opts.DB.Proc.Sync, "db-sync", 0, flag("sync"))
|
||||||
startCmd.PersistentFlags().DurationVar(&opts.DB.Proc.Shrink, "db-shrink", 0, flag("shrink"))
|
startCmd.PersistentFlags().DurationVar(&opts.DB.Proc.Shrink, "db-shrink", 0, flag("shrink"))
|
||||||
|
|
||||||
|
startCmd.PersistentFlags().DurationVar(&opts.Query.Timeout, "query-timeout", 0, "")
|
||||||
|
|
||||||
startCmd.PersistentFlags().StringSliceVarP(&opts.Node.Join, "join", "j", nil, flag("join"))
|
startCmd.PersistentFlags().StringSliceVarP(&opts.Node.Join, "join", "j", nil, flag("join"))
|
||||||
|
|
||||||
startCmd.PersistentFlags().StringVarP(&opts.DB.Code, "key", "k", "", flag("key"))
|
startCmd.PersistentFlags().StringVarP(&opts.DB.Code, "key", "k", "", flag("key"))
|
||||||
|
|
|
@ -74,6 +74,10 @@ type Options struct {
|
||||||
Join []string // Slice of cluster peers to join
|
Join []string // Slice of cluster peers to join
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Query struct {
|
||||||
|
Timeout time.Duration // Fixed query timeout
|
||||||
|
}
|
||||||
|
|
||||||
Format struct {
|
Format struct {
|
||||||
Type string // Stores the cli output format
|
Type string // Stores the cli output format
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import (
|
||||||
|
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
|
||||||
|
"github.com/abcum/surreal/cnf"
|
||||||
"github.com/abcum/surreal/kvs"
|
"github.com/abcum/surreal/kvs"
|
||||||
"github.com/abcum/surreal/log"
|
"github.com/abcum/surreal/log"
|
||||||
"github.com/abcum/surreal/mem"
|
"github.com/abcum/surreal/mem"
|
||||||
|
@ -269,6 +270,22 @@ func (e *executor) operate(ctx context.Context, stm sql.Statement) (res []interf
|
||||||
// can monitor the running time, and ensure
|
// can monitor the running time, and ensure
|
||||||
// it runs no longer than specified.
|
// it runs no longer than specified.
|
||||||
|
|
||||||
|
if cnf.Settings.Query.Timeout > 0 {
|
||||||
|
if ctx.Value(ctxKeyKind) != cnf.AuthKV {
|
||||||
|
ctx, canc = context.WithTimeout(ctx, cnf.Settings.Query.Timeout)
|
||||||
|
defer func() {
|
||||||
|
if tim := ctx.Err(); err == nil && tim != nil {
|
||||||
|
res, err = nil, &TimerError{timer: cnf.Settings.Query.Timeout}
|
||||||
|
}
|
||||||
|
canc()
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark the beginning of this statement so we
|
||||||
|
// can monitor the running time, and ensure
|
||||||
|
// it runs no longer than specified.
|
||||||
|
|
||||||
if stm, ok := stm.(sql.KillableStatement); ok {
|
if stm, ok := stm.(sql.KillableStatement); ok {
|
||||||
if stm.Duration() > 0 {
|
if stm.Duration() > 0 {
|
||||||
ctx, canc = context.WithTimeout(ctx, stm.Duration())
|
ctx, canc = context.WithTimeout(ctx, stm.Duration())
|
||||||
|
|
Loading…
Reference in a new issue