public void Notify(DataTypeCacheRefresher.JsonPayload[] payloads) { EnsureCaches(); var idsA = payloads.Select(x => x.Id).ToArray(); foreach (var payload in payloads) { _logger.LogDebug("Notified {RemovedStatus} for data type {DataTypeId}", payload.Removed ? "Removed" : "Refreshed", payload.Id); } using (_contentStore.GetScopedWriteLock(_scopeProvider)) using (_mediaStore.GetScopedWriteLock(_scopeProvider)) { // TODO: need to add a datatype lock // this is triggering datatypes reload in the factory, and right after we create some // content types by loading them ... there's a race condition here, which would require // some locking on datatypes _publishedContentTypeFactory.NotifyDataTypeChanges(idsA); using (var scope = _scopeProvider.CreateScope()) { scope.ReadLock(Constants.Locks.ContentTree); _contentStore.UpdateDataTypesLocked(idsA, id => CreateContentType(PublishedItemType.Content, id)); scope.Complete(); } using (var scope = _scopeProvider.CreateScope()) { scope.ReadLock(Constants.Locks.MediaTree); _mediaStore.UpdateDataTypesLocked(idsA, id => CreateContentType(PublishedItemType.Media, id)); scope.Complete(); } } CurrentPublishedSnapshot?.Resync(); }