From e2b531dd24f47d9bff82e31e87b227d690f2cc6c Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 13 Dec 2024 00:52:23 +0800 Subject: [PATCH 1/2] Update dependencies in go.mod and go.sum; upgrade golang.org/x/crypto to v0.31.0, golang.org/x/sync to v0.10.0, golang.org/x/sys to v0.28.0, and golang.org/x/text to v0.21.0. Refactor Execute method in process.go to implement context timeout and improve error handling. --- go.mod | 8 ++++---- go.sum | 8 ++++++++ process/process.go | 31 +++++++++++++++++++++++++------ 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index e0ed0f0c..2ce35ca7 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/tidwall/buntdb v1.3.0 github.com/yaoapp/kun v0.9.0 github.com/yaoapp/xun v0.0.0-00010101000000-000000000000 - golang.org/x/crypto v0.25.0 + golang.org/x/crypto v0.31.0 gopkg.in/yaml.v3 v3.0.1 rogchap.com/v8go v0.8.0 ) @@ -68,9 +68,9 @@ require ( go.mongodb.org/mongo-driver v1.13.0 golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.27.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect google.golang.org/grpc v1.60.1 // indirect google.golang.org/protobuf v1.34.2 // indirect diff --git a/go.sum b/go.sum index 59e92dfe..e9a442ee 100644 --- a/go.sum +++ b/go.sum @@ -184,6 +184,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -204,6 +206,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -226,6 +230,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -236,6 +242,8 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= diff --git a/process/process.go b/process/process.go index 8a9de927..3baa7657 100644 --- a/process/process.go +++ b/process/process.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "strings" + "time" "github.com/yaoapp/kun/exception" ) @@ -32,16 +33,32 @@ func Of(name string, args ...interface{}) (*Process, error) { // Execute execute the process and return error only func (process *Process) Execute() (err error) { + if process.Context == nil { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + process.Context = ctx + } + var hd Handler hd, err = process.handler() if err != nil { return err } - defer func() { err = exception.Catch(recover()) }() - value := hd(process) - process._val = &value - return err + done := make(chan struct{}) + go func() { + defer close(done) + defer func() { err = exception.Catch(recover()) }() + value := hd(process) + process._val = &value + }() + + select { + case <-process.Context.Done(): + return process.Context.Err() + case <-done: + return err + } } // Release the value of the process @@ -51,6 +68,9 @@ func (process *Process) Release() { // Dispose the process after run success func (process *Process) Dispose() { + if process == nil { + return + } if process.Runtime != nil { process.Runtime.Dispose() } @@ -60,7 +80,6 @@ func (process *Process) Dispose() { process.Context = nil process.Runtime = nil process._val = nil - process = nil } // Value get the result of the process @@ -85,6 +104,7 @@ func (process *Process) Run() interface{} { return nil } + defer func() { process.Release() }() return hd(process) } @@ -106,7 +126,6 @@ func (process *Process) Run() interface{} { // // **** func (process *Process) Exec() (value interface{}, err error) { - var hd Handler hd, err = process.handler() if err != nil { From b6515a6c01101767819d623c6f3cc18f3b1de376 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 13 Dec 2024 01:02:07 +0800 Subject: [PATCH 2/2] Add NewWithContext function to process.go for creating processes with context support; improves error handling during process initialization. --- process/process.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/process/process.go b/process/process.go index 3baa7657..bfa6a641 100644 --- a/process/process.go +++ b/process/process.go @@ -21,6 +21,15 @@ func New(name string, args ...interface{}) *Process { return process } +// NewWithContext make a new process with context +func NewWithContext(ctx context.Context, name string, args ...interface{}) *Process { + process, err := Of(name, args...) + if err != nil { + exception.New("%s", 500, err.Error()).Throw() + } + return process +} + // Of make a new process and return error func Of(name string, args ...interface{}) (*Process, error) { process := &Process{Name: name, Args: args, Global: map[string]interface{}{}}