@@ -40,6 +40,9 @@ type Client interface {
4040 // DeleteStale should block and handle WriteDeleteStale messages until the channel is closed.
4141 DeleteStale (context.Context , <- chan * message.WriteDeleteStale ) error
4242
43+ // DeleteRecords should block and handle WriteDeleteRecord messages until the channel is closed.
44+ DeleteRecords (context.Context , <- chan * message.WriteDeleteRecord ) error
45+
4346 // WriteTable should block and handle writes to a single table until the channel is closed. Table metadata can be found in the first WriteInsert message.
4447 // The channel is closed when all inserts in the batch have been sent. New batches, if any, will be sent on a new call to WriteTable.
4548 WriteTable (context.Context , <- chan * message.WriteInsert ) error
@@ -48,9 +51,11 @@ type Client interface {
4851type StreamingBatchWriter struct {
4952 client Client
5053
51- insertWorkers map [string ]* streamingWorkerManager [* message.WriteInsert ]
52- migrateWorker * streamingWorkerManager [* message.WriteMigrateTable ]
53- deleteWorker * streamingWorkerManager [* message.WriteDeleteStale ]
54+ insertWorkers map [string ]* streamingWorkerManager [* message.WriteInsert ]
55+ migrateWorker * streamingWorkerManager [* message.WriteMigrateTable ]
56+ deleteStaleWorker * streamingWorkerManager [* message.WriteDeleteStale ]
57+ deleteRecordWorker * streamingWorkerManager [* message.WriteDeleteRecord ]
58+
5459 workersLock sync.RWMutex
5560 workersWaitGroup sync.WaitGroup
5661
@@ -128,9 +133,14 @@ func (w *StreamingBatchWriter) Flush(_ context.Context) error {
128133 w .migrateWorker .flush <- done
129134 <- done
130135 }
131- if w .deleteWorker != nil {
136+ if w .deleteStaleWorker != nil {
137+ done := make (chan bool )
138+ w .deleteStaleWorker .flush <- done
139+ <- done
140+ }
141+ if w .deleteRecordWorker != nil {
132142 done := make (chan bool )
133- w .deleteWorker .flush <- done
143+ w .deleteRecordWorker .flush <- done
134144 <- done
135145 }
136146 for _ , worker := range w .insertWorkers {
@@ -151,14 +161,18 @@ func (w *StreamingBatchWriter) Close(context.Context) error {
151161 if w .migrateWorker != nil {
152162 close (w .migrateWorker .ch )
153163 }
154- if w .deleteWorker != nil {
155- close (w .deleteWorker .ch )
164+ if w .deleteStaleWorker != nil {
165+ close (w .deleteStaleWorker .ch )
166+ }
167+ if w .deleteRecordWorker != nil {
168+ close (w .deleteRecordWorker .ch )
156169 }
157170 w .workersWaitGroup .Wait ()
158171
159172 w .insertWorkers = make (map [string ]* streamingWorkerManager [* message.WriteInsert ])
160173 w .migrateWorker = nil
161- w .deleteWorker = nil
174+ w .deleteStaleWorker = nil
175+ w .deleteRecordWorker = nil
162176 w .lastMsgType = writers .MsgTypeUnset
163177
164178 return nil
@@ -232,13 +246,13 @@ func (w *StreamingBatchWriter) startWorker(ctx context.Context, errCh chan<- err
232246 case * message.WriteDeleteStale :
233247 w .workersLock .Lock ()
234248 defer w .workersLock .Unlock ()
235- if w .deleteWorker != nil {
236- w .deleteWorker .ch <- m
249+ if w .deleteStaleWorker != nil {
250+ w .deleteStaleWorker .ch <- m
237251 return nil
238252 }
239253 ch := make (chan * message.WriteDeleteStale )
240254 flush := make (chan chan bool )
241- w .deleteWorker = & streamingWorkerManager [* message.WriteDeleteStale ]{
255+ w .deleteStaleWorker = & streamingWorkerManager [* message.WriteDeleteStale ]{
242256 ch : ch ,
243257 writeFunc : w .client .DeleteStale ,
244258
@@ -251,8 +265,8 @@ func (w *StreamingBatchWriter) startWorker(ctx context.Context, errCh chan<- err
251265 }
252266
253267 w .workersWaitGroup .Add (1 )
254- go w .deleteWorker .run (ctx , & w .workersWaitGroup , tableName )
255- w .deleteWorker .ch <- m
268+ go w .deleteStaleWorker .run (ctx , & w .workersWaitGroup , tableName )
269+ w .deleteStaleWorker .ch <- m
256270 return nil
257271 case * message.WriteInsert :
258272 w .workersLock .RLock ()
@@ -285,7 +299,32 @@ func (w *StreamingBatchWriter) startWorker(ctx context.Context, errCh chan<- err
285299 go wr .run (ctx , & w .workersWaitGroup , tableName )
286300 ch <- m
287301 return nil
302+ case * message.WriteDeleteRecord :
303+ w .workersLock .Lock ()
304+ defer w .workersLock .Unlock ()
305+ if w .deleteRecordWorker != nil {
306+ w .deleteRecordWorker .ch <- m
307+ return nil
308+ }
309+ ch := make (chan * message.WriteDeleteRecord )
310+ flush := make (chan chan bool )
311+ // TODO: flush all workers for nested tables as well (See https://github.com/cloudquery/plugin-sdk/issues/1296)
312+ w .deleteRecordWorker = & streamingWorkerManager [* message.WriteDeleteRecord ]{
313+ ch : ch ,
314+ writeFunc : w .client .DeleteRecords ,
315+
316+ flush : flush ,
317+ errCh : errCh ,
288318
319+ batchSizeRows : w .batchSizeRows ,
320+ batchTimeout : w .batchTimeout ,
321+ tickerFn : w .tickerFn ,
322+ }
323+
324+ w .workersWaitGroup .Add (1 )
325+ go w .deleteRecordWorker .run (ctx , & w .workersWaitGroup , tableName )
326+ w .deleteRecordWorker .ch <- m
327+ return nil
289328 default :
290329 return fmt .Errorf ("unhandled message type: %T" , msg )
291330 }
0 commit comments