8
8
"strings"
9
9
"time"
10
10
11
- "github.com/wormhole-foundation/wormhole-monitor/fly/common"
12
11
"github.com/dgraph-io/badger/v3"
12
+ "github.com/wormhole-foundation/wormhole-monitor/fly/common"
13
13
"github.com/wormhole-foundation/wormhole/sdk/vaa"
14
14
)
15
15
@@ -203,7 +203,6 @@ func (db *Database) iterateIndex(metricsChecked bool, callback func(item *badger
203
203
})
204
204
}
205
205
206
-
207
206
// processMessage retrieves a message from the database and applies an update function to it if the message is older than the cut-off time
208
207
func (db * Database ) processMessage (messageID string , now time.Time , cutOffTime time.Duration , updateFunc func (* Message ) bool ) (* Message , error ) {
209
208
message , err := db .GetMessage (messageID )
@@ -240,6 +239,13 @@ func (db *Database) QueryMessagesByIndex(metricsChecked bool, cutOffTime time.Du
240
239
241
240
if message != nil {
242
241
messagesToUpdate = append (messagesToUpdate , message )
242
+
243
+ if (len (messagesToUpdate ) % common .MessageUpdateBatchSize ) == 0 {
244
+ if err := db .batchUpdateMessages (messagesToUpdate ); err != nil {
245
+ return fmt .Errorf ("failed to batch update messages: %w" , err )
246
+ }
247
+ messagesToUpdate = messagesToUpdate [:0 ]
248
+ }
243
249
}
244
250
245
251
return nil
@@ -256,11 +262,12 @@ func (db *Database) QueryMessagesByIndex(metricsChecked bool, cutOffTime time.Du
256
262
return messagesToUpdate , nil
257
263
}
258
264
259
- // RemoveObservationsByIndex removes observations from messages based on indexed attributes.
260
- func (db * Database ) RemoveObservationsByIndex (metricsChecked bool , cutOffTime time.Duration ) error {
261
- var messagesToUpdate [] * Message
265
+ // removeMessagesByIndex dynamically deletes messages in batches based on indexed attributes.
266
+ func (db * Database ) RemoveMessagesByIndex (metricsChecked bool , cutOffTime time.Duration ) error {
267
+ messageIDsToDelete := make ([] string , 0 )
262
268
now := time .Now ()
263
269
270
+ // Iterate over the index to find messages to delete
264
271
err := db .iterateIndex (metricsChecked , func (item * badger.Item ) error {
265
272
key := item .Key ()
266
273
_ , messageID , err := parseMetricsCheckedIndexKey (key )
@@ -269,7 +276,7 @@ func (db *Database) RemoveObservationsByIndex(metricsChecked bool, cutOffTime ti
269
276
}
270
277
271
278
message , err := db .processMessage (messageID , now , cutOffTime , func (m * Message ) bool {
272
- m . Observations = nil
279
+ // return true since we just want to delete the message, no updating is needed
273
280
return true
274
281
})
275
282
@@ -278,7 +285,15 @@ func (db *Database) RemoveObservationsByIndex(metricsChecked bool, cutOffTime ti
278
285
}
279
286
280
287
if message != nil {
281
- messagesToUpdate = append (messagesToUpdate , message )
288
+ messageIDsToDelete = append (messageIDsToDelete , messageID )
289
+ }
290
+
291
+ // Delete messages in batches to reduce total memory usage at a time
292
+ if len (messageIDsToDelete ) >= common .MessageUpdateBatchSize {
293
+ if err := db .deleteMessagesBatch (messageIDsToDelete ); err != nil {
294
+ return fmt .Errorf ("failed to delete messages: %w" , err )
295
+ }
296
+ messageIDsToDelete = make ([]string , 0 )
282
297
}
283
298
284
299
return nil
@@ -288,5 +303,24 @@ func (db *Database) RemoveObservationsByIndex(metricsChecked bool, cutOffTime ti
288
303
return err
289
304
}
290
305
291
- return db .batchUpdateMessages (messagesToUpdate )
306
+ return db .deleteMessagesBatch (messageIDsToDelete )
307
+ }
308
+
309
+ func (db * Database ) deleteMessagesBatch (messageIDs []string ) error {
310
+ return db .db .Update (func (txn * badger.Txn ) error {
311
+ for _ , messageID := range messageIDs {
312
+ err := txn .Delete ([]byte (messageID ))
313
+ // deleting the message should delete the index as well
314
+ mcKey := fmt .Sprintf (metricsCheckedIndexKeyFmt , true , messageID )
315
+ if err := txn .Delete ([]byte (mcKey )); err != nil {
316
+ return fmt .Errorf ("failed to delete index for messageID %s: %w" , messageID , err )
317
+ }
318
+ if err != nil {
319
+ // Depending on your error handling strategy, you might want to log this error
320
+ // and continue, or you might want to return the error immediately.
321
+ return fmt .Errorf ("failed to delete messageID %s: %w" , messageID , err )
322
+ }
323
+ }
324
+ return nil
325
+ })
292
326
}
0 commit comments