Plugins: recreate Go plugin on each invocation (#20996)
This commit is contained in:
parent
467a7f8dab
commit
5586fad643
1 changed files with 28 additions and 13 deletions
41
plugin/go.go
41
plugin/go.go
|
|
@ -14,7 +14,7 @@ import (
|
|||
|
||||
// Go implements Go request provider
|
||||
type Go struct {
|
||||
vm *interp.Interpreter
|
||||
vm func() (*interp.Interpreter, error)
|
||||
script string
|
||||
in []inputTransformation
|
||||
out []outputTransformation
|
||||
|
|
@ -37,7 +37,7 @@ func NewGoPluginFromConfig(ctx context.Context, other map[string]interface{}) (P
|
|||
return nil, err
|
||||
}
|
||||
|
||||
vm, err := golang.RegisteredVM(cc.VM, "")
|
||||
_, err := golang.RegisteredVM(cc.VM, "")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -53,7 +53,8 @@ func NewGoPluginFromConfig(ctx context.Context, other map[string]interface{}) (P
|
|||
}
|
||||
|
||||
p := &Go{
|
||||
vm: vm,
|
||||
// recreate VM on each invocation
|
||||
vm: func() (*interp.Interpreter, error) { return golang.RegisteredVM(cc.VM, "") },
|
||||
script: cc.Script,
|
||||
in: in,
|
||||
out: out,
|
||||
|
|
@ -139,23 +140,35 @@ func (p *Go) BoolGetter() (func() (bool, error), error) {
|
|||
}
|
||||
|
||||
func (p *Go) handleGetter() (any, error) {
|
||||
if err := transformInputs(p.in, p.setParam); err != nil {
|
||||
vm, err := p.vm()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return p.evaluate()
|
||||
if err := transformInputs(p.in, p.setParam(vm)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return p.evaluate(vm)
|
||||
}
|
||||
|
||||
func (p *Go) handleSetter(param string, val any) error {
|
||||
if err := transformInputs(p.in, p.setParam); err != nil {
|
||||
vm, err := p.vm()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := p.setParam(param, val); err != nil {
|
||||
setParam := p.setParam(vm)
|
||||
|
||||
if err := transformInputs(p.in, setParam); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
vv, err := p.evaluate()
|
||||
if err := setParam(param, val); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
vv, err := p.evaluate(vm)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -163,7 +176,7 @@ func (p *Go) handleSetter(param string, val any) error {
|
|||
return transformOutputs(p.out, vv)
|
||||
}
|
||||
|
||||
func (p *Go) evaluate() (res any, err error) {
|
||||
func (p *Go) evaluate(vm *interp.Interpreter) (res any, err error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
err = fmt.Errorf("panic: %v", r)
|
||||
|
|
@ -171,7 +184,7 @@ func (p *Go) evaluate() (res any, err error) {
|
|||
err = backoff.Permanent(err)
|
||||
}()
|
||||
|
||||
v, err := p.vm.Eval(p.script)
|
||||
v, err := vm.Eval(p.script)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -187,9 +200,11 @@ func (p *Go) evaluate() (res any, err error) {
|
|||
return normalizeValue(v.Interface())
|
||||
}
|
||||
|
||||
func (p *Go) setParam(param string, val any) error {
|
||||
_, err := p.vm.Eval(fmt.Sprintf("%s := %#v;", param, val))
|
||||
return err
|
||||
func (p *Go) setParam(vm *interp.Interpreter) func(param string, val any) error {
|
||||
return func(param string, val any) error {
|
||||
_, err := vm.Eval(fmt.Sprintf("%s := %#v;", param, val))
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
var _ IntSetter = (*Go)(nil)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue