@@ -24,88 +24,28 @@ import (
24
24
"github.com/milvus-io/milvus/pkg/streaming/util/message"
25
25
"github.com/milvus-io/milvus/pkg/streaming/util/message/adaptor"
26
26
"github.com/milvus-io/milvus/pkg/util/conc"
27
- "github.com/milvus-io/milvus/pkg/util/paramtable"
28
27
"github.com/milvus-io/milvus/pkg/util/retry"
29
28
)
30
29
31
- // buildFlusherComponents builds the components of the flusher.
32
- func (impl * WALFlusherImpl ) buildFlusherComponents (ctx context.Context , l wal.WAL ) (* flusherComponents , error ) {
33
- // Get all existed vchannels of the pchannel.
34
- vchannels , err := impl .getVchannels (ctx , l .Channel ().Name )
35
- if err != nil {
36
- impl .logger .Warn ("get vchannels failed" , zap .Error (err ))
37
- return nil , err
38
- }
39
- impl .logger .Info ("fetch vchannel done" , zap .Int ("vchannelNum" , len (vchannels )))
40
-
41
- // Get all the recovery info of the recoverable vchannels.
42
- recoverInfos , err := impl .getRecoveryInfos (ctx , vchannels )
43
- if err != nil {
44
- impl .logger .Warn ("get recovery info failed" , zap .Error (err ))
45
- return nil , err
46
- }
47
- impl .logger .Info ("fetch recovery info done" , zap .Int ("recoveryInfoNum" , len (recoverInfos )))
48
-
49
- // build up components
50
- dc , err := resource .Resource ().DataCoordClient ().GetWithContext (ctx )
51
- if err != nil {
52
- impl .logger .Warn ("flusher recovery is canceled before data coord client ready" , zap .Error (err ))
53
- return nil , err
54
- }
55
- impl .logger .Info ("data coord client ready" )
56
-
57
- broker := broker .NewCoordBroker (dc , paramtable .GetNodeID ())
58
- chunkManager := resource .Resource ().ChunkManager ()
59
- syncMgr := syncmgr .NewSyncManager (chunkManager )
60
- wbMgr := writebuffer .NewManager (syncMgr )
61
- wbMgr .Start ()
62
- cpUpdater := util .NewChannelCheckpointUpdater (broker )
63
- go cpUpdater .Start ()
64
-
65
- fc := & flusherComponents {
66
- wal : l ,
67
- broker : broker ,
68
- syncMgr : syncMgr ,
69
- wbMgr : wbMgr ,
70
- cpUpdater : cpUpdater ,
71
- chunkManager : chunkManager ,
72
- dataServices : make (map [string ]* dataSyncServiceWrapper ),
73
- logger : impl .logger ,
74
- }
75
- impl .logger .Info ("flusher components intiailizing done" )
76
- if err := fc .recover (ctx , recoverInfos ); err != nil {
77
- impl .logger .Warn ("flusher recovery is canceled before recovery done, recycle the resource" , zap .Error (err ))
78
- fc .Close ()
79
- impl .logger .Info ("flusher recycle the resource done" )
80
- return nil , err
81
- }
82
- impl .logger .Info ("flusher recovery done" )
83
- return fc , nil
84
- }
85
-
86
30
// flusherComponents is the components of the flusher.
87
31
type flusherComponents struct {
88
- wal wal.WAL
89
- broker broker.Broker
90
- syncMgr syncmgr.SyncManager
91
- wbMgr writebuffer.BufferManager
92
- cpUpdater * util.ChannelCheckpointUpdater
93
- chunkManager storage.ChunkManager
94
- dataServices map [string ]* dataSyncServiceWrapper
95
- logger * log.MLogger
32
+ wal wal.WAL
33
+ broker broker.Broker
34
+ syncMgr syncmgr.SyncManager
35
+ wbMgr writebuffer.BufferManager
36
+ cpUpdater * util.ChannelCheckpointUpdater
37
+ chunkManager storage.ChunkManager
38
+ dataServices map [string ]* dataSyncServiceWrapper
39
+ checkpointManager * pchannelCheckpointManager
40
+ logger * log.MLogger
96
41
}
97
42
98
- // GetMinimumStartMessage gets the minimum start message of all the data services.
99
- func (impl * flusherComponents ) GetMinimumStartMessage () message.MessageID {
100
- var startMessageID message.MessageID
101
- for _ , ds := range impl .dataServices {
102
- if startMessageID == nil || ds .startMessageID .LT (startMessageID ) {
103
- startMessageID = ds .startMessageID
104
- }
105
- }
106
- return startMessageID
43
+ // StartMessageID returns the start message id of the flusher after recovering.
44
+ func (impl * flusherComponents ) StartMessageID () message.MessageID {
45
+ return impl .checkpointManager .StartMessageID ()
107
46
}
108
47
48
+ // WhenCreateCollection handles the create collection message.
109
49
func (impl * flusherComponents ) WhenCreateCollection (createCollectionMsg message.ImmutableCreateCollectionMessageV1 ) {
110
50
if _ , ok := impl .dataServices [createCollectionMsg .VChannel ()]; ok {
111
51
impl .logger .Info ("the data sync service of current vchannel is built, skip it" , zap .String ("vchannel" , createCollectionMsg .VChannel ()))
@@ -172,8 +112,10 @@ func (impl *flusherComponents) WhenDropCollection(vchannel string) {
172
112
delete (impl .dataServices , vchannel )
173
113
impl .logger .Info ("drop data sync service" , zap .String ("vchannel" , vchannel ))
174
114
}
115
+ impl .checkpointManager .DropVChannel (vchannel )
175
116
}
176
117
118
+ // HandleMessage handles the plain message.
177
119
func (impl * flusherComponents ) HandleMessage (ctx context.Context , msg message.ImmutableMessage ) error {
178
120
vchannel := msg .VChannel ()
179
121
if vchannel == "" {
@@ -185,6 +127,7 @@ func (impl *flusherComponents) HandleMessage(ctx context.Context, msg message.Im
185
127
return impl .dataServices [vchannel ].HandleMessage (ctx , msg )
186
128
}
187
129
130
+ // broadcastToAllDataSyncService broadcasts the message to all data sync services.
188
131
func (impl * flusherComponents ) broadcastToAllDataSyncService (ctx context.Context , msg message.ImmutableMessage ) error {
189
132
for _ , ds := range impl .dataServices {
190
133
if err := ds .HandleMessage (ctx , msg ); err != nil {
@@ -194,17 +137,14 @@ func (impl *flusherComponents) broadcastToAllDataSyncService(ctx context.Context
194
137
return nil
195
138
}
196
139
140
+ // addNewDataSyncService adds a new data sync service to the components when new collection is created.
197
141
func (impl * flusherComponents ) addNewDataSyncService (
198
142
createCollectionMsg message.ImmutableCreateCollectionMessageV1 ,
199
143
input chan <- * msgstream.MsgPack ,
200
144
ds * pipeline.DataSyncService ,
201
145
) {
202
- newDS := & dataSyncServiceWrapper {
203
- input : input ,
204
- handler : adaptor .NewBaseMsgPackAdaptorHandler (),
205
- ds : ds ,
206
- startMessageID : createCollectionMsg .LastConfirmedMessageID (),
207
- }
146
+ impl .checkpointManager .AddVChannel (createCollectionMsg .VChannel (), createCollectionMsg .LastConfirmedMessageID ())
147
+ newDS := newDataSyncServiceWrapper (input , ds )
208
148
newDS .Start ()
209
149
impl .dataServices [createCollectionMsg .VChannel ()] = newDS
210
150
impl .logger .Info ("create data sync service done" , zap .String ("vchannel" , createCollectionMsg .VChannel ()))
@@ -219,6 +159,7 @@ func (impl *flusherComponents) Close() {
219
159
impl .wbMgr .Stop ()
220
160
impl .cpUpdater .Close ()
221
161
impl .syncMgr .Close ()
162
+ impl .checkpointManager .Close ()
222
163
}
223
164
224
165
// recover recover the components of the flusher.
@@ -254,6 +195,7 @@ func (impl *flusherComponents) recover(ctx context.Context, recoverInfos map[str
254
195
return nil
255
196
}
256
197
198
+ // buildDataSyncServiceWithRetry builds the data sync service with retry.
257
199
func (impl * flusherComponents ) buildDataSyncServiceWithRetry (ctx context.Context , recoverInfo * datapb.GetChannelRecoveryInfoResponse ) (* dataSyncServiceWrapper , error ) {
258
200
var ds * dataSyncServiceWrapper
259
201
err := retry .Do (ctx , func () error {
@@ -267,6 +209,7 @@ func (impl *flusherComponents) buildDataSyncServiceWithRetry(ctx context.Context
267
209
return ds , nil
268
210
}
269
211
212
+ // buildDataSyncService builds the data sync service with given recovery info.
270
213
func (impl * flusherComponents ) buildDataSyncService (ctx context.Context , recoverInfo * datapb.GetChannelRecoveryInfoResponse ) (* dataSyncServiceWrapper , error ) {
271
214
// Build and add pipeline.
272
215
input := make (chan * msgstream.MsgPack , 10 )
@@ -300,10 +243,5 @@ func (impl *flusherComponents) buildDataSyncService(ctx context.Context, recover
300
243
if err != nil {
301
244
return nil , err
302
245
}
303
- return & dataSyncServiceWrapper {
304
- input : input ,
305
- handler : adaptor .NewBaseMsgPackAdaptorHandler (),
306
- ds : ds ,
307
- startMessageID : adaptor .MustGetMessageIDFromMQWrapperIDBytes (impl .wal .WALName (), recoverInfo .GetInfo ().GetSeekPosition ().GetMsgID ()),
308
- }, nil
246
+ return newDataSyncServiceWrapper (input , ds ), nil
309
247
}
0 commit comments