Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ type App interface {
CreateProject(tx *gorm.DB, p common.Project) (int64, error)
ReGenProjectToken(uid, pid int64) (string, error)
GetProject(pid int64) (*common.Project, error)
CleanProject(tx *gorm.DB, pid int64) error
ClearProject(tx *gorm.DB, pid int64) error
GetUserProjects(uid int64, oid string) ([]*common.ProjectWithUserRole, error)
CheckProjectExist(oid, title string) (*common.Project, error)
CheckUserIsInProject(pid, uid int64) (*common.ProjectRelevance, error) // 确认该用户是否加入该项目
Expand Down
4 changes: 2 additions & 2 deletions app/org.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func (a *app) GetUserOrgs(userID int64) ([]*common.Org, error) {
return list, nil
}

func (a *app) CleanProject(tx *gorm.DB, pid int64) error {
func (a *app) ClearProject(tx *gorm.DB, pid int64) error {
var err error
if err = a.store.Project().DeleteProjectV2(tx, pid); err != nil {
return errors.NewError(http.StatusInternalServerError, fmt.Sprintf("删除项目%d失败", pid)).WithLog(err.Error())
Expand Down Expand Up @@ -97,7 +97,7 @@ func (a *app) DeleteOrg(orgID string, userID int64) error {
}
}()
for _, v := range plist {
if err := a.CleanProject(tx, v.ID); err != nil {
if err := a.ClearProject(tx, v.ID); err != nil {
return errors.NewError(http.StatusInternalServerError, fmt.Sprintf("删除项目%d失败", v.ID)).WithLog(err.Error())
}
}
Expand Down
29 changes: 11 additions & 18 deletions app/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,32 +247,23 @@ type responseMap struct {
m cmap.ConcurrentMap[string, *streamResponse]
}

func (rm *responseMap) Set(ctx context.Context, id string) chan *cronpb.ClientEvent {
timeouter := time.NewTimer(time.Second * 5)
func (rm *responseMap) set(ctx context.Context, id string) chan *cronpb.ClientEvent {
responser := &streamResponse{
recv: make(chan *cronpb.ClientEvent, 1),
mu: &sync.Mutex{},
}
rm.m.Set(id, responser)
go func() {
for {
select {
case <-ctx.Done():
case <-timeouter.C:
}
timeouter.Stop()
responser.mu.Lock()
responser.isClose = true
close(responser.recv)
rm.Remove(id)
responser.mu.Unlock()
return
}
<-ctx.Done()
responser.mu.Lock()
responser.isClose = true
close(responser.recv)
responser.mu.Unlock()
}()
return responser.recv
}

func (rm *responseMap) Remove(id string) {
func (rm *responseMap) remove(id string) {
rm.m.Remove(id)
}

Expand Down Expand Up @@ -310,8 +301,10 @@ func (s *streamManager[T]) SendEventWaitResponse(ctx context.Context, stream int
if !s.isV2 {
return nil, nil
}
resp := s.responseMap.Set(ctx, event.Id)
defer s.responseMap.Remove(event.Id)
ctx, cancel := context.WithCancel(ctx)
defer cancel() // cancel 后 Set 内部的协程会自动清理该id
resp := s.responseMap.set(ctx, event.Id)
defer s.responseMap.remove(event.Id) // 确保id在使用完立即销毁
if err := stream.Send(event); err != nil {
return nil, err
}
Expand Down
2 changes: 2 additions & 0 deletions app/webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ func (a *app) DeleteAllWebHook(tx *gorm.DB, projectID int64) error {
if err != nil {
errObj := errors.ErrInternalError
errObj.Log = "[WebHook - DeleteAllWebHook] failed to delete all webhook by project id: " + err.Error()
return errObj
}

return nil
Expand All @@ -94,6 +95,7 @@ func (a *app) DeleteAllWorkflowTask(tx *gorm.DB, projectID int64) error {
if err != nil {
errObj := errors.ErrInternalError
errObj.Log = "[WebHook - DeleteAllWorkflowTask] failed to delete all workflow task by project id: " + err.Error()
return errObj
}

return nil
Expand Down
2 changes: 1 addition & 1 deletion cmd/service/controller/project_func/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func DeleteOne(c *gin.Context) {
return
}

if err = srv.CleanProject(tx, req.ProjectID); err != nil {
if err = srv.ClearProject(tx, req.ProjectID); err != nil {
response.APIError(c, err)
return
}
Expand Down
11 changes: 9 additions & 2 deletions cmd/service/rpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -538,9 +538,16 @@ func (s *cronRpc) buildAgentRegister(ctx context.Context) (registerFunc func(req
type dispatcher func(reqID string, meta infra.NodeMeta) app.JobDispatcher

func buildDispatchJobsV2Handler(sendEvent func(ctx context.Context, e *cronpb.ServiceEvent) error) dispatcher {
return func(reqID string, meta infra.NodeMeta) app.JobDispatcher {
return func(firstReqID string, meta infra.NodeMeta) app.JobDispatcher {
// firstReqID 代表需要向agent回复的任务下发id,agent在发起注册后,会监听该id的事件来作为中心对agent注册的回应
// 但该id仅需要被回复一次即可
once := sync.Once{}
return func(taskRaw []byte) error {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)
reqID := utils.GetStrID()
once.Do(func() {
reqID = firstReqID
})
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
if err := sendEvent(ctx, &cronpb.ServiceEvent{
Id: reqID,
Expand Down
8 changes: 7 additions & 1 deletion pkg/infra/register/registerv2.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package register
import (
"context"
"errors"
"fmt"
"io"
"sync"
"time"
Expand Down Expand Up @@ -191,9 +192,12 @@ func (s *remoteRegistryV2) register() error {

// 加入 hang 实现“同步模式”的重新注册
hang := make(chan struct{}, 1)
closeHang := sync.OnceFunc(func() {
close(hang)
})
reqID := u.GetStrID()
go safe.Run(func() {
defer close(hang)
defer closeHang()
wait := s.registerNotify.registerNotify(reqID)
hang <- struct{}{}
wait()
Expand Down Expand Up @@ -226,6 +230,7 @@ func (s *remoteRegistryV2) register() error {
if err == nil {
return
}
closeHang() // 避免异常导致死锁
close(kill)

if closeStream != nil {
Expand Down Expand Up @@ -267,6 +272,7 @@ func (s *remoteRegistryV2) register() error {
return
default:
if resp, err = receive(); err != nil {
err = fmt.Errorf("receive error: %w", err)
return
}
if resp.Type == cronpb.EventType_EVENT_REGISTER_REPLY {
Expand Down
2 changes: 1 addition & 1 deletion protocol/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func (a *comm) GetTask(projectID int64, taskID string) (*common.TaskInfo, error)
}

const (
version = "v2.4.7-2"
version = "v2.4.7-3"
GrpcBufferSize = 1024 * 4
)

Expand Down