@@ -19,20 +19,26 @@ package watch
19
19
20
20
import (
21
21
"context"
22
+ "time"
22
23
23
24
synctypes "configcenter/pkg/synchronize/types"
24
25
"configcenter/src/common"
25
26
"configcenter/src/common/blog"
27
+ "configcenter/src/common/http/rest"
26
28
"configcenter/src/common/mapstr"
27
29
"configcenter/src/common/metadata"
28
30
"configcenter/src/common/watch"
31
+ "configcenter/src/storage/dal/mongo/local"
29
32
"configcenter/src/storage/driver/mongodb"
30
33
"configcenter/src/storage/stream/types"
31
34
)
32
35
33
- const tokenTable = "cc_SrcSyncDataToken"
36
+ const (
37
+ tokenTable = "SrcSyncDataToken"
38
+ cursorTable = "SrcSyncDataCursor"
39
+ )
34
40
35
- var _ types.TokenHandler = new (tokenHandler )
41
+ var _ types.TaskTokenHandler = new (tokenHandler )
36
42
37
43
// tokenHandler is cmdb data syncer event token handler
38
44
type tokenHandler struct {
@@ -44,62 +50,65 @@ func newTokenHandler(resource synctypes.ResType) *tokenHandler {
44
50
return & tokenHandler {resource : resource }
45
51
}
46
52
47
- // tokenInfo is cmdb data syncer event token info
48
- type tokenInfo struct {
49
- Resource synctypes.ResType `bson:"resource"`
50
- Token string `bson:"token"`
51
- Cursor map [watch.CursorType ]string `bson:"cursor"`
52
- StartAtTime * metadata.Time `bson:"start_at_time"`
53
- }
54
-
55
53
// SetLastWatchToken set last event watch token
56
- func (t * tokenHandler ) SetLastWatchToken (ctx context.Context , token string ) error {
54
+ func (t * tokenHandler ) SetLastWatchToken (ctx context.Context , uuid string , watchDB local.DB ,
55
+ token * types.TokenInfo ) error {
56
+
57
57
tokenData := mapstr.MapStr {
58
- common .BKTokenField : token ,
58
+ common .BKTokenField : token ,
59
+ common .BKStartAtTimeField : token .StartAtTime ,
59
60
}
60
- return t .setWatchTokenInfo (ctx , tokenData )
61
- }
62
-
63
- // GetStartWatchToken get event start watch token
64
- func (t * tokenHandler ) GetStartWatchToken (ctx context.Context ) (string , error ) {
65
- info , err := t .getWatchTokenInfo (ctx , common .BKTokenField )
66
- if err != nil {
67
- return "" , err
61
+ filter := map [string ]interface {}{
62
+ "resource" : watch .GenDBWatchTokenID (uuid , string (t .resource )),
68
63
}
69
64
70
- return info .Token , nil
65
+ if err := watchDB .Table (tokenTable ).Upsert (ctx , filter , tokenData ); err != nil {
66
+ blog .Errorf ("set %s watch token info failed, data: %+v, err: %v" , t .resource , tokenData , err )
67
+ return err
68
+ }
69
+ return nil
71
70
}
72
71
73
- // resetWatchToken reset watch token and start watch time
74
- func (t * tokenHandler ) resetWatchToken (startAtTime types.TimeStamp ) error {
72
+ // GetStartWatchToken get event start watch token
73
+ func (t * tokenHandler ) GetStartWatchToken (ctx context.Context , uuid string , watchDB local.DB ) (* types.TokenInfo ,
74
+ error ) {
75
+
75
76
filter := map [string ]interface {}{
76
- "resource" : t .resource ,
77
- }
78
- data := mapstr.MapStr {
79
- common .BKCursorField : make (map [watch.CursorType ]string ),
80
- common .BKTokenField : "" ,
81
- common .BKStartAtTimeField : startAtTime ,
77
+ "resource" : watch .GenDBWatchTokenID (uuid , string (t .resource )),
82
78
}
83
79
84
- if err := mongodb .Client ("watch" ).Table (tokenTable ).Upsert (context .Background (), filter , data ); err != nil {
85
- blog .Errorf ("reset %s watch token failed, data: %+v, err: %v" , t .resource , data , err )
86
- return err
80
+ info := new (types.TokenInfo )
81
+ if err := watchDB .Table (tokenTable ).Find (filter ).One (ctx , & info ); err != nil {
82
+ if mongodb .IsNotFoundError (err ) {
83
+ return & types.TokenInfo {Token : "" , StartAtTime : & types.TimeStamp {Sec : uint32 (time .Now ().Unix ())}}, nil
84
+ }
85
+ blog .Errorf ("get %s event watch token info failed, err: %v" , t .resource , err )
86
+ return nil , err
87
87
}
88
- return nil
88
+
89
+ return info , nil
90
+ }
91
+
92
+ // cursorInfo is cmdb data syncer event token info
93
+ type cursorInfo struct {
94
+ Resource synctypes.ResType `bson:"resource"`
95
+ Cursor map [watch.CursorType ]string `bson:"cursor"`
96
+ StartAtTime * metadata.Time `bson:"start_at_time"`
89
97
}
90
98
91
- // getWatchTokenInfo get event watch token info
92
- func (t * tokenHandler ) getWatchTokenInfo ( ctx context. Context , fields ... string ) (* tokenInfo , error ) {
99
+ // getWatchCursorInfo get event watch token info
100
+ func (t * tokenHandler ) getWatchCursorInfo ( kit * rest. Kit ) (* cursorInfo , error ) {
93
101
filter := map [string ]interface {}{
94
102
"resource" : t .resource ,
95
103
}
96
104
97
- info := new (tokenInfo )
98
- if err := mongodb .Client ("watch" ).Table (tokenTable ).Find (filter ).Fields (fields ... ).One (ctx , & info ); err != nil {
99
- if mongodb .Client ("watch" ).IsNotFoundError (err ) {
100
- return new (tokenInfo ), nil
105
+ info := new (cursorInfo )
106
+ err := mongodb .Dal ("watch" ).Shard (kit .ShardOpts ()).Table (cursorTable ).Find (filter ).One (kit .Ctx , & info )
107
+ if err != nil {
108
+ if mongodb .IsNotFoundError (err ) {
109
+ return new (cursorInfo ), nil
101
110
}
102
- blog .Errorf ("get %s event watch token info failed, err: %v" , t .resource , err )
111
+ blog .Errorf ("get %s event watch token info failed, err: %v, rid: %s " , t .resource , err , kit . Rid )
103
112
return nil , err
104
113
}
105
114
@@ -110,14 +119,14 @@ func (t *tokenHandler) getWatchTokenInfo(ctx context.Context, fields ...string)
110
119
return info , nil
111
120
}
112
121
113
- // getWatchTokenInfo get event watch token info
114
- func (t * tokenHandler ) setWatchTokenInfo ( ctx context. Context , data mapstr.MapStr ) error {
122
+ // setWatchCursorInfo get event watch token info
123
+ func (t * tokenHandler ) setWatchCursorInfo ( kit * rest. Kit , data mapstr.MapStr ) error {
115
124
filter := map [string ]interface {}{
116
125
"resource" : t .resource ,
117
126
}
118
127
119
- if err := mongodb .Client ("watch" ).Table (tokenTable ).Upsert (ctx , filter , data ); err != nil {
120
- blog .Errorf ("set %s watch token info failed, data: %+v, err: %v" , t .resource , data , err )
128
+ if err := mongodb .Dal ("watch" ).Shard ( kit . ShardOpts ()). Table (cursorTable ).Upsert (kit . Ctx , filter , data ); err != nil {
129
+ blog .Errorf ("set %s watch token info failed, data: %+v, err: %v, rid: %s " , t .resource , data , err , kit . Rid )
121
130
return err
122
131
}
123
132
0 commit comments