2021-01-14 16:34:52 +08:00
|
|
|
|
package services
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
|
|
|
|
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
|
|
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2021-07-22 18:42:57 +08:00
|
|
|
|
// SysLockerService 互斥锁管理
|
2021-01-14 16:34:52 +08:00
|
|
|
|
type SysLockerService struct {
|
|
|
|
|
|
BaseService
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-07-22 18:42:57 +08:00
|
|
|
|
// SysLockerLock 获得锁
|
2021-01-14 16:34:52 +08:00
|
|
|
|
func (this *SysLockerService) SysLockerLock(ctx context.Context, req *pb.SysLockerLockRequest) (*pb.SysLockerLockResponse, error) {
|
2022-09-17 16:07:37 +08:00
|
|
|
|
_, userId, err := this.ValidateAdminAndUser(ctx, false)
|
2021-01-14 16:34:52 +08:00
|
|
|
|
if err != nil {
|
2021-07-22 18:42:57 +08:00
|
|
|
|
_, err = this.ValidateMonitorNode(ctx)
|
2021-04-05 20:48:33 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2021-01-14 16:34:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
key := req.Key
|
|
|
|
|
|
if userId > 0 {
|
|
|
|
|
|
key = "@user" // 这里不加入用户ID,防止多个用户间冲突
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
timeout := req.TimeoutSeconds
|
|
|
|
|
|
if timeout <= 0 {
|
|
|
|
|
|
timeout = 60
|
|
|
|
|
|
} else if timeout > 86400 { // 最多不能超过1天
|
|
|
|
|
|
timeout = 86400
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var tx = this.NullTx()
|
|
|
|
|
|
ok, err := models.SharedSysLockerDAO.Lock(tx, key, timeout)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
return &pb.SysLockerLockResponse{Ok: ok}, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-07-22 18:42:57 +08:00
|
|
|
|
// SysLockerUnlock 释放锁
|
2021-01-14 16:34:52 +08:00
|
|
|
|
func (this *SysLockerService) SysLockerUnlock(ctx context.Context, req *pb.SysLockerUnlockRequest) (*pb.RPCSuccess, error) {
|
2022-09-17 16:07:37 +08:00
|
|
|
|
_, userId, err := this.ValidateAdminAndUser(ctx, false)
|
2021-01-14 16:34:52 +08:00
|
|
|
|
if err != nil {
|
2021-07-22 18:42:57 +08:00
|
|
|
|
_, err = this.ValidateMonitorNode(ctx)
|
2021-04-05 20:48:33 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2021-01-14 16:34:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
key := req.Key
|
|
|
|
|
|
if userId > 0 {
|
|
|
|
|
|
key = "@user"
|
|
|
|
|
|
}
|
|
|
|
|
|
var tx = this.NullTx()
|
|
|
|
|
|
err = models.SharedSysLockerDAO.Unlock(tx, key)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
return this.Success()
|
|
|
|
|
|
}
|