|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- package ticktock
-
- import (
- "context"
- "fmt"
- "time"
-
- "gitlink.org.cn/cloudream/common/pkgs/logger"
- "gitlink.org.cn/cloudream/common/utils/reflect2"
- stgglb "gitlink.org.cn/cloudream/jcs-pub/common/globals"
- "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/accesstoken"
- hubrpc "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/rpc/hub"
- "gitlink.org.cn/cloudream/jcs-pub/coordinator/internal/db"
-
- cortypes "gitlink.org.cn/cloudream/jcs-pub/coordinator/types"
- )
-
- type ClearExpiredAccessToken struct {
- }
-
- func (j *ClearExpiredAccessToken) Name() string {
- return reflect2.TypeNameOf[ClearExpiredAccessToken]()
- }
-
- func (j *ClearExpiredAccessToken) Execute(t *TickTock) {
- log := logger.WithType[ClearExpiredAccessToken]("TickTock")
- log.Infof("job start")
- startTime := time.Now()
- defer func() {
- log.Infof("job end, time: %v", time.Since(startTime))
- }()
-
- expired, err := db.DoTx02(t.db, func(tx db.SQLContext) ([]cortypes.LoadedAccessToken, error) {
- nowTime := time.Now()
- expired, err := t.db.LoadedAccessToken().GetExpired(tx, nowTime)
- if err != nil {
- return nil, fmt.Errorf("get expired access token load record: %w", err)
- }
-
- err = t.db.LoadedAccessToken().DeleteExpired(tx, nowTime)
- if err != nil {
- return nil, fmt.Errorf("delete expired access token load record: %w", err)
- }
-
- err = t.db.UserAccessToken().DeleteExpired(tx, nowTime)
- if err != nil {
- return nil, fmt.Errorf("delete expired user access token: %w", err)
- }
-
- return expired, nil
- })
- if err != nil {
- log.Warn(err.Error())
- return
- }
-
- uniToken := make(map[accesstoken.CacheKey]bool)
- for _, t := range expired {
- uniToken[accesstoken.CacheKey{
- UserID: t.UserID,
- TokenID: t.TokenID,
- }] = true
- }
-
- log.Infof("%v expired access token cleared", len(uniToken))
-
- // 通知本服务的AccessToken缓存失效
- for k := range uniToken {
- t.accessToken.NotifyTokenInvalid(k)
- }
-
- // 通知所有加载了失效Token的Hub
-
- var loadedHubIDs []cortypes.HubID
- for _, e := range expired {
- loadedHubIDs = append(loadedHubIDs, e.HubID)
- }
-
- loadedHubs, err := t.db.Hub().BatchGetByID(t.db.DefCtx(), loadedHubIDs)
- if err != nil {
- log.Warnf("getting hubs: %v", err)
- return
- }
-
- hubMap := make(map[cortypes.HubID]cortypes.Hub)
- for _, h := range loadedHubs {
- hubMap[h.HubID] = h
- }
-
- for _, e := range expired {
- h, ok := hubMap[e.HubID]
- if !ok {
- continue
- }
- addr, ok := h.Address.(*cortypes.GRPCAddressInfo)
- if !ok {
- continue
- }
-
- cli := stgglb.HubRPCPool.Get(addr.ExternalIP, addr.ExternalGRPCPort)
- // 不关心返回值
- _, err := cli.NotifyUserAccessTokenInvalid(context.Background(), &hubrpc.NotifyUserAccessTokenInvalid{
- UserID: e.UserID,
- TokenID: e.TokenID,
- })
- if err != nil {
- log.Warnf("notify hub %v: %v", h.HubID, err)
- }
- cli.Release()
- }
-
- }
|