diff --git a/src/Core/Services/Implementations/CipherService.cs b/src/Core/Services/Implementations/CipherService.cs index c779679300..3117ede509 100644 --- a/src/Core/Services/Implementations/CipherService.cs +++ b/src/Core/Services/Implementations/CipherService.cs @@ -10,6 +10,7 @@ using Bit.Core.Models.Data; using Newtonsoft.Json; using System.IO; using Bit.Core.Enums; +using Bit.Core.Utilities; namespace Bit.Core.Services { @@ -295,9 +296,12 @@ namespace Bit.Core.Services await _cipherRepository.DeleteAsync(cipherIds, deletingUserId); - var events = deletingCiphers.Select(c => + var events = deletingCiphers.Select(c => new Tuple(c, EventType.Cipher_Deleted, null)); - await _eventService.LogCipherEventsAsync(events); + foreach(var eventsBatch in events.Batch(100)) + { + await _eventService.LogCipherEventsAsync(eventsBatch); + } // push await _pushService.PushSyncCiphersAsync(deletingUserId); @@ -509,7 +513,10 @@ namespace Bit.Core.Services var events = ciphers.Select(c => new Tuple(c, EventType.Cipher_Shared, null)); - await _eventService.LogCipherEventsAsync(events); + foreach(var eventsBatch in events.Batch(100)) + { + await _eventService.LogCipherEventsAsync(eventsBatch); + } // push await _pushService.PushSyncCiphersAsync(sharingUserId); diff --git a/src/Core/Utilities/CoreHelpers.cs b/src/Core/Utilities/CoreHelpers.cs index ac927e488e..e5451a04a2 100644 --- a/src/Core/Utilities/CoreHelpers.cs +++ b/src/Core/Utilities/CoreHelpers.cs @@ -65,6 +65,32 @@ namespace Bit.Core.Utilities return new Guid(guidArray); } + public static IEnumerable> Batch(this IEnumerable source, int size) + { + T[] bucket = null; + var count = 0; + foreach(var item in source) + { + if(bucket == null) + { + bucket = new T[size]; + } + bucket[count++] = item; + if(count != size) + { + continue; + } + yield return bucket.Select(x => x); + bucket = null; + count = 0; + } + // Return the last bucket with all remaining elements + if(bucket != null && count > 0) + { + yield return bucket.Take(count); + } + } + public static DataTable ToGuidIdArrayTVP(this IEnumerable ids) { return ids.ToArrayTVP("GuidId"); diff --git a/src/Events/Controllers/CollectController.cs b/src/Events/Controllers/CollectController.cs index 304c3b164f..211efcf359 100644 --- a/src/Events/Controllers/CollectController.cs +++ b/src/Events/Controllers/CollectController.cs @@ -7,6 +7,7 @@ using Bit.Core.Enums; using Bit.Core.Models.Table; using Bit.Core.Repositories; using Bit.Core.Services; +using Bit.Core.Utilities; using Bit.Events.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -74,7 +75,10 @@ namespace Bit.Events.Controllers } if(cipherEvents.Any()) { - await _eventService.LogCipherEventsAsync(cipherEvents); + foreach(var eventsBatch in cipherEvents.Batch(50)) + { + await _eventService.LogCipherEventsAsync(eventsBatch); + } } return new OkResult(); }